LLVM 22.0.0git
SelectionDAGBuilder.cpp
Go to the documentation of this file.
1//===- SelectionDAGBuilder.cpp - Selection-DAG building -------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This implements routines for translating from LLVM IR into SelectionDAG IR.
10//
11//===----------------------------------------------------------------------===//
12
13#include "SelectionDAGBuilder.h"
14#include "SDNodeDbgValue.h"
15#include "llvm/ADT/APFloat.h"
16#include "llvm/ADT/APInt.h"
17#include "llvm/ADT/BitVector.h"
18#include "llvm/ADT/STLExtras.h"
21#include "llvm/ADT/StringRef.h"
22#include "llvm/ADT/Twine.h"
26#include "llvm/Analysis/Loads.h"
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(ISD::BITCAST, DL,
663 ValueVT.changeVectorElementType(MVT::f16), Val);
664 } else if (PartEVT != ValueEVT) {
665 return SDValue();
666 }
667
668 // Widening a scalable vector to another scalable vector is done by inserting
669 // the vector into a larger undef one.
670 if (PartNumElts.isScalable())
671 return DAG.getNode(ISD::INSERT_SUBVECTOR, DL, PartVT, DAG.getUNDEF(PartVT),
672 Val, DAG.getVectorIdxConstant(0, DL));
673
674 // Vector widening case, e.g. <2 x float> -> <4 x float>. Shuffle in
675 // undef elements.
677 DAG.ExtractVectorElements(Val, Ops);
678 SDValue EltUndef = DAG.getUNDEF(PartEVT);
679 Ops.append((PartNumElts - ValueNumElts).getFixedValue(), EltUndef);
680
681 // FIXME: Use CONCAT for 2x -> 4x.
682 return DAG.getBuildVector(PartVT, DL, Ops);
683}
684
685/// getCopyToPartsVector - Create a series of nodes that contain the specified
686/// value split into legal parts.
687static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &DL,
688 SDValue Val, SDValue *Parts, unsigned NumParts,
689 MVT PartVT, const Value *V,
690 std::optional<CallingConv::ID> CallConv) {
691 EVT ValueVT = Val.getValueType();
692 assert(ValueVT.isVector() && "Not a vector");
693 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
694 const bool IsABIRegCopy = CallConv.has_value();
695
696 if (NumParts == 1) {
697 EVT PartEVT = PartVT;
698 if (PartEVT == ValueVT) {
699 // Nothing to do.
700 } else if (PartVT.getSizeInBits() == ValueVT.getSizeInBits()) {
701 // Bitconvert vector->vector case.
702 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
703 } else if (SDValue Widened = widenVectorToPartType(DAG, Val, DL, PartVT)) {
704 Val = Widened;
705 } else if (PartVT.isVector() &&
707 ValueVT.getVectorElementType()) &&
708 PartEVT.getVectorElementCount() ==
709 ValueVT.getVectorElementCount()) {
710
711 // Promoted vector extract
712 Val = DAG.getAnyExtOrTrunc(Val, DL, PartVT);
713 } else if (PartEVT.isVector() &&
714 PartEVT.getVectorElementType() !=
715 ValueVT.getVectorElementType() &&
716 TLI.getTypeAction(*DAG.getContext(), ValueVT) ==
718 // Combination of widening and promotion.
719 EVT WidenVT =
721 PartVT.getVectorElementCount());
722 SDValue Widened = widenVectorToPartType(DAG, Val, DL, WidenVT);
723 Val = DAG.getAnyExtOrTrunc(Widened, DL, PartVT);
724 } else {
725 // Don't extract an integer from a float vector. This can happen if the
726 // FP type gets softened to integer and then promoted. The promotion
727 // prevents it from being picked up by the earlier bitcast case.
728 if (ValueVT.getVectorElementCount().isScalar() &&
729 (!ValueVT.isFloatingPoint() || !PartVT.isInteger())) {
730 // If we reach this condition and PartVT is FP, this means that
731 // ValueVT is also FP and both have a different size, otherwise we
732 // would have bitcasted them. Producing an EXTRACT_VECTOR_ELT here
733 // would be invalid since that would mean the smaller FP type has to
734 // be extended to the larger one.
735 if (PartVT.isFloatingPoint()) {
736 Val = DAG.getBitcast(ValueVT.getScalarType(), Val);
737 Val = DAG.getNode(ISD::FP_EXTEND, DL, PartVT, Val);
738 } else
739 Val = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, PartVT, Val,
740 DAG.getVectorIdxConstant(0, DL));
741 } else {
742 uint64_t ValueSize = ValueVT.getFixedSizeInBits();
743 assert(PartVT.getFixedSizeInBits() > ValueSize &&
744 "lossy conversion of vector to scalar type");
745 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
746 Val = DAG.getBitcast(IntermediateType, Val);
747 Val = DAG.getAnyExtOrTrunc(Val, DL, PartVT);
748 }
749 }
750
751 assert(Val.getValueType() == PartVT && "Unexpected vector part value type");
752 Parts[0] = Val;
753 return;
754 }
755
756 // Handle a multi-element vector.
757 EVT IntermediateVT;
758 MVT RegisterVT;
759 unsigned NumIntermediates;
760 unsigned NumRegs;
761 if (IsABIRegCopy) {
763 *DAG.getContext(), *CallConv, ValueVT, IntermediateVT, NumIntermediates,
764 RegisterVT);
765 } else {
766 NumRegs =
767 TLI.getVectorTypeBreakdown(*DAG.getContext(), ValueVT, IntermediateVT,
768 NumIntermediates, RegisterVT);
769 }
770
771 assert(NumRegs == NumParts && "Part count doesn't match vector breakdown!");
772 NumParts = NumRegs; // Silence a compiler warning.
773 assert(RegisterVT == PartVT && "Part type doesn't match vector breakdown!");
774
775 assert(IntermediateVT.isScalableVector() == ValueVT.isScalableVector() &&
776 "Mixing scalable and fixed vectors when copying in parts");
777
778 std::optional<ElementCount> DestEltCnt;
779
780 if (IntermediateVT.isVector())
781 DestEltCnt = IntermediateVT.getVectorElementCount() * NumIntermediates;
782 else
783 DestEltCnt = ElementCount::getFixed(NumIntermediates);
784
785 EVT BuiltVectorTy = EVT::getVectorVT(
786 *DAG.getContext(), IntermediateVT.getScalarType(), *DestEltCnt);
787
788 if (ValueVT == BuiltVectorTy) {
789 // Nothing to do.
790 } else if (ValueVT.getSizeInBits() == BuiltVectorTy.getSizeInBits()) {
791 // Bitconvert vector->vector case.
792 Val = DAG.getNode(ISD::BITCAST, DL, BuiltVectorTy, Val);
793 } else {
794 if (BuiltVectorTy.getVectorElementType().bitsGT(
795 ValueVT.getVectorElementType())) {
796 // Integer promotion.
797 ValueVT = EVT::getVectorVT(*DAG.getContext(),
798 BuiltVectorTy.getVectorElementType(),
799 ValueVT.getVectorElementCount());
800 Val = DAG.getNode(ISD::ANY_EXTEND, DL, ValueVT, Val);
801 }
802
803 if (SDValue Widened = widenVectorToPartType(DAG, Val, DL, BuiltVectorTy)) {
804 Val = Widened;
805 }
806 }
807
808 assert(Val.getValueType() == BuiltVectorTy && "Unexpected vector value type");
809
810 // Split the vector into intermediate operands.
811 SmallVector<SDValue, 8> Ops(NumIntermediates);
812 for (unsigned i = 0; i != NumIntermediates; ++i) {
813 if (IntermediateVT.isVector()) {
814 // This does something sensible for scalable vectors - see the
815 // definition of EXTRACT_SUBVECTOR for further details.
816 unsigned IntermediateNumElts = IntermediateVT.getVectorMinNumElements();
817 Ops[i] =
818 DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, IntermediateVT, Val,
819 DAG.getVectorIdxConstant(i * IntermediateNumElts, DL));
820 } else {
821 Ops[i] = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, IntermediateVT, Val,
822 DAG.getVectorIdxConstant(i, DL));
823 }
824 }
825
826 // Split the intermediate operands into legal parts.
827 if (NumParts == NumIntermediates) {
828 // If the register was not expanded, promote or copy the value,
829 // as appropriate.
830 for (unsigned i = 0; i != NumParts; ++i)
831 getCopyToParts(DAG, DL, Ops[i], &Parts[i], 1, PartVT, V, CallConv);
832 } else if (NumParts > 0) {
833 // If the intermediate type was expanded, split each the value into
834 // legal parts.
835 assert(NumIntermediates != 0 && "division by zero");
836 assert(NumParts % NumIntermediates == 0 &&
837 "Must expand into a divisible number of parts!");
838 unsigned Factor = NumParts / NumIntermediates;
839 for (unsigned i = 0; i != NumIntermediates; ++i)
840 getCopyToParts(DAG, DL, Ops[i], &Parts[i * Factor], Factor, PartVT, V,
841 CallConv);
842 }
843}
844
845static void failForInvalidBundles(const CallBase &I, StringRef Name,
846 ArrayRef<uint32_t> AllowedBundles) {
847 if (I.hasOperandBundlesOtherThan(AllowedBundles)) {
848 ListSeparator LS;
849 std::string Error;
851 for (unsigned i = 0, e = I.getNumOperandBundles(); i != e; ++i) {
852 OperandBundleUse U = I.getOperandBundleAt(i);
853 if (!is_contained(AllowedBundles, U.getTagID()))
854 OS << LS << U.getTagName();
855 }
857 Twine("cannot lower ", Name)
858 .concat(Twine(" with arbitrary operand bundles: ", Error)));
859 }
860}
861
863 EVT valuevt, std::optional<CallingConv::ID> CC)
864 : ValueVTs(1, valuevt), RegVTs(1, regvt), Regs(regs),
865 RegCount(1, regs.size()), CallConv(CC) {}
866
868 const DataLayout &DL, Register Reg, Type *Ty,
869 std::optional<CallingConv::ID> CC) {
870 ComputeValueVTs(TLI, DL, Ty, ValueVTs);
871
872 CallConv = CC;
873
874 for (EVT ValueVT : ValueVTs) {
875 unsigned NumRegs =
877 ? TLI.getNumRegistersForCallingConv(Context, *CC, ValueVT)
878 : TLI.getNumRegisters(Context, ValueVT);
879 MVT RegisterVT =
881 ? TLI.getRegisterTypeForCallingConv(Context, *CC, ValueVT)
882 : TLI.getRegisterType(Context, ValueVT);
883 for (unsigned i = 0; i != NumRegs; ++i)
884 Regs.push_back(Reg + i);
885 RegVTs.push_back(RegisterVT);
886 RegCount.push_back(NumRegs);
887 Reg = Reg.id() + NumRegs;
888 }
889}
890
892 FunctionLoweringInfo &FuncInfo,
893 const SDLoc &dl, SDValue &Chain,
894 SDValue *Glue, const Value *V) const {
895 // A Value with type {} or [0 x %t] needs no registers.
896 if (ValueVTs.empty())
897 return SDValue();
898
899 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
900
901 // Assemble the legal parts into the final values.
902 SmallVector<SDValue, 4> Values(ValueVTs.size());
904 for (unsigned Value = 0, Part = 0, e = ValueVTs.size(); Value != e; ++Value) {
905 // Copy the legal parts from the registers.
906 EVT ValueVT = ValueVTs[Value];
907 unsigned NumRegs = RegCount[Value];
908 MVT RegisterVT = isABIMangled()
910 *DAG.getContext(), *CallConv, RegVTs[Value])
911 : RegVTs[Value];
912
913 Parts.resize(NumRegs);
914 for (unsigned i = 0; i != NumRegs; ++i) {
915 SDValue P;
916 if (!Glue) {
917 P = DAG.getCopyFromReg(Chain, dl, Regs[Part+i], RegisterVT);
918 } else {
919 P = DAG.getCopyFromReg(Chain, dl, Regs[Part+i], RegisterVT, *Glue);
920 *Glue = P.getValue(2);
921 }
922
923 Chain = P.getValue(1);
924 Parts[i] = P;
925
926 // If the source register was virtual and if we know something about it,
927 // add an assert node.
928 if (!Regs[Part + i].isVirtual() || !RegisterVT.isInteger())
929 continue;
930
932 FuncInfo.GetLiveOutRegInfo(Regs[Part+i]);
933 if (!LOI)
934 continue;
935
936 unsigned RegSize = RegisterVT.getScalarSizeInBits();
937 unsigned NumSignBits = LOI->NumSignBits;
938 unsigned NumZeroBits = LOI->Known.countMinLeadingZeros();
939
940 if (NumZeroBits == RegSize) {
941 // The current value is a zero.
942 // Explicitly express that as it would be easier for
943 // optimizations to kick in.
944 Parts[i] = DAG.getConstant(0, dl, RegisterVT);
945 continue;
946 }
947
948 // FIXME: We capture more information than the dag can represent. For
949 // now, just use the tightest assertzext/assertsext possible.
950 bool isSExt;
951 EVT FromVT(MVT::Other);
952 if (NumZeroBits) {
953 FromVT = EVT::getIntegerVT(*DAG.getContext(), RegSize - NumZeroBits);
954 isSExt = false;
955 } else if (NumSignBits > 1) {
956 FromVT =
957 EVT::getIntegerVT(*DAG.getContext(), RegSize - NumSignBits + 1);
958 isSExt = true;
959 } else {
960 continue;
961 }
962 // Add an assertion node.
963 assert(FromVT != MVT::Other);
964 Parts[i] = DAG.getNode(isSExt ? ISD::AssertSext : ISD::AssertZext, dl,
965 RegisterVT, P, DAG.getValueType(FromVT));
966 }
967
968 Values[Value] = getCopyFromParts(DAG, dl, Parts.begin(), NumRegs,
969 RegisterVT, ValueVT, V, Chain, CallConv);
970 Part += NumRegs;
971 Parts.clear();
972 }
973
974 return DAG.getNode(ISD::MERGE_VALUES, dl, DAG.getVTList(ValueVTs), Values);
975}
976
978 const SDLoc &dl, SDValue &Chain, SDValue *Glue,
979 const Value *V,
980 ISD::NodeType PreferredExtendType) const {
981 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
982 ISD::NodeType ExtendKind = PreferredExtendType;
983
984 // Get the list of the values's legal parts.
985 unsigned NumRegs = Regs.size();
986 SmallVector<SDValue, 8> Parts(NumRegs);
987 for (unsigned Value = 0, Part = 0, e = ValueVTs.size(); Value != e; ++Value) {
988 unsigned NumParts = RegCount[Value];
989
990 MVT RegisterVT = isABIMangled()
992 *DAG.getContext(), *CallConv, RegVTs[Value])
993 : RegVTs[Value];
994
995 if (ExtendKind == ISD::ANY_EXTEND && TLI.isZExtFree(Val, RegisterVT))
996 ExtendKind = ISD::ZERO_EXTEND;
997
998 getCopyToParts(DAG, dl, Val.getValue(Val.getResNo() + Value), &Parts[Part],
999 NumParts, RegisterVT, V, CallConv, ExtendKind);
1000 Part += NumParts;
1001 }
1002
1003 // Copy the parts into the registers.
1004 SmallVector<SDValue, 8> Chains(NumRegs);
1005 for (unsigned i = 0; i != NumRegs; ++i) {
1006 SDValue Part;
1007 if (!Glue) {
1008 Part = DAG.getCopyToReg(Chain, dl, Regs[i], Parts[i]);
1009 } else {
1010 Part = DAG.getCopyToReg(Chain, dl, Regs[i], Parts[i], *Glue);
1011 *Glue = Part.getValue(1);
1012 }
1013
1014 Chains[i] = Part.getValue(0);
1015 }
1016
1017 if (NumRegs == 1 || Glue)
1018 // If NumRegs > 1 && Glue is used then the use of the last CopyToReg is
1019 // flagged to it. That is the CopyToReg nodes and the user are considered
1020 // a single scheduling unit. If we create a TokenFactor and return it as
1021 // chain, then the TokenFactor is both a predecessor (operand) of the
1022 // user as well as a successor (the TF operands are flagged to the user).
1023 // c1, f1 = CopyToReg
1024 // c2, f2 = CopyToReg
1025 // c3 = TokenFactor c1, c2
1026 // ...
1027 // = op c3, ..., f2
1028 Chain = Chains[NumRegs-1];
1029 else
1030 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chains);
1031}
1032
1034 unsigned MatchingIdx, const SDLoc &dl,
1035 SelectionDAG &DAG,
1036 std::vector<SDValue> &Ops) const {
1037 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1038
1039 InlineAsm::Flag Flag(Code, Regs.size());
1040 if (HasMatching)
1041 Flag.setMatchingOp(MatchingIdx);
1042 else if (!Regs.empty() && Regs.front().isVirtual()) {
1043 // Put the register class of the virtual registers in the flag word. That
1044 // way, later passes can recompute register class constraints for inline
1045 // assembly as well as normal instructions.
1046 // Don't do this for tied operands that can use the regclass information
1047 // from the def.
1049 const TargetRegisterClass *RC = MRI.getRegClass(Regs.front());
1050 Flag.setRegClass(RC->getID());
1051 }
1052
1053 SDValue Res = DAG.getTargetConstant(Flag, dl, MVT::i32);
1054 Ops.push_back(Res);
1055
1056 if (Code == InlineAsm::Kind::Clobber) {
1057 // Clobbers should always have a 1:1 mapping with registers, and may
1058 // reference registers that have illegal (e.g. vector) types. Hence, we
1059 // shouldn't try to apply any sort of splitting logic to them.
1060 assert(Regs.size() == RegVTs.size() && Regs.size() == ValueVTs.size() &&
1061 "No 1:1 mapping from clobbers to regs?");
1063 (void)SP;
1064 for (unsigned I = 0, E = ValueVTs.size(); I != E; ++I) {
1065 Ops.push_back(DAG.getRegister(Regs[I], RegVTs[I]));
1066 assert(
1067 (Regs[I] != SP ||
1069 "If we clobbered the stack pointer, MFI should know about it.");
1070 }
1071 return;
1072 }
1073
1074 for (unsigned Value = 0, Reg = 0, e = ValueVTs.size(); Value != e; ++Value) {
1075 MVT RegisterVT = RegVTs[Value];
1076 unsigned NumRegs = TLI.getNumRegisters(*DAG.getContext(), ValueVTs[Value],
1077 RegisterVT);
1078 for (unsigned i = 0; i != NumRegs; ++i) {
1079 assert(Reg < Regs.size() && "Mismatch in # registers expected");
1080 Register TheReg = Regs[Reg++];
1081 Ops.push_back(DAG.getRegister(TheReg, RegisterVT));
1082 }
1083 }
1084}
1085
1089 unsigned I = 0;
1090 for (auto CountAndVT : zip_first(RegCount, RegVTs)) {
1091 unsigned RegCount = std::get<0>(CountAndVT);
1092 MVT RegisterVT = std::get<1>(CountAndVT);
1093 TypeSize RegisterSize = RegisterVT.getSizeInBits();
1094 for (unsigned E = I + RegCount; I != E; ++I)
1095 OutVec.push_back(std::make_pair(Regs[I], RegisterSize));
1096 }
1097 return OutVec;
1098}
1099
1101 AssumptionCache *ac, const TargetLibraryInfo *li,
1102 const TargetTransformInfo &TTI) {
1103 BatchAA = aa;
1104 AC = ac;
1105 GFI = gfi;
1106 LibInfo = li;
1107 Context = DAG.getContext();
1108 LPadToCallSiteMap.clear();
1109 this->TTI = &TTI;
1110 SL->init(DAG.getTargetLoweringInfo(), TM, DAG.getDataLayout());
1111 AssignmentTrackingEnabled = isAssignmentTrackingEnabled(
1112 *DAG.getMachineFunction().getFunction().getParent());
1113}
1114
1116 NodeMap.clear();
1117 UnusedArgNodeMap.clear();
1118 PendingLoads.clear();
1119 PendingExports.clear();
1120 PendingConstrainedFP.clear();
1121 PendingConstrainedFPStrict.clear();
1122 CurInst = nullptr;
1123 HasTailCall = false;
1124 SDNodeOrder = LowestSDNodeOrder;
1125 StatepointLowering.clear();
1126}
1127
1129 DanglingDebugInfoMap.clear();
1130}
1131
1132// Update DAG root to include dependencies on Pending chains.
1133SDValue SelectionDAGBuilder::updateRoot(SmallVectorImpl<SDValue> &Pending) {
1134 SDValue Root = DAG.getRoot();
1135
1136 if (Pending.empty())
1137 return Root;
1138
1139 // Add current root to PendingChains, unless we already indirectly
1140 // depend on it.
1141 if (Root.getOpcode() != ISD::EntryToken) {
1142 unsigned i = 0, e = Pending.size();
1143 for (; i != e; ++i) {
1144 assert(Pending[i].getNode()->getNumOperands() > 1);
1145 if (Pending[i].getNode()->getOperand(0) == Root)
1146 break; // Don't add the root if we already indirectly depend on it.
1147 }
1148
1149 if (i == e)
1150 Pending.push_back(Root);
1151 }
1152
1153 if (Pending.size() == 1)
1154 Root = Pending[0];
1155 else
1156 Root = DAG.getTokenFactor(getCurSDLoc(), Pending);
1157
1158 DAG.setRoot(Root);
1159 Pending.clear();
1160 return Root;
1161}
1162
1166
1168 // If the new exception behavior differs from that of the pending
1169 // ones, chain up them and update the root.
1170 switch (EB) {
1173 // Floating-point exceptions produced by such operations are not intended
1174 // to be observed, so the sequence of these operations does not need to be
1175 // preserved.
1176 //
1177 // They however must not be mixed with the instructions that have strict
1178 // exception behavior. Placing an operation with 'ebIgnore' behavior between
1179 // 'ebStrict' operations could distort the observed exception behavior.
1180 if (!PendingConstrainedFPStrict.empty()) {
1181 assert(PendingConstrainedFP.empty());
1182 updateRoot(PendingConstrainedFPStrict);
1183 }
1184 break;
1186 // Floating-point exception produced by these operations may be observed, so
1187 // they must be correctly chained. If trapping on FP exceptions is
1188 // disabled, the exceptions can be observed only by functions that read
1189 // exception flags, like 'llvm.get_fpenv' or 'fetestexcept'. It means that
1190 // the order of operations is not significant between barriers.
1191 //
1192 // If trapping is enabled, each operation becomes an implicit observation
1193 // point, so the operations must be sequenced according their original
1194 // source order.
1195 if (!PendingConstrainedFP.empty()) {
1196 assert(PendingConstrainedFPStrict.empty());
1197 updateRoot(PendingConstrainedFP);
1198 }
1199 // TODO: Add support for trapping-enabled scenarios.
1200 }
1201 return DAG.getRoot();
1202}
1203
1205 // Chain up all pending constrained intrinsics together with all
1206 // pending loads, by simply appending them to PendingLoads and
1207 // then calling getMemoryRoot().
1208 PendingLoads.reserve(PendingLoads.size() +
1209 PendingConstrainedFP.size() +
1210 PendingConstrainedFPStrict.size());
1211 PendingLoads.append(PendingConstrainedFP.begin(),
1212 PendingConstrainedFP.end());
1213 PendingLoads.append(PendingConstrainedFPStrict.begin(),
1214 PendingConstrainedFPStrict.end());
1215 PendingConstrainedFP.clear();
1216 PendingConstrainedFPStrict.clear();
1217 return getMemoryRoot();
1218}
1219
1221 // We need to emit pending fpexcept.strict constrained intrinsics,
1222 // so append them to the PendingExports list.
1223 PendingExports.append(PendingConstrainedFPStrict.begin(),
1224 PendingConstrainedFPStrict.end());
1225 PendingConstrainedFPStrict.clear();
1226 return updateRoot(PendingExports);
1227}
1228
1230 DILocalVariable *Variable,
1232 DebugLoc DL) {
1233 assert(Variable && "Missing variable");
1234
1235 // Check if address has undef value.
1236 if (!Address || isa<UndefValue>(Address) ||
1237 (Address->use_empty() && !isa<Argument>(Address))) {
1238 LLVM_DEBUG(
1239 dbgs()
1240 << "dbg_declare: Dropping debug info (bad/undef/unused-arg address)\n");
1241 return;
1242 }
1243
1244 bool IsParameter = Variable->isParameter() || isa<Argument>(Address);
1245
1246 SDValue &N = NodeMap[Address];
1247 if (!N.getNode() && isa<Argument>(Address))
1248 // Check unused arguments map.
1249 N = UnusedArgNodeMap[Address];
1250 SDDbgValue *SDV;
1251 if (N.getNode()) {
1252 if (const BitCastInst *BCI = dyn_cast<BitCastInst>(Address))
1253 Address = BCI->getOperand(0);
1254 // Parameters are handled specially.
1255 auto *FINode = dyn_cast<FrameIndexSDNode>(N.getNode());
1256 if (IsParameter && FINode) {
1257 // Byval parameter. We have a frame index at this point.
1258 SDV = DAG.getFrameIndexDbgValue(Variable, Expression, FINode->getIndex(),
1259 /*IsIndirect*/ true, DL, SDNodeOrder);
1260 } else if (isa<Argument>(Address)) {
1261 // Address is an argument, so try to emit its dbg value using
1262 // virtual register info from the FuncInfo.ValueMap.
1263 EmitFuncArgumentDbgValue(Address, Variable, Expression, DL,
1264 FuncArgumentDbgValueKind::Declare, N);
1265 return;
1266 } else {
1267 SDV = DAG.getDbgValue(Variable, Expression, N.getNode(), N.getResNo(),
1268 true, DL, SDNodeOrder);
1269 }
1270 DAG.AddDbgValue(SDV, IsParameter);
1271 } else {
1272 // If Address is an argument then try to emit its dbg value using
1273 // virtual register info from the FuncInfo.ValueMap.
1274 if (!EmitFuncArgumentDbgValue(Address, Variable, Expression, DL,
1275 FuncArgumentDbgValueKind::Declare, N)) {
1276 LLVM_DEBUG(dbgs() << "dbg_declare: Dropping debug info"
1277 << " (could not emit func-arg dbg_value)\n");
1278 }
1279 }
1280}
1281
1283 // Add SDDbgValue nodes for any var locs here. Do so before updating
1284 // SDNodeOrder, as this mapping is {Inst -> Locs BEFORE Inst}.
1285 if (FunctionVarLocs const *FnVarLocs = DAG.getFunctionVarLocs()) {
1286 // Add SDDbgValue nodes for any var locs here. Do so before updating
1287 // SDNodeOrder, as this mapping is {Inst -> Locs BEFORE Inst}.
1288 for (auto It = FnVarLocs->locs_begin(&I), End = FnVarLocs->locs_end(&I);
1289 It != End; ++It) {
1290 auto *Var = FnVarLocs->getDILocalVariable(It->VariableID);
1291 dropDanglingDebugInfo(Var, It->Expr);
1292 if (It->Values.isKillLocation(It->Expr)) {
1293 handleKillDebugValue(Var, It->Expr, It->DL, SDNodeOrder);
1294 continue;
1295 }
1296 SmallVector<Value *> Values(It->Values.location_ops());
1297 if (!handleDebugValue(Values, Var, It->Expr, It->DL, SDNodeOrder,
1298 It->Values.hasArgList())) {
1299 SmallVector<Value *, 4> Vals(It->Values.location_ops());
1301 FnVarLocs->getDILocalVariable(It->VariableID),
1302 It->Expr, Vals.size() > 1, It->DL, SDNodeOrder);
1303 }
1304 }
1305 }
1306
1307 // We must skip DbgVariableRecords if they've already been processed above as
1308 // we have just emitted the debug values resulting from assignment tracking
1309 // analysis, making any existing DbgVariableRecords redundant (and probably
1310 // less correct). We still need to process DbgLabelRecords. This does sink
1311 // DbgLabelRecords to the bottom of the group of debug records. That sholdn't
1312 // be important as it does so deterministcally and ordering between
1313 // DbgLabelRecords and DbgVariableRecords is immaterial (other than for MIR/IR
1314 // printing).
1315 bool SkipDbgVariableRecords = DAG.getFunctionVarLocs();
1316 // Is there is any debug-info attached to this instruction, in the form of
1317 // DbgRecord non-instruction debug-info records.
1318 for (DbgRecord &DR : I.getDbgRecordRange()) {
1319 if (DbgLabelRecord *DLR = dyn_cast<DbgLabelRecord>(&DR)) {
1320 assert(DLR->getLabel() && "Missing label");
1321 SDDbgLabel *SDV =
1322 DAG.getDbgLabel(DLR->getLabel(), DLR->getDebugLoc(), SDNodeOrder);
1323 DAG.AddDbgLabel(SDV);
1324 continue;
1325 }
1326
1327 if (SkipDbgVariableRecords)
1328 continue;
1330 DILocalVariable *Variable = DVR.getVariable();
1333
1335 if (FuncInfo.PreprocessedDVRDeclares.contains(&DVR))
1336 continue;
1337 LLVM_DEBUG(dbgs() << "SelectionDAG visiting dbg_declare: " << DVR
1338 << "\n");
1340 DVR.getDebugLoc());
1341 continue;
1342 }
1343
1344 // A DbgVariableRecord with no locations is a kill location.
1346 if (Values.empty()) {
1348 SDNodeOrder);
1349 continue;
1350 }
1351
1352 // A DbgVariableRecord with an undef or absent location is also a kill
1353 // location.
1354 if (llvm::any_of(Values,
1355 [](Value *V) { return !V || isa<UndefValue>(V); })) {
1357 SDNodeOrder);
1358 continue;
1359 }
1360
1361 bool IsVariadic = DVR.hasArgList();
1362 if (!handleDebugValue(Values, Variable, Expression, DVR.getDebugLoc(),
1363 SDNodeOrder, IsVariadic)) {
1364 addDanglingDebugInfo(Values, Variable, Expression, IsVariadic,
1365 DVR.getDebugLoc(), SDNodeOrder);
1366 }
1367 }
1368}
1369
1371 visitDbgInfo(I);
1372
1373 // Set up outgoing PHI node register values before emitting the terminator.
1374 if (I.isTerminator()) {
1375 HandlePHINodesInSuccessorBlocks(I.getParent());
1376 }
1377
1378 ++SDNodeOrder;
1379 CurInst = &I;
1380
1381 // Set inserted listener only if required.
1382 bool NodeInserted = false;
1383 std::unique_ptr<SelectionDAG::DAGNodeInsertedListener> InsertedListener;
1384 MDNode *PCSectionsMD = I.getMetadata(LLVMContext::MD_pcsections);
1385 MDNode *MMRA = I.getMetadata(LLVMContext::MD_mmra);
1386 if (PCSectionsMD || MMRA) {
1387 InsertedListener = std::make_unique<SelectionDAG::DAGNodeInsertedListener>(
1388 DAG, [&](SDNode *) { NodeInserted = true; });
1389 }
1390
1391 visit(I.getOpcode(), I);
1392
1393 if (!I.isTerminator() && !HasTailCall &&
1394 !isa<GCStatepointInst>(I)) // statepoints handle their exports internally
1396
1397 // Handle metadata.
1398 if (PCSectionsMD || MMRA) {
1399 auto It = NodeMap.find(&I);
1400 if (It != NodeMap.end()) {
1401 if (PCSectionsMD)
1402 DAG.addPCSections(It->second.getNode(), PCSectionsMD);
1403 if (MMRA)
1404 DAG.addMMRAMetadata(It->second.getNode(), MMRA);
1405 } else if (NodeInserted) {
1406 // This should not happen; if it does, don't let it go unnoticed so we can
1407 // fix it. Relevant visit*() function is probably missing a setValue().
1408 errs() << "warning: loosing !pcsections and/or !mmra metadata ["
1409 << I.getModule()->getName() << "]\n";
1410 LLVM_DEBUG(I.dump());
1411 assert(false);
1412 }
1413 }
1414
1415 CurInst = nullptr;
1416}
1417
1418void SelectionDAGBuilder::visitPHI(const PHINode &) {
1419 llvm_unreachable("SelectionDAGBuilder shouldn't visit PHI nodes!");
1420}
1421
1422void SelectionDAGBuilder::visit(unsigned Opcode, const User &I) {
1423 // Note: this doesn't use InstVisitor, because it has to work with
1424 // ConstantExpr's in addition to instructions.
1425 switch (Opcode) {
1426 default: llvm_unreachable("Unknown instruction type encountered!");
1427 // Build the switch statement using the Instruction.def file.
1428#define HANDLE_INST(NUM, OPCODE, CLASS) \
1429 case Instruction::OPCODE: visit##OPCODE((const CLASS&)I); break;
1430#include "llvm/IR/Instruction.def"
1431 }
1432}
1433
1435 DILocalVariable *Variable,
1436 DebugLoc DL, unsigned Order,
1439 // For variadic dbg_values we will now insert poison.
1440 // FIXME: We can potentially recover these!
1442 for (const Value *V : Values) {
1443 auto *Poison = PoisonValue::get(V->getType());
1445 }
1446 SDDbgValue *SDV = DAG.getDbgValueList(Variable, Expression, Locs, {},
1447 /*IsIndirect=*/false, DL, Order,
1448 /*IsVariadic=*/true);
1449 DAG.AddDbgValue(SDV, /*isParameter=*/false);
1450 return true;
1451}
1452
1454 DILocalVariable *Var,
1455 DIExpression *Expr,
1456 bool IsVariadic, DebugLoc DL,
1457 unsigned Order) {
1458 if (IsVariadic) {
1459 handleDanglingVariadicDebugInfo(DAG, Var, DL, Order, Values, Expr);
1460 return;
1461 }
1462 // TODO: Dangling debug info will eventually either be resolved or produce
1463 // a poison DBG_VALUE. However in the resolution case, a gap may appear
1464 // between the original dbg.value location and its resolved DBG_VALUE,
1465 // which we should ideally fill with an extra poison DBG_VALUE.
1466 assert(Values.size() == 1);
1467 DanglingDebugInfoMap[Values[0]].emplace_back(Var, Expr, DL, Order);
1468}
1469
1471 const DIExpression *Expr) {
1472 auto isMatchingDbgValue = [&](DanglingDebugInfo &DDI) {
1473 DIVariable *DanglingVariable = DDI.getVariable();
1474 DIExpression *DanglingExpr = DDI.getExpression();
1475 if (DanglingVariable == Variable && Expr->fragmentsOverlap(DanglingExpr)) {
1476 LLVM_DEBUG(dbgs() << "Dropping dangling debug info for "
1477 << printDDI(nullptr, DDI) << "\n");
1478 return true;
1479 }
1480 return false;
1481 };
1482
1483 for (auto &DDIMI : DanglingDebugInfoMap) {
1484 DanglingDebugInfoVector &DDIV = DDIMI.second;
1485
1486 // If debug info is to be dropped, run it through final checks to see
1487 // whether it can be salvaged.
1488 for (auto &DDI : DDIV)
1489 if (isMatchingDbgValue(DDI))
1490 salvageUnresolvedDbgValue(DDIMI.first, DDI);
1491
1492 erase_if(DDIV, isMatchingDbgValue);
1493 }
1494}
1495
1496// resolveDanglingDebugInfo - if we saw an earlier dbg_value referring to V,
1497// generate the debug data structures now that we've seen its definition.
1499 SDValue Val) {
1500 auto DanglingDbgInfoIt = DanglingDebugInfoMap.find(V);
1501 if (DanglingDbgInfoIt == DanglingDebugInfoMap.end())
1502 return;
1503
1504 DanglingDebugInfoVector &DDIV = DanglingDbgInfoIt->second;
1505 for (auto &DDI : DDIV) {
1506 DebugLoc DL = DDI.getDebugLoc();
1507 unsigned ValSDNodeOrder = Val.getNode()->getIROrder();
1508 unsigned DbgSDNodeOrder = DDI.getSDNodeOrder();
1509 DILocalVariable *Variable = DDI.getVariable();
1510 DIExpression *Expr = DDI.getExpression();
1511 assert(Variable->isValidLocationForIntrinsic(DL) &&
1512 "Expected inlined-at fields to agree");
1513 SDDbgValue *SDV;
1514 if (Val.getNode()) {
1515 // FIXME: I doubt that it is correct to resolve a dangling DbgValue as a
1516 // FuncArgumentDbgValue (it would be hoisted to the function entry, and if
1517 // we couldn't resolve it directly when examining the DbgValue intrinsic
1518 // in the first place we should not be more successful here). Unless we
1519 // have some test case that prove this to be correct we should avoid
1520 // calling EmitFuncArgumentDbgValue here.
1521 if (!EmitFuncArgumentDbgValue(V, Variable, Expr, DL,
1522 FuncArgumentDbgValueKind::Value, Val)) {
1523 LLVM_DEBUG(dbgs() << "Resolve dangling debug info for "
1524 << printDDI(V, DDI) << "\n");
1525 LLVM_DEBUG(dbgs() << " By mapping to:\n "; Val.dump());
1526 // Increase the SDNodeOrder for the DbgValue here to make sure it is
1527 // inserted after the definition of Val when emitting the instructions
1528 // after ISel. An alternative could be to teach
1529 // ScheduleDAGSDNodes::EmitSchedule to delay the insertion properly.
1530 LLVM_DEBUG(if (ValSDNodeOrder > DbgSDNodeOrder) dbgs()
1531 << "changing SDNodeOrder from " << DbgSDNodeOrder << " to "
1532 << ValSDNodeOrder << "\n");
1533 SDV = getDbgValue(Val, Variable, Expr, DL,
1534 std::max(DbgSDNodeOrder, ValSDNodeOrder));
1535 DAG.AddDbgValue(SDV, false);
1536 } else
1537 LLVM_DEBUG(dbgs() << "Resolved dangling debug info for "
1538 << printDDI(V, DDI)
1539 << " in EmitFuncArgumentDbgValue\n");
1540 } else {
1541 LLVM_DEBUG(dbgs() << "Dropping debug info for " << printDDI(V, DDI)
1542 << "\n");
1543 auto Poison = PoisonValue::get(V->getType());
1544 auto SDV =
1545 DAG.getConstantDbgValue(Variable, Expr, Poison, DL, DbgSDNodeOrder);
1546 DAG.AddDbgValue(SDV, false);
1547 }
1548 }
1549 DDIV.clear();
1550}
1551
1553 DanglingDebugInfo &DDI) {
1554 // TODO: For the variadic implementation, instead of only checking the fail
1555 // state of `handleDebugValue`, we need know specifically which values were
1556 // invalid, so that we attempt to salvage only those values when processing
1557 // a DIArgList.
1558 const Value *OrigV = V;
1559 DILocalVariable *Var = DDI.getVariable();
1560 DIExpression *Expr = DDI.getExpression();
1561 DebugLoc DL = DDI.getDebugLoc();
1562 unsigned SDOrder = DDI.getSDNodeOrder();
1563
1564 // Currently we consider only dbg.value intrinsics -- we tell the salvager
1565 // that DW_OP_stack_value is desired.
1566 bool StackValue = true;
1567
1568 // Can this Value can be encoded without any further work?
1569 if (handleDebugValue(V, Var, Expr, DL, SDOrder, /*IsVariadic=*/false))
1570 return;
1571
1572 // Attempt to salvage back through as many instructions as possible. Bail if
1573 // a non-instruction is seen, such as a constant expression or global
1574 // variable. FIXME: Further work could recover those too.
1575 while (isa<Instruction>(V)) {
1576 const Instruction &VAsInst = *cast<const Instruction>(V);
1577 // Temporary "0", awaiting real implementation.
1579 SmallVector<Value *, 4> AdditionalValues;
1580 V = salvageDebugInfoImpl(const_cast<Instruction &>(VAsInst),
1581 Expr->getNumLocationOperands(), Ops,
1582 AdditionalValues);
1583 // If we cannot salvage any further, and haven't yet found a suitable debug
1584 // expression, bail out.
1585 if (!V)
1586 break;
1587
1588 // TODO: If AdditionalValues isn't empty, then the salvage can only be
1589 // represented with a DBG_VALUE_LIST, so we give up. When we have support
1590 // here for variadic dbg_values, remove that condition.
1591 if (!AdditionalValues.empty())
1592 break;
1593
1594 // New value and expr now represent this debuginfo.
1595 Expr = DIExpression::appendOpsToArg(Expr, Ops, 0, StackValue);
1596
1597 // Some kind of simplification occurred: check whether the operand of the
1598 // salvaged debug expression can be encoded in this DAG.
1599 if (handleDebugValue(V, Var, Expr, DL, SDOrder, /*IsVariadic=*/false)) {
1600 LLVM_DEBUG(
1601 dbgs() << "Salvaged debug location info for:\n " << *Var << "\n"
1602 << *OrigV << "\nBy stripping back to:\n " << *V << "\n");
1603 return;
1604 }
1605 }
1606
1607 // This was the final opportunity to salvage this debug information, and it
1608 // couldn't be done. Place a poison DBG_VALUE at this location to terminate
1609 // any earlier variable location.
1610 assert(OrigV && "V shouldn't be null");
1611 auto *Poison = PoisonValue::get(OrigV->getType());
1612 auto *SDV = DAG.getConstantDbgValue(Var, Expr, Poison, DL, SDNodeOrder);
1613 DAG.AddDbgValue(SDV, false);
1614 LLVM_DEBUG(dbgs() << "Dropping debug value info for:\n "
1615 << printDDI(OrigV, DDI) << "\n");
1616}
1617
1619 DIExpression *Expr,
1620 DebugLoc DbgLoc,
1621 unsigned Order) {
1625 handleDebugValue(Poison, Var, NewExpr, DbgLoc, Order,
1626 /*IsVariadic*/ false);
1627}
1628
1630 DILocalVariable *Var,
1631 DIExpression *Expr, DebugLoc DbgLoc,
1632 unsigned Order, bool IsVariadic) {
1633 if (Values.empty())
1634 return true;
1635
1636 // Filter EntryValue locations out early.
1637 if (visitEntryValueDbgValue(Values, Var, Expr, DbgLoc))
1638 return true;
1639
1640 SmallVector<SDDbgOperand> LocationOps;
1641 SmallVector<SDNode *> Dependencies;
1642 for (const Value *V : Values) {
1643 // Constant value.
1646 LocationOps.emplace_back(SDDbgOperand::fromConst(V));
1647 continue;
1648 }
1649
1650 // Look through IntToPtr constants.
1651 if (auto *CE = dyn_cast<ConstantExpr>(V))
1652 if (CE->getOpcode() == Instruction::IntToPtr) {
1653 LocationOps.emplace_back(SDDbgOperand::fromConst(CE->getOperand(0)));
1654 continue;
1655 }
1656
1657 // If the Value is a frame index, we can create a FrameIndex debug value
1658 // without relying on the DAG at all.
1659 if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
1660 auto SI = FuncInfo.StaticAllocaMap.find(AI);
1661 if (SI != FuncInfo.StaticAllocaMap.end()) {
1662 LocationOps.emplace_back(SDDbgOperand::fromFrameIdx(SI->second));
1663 continue;
1664 }
1665 }
1666
1667 // Do not use getValue() in here; we don't want to generate code at
1668 // this point if it hasn't been done yet.
1669 SDValue N = NodeMap[V];
1670 if (!N.getNode() && isa<Argument>(V)) // Check unused arguments map.
1671 N = UnusedArgNodeMap[V];
1672
1673 if (N.getNode()) {
1674 // Only emit func arg dbg value for non-variadic dbg.values for now.
1675 if (!IsVariadic &&
1676 EmitFuncArgumentDbgValue(V, Var, Expr, DbgLoc,
1677 FuncArgumentDbgValueKind::Value, N))
1678 return true;
1679 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(N.getNode())) {
1680 // Construct a FrameIndexDbgValue for FrameIndexSDNodes so we can
1681 // describe stack slot locations.
1682 //
1683 // Consider "int x = 0; int *px = &x;". There are two kinds of
1684 // interesting debug values here after optimization:
1685 //
1686 // dbg.value(i32* %px, !"int *px", !DIExpression()), and
1687 // dbg.value(i32* %px, !"int x", !DIExpression(DW_OP_deref))
1688 //
1689 // Both describe the direct values of their associated variables.
1690 Dependencies.push_back(N.getNode());
1691 LocationOps.emplace_back(SDDbgOperand::fromFrameIdx(FISDN->getIndex()));
1692 continue;
1693 }
1694 LocationOps.emplace_back(
1695 SDDbgOperand::fromNode(N.getNode(), N.getResNo()));
1696 continue;
1697 }
1698
1699 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1700 // Special rules apply for the first dbg.values of parameter variables in a
1701 // function. Identify them by the fact they reference Argument Values, that
1702 // they're parameters, and they are parameters of the current function. We
1703 // need to let them dangle until they get an SDNode.
1704 bool IsParamOfFunc =
1705 isa<Argument>(V) && Var->isParameter() && !DbgLoc.getInlinedAt();
1706 if (IsParamOfFunc)
1707 return false;
1708
1709 // The value is not used in this block yet (or it would have an SDNode).
1710 // We still want the value to appear for the user if possible -- if it has
1711 // an associated VReg, we can refer to that instead.
1712 auto VMI = FuncInfo.ValueMap.find(V);
1713 if (VMI != FuncInfo.ValueMap.end()) {
1714 Register Reg = VMI->second;
1715 // If this is a PHI node, it may be split up into several MI PHI nodes
1716 // (in FunctionLoweringInfo::set).
1717 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), Reg,
1718 V->getType(), std::nullopt);
1719 if (RFV.occupiesMultipleRegs()) {
1720 // FIXME: We could potentially support variadic dbg_values here.
1721 if (IsVariadic)
1722 return false;
1723 unsigned Offset = 0;
1724 unsigned BitsToDescribe = 0;
1725 if (auto VarSize = Var->getSizeInBits())
1726 BitsToDescribe = *VarSize;
1727 if (auto Fragment = Expr->getFragmentInfo())
1728 BitsToDescribe = Fragment->SizeInBits;
1729 for (const auto &RegAndSize : RFV.getRegsAndSizes()) {
1730 // Bail out if all bits are described already.
1731 if (Offset >= BitsToDescribe)
1732 break;
1733 // TODO: handle scalable vectors.
1734 unsigned RegisterSize = RegAndSize.second;
1735 unsigned FragmentSize = (Offset + RegisterSize > BitsToDescribe)
1736 ? BitsToDescribe - Offset
1737 : RegisterSize;
1738 auto FragmentExpr = DIExpression::createFragmentExpression(
1739 Expr, Offset, FragmentSize);
1740 if (!FragmentExpr)
1741 continue;
1742 SDDbgValue *SDV = DAG.getVRegDbgValue(
1743 Var, *FragmentExpr, RegAndSize.first, false, DbgLoc, Order);
1744 DAG.AddDbgValue(SDV, false);
1745 Offset += RegisterSize;
1746 }
1747 return true;
1748 }
1749 // We can use simple vreg locations for variadic dbg_values as well.
1750 LocationOps.emplace_back(SDDbgOperand::fromVReg(Reg));
1751 continue;
1752 }
1753 // We failed to create a SDDbgOperand for V.
1754 return false;
1755 }
1756
1757 // We have created a SDDbgOperand for each Value in Values.
1758 assert(!LocationOps.empty());
1759 SDDbgValue *SDV =
1760 DAG.getDbgValueList(Var, Expr, LocationOps, Dependencies,
1761 /*IsIndirect=*/false, DbgLoc, Order, IsVariadic);
1762 DAG.AddDbgValue(SDV, /*isParameter=*/false);
1763 return true;
1764}
1765
1767 // Try to fixup any remaining dangling debug info -- and drop it if we can't.
1768 for (auto &Pair : DanglingDebugInfoMap)
1769 for (auto &DDI : Pair.second)
1770 salvageUnresolvedDbgValue(const_cast<Value *>(Pair.first), DDI);
1772}
1773
1774/// getCopyFromRegs - If there was virtual register allocated for the value V
1775/// emit CopyFromReg of the specified type Ty. Return empty SDValue() otherwise.
1778 SDValue Result;
1779
1780 if (It != FuncInfo.ValueMap.end()) {
1781 Register InReg = It->second;
1782
1783 RegsForValue RFV(*DAG.getContext(), DAG.getTargetLoweringInfo(),
1784 DAG.getDataLayout(), InReg, Ty,
1785 std::nullopt); // This is not an ABI copy.
1786 SDValue Chain = DAG.getEntryNode();
1787 Result = RFV.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(), Chain, nullptr,
1788 V);
1789 resolveDanglingDebugInfo(V, Result);
1790 }
1791
1792 return Result;
1793}
1794
1795/// getValue - Return an SDValue for the given Value.
1797 // If we already have an SDValue for this value, use it. It's important
1798 // to do this first, so that we don't create a CopyFromReg if we already
1799 // have a regular SDValue.
1800 SDValue &N = NodeMap[V];
1801 if (N.getNode()) return N;
1802
1803 // If there's a virtual register allocated and initialized for this
1804 // value, use it.
1805 if (SDValue copyFromReg = getCopyFromRegs(V, V->getType()))
1806 return copyFromReg;
1807
1808 // Otherwise create a new SDValue and remember it.
1809 SDValue Val = getValueImpl(V);
1810 NodeMap[V] = Val;
1812 return Val;
1813}
1814
1815/// getNonRegisterValue - Return an SDValue for the given Value, but
1816/// don't look in FuncInfo.ValueMap for a virtual register.
1818 // If we already have an SDValue for this value, use it.
1819 SDValue &N = NodeMap[V];
1820 if (N.getNode()) {
1821 if (isIntOrFPConstant(N)) {
1822 // Remove the debug location from the node as the node is about to be used
1823 // in a location which may differ from the original debug location. This
1824 // is relevant to Constant and ConstantFP nodes because they can appear
1825 // as constant expressions inside PHI nodes.
1826 N->setDebugLoc(DebugLoc());
1827 }
1828 return N;
1829 }
1830
1831 // Otherwise create a new SDValue and remember it.
1832 SDValue Val = getValueImpl(V);
1833 NodeMap[V] = Val;
1835 return Val;
1836}
1837
1838/// getValueImpl - Helper function for getValue and getNonRegisterValue.
1839/// Create an SDValue for the given value.
1841 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1842
1843 if (const Constant *C = dyn_cast<Constant>(V)) {
1844 EVT VT = TLI.getValueType(DAG.getDataLayout(), V->getType(), true);
1845
1846 if (const ConstantInt *CI = dyn_cast<ConstantInt>(C)) {
1847 SDLoc DL = getCurSDLoc();
1848
1849 // DAG.getConstant() may attempt to legalise the vector constant which can
1850 // significantly change the combines applied to the DAG. To reduce the
1851 // divergence when enabling ConstantInt based vectors we try to construct
1852 // the DAG in the same way as shufflevector based splats. TODO: The
1853 // divergence sometimes leads to better optimisations. Ideally we should
1854 // prevent DAG.getConstant() from legalising too early but there are some
1855 // degradations preventing this.
1856 if (VT.isScalableVector())
1857 return DAG.getNode(
1858 ISD::SPLAT_VECTOR, DL, VT,
1859 DAG.getConstant(CI->getValue(), DL, VT.getVectorElementType()));
1860 if (VT.isFixedLengthVector())
1861 return DAG.getSplatBuildVector(
1862 VT, DL,
1863 DAG.getConstant(CI->getValue(), DL, VT.getVectorElementType()));
1864 return DAG.getConstant(*CI, DL, VT);
1865 }
1866
1867 if (const GlobalValue *GV = dyn_cast<GlobalValue>(C))
1868 return DAG.getGlobalAddress(GV, getCurSDLoc(), VT);
1869
1870 if (const ConstantPtrAuth *CPA = dyn_cast<ConstantPtrAuth>(C)) {
1871 return DAG.getNode(ISD::PtrAuthGlobalAddress, getCurSDLoc(), VT,
1872 getValue(CPA->getPointer()), getValue(CPA->getKey()),
1873 getValue(CPA->getAddrDiscriminator()),
1874 getValue(CPA->getDiscriminator()));
1875 }
1876
1878 return DAG.getConstant(0, getCurSDLoc(), VT);
1879
1880 if (match(C, m_VScale()))
1881 return DAG.getVScale(getCurSDLoc(), VT, APInt(VT.getSizeInBits(), 1));
1882
1883 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C))
1884 return DAG.getConstantFP(*CFP, getCurSDLoc(), VT);
1885
1886 if (isa<UndefValue>(C) && !V->getType()->isAggregateType())
1887 return isa<PoisonValue>(C) ? DAG.getPOISON(VT) : DAG.getUNDEF(VT);
1888
1889 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
1890 visit(CE->getOpcode(), *CE);
1891 SDValue N1 = NodeMap[V];
1892 assert(N1.getNode() && "visit didn't populate the NodeMap!");
1893 return N1;
1894 }
1895
1897 SmallVector<SDValue, 4> Constants;
1898 for (const Use &U : C->operands()) {
1899 SDNode *Val = getValue(U).getNode();
1900 // If the operand is an empty aggregate, there are no values.
1901 if (!Val) continue;
1902 // Add each leaf value from the operand to the Constants list
1903 // to form a flattened list of all the values.
1904 for (unsigned i = 0, e = Val->getNumValues(); i != e; ++i)
1905 Constants.push_back(SDValue(Val, i));
1906 }
1907
1908 return DAG.getMergeValues(Constants, getCurSDLoc());
1909 }
1910
1911 if (const ConstantDataSequential *CDS =
1914 for (uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i) {
1915 SDNode *Val = getValue(CDS->getElementAsConstant(i)).getNode();
1916 // Add each leaf value from the operand to the Constants list
1917 // to form a flattened list of all the values.
1918 for (unsigned i = 0, e = Val->getNumValues(); i != e; ++i)
1919 Ops.push_back(SDValue(Val, i));
1920 }
1921
1922 if (isa<ArrayType>(CDS->getType()))
1923 return DAG.getMergeValues(Ops, getCurSDLoc());
1924 return DAG.getBuildVector(VT, getCurSDLoc(), Ops);
1925 }
1926
1927 if (C->getType()->isStructTy() || C->getType()->isArrayTy()) {
1929 "Unknown struct or array constant!");
1930
1931 SmallVector<EVT, 4> ValueVTs;
1932 ComputeValueVTs(TLI, DAG.getDataLayout(), C->getType(), ValueVTs);
1933 unsigned NumElts = ValueVTs.size();
1934 if (NumElts == 0)
1935 return SDValue(); // empty struct
1936 SmallVector<SDValue, 4> Constants(NumElts);
1937 for (unsigned i = 0; i != NumElts; ++i) {
1938 EVT EltVT = ValueVTs[i];
1939 if (isa<UndefValue>(C))
1940 Constants[i] = DAG.getUNDEF(EltVT);
1941 else if (EltVT.isFloatingPoint())
1942 Constants[i] = DAG.getConstantFP(0, getCurSDLoc(), EltVT);
1943 else
1944 Constants[i] = DAG.getConstant(0, getCurSDLoc(), EltVT);
1945 }
1946
1947 return DAG.getMergeValues(Constants, getCurSDLoc());
1948 }
1949
1950 if (const BlockAddress *BA = dyn_cast<BlockAddress>(C))
1951 return DAG.getBlockAddress(BA, VT);
1952
1953 if (const auto *Equiv = dyn_cast<DSOLocalEquivalent>(C))
1954 return getValue(Equiv->getGlobalValue());
1955
1956 if (const auto *NC = dyn_cast<NoCFIValue>(C))
1957 return getValue(NC->getGlobalValue());
1958
1959 if (VT == MVT::aarch64svcount) {
1960 assert(C->isNullValue() && "Can only zero this target type!");
1961 return DAG.getNode(ISD::BITCAST, getCurSDLoc(), VT,
1962 DAG.getConstant(0, getCurSDLoc(), MVT::nxv16i1));
1963 }
1964
1965 if (VT.isRISCVVectorTuple()) {
1966 assert(C->isNullValue() && "Can only zero this target type!");
1967 return DAG.getNode(
1969 DAG.getNode(
1971 EVT::getVectorVT(*DAG.getContext(), MVT::i8,
1972 VT.getSizeInBits().getKnownMinValue() / 8, true),
1973 DAG.getConstant(0, getCurSDLoc(), MVT::getIntegerVT(8))));
1974 }
1975
1976 VectorType *VecTy = cast<VectorType>(V->getType());
1977
1978 // Now that we know the number and type of the elements, get that number of
1979 // elements into the Ops array based on what kind of constant it is.
1980 if (const ConstantVector *CV = dyn_cast<ConstantVector>(C)) {
1982 unsigned NumElements = cast<FixedVectorType>(VecTy)->getNumElements();
1983 for (unsigned i = 0; i != NumElements; ++i)
1984 Ops.push_back(getValue(CV->getOperand(i)));
1985
1986 return DAG.getBuildVector(VT, getCurSDLoc(), Ops);
1987 }
1988
1990 EVT EltVT =
1991 TLI.getValueType(DAG.getDataLayout(), VecTy->getElementType());
1992
1993 SDValue Op;
1994 if (EltVT.isFloatingPoint())
1995 Op = DAG.getConstantFP(0, getCurSDLoc(), EltVT);
1996 else
1997 Op = DAG.getConstant(0, getCurSDLoc(), EltVT);
1998
1999 return DAG.getSplat(VT, getCurSDLoc(), Op);
2000 }
2001
2002 llvm_unreachable("Unknown vector constant");
2003 }
2004
2005 // If this is a static alloca, generate it as the frameindex instead of
2006 // computation.
2007 if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
2009 FuncInfo.StaticAllocaMap.find(AI);
2010 if (SI != FuncInfo.StaticAllocaMap.end())
2011 return DAG.getFrameIndex(
2012 SI->second, TLI.getValueType(DAG.getDataLayout(), AI->getType()));
2013 }
2014
2015 // If this is an instruction which fast-isel has deferred, select it now.
2016 if (const Instruction *Inst = dyn_cast<Instruction>(V)) {
2017 Register InReg = FuncInfo.InitializeRegForValue(Inst);
2018
2019 std::optional<CallingConv::ID> CallConv;
2020 auto *CB = dyn_cast<CallBase>(Inst);
2021 if (CB && !CB->isInlineAsm())
2022 CallConv = CB->getCallingConv();
2023
2024 RegsForValue RFV(*DAG.getContext(), TLI, DAG.getDataLayout(), InReg,
2025 Inst->getType(), CallConv);
2026 SDValue Chain = DAG.getEntryNode();
2027 return RFV.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(), Chain, nullptr, V);
2028 }
2029
2030 if (const MetadataAsValue *MD = dyn_cast<MetadataAsValue>(V))
2031 return DAG.getMDNode(cast<MDNode>(MD->getMetadata()));
2032
2033 if (const auto *BB = dyn_cast<BasicBlock>(V))
2034 return DAG.getBasicBlock(FuncInfo.getMBB(BB));
2035
2036 llvm_unreachable("Can't get register for value!");
2037}
2038
2039void SelectionDAGBuilder::visitCatchPad(const CatchPadInst &I) {
2041 bool IsMSVCCXX = Pers == EHPersonality::MSVC_CXX;
2042 bool IsCoreCLR = Pers == EHPersonality::CoreCLR;
2043 bool IsSEH = isAsynchronousEHPersonality(Pers);
2044 MachineBasicBlock *CatchPadMBB = FuncInfo.MBB;
2045 if (IsSEH) {
2046 // For SEH, EHCont Guard needs to know that this catchpad is a target.
2047 CatchPadMBB->setIsEHContTarget(true);
2049 } else
2050 CatchPadMBB->setIsEHScopeEntry();
2051 // In MSVC C++ and CoreCLR, catchblocks are funclets and need prologues.
2052 if (IsMSVCCXX || IsCoreCLR)
2053 CatchPadMBB->setIsEHFuncletEntry();
2054}
2055
2056void SelectionDAGBuilder::visitCatchRet(const CatchReturnInst &I) {
2057 // Update machine-CFG edge.
2058 MachineBasicBlock *TargetMBB = FuncInfo.getMBB(I.getSuccessor());
2059 FuncInfo.MBB->addSuccessor(TargetMBB);
2060
2061 auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn());
2062 bool IsSEH = isAsynchronousEHPersonality(Pers);
2063 if (IsSEH) {
2064 // If this is not a fall-through branch or optimizations are switched off,
2065 // emit the branch.
2066 if (TargetMBB != NextBlock(FuncInfo.MBB) ||
2067 TM.getOptLevel() == CodeGenOptLevel::None)
2068 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
2069 getControlRoot(), DAG.getBasicBlock(TargetMBB)));
2070 return;
2071 }
2072
2073 // For non-SEH, EHCont Guard needs to know that this catchret is a target.
2074 TargetMBB->setIsEHContTarget(true);
2075 DAG.getMachineFunction().setHasEHContTarget(true);
2076
2077 // Figure out the funclet membership for the catchret's successor.
2078 // This will be used by the FuncletLayout pass to determine how to order the
2079 // BB's.
2080 // A 'catchret' returns to the outer scope's color.
2081 Value *ParentPad = I.getCatchSwitchParentPad();
2082 const BasicBlock *SuccessorColor;
2083 if (isa<ConstantTokenNone>(ParentPad))
2084 SuccessorColor = &FuncInfo.Fn->getEntryBlock();
2085 else
2086 SuccessorColor = cast<Instruction>(ParentPad)->getParent();
2087 assert(SuccessorColor && "No parent funclet for catchret!");
2088 MachineBasicBlock *SuccessorColorMBB = FuncInfo.getMBB(SuccessorColor);
2089 assert(SuccessorColorMBB && "No MBB for SuccessorColor!");
2090
2091 // Create the terminator node.
2092 SDValue Ret = DAG.getNode(ISD::CATCHRET, getCurSDLoc(), MVT::Other,
2093 getControlRoot(), DAG.getBasicBlock(TargetMBB),
2094 DAG.getBasicBlock(SuccessorColorMBB));
2095 DAG.setRoot(Ret);
2096}
2097
2098void SelectionDAGBuilder::visitCleanupPad(const CleanupPadInst &CPI) {
2099 // Don't emit any special code for the cleanuppad instruction. It just marks
2100 // the start of an EH scope/funclet.
2101 FuncInfo.MBB->setIsEHScopeEntry();
2102 auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn());
2103 if (Pers != EHPersonality::Wasm_CXX) {
2104 FuncInfo.MBB->setIsEHFuncletEntry();
2105 FuncInfo.MBB->setIsCleanupFuncletEntry();
2106 }
2107}
2108
2109/// When an invoke or a cleanupret unwinds to the next EH pad, there are
2110/// many places it could ultimately go. In the IR, we have a single unwind
2111/// destination, but in the machine CFG, we enumerate all the possible blocks.
2112/// This function skips over imaginary basic blocks that hold catchswitch
2113/// instructions, and finds all the "real" machine
2114/// basic block destinations. As those destinations may not be successors of
2115/// EHPadBB, here we also calculate the edge probability to those destinations.
2116/// The passed-in Prob is the edge probability to EHPadBB.
2118 FunctionLoweringInfo &FuncInfo, const BasicBlock *EHPadBB,
2119 BranchProbability Prob,
2120 SmallVectorImpl<std::pair<MachineBasicBlock *, BranchProbability>>
2121 &UnwindDests) {
2122 EHPersonality Personality =
2124 bool IsMSVCCXX = Personality == EHPersonality::MSVC_CXX;
2125 bool IsCoreCLR = Personality == EHPersonality::CoreCLR;
2126 bool IsWasmCXX = Personality == EHPersonality::Wasm_CXX;
2127 bool IsSEH = isAsynchronousEHPersonality(Personality);
2128
2129 while (EHPadBB) {
2131 BasicBlock *NewEHPadBB = nullptr;
2132 if (isa<LandingPadInst>(Pad)) {
2133 // Stop on landingpads. They are not funclets.
2134 UnwindDests.emplace_back(FuncInfo.getMBB(EHPadBB), Prob);
2135 break;
2136 } else if (isa<CleanupPadInst>(Pad)) {
2137 // Stop on cleanup pads. Cleanups are always funclet entries for all known
2138 // personalities except Wasm. And in Wasm this becomes a catch_all(_ref),
2139 // which always catches an exception.
2140 UnwindDests.emplace_back(FuncInfo.getMBB(EHPadBB), Prob);
2141 UnwindDests.back().first->setIsEHScopeEntry();
2142 // In Wasm, EH scopes are not funclets
2143 if (!IsWasmCXX)
2144 UnwindDests.back().first->setIsEHFuncletEntry();
2145 break;
2146 } else if (const auto *CatchSwitch = dyn_cast<CatchSwitchInst>(Pad)) {
2147 // Add the catchpad handlers to the possible destinations.
2148 for (const BasicBlock *CatchPadBB : CatchSwitch->handlers()) {
2149 UnwindDests.emplace_back(FuncInfo.getMBB(CatchPadBB), Prob);
2150 // For MSVC++ and the CLR, catchblocks are funclets and need prologues.
2151 if (IsMSVCCXX || IsCoreCLR)
2152 UnwindDests.back().first->setIsEHFuncletEntry();
2153 if (!IsSEH)
2154 UnwindDests.back().first->setIsEHScopeEntry();
2155 }
2156 NewEHPadBB = CatchSwitch->getUnwindDest();
2157 } else {
2158 continue;
2159 }
2160
2161 BranchProbabilityInfo *BPI = FuncInfo.BPI;
2162 if (BPI && NewEHPadBB)
2163 Prob *= BPI->getEdgeProbability(EHPadBB, NewEHPadBB);
2164 EHPadBB = NewEHPadBB;
2165 }
2166}
2167
2168void SelectionDAGBuilder::visitCleanupRet(const CleanupReturnInst &I) {
2169 // Update successor info.
2171 auto UnwindDest = I.getUnwindDest();
2172 BranchProbabilityInfo *BPI = FuncInfo.BPI;
2173 BranchProbability UnwindDestProb =
2174 (BPI && UnwindDest)
2175 ? BPI->getEdgeProbability(FuncInfo.MBB->getBasicBlock(), UnwindDest)
2177 findUnwindDestinations(FuncInfo, UnwindDest, UnwindDestProb, UnwindDests);
2178 for (auto &UnwindDest : UnwindDests) {
2179 UnwindDest.first->setIsEHPad();
2180 addSuccessorWithProb(FuncInfo.MBB, UnwindDest.first, UnwindDest.second);
2181 }
2182 FuncInfo.MBB->normalizeSuccProbs();
2183
2184 // Create the terminator node.
2185 MachineBasicBlock *CleanupPadMBB =
2186 FuncInfo.getMBB(I.getCleanupPad()->getParent());
2187 SDValue Ret = DAG.getNode(ISD::CLEANUPRET, getCurSDLoc(), MVT::Other,
2188 getControlRoot(), DAG.getBasicBlock(CleanupPadMBB));
2189 DAG.setRoot(Ret);
2190}
2191
2192void SelectionDAGBuilder::visitCatchSwitch(const CatchSwitchInst &CSI) {
2193 report_fatal_error("visitCatchSwitch not yet implemented!");
2194}
2195
2196void SelectionDAGBuilder::visitRet(const ReturnInst &I) {
2197 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
2198 auto &DL = DAG.getDataLayout();
2199 SDValue Chain = getControlRoot();
2202
2203 // Calls to @llvm.experimental.deoptimize don't generate a return value, so
2204 // lower
2205 //
2206 // %val = call <ty> @llvm.experimental.deoptimize()
2207 // ret <ty> %val
2208 //
2209 // differently.
2210 if (I.getParent()->getTerminatingDeoptimizeCall()) {
2212 return;
2213 }
2214
2215 if (!FuncInfo.CanLowerReturn) {
2216 Register DemoteReg = FuncInfo.DemoteRegister;
2217
2218 // Emit a store of the return value through the virtual register.
2219 // Leave Outs empty so that LowerReturn won't try to load return
2220 // registers the usual way.
2221 MVT PtrValueVT = TLI.getPointerTy(DL, DL.getAllocaAddrSpace());
2222 SDValue RetPtr =
2223 DAG.getCopyFromReg(Chain, getCurSDLoc(), DemoteReg, PtrValueVT);
2224 SDValue RetOp = getValue(I.getOperand(0));
2225
2226 SmallVector<EVT, 4> ValueVTs, MemVTs;
2227 SmallVector<uint64_t, 4> Offsets;
2228 ComputeValueVTs(TLI, DL, I.getOperand(0)->getType(), ValueVTs, &MemVTs,
2229 &Offsets, 0);
2230 unsigned NumValues = ValueVTs.size();
2231
2232 SmallVector<SDValue, 4> Chains(NumValues);
2233 Align BaseAlign = DL.getPrefTypeAlign(I.getOperand(0)->getType());
2234 for (unsigned i = 0; i != NumValues; ++i) {
2235 // An aggregate return value cannot wrap around the address space, so
2236 // offsets to its parts don't wrap either.
2237 SDValue Ptr = DAG.getObjectPtrOffset(getCurSDLoc(), RetPtr,
2238 TypeSize::getFixed(Offsets[i]));
2239
2240 SDValue Val = RetOp.getValue(RetOp.getResNo() + i);
2241 if (MemVTs[i] != ValueVTs[i])
2242 Val = DAG.getPtrExtOrTrunc(Val, getCurSDLoc(), MemVTs[i]);
2243 Chains[i] = DAG.getStore(
2244 Chain, getCurSDLoc(), Val,
2245 // FIXME: better loc info would be nice.
2246 Ptr, MachinePointerInfo::getUnknownStack(DAG.getMachineFunction()),
2247 commonAlignment(BaseAlign, Offsets[i]));
2248 }
2249
2250 Chain = DAG.getNode(ISD::TokenFactor, getCurSDLoc(),
2251 MVT::Other, Chains);
2252 } else if (I.getNumOperands() != 0) {
2254 ComputeValueTypes(DL, I.getOperand(0)->getType(), Types);
2255 unsigned NumValues = Types.size();
2256 if (NumValues) {
2257 SDValue RetOp = getValue(I.getOperand(0));
2258
2259 const Function *F = I.getParent()->getParent();
2260
2261 bool NeedsRegBlock = TLI.functionArgumentNeedsConsecutiveRegisters(
2262 I.getOperand(0)->getType(), F->getCallingConv(),
2263 /*IsVarArg*/ false, DL);
2264
2265 ISD::NodeType ExtendKind = ISD::ANY_EXTEND;
2266 if (F->getAttributes().hasRetAttr(Attribute::SExt))
2267 ExtendKind = ISD::SIGN_EXTEND;
2268 else if (F->getAttributes().hasRetAttr(Attribute::ZExt))
2269 ExtendKind = ISD::ZERO_EXTEND;
2270
2271 LLVMContext &Context = F->getContext();
2272 bool RetInReg = F->getAttributes().hasRetAttr(Attribute::InReg);
2273
2274 for (unsigned j = 0; j != NumValues; ++j) {
2275 EVT VT = TLI.getValueType(DL, Types[j]);
2276
2277 if (ExtendKind != ISD::ANY_EXTEND && VT.isInteger())
2278 VT = TLI.getTypeForExtReturn(Context, VT, ExtendKind);
2279
2280 CallingConv::ID CC = F->getCallingConv();
2281
2282 unsigned NumParts = TLI.getNumRegistersForCallingConv(Context, CC, VT);
2283 MVT PartVT = TLI.getRegisterTypeForCallingConv(Context, CC, VT);
2284 SmallVector<SDValue, 4> Parts(NumParts);
2286 SDValue(RetOp.getNode(), RetOp.getResNo() + j),
2287 &Parts[0], NumParts, PartVT, &I, CC, ExtendKind);
2288
2289 // 'inreg' on function refers to return value
2290 ISD::ArgFlagsTy Flags = ISD::ArgFlagsTy();
2291 if (RetInReg)
2292 Flags.setInReg();
2293
2294 if (I.getOperand(0)->getType()->isPointerTy()) {
2295 Flags.setPointer();
2296 Flags.setPointerAddrSpace(
2297 cast<PointerType>(I.getOperand(0)->getType())->getAddressSpace());
2298 }
2299
2300 if (NeedsRegBlock) {
2301 Flags.setInConsecutiveRegs();
2302 if (j == NumValues - 1)
2303 Flags.setInConsecutiveRegsLast();
2304 }
2305
2306 // Propagate extension type if any
2307 if (ExtendKind == ISD::SIGN_EXTEND)
2308 Flags.setSExt();
2309 else if (ExtendKind == ISD::ZERO_EXTEND)
2310 Flags.setZExt();
2311 else if (F->getAttributes().hasRetAttr(Attribute::NoExt))
2312 Flags.setNoExt();
2313
2314 for (unsigned i = 0; i < NumParts; ++i) {
2315 Outs.push_back(ISD::OutputArg(Flags,
2316 Parts[i].getValueType().getSimpleVT(),
2317 VT, Types[j], 0, 0));
2318 OutVals.push_back(Parts[i]);
2319 }
2320 }
2321 }
2322 }
2323
2324 // Push in swifterror virtual register as the last element of Outs. This makes
2325 // sure swifterror virtual register will be returned in the swifterror
2326 // physical register.
2327 const Function *F = I.getParent()->getParent();
2328 if (TLI.supportSwiftError() &&
2329 F->getAttributes().hasAttrSomewhere(Attribute::SwiftError)) {
2330 assert(SwiftError.getFunctionArg() && "Need a swift error argument");
2331 ISD::ArgFlagsTy Flags = ISD::ArgFlagsTy();
2332 Flags.setSwiftError();
2333 Outs.push_back(ISD::OutputArg(Flags, /*vt=*/TLI.getPointerTy(DL),
2334 /*argvt=*/EVT(TLI.getPointerTy(DL)),
2335 PointerType::getUnqual(*DAG.getContext()),
2336 /*origidx=*/1, /*partOffs=*/0));
2337 // Create SDNode for the swifterror virtual register.
2338 OutVals.push_back(
2339 DAG.getRegister(SwiftError.getOrCreateVRegUseAt(
2340 &I, FuncInfo.MBB, SwiftError.getFunctionArg()),
2341 EVT(TLI.getPointerTy(DL))));
2342 }
2343
2344 bool isVarArg = DAG.getMachineFunction().getFunction().isVarArg();
2345 CallingConv::ID CallConv =
2346 DAG.getMachineFunction().getFunction().getCallingConv();
2347 Chain = DAG.getTargetLoweringInfo().LowerReturn(
2348 Chain, CallConv, isVarArg, Outs, OutVals, getCurSDLoc(), DAG);
2349
2350 // Verify that the target's LowerReturn behaved as expected.
2351 assert(Chain.getNode() && Chain.getValueType() == MVT::Other &&
2352 "LowerReturn didn't return a valid chain!");
2353
2354 // Update the DAG with the new chain value resulting from return lowering.
2355 DAG.setRoot(Chain);
2356}
2357
2358/// CopyToExportRegsIfNeeded - If the given value has virtual registers
2359/// created for it, emit nodes to copy the value into the virtual
2360/// registers.
2362 // Skip empty types
2363 if (V->getType()->isEmptyTy())
2364 return;
2365
2367 if (VMI != FuncInfo.ValueMap.end()) {
2368 assert((!V->use_empty() || isa<CallBrInst>(V)) &&
2369 "Unused value assigned virtual registers!");
2370 CopyValueToVirtualRegister(V, VMI->second);
2371 }
2372}
2373
2374/// ExportFromCurrentBlock - If this condition isn't known to be exported from
2375/// the current basic block, add it to ValueMap now so that we'll get a
2376/// CopyTo/FromReg.
2378 // No need to export constants.
2379 if (!isa<Instruction>(V) && !isa<Argument>(V)) return;
2380
2381 // Already exported?
2382 if (FuncInfo.isExportedInst(V)) return;
2383
2384 Register Reg = FuncInfo.InitializeRegForValue(V);
2386}
2387
2389 const BasicBlock *FromBB) {
2390 // The operands of the setcc have to be in this block. We don't know
2391 // how to export them from some other block.
2392 if (const Instruction *VI = dyn_cast<Instruction>(V)) {
2393 // Can export from current BB.
2394 if (VI->getParent() == FromBB)
2395 return true;
2396
2397 // Is already exported, noop.
2398 return FuncInfo.isExportedInst(V);
2399 }
2400
2401 // If this is an argument, we can export it if the BB is the entry block or
2402 // if it is already exported.
2403 if (isa<Argument>(V)) {
2404 if (FromBB->isEntryBlock())
2405 return true;
2406
2407 // Otherwise, can only export this if it is already exported.
2408 return FuncInfo.isExportedInst(V);
2409 }
2410
2411 // Otherwise, constants can always be exported.
2412 return true;
2413}
2414
2415/// Return branch probability calculated by BranchProbabilityInfo for IR blocks.
2417SelectionDAGBuilder::getEdgeProbability(const MachineBasicBlock *Src,
2418 const MachineBasicBlock *Dst) const {
2420 const BasicBlock *SrcBB = Src->getBasicBlock();
2421 const BasicBlock *DstBB = Dst->getBasicBlock();
2422 if (!BPI) {
2423 // If BPI is not available, set the default probability as 1 / N, where N is
2424 // the number of successors.
2425 auto SuccSize = std::max<uint32_t>(succ_size(SrcBB), 1);
2426 return BranchProbability(1, SuccSize);
2427 }
2428 return BPI->getEdgeProbability(SrcBB, DstBB);
2429}
2430
2431void SelectionDAGBuilder::addSuccessorWithProb(MachineBasicBlock *Src,
2432 MachineBasicBlock *Dst,
2433 BranchProbability Prob) {
2434 if (!FuncInfo.BPI)
2435 Src->addSuccessorWithoutProb(Dst);
2436 else {
2437 if (Prob.isUnknown())
2438 Prob = getEdgeProbability(Src, Dst);
2439 Src->addSuccessor(Dst, Prob);
2440 }
2441}
2442
2443static bool InBlock(const Value *V, const BasicBlock *BB) {
2444 if (const Instruction *I = dyn_cast<Instruction>(V))
2445 return I->getParent() == BB;
2446 return true;
2447}
2448
2449/// EmitBranchForMergedCondition - Helper method for FindMergedConditions.
2450/// This function emits a branch and is used at the leaves of an OR or an
2451/// AND operator tree.
2452void
2455 MachineBasicBlock *FBB,
2456 MachineBasicBlock *CurBB,
2457 MachineBasicBlock *SwitchBB,
2458 BranchProbability TProb,
2459 BranchProbability FProb,
2460 bool InvertCond) {
2461 const BasicBlock *BB = CurBB->getBasicBlock();
2462
2463 // If the leaf of the tree is a comparison, merge the condition into
2464 // the caseblock.
2465 if (const CmpInst *BOp = dyn_cast<CmpInst>(Cond)) {
2466 // The operands of the cmp have to be in this block. We don't know
2467 // how to export them from some other block. If this is the first block
2468 // of the sequence, no exporting is needed.
2469 if (CurBB == SwitchBB ||
2470 (isExportableFromCurrentBlock(BOp->getOperand(0), BB) &&
2471 isExportableFromCurrentBlock(BOp->getOperand(1), BB))) {
2472 ISD::CondCode Condition;
2473 if (const ICmpInst *IC = dyn_cast<ICmpInst>(Cond)) {
2474 ICmpInst::Predicate Pred =
2475 InvertCond ? IC->getInversePredicate() : IC->getPredicate();
2476 Condition = getICmpCondCode(Pred);
2477 } else {
2478 const FCmpInst *FC = cast<FCmpInst>(Cond);
2479 FCmpInst::Predicate Pred =
2480 InvertCond ? FC->getInversePredicate() : FC->getPredicate();
2481 Condition = getFCmpCondCode(Pred);
2482 if (TM.Options.NoNaNsFPMath)
2483 Condition = getFCmpCodeWithoutNaN(Condition);
2484 }
2485
2486 CaseBlock CB(Condition, BOp->getOperand(0), BOp->getOperand(1), nullptr,
2487 TBB, FBB, CurBB, getCurSDLoc(), TProb, FProb);
2488 SL->SwitchCases.push_back(CB);
2489 return;
2490 }
2491 }
2492
2493 // Create a CaseBlock record representing this branch.
2494 ISD::CondCode Opc = InvertCond ? ISD::SETNE : ISD::SETEQ;
2495 CaseBlock CB(Opc, Cond, ConstantInt::getTrue(*DAG.getContext()),
2496 nullptr, TBB, FBB, CurBB, getCurSDLoc(), TProb, FProb);
2497 SL->SwitchCases.push_back(CB);
2498}
2499
2500// Collect dependencies on V recursively. This is used for the cost analysis in
2501// `shouldKeepJumpConditionsTogether`.
2505 unsigned Depth = 0) {
2506 // Return false if we have an incomplete count.
2508 return false;
2509
2510 auto *I = dyn_cast<Instruction>(V);
2511 if (I == nullptr)
2512 return true;
2513
2514 if (Necessary != nullptr) {
2515 // This instruction is necessary for the other side of the condition so
2516 // don't count it.
2517 if (Necessary->contains(I))
2518 return true;
2519 }
2520
2521 // Already added this dep.
2522 if (!Deps->try_emplace(I, false).second)
2523 return true;
2524
2525 for (unsigned OpIdx = 0, E = I->getNumOperands(); OpIdx < E; ++OpIdx)
2526 if (!collectInstructionDeps(Deps, I->getOperand(OpIdx), Necessary,
2527 Depth + 1))
2528 return false;
2529 return true;
2530}
2531
2534 Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs,
2536 if (I.getNumSuccessors() != 2)
2537 return false;
2538
2539 if (!I.isConditional())
2540 return false;
2541
2542 if (Params.BaseCost < 0)
2543 return false;
2544
2545 // Baseline cost.
2546 InstructionCost CostThresh = Params.BaseCost;
2547
2548 BranchProbabilityInfo *BPI = nullptr;
2549 if (Params.LikelyBias || Params.UnlikelyBias)
2550 BPI = FuncInfo.BPI;
2551 if (BPI != nullptr) {
2552 // See if we are either likely to get an early out or compute both lhs/rhs
2553 // of the condition.
2554 BasicBlock *IfFalse = I.getSuccessor(0);
2555 BasicBlock *IfTrue = I.getSuccessor(1);
2556
2557 std::optional<bool> Likely;
2558 if (BPI->isEdgeHot(I.getParent(), IfTrue))
2559 Likely = true;
2560 else if (BPI->isEdgeHot(I.getParent(), IfFalse))
2561 Likely = false;
2562
2563 if (Likely) {
2564 if (Opc == (*Likely ? Instruction::And : Instruction::Or))
2565 // Its likely we will have to compute both lhs and rhs of condition
2566 CostThresh += Params.LikelyBias;
2567 else {
2568 if (Params.UnlikelyBias < 0)
2569 return false;
2570 // Its likely we will get an early out.
2571 CostThresh -= Params.UnlikelyBias;
2572 }
2573 }
2574 }
2575
2576 if (CostThresh <= 0)
2577 return false;
2578
2579 // Collect "all" instructions that lhs condition is dependent on.
2580 // Use map for stable iteration (to avoid non-determanism of iteration of
2581 // SmallPtrSet). The `bool` value is just a dummy.
2583 collectInstructionDeps(&LhsDeps, Lhs);
2584 // Collect "all" instructions that rhs condition is dependent on AND are
2585 // dependencies of lhs. This gives us an estimate on which instructions we
2586 // stand to save by splitting the condition.
2587 if (!collectInstructionDeps(&RhsDeps, Rhs, &LhsDeps))
2588 return false;
2589 // Add the compare instruction itself unless its a dependency on the LHS.
2590 if (const auto *RhsI = dyn_cast<Instruction>(Rhs))
2591 if (!LhsDeps.contains(RhsI))
2592 RhsDeps.try_emplace(RhsI, false);
2593
2594 InstructionCost CostOfIncluding = 0;
2595 // See if this instruction will need to computed independently of whether RHS
2596 // is.
2597 Value *BrCond = I.getCondition();
2598 auto ShouldCountInsn = [&RhsDeps, &BrCond](const Instruction *Ins) {
2599 for (const auto *U : Ins->users()) {
2600 // If user is independent of RHS calculation we don't need to count it.
2601 if (auto *UIns = dyn_cast<Instruction>(U))
2602 if (UIns != BrCond && !RhsDeps.contains(UIns))
2603 return false;
2604 }
2605 return true;
2606 };
2607
2608 // Prune instructions from RHS Deps that are dependencies of unrelated
2609 // instructions. The value (SelectionDAG::MaxRecursionDepth) is fairly
2610 // arbitrary and just meant to cap the how much time we spend in the pruning
2611 // loop. Its highly unlikely to come into affect.
2612 const unsigned MaxPruneIters = SelectionDAG::MaxRecursionDepth;
2613 // Stop after a certain point. No incorrectness from including too many
2614 // instructions.
2615 for (unsigned PruneIters = 0; PruneIters < MaxPruneIters; ++PruneIters) {
2616 const Instruction *ToDrop = nullptr;
2617 for (const auto &InsPair : RhsDeps) {
2618 if (!ShouldCountInsn(InsPair.first)) {
2619 ToDrop = InsPair.first;
2620 break;
2621 }
2622 }
2623 if (ToDrop == nullptr)
2624 break;
2625 RhsDeps.erase(ToDrop);
2626 }
2627
2628 for (const auto &InsPair : RhsDeps) {
2629 // Finally accumulate latency that we can only attribute to computing the
2630 // RHS condition. Use latency because we are essentially trying to calculate
2631 // the cost of the dependency chain.
2632 // Possible TODO: We could try to estimate ILP and make this more precise.
2633 CostOfIncluding += TTI->getInstructionCost(
2634 InsPair.first, TargetTransformInfo::TCK_Latency);
2635
2636 if (CostOfIncluding > CostThresh)
2637 return false;
2638 }
2639 return true;
2640}
2641
2644 MachineBasicBlock *FBB,
2645 MachineBasicBlock *CurBB,
2646 MachineBasicBlock *SwitchBB,
2648 BranchProbability TProb,
2649 BranchProbability FProb,
2650 bool InvertCond) {
2651 // Skip over not part of the tree and remember to invert op and operands at
2652 // next level.
2653 Value *NotCond;
2654 if (match(Cond, m_OneUse(m_Not(m_Value(NotCond)))) &&
2655 InBlock(NotCond, CurBB->getBasicBlock())) {
2656 FindMergedConditions(NotCond, TBB, FBB, CurBB, SwitchBB, Opc, TProb, FProb,
2657 !InvertCond);
2658 return;
2659 }
2660
2662 const Value *BOpOp0, *BOpOp1;
2663 // Compute the effective opcode for Cond, taking into account whether it needs
2664 // to be inverted, e.g.
2665 // and (not (or A, B)), C
2666 // gets lowered as
2667 // and (and (not A, not B), C)
2669 if (BOp) {
2670 BOpc = match(BOp, m_LogicalAnd(m_Value(BOpOp0), m_Value(BOpOp1)))
2671 ? Instruction::And
2672 : (match(BOp, m_LogicalOr(m_Value(BOpOp0), m_Value(BOpOp1)))
2673 ? Instruction::Or
2675 if (InvertCond) {
2676 if (BOpc == Instruction::And)
2677 BOpc = Instruction::Or;
2678 else if (BOpc == Instruction::Or)
2679 BOpc = Instruction::And;
2680 }
2681 }
2682
2683 // If this node is not part of the or/and tree, emit it as a branch.
2684 // Note that all nodes in the tree should have same opcode.
2685 bool BOpIsInOrAndTree = BOpc && BOpc == Opc && BOp->hasOneUse();
2686 if (!BOpIsInOrAndTree || BOp->getParent() != CurBB->getBasicBlock() ||
2687 !InBlock(BOpOp0, CurBB->getBasicBlock()) ||
2688 !InBlock(BOpOp1, CurBB->getBasicBlock())) {
2689 EmitBranchForMergedCondition(Cond, TBB, FBB, CurBB, SwitchBB,
2690 TProb, FProb, InvertCond);
2691 return;
2692 }
2693
2694 // Create TmpBB after CurBB.
2695 MachineFunction::iterator BBI(CurBB);
2696 MachineFunction &MF = DAG.getMachineFunction();
2698 CurBB->getParent()->insert(++BBI, TmpBB);
2699
2700 if (Opc == Instruction::Or) {
2701 // Codegen X | Y as:
2702 // BB1:
2703 // jmp_if_X TBB
2704 // jmp TmpBB
2705 // TmpBB:
2706 // jmp_if_Y TBB
2707 // jmp FBB
2708 //
2709
2710 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
2711 // The requirement is that
2712 // TrueProb for BB1 + (FalseProb for BB1 * TrueProb for TmpBB)
2713 // = TrueProb for original BB.
2714 // Assuming the original probabilities are A and B, one choice is to set
2715 // BB1's probabilities to A/2 and A/2+B, and set TmpBB's probabilities to
2716 // A/(1+B) and 2B/(1+B). This choice assumes that
2717 // TrueProb for BB1 == FalseProb for BB1 * TrueProb for TmpBB.
2718 // Another choice is to assume TrueProb for BB1 equals to TrueProb for
2719 // TmpBB, but the math is more complicated.
2720
2721 auto NewTrueProb = TProb / 2;
2722 auto NewFalseProb = TProb / 2 + FProb;
2723 // Emit the LHS condition.
2724 FindMergedConditions(BOpOp0, TBB, TmpBB, CurBB, SwitchBB, Opc, NewTrueProb,
2725 NewFalseProb, InvertCond);
2726
2727 // Normalize A/2 and B to get A/(1+B) and 2B/(1+B).
2728 SmallVector<BranchProbability, 2> Probs{TProb / 2, FProb};
2730 // Emit the RHS condition into TmpBB.
2731 FindMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
2732 Probs[1], InvertCond);
2733 } else {
2734 assert(Opc == Instruction::And && "Unknown merge op!");
2735 // Codegen X & Y as:
2736 // BB1:
2737 // jmp_if_X TmpBB
2738 // jmp FBB
2739 // TmpBB:
2740 // jmp_if_Y TBB
2741 // jmp FBB
2742 //
2743 // This requires creation of TmpBB after CurBB.
2744
2745 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
2746 // The requirement is that
2747 // FalseProb for BB1 + (TrueProb for BB1 * FalseProb for TmpBB)
2748 // = FalseProb for original BB.
2749 // Assuming the original probabilities are A and B, one choice is to set
2750 // BB1's probabilities to A+B/2 and B/2, and set TmpBB's probabilities to
2751 // 2A/(1+A) and B/(1+A). This choice assumes that FalseProb for BB1 ==
2752 // TrueProb for BB1 * FalseProb for TmpBB.
2753
2754 auto NewTrueProb = TProb + FProb / 2;
2755 auto NewFalseProb = FProb / 2;
2756 // Emit the LHS condition.
2757 FindMergedConditions(BOpOp0, TmpBB, FBB, CurBB, SwitchBB, Opc, NewTrueProb,
2758 NewFalseProb, InvertCond);
2759
2760 // Normalize A and B/2 to get 2A/(1+A) and B/(1+A).
2761 SmallVector<BranchProbability, 2> Probs{TProb, FProb / 2};
2763 // Emit the RHS condition into TmpBB.
2764 FindMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
2765 Probs[1], InvertCond);
2766 }
2767}
2768
2769/// If the set of cases should be emitted as a series of branches, return true.
2770/// If we should emit this as a bunch of and/or'd together conditions, return
2771/// false.
2772bool
2773SelectionDAGBuilder::ShouldEmitAsBranches(const std::vector<CaseBlock> &Cases) {
2774 if (Cases.size() != 2) return true;
2775
2776 // If this is two comparisons of the same values or'd or and'd together, they
2777 // will get folded into a single comparison, so don't emit two blocks.
2778 if ((Cases[0].CmpLHS == Cases[1].CmpLHS &&
2779 Cases[0].CmpRHS == Cases[1].CmpRHS) ||
2780 (Cases[0].CmpRHS == Cases[1].CmpLHS &&
2781 Cases[0].CmpLHS == Cases[1].CmpRHS)) {
2782 return false;
2783 }
2784
2785 // Handle: (X != null) | (Y != null) --> (X|Y) != 0
2786 // Handle: (X == null) & (Y == null) --> (X|Y) == 0
2787 if (Cases[0].CmpRHS == Cases[1].CmpRHS &&
2788 Cases[0].CC == Cases[1].CC &&
2789 isa<Constant>(Cases[0].CmpRHS) &&
2790 cast<Constant>(Cases[0].CmpRHS)->isNullValue()) {
2791 if (Cases[0].CC == ISD::SETEQ && Cases[0].TrueBB == Cases[1].ThisBB)
2792 return false;
2793 if (Cases[0].CC == ISD::SETNE && Cases[0].FalseBB == Cases[1].ThisBB)
2794 return false;
2795 }
2796
2797 return true;
2798}
2799
2800void SelectionDAGBuilder::visitBr(const BranchInst &I) {
2802
2803 // Update machine-CFG edges.
2804 MachineBasicBlock *Succ0MBB = FuncInfo.getMBB(I.getSuccessor(0));
2805
2806 if (I.isUnconditional()) {
2807 // Update machine-CFG edges.
2808 BrMBB->addSuccessor(Succ0MBB);
2809
2810 // If this is not a fall-through branch or optimizations are switched off,
2811 // emit the branch.
2812 if (Succ0MBB != NextBlock(BrMBB) ||
2814 auto Br = DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
2815 getControlRoot(), DAG.getBasicBlock(Succ0MBB));
2816 setValue(&I, Br);
2817 DAG.setRoot(Br);
2818 }
2819
2820 return;
2821 }
2822
2823 // If this condition is one of the special cases we handle, do special stuff
2824 // now.
2825 const Value *CondVal = I.getCondition();
2826 MachineBasicBlock *Succ1MBB = FuncInfo.getMBB(I.getSuccessor(1));
2827
2828 // If this is a series of conditions that are or'd or and'd together, emit
2829 // this as a sequence of branches instead of setcc's with and/or operations.
2830 // As long as jumps are not expensive (exceptions for multi-use logic ops,
2831 // unpredictable branches, and vector extracts because those jumps are likely
2832 // expensive for any target), this should improve performance.
2833 // For example, instead of something like:
2834 // cmp A, B
2835 // C = seteq
2836 // cmp D, E
2837 // F = setle
2838 // or C, F
2839 // jnz foo
2840 // Emit:
2841 // cmp A, B
2842 // je foo
2843 // cmp D, E
2844 // jle foo
2845 bool IsUnpredictable = I.hasMetadata(LLVMContext::MD_unpredictable);
2846 const Instruction *BOp = dyn_cast<Instruction>(CondVal);
2847 if (!DAG.getTargetLoweringInfo().isJumpExpensive() && BOp &&
2848 BOp->hasOneUse() && !IsUnpredictable) {
2849 Value *Vec;
2850 const Value *BOp0, *BOp1;
2852 if (match(BOp, m_LogicalAnd(m_Value(BOp0), m_Value(BOp1))))
2853 Opcode = Instruction::And;
2854 else if (match(BOp, m_LogicalOr(m_Value(BOp0), m_Value(BOp1))))
2855 Opcode = Instruction::Or;
2856
2857 if (Opcode &&
2858 !(match(BOp0, m_ExtractElt(m_Value(Vec), m_Value())) &&
2859 match(BOp1, m_ExtractElt(m_Specific(Vec), m_Value()))) &&
2861 FuncInfo, I, Opcode, BOp0, BOp1,
2862 DAG.getTargetLoweringInfo().getJumpConditionMergingParams(
2863 Opcode, BOp0, BOp1))) {
2864 FindMergedConditions(BOp, Succ0MBB, Succ1MBB, BrMBB, BrMBB, Opcode,
2865 getEdgeProbability(BrMBB, Succ0MBB),
2866 getEdgeProbability(BrMBB, Succ1MBB),
2867 /*InvertCond=*/false);
2868 // If the compares in later blocks need to use values not currently
2869 // exported from this block, export them now. This block should always
2870 // be the first entry.
2871 assert(SL->SwitchCases[0].ThisBB == BrMBB && "Unexpected lowering!");
2872
2873 // Allow some cases to be rejected.
2874 if (ShouldEmitAsBranches(SL->SwitchCases)) {
2875 for (unsigned i = 1, e = SL->SwitchCases.size(); i != e; ++i) {
2876 ExportFromCurrentBlock(SL->SwitchCases[i].CmpLHS);
2877 ExportFromCurrentBlock(SL->SwitchCases[i].CmpRHS);
2878 }
2879
2880 // Emit the branch for this block.
2881 visitSwitchCase(SL->SwitchCases[0], BrMBB);
2882 SL->SwitchCases.erase(SL->SwitchCases.begin());
2883 return;
2884 }
2885
2886 // Okay, we decided not to do this, remove any inserted MBB's and clear
2887 // SwitchCases.
2888 for (unsigned i = 1, e = SL->SwitchCases.size(); i != e; ++i)
2889 FuncInfo.MF->erase(SL->SwitchCases[i].ThisBB);
2890
2891 SL->SwitchCases.clear();
2892 }
2893 }
2894
2895 // Create a CaseBlock record representing this branch.
2896 CaseBlock CB(ISD::SETEQ, CondVal, ConstantInt::getTrue(*DAG.getContext()),
2897 nullptr, Succ0MBB, Succ1MBB, BrMBB, getCurSDLoc(),
2899 IsUnpredictable);
2900
2901 // Use visitSwitchCase to actually insert the fast branch sequence for this
2902 // cond branch.
2903 visitSwitchCase(CB, BrMBB);
2904}
2905
2906/// visitSwitchCase - Emits the necessary code to represent a single node in
2907/// the binary search tree resulting from lowering a switch instruction.
2909 MachineBasicBlock *SwitchBB) {
2910 SDValue Cond;
2911 SDValue CondLHS = getValue(CB.CmpLHS);
2912 SDLoc dl = CB.DL;
2913
2914 if (CB.CC == ISD::SETTRUE) {
2915 // Branch or fall through to TrueBB.
2916 addSuccessorWithProb(SwitchBB, CB.TrueBB, CB.TrueProb);
2917 SwitchBB->normalizeSuccProbs();
2918 if (CB.TrueBB != NextBlock(SwitchBB)) {
2919 DAG.setRoot(DAG.getNode(ISD::BR, dl, MVT::Other, getControlRoot(),
2920 DAG.getBasicBlock(CB.TrueBB)));
2921 }
2922 return;
2923 }
2924
2925 auto &TLI = DAG.getTargetLoweringInfo();
2926 EVT MemVT = TLI.getMemValueType(DAG.getDataLayout(), CB.CmpLHS->getType());
2927
2928 // Build the setcc now.
2929 if (!CB.CmpMHS) {
2930 // Fold "(X == true)" to X and "(X == false)" to !X to
2931 // handle common cases produced by branch lowering.
2932 if (CB.CmpRHS == ConstantInt::getTrue(*DAG.getContext()) &&
2933 CB.CC == ISD::SETEQ)
2934 Cond = CondLHS;
2935 else if (CB.CmpRHS == ConstantInt::getFalse(*DAG.getContext()) &&
2936 CB.CC == ISD::SETEQ) {
2937 SDValue True = DAG.getConstant(1, dl, CondLHS.getValueType());
2938 Cond = DAG.getNode(ISD::XOR, dl, CondLHS.getValueType(), CondLHS, True);
2939 } else {
2940 SDValue CondRHS = getValue(CB.CmpRHS);
2941
2942 // If a pointer's DAG type is larger than its memory type then the DAG
2943 // values are zero-extended. This breaks signed comparisons so truncate
2944 // back to the underlying type before doing the compare.
2945 if (CondLHS.getValueType() != MemVT) {
2946 CondLHS = DAG.getPtrExtOrTrunc(CondLHS, getCurSDLoc(), MemVT);
2947 CondRHS = DAG.getPtrExtOrTrunc(CondRHS, getCurSDLoc(), MemVT);
2948 }
2949 Cond = DAG.getSetCC(dl, MVT::i1, CondLHS, CondRHS, CB.CC);
2950 }
2951 } else {
2952 assert(CB.CC == ISD::SETLE && "Can handle only LE ranges now");
2953
2954 const APInt& Low = cast<ConstantInt>(CB.CmpLHS)->getValue();
2955 const APInt& High = cast<ConstantInt>(CB.CmpRHS)->getValue();
2956
2957 SDValue CmpOp = getValue(CB.CmpMHS);
2958 EVT VT = CmpOp.getValueType();
2959
2960 if (cast<ConstantInt>(CB.CmpLHS)->isMinValue(true)) {
2961 Cond = DAG.getSetCC(dl, MVT::i1, CmpOp, DAG.getConstant(High, dl, VT),
2962 ISD::SETLE);
2963 } else {
2964 SDValue SUB = DAG.getNode(ISD::SUB, dl,
2965 VT, CmpOp, DAG.getConstant(Low, dl, VT));
2966 Cond = DAG.getSetCC(dl, MVT::i1, SUB,
2967 DAG.getConstant(High-Low, dl, VT), ISD::SETULE);
2968 }
2969 }
2970
2971 // Update successor info
2972 addSuccessorWithProb(SwitchBB, CB.TrueBB, CB.TrueProb);
2973 // TrueBB and FalseBB are always different unless the incoming IR is
2974 // degenerate. This only happens when running llc on weird IR.
2975 if (CB.TrueBB != CB.FalseBB)
2976 addSuccessorWithProb(SwitchBB, CB.FalseBB, CB.FalseProb);
2977 SwitchBB->normalizeSuccProbs();
2978
2979 // If the lhs block is the next block, invert the condition so that we can
2980 // fall through to the lhs instead of the rhs block.
2981 if (CB.TrueBB == NextBlock(SwitchBB)) {
2982 std::swap(CB.TrueBB, CB.FalseBB);
2983 SDValue True = DAG.getConstant(1, dl, Cond.getValueType());
2984 Cond = DAG.getNode(ISD::XOR, dl, Cond.getValueType(), Cond, True);
2985 }
2986
2987 SDNodeFlags Flags;
2989 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl, MVT::Other, getControlRoot(),
2990 Cond, DAG.getBasicBlock(CB.TrueBB), Flags);
2991
2992 setValue(CurInst, BrCond);
2993
2994 // Insert the false branch. Do this even if it's a fall through branch,
2995 // this makes it easier to do DAG optimizations which require inverting
2996 // the branch condition.
2997 BrCond = DAG.getNode(ISD::BR, dl, MVT::Other, BrCond,
2998 DAG.getBasicBlock(CB.FalseBB));
2999
3000 DAG.setRoot(BrCond);
3001}
3002
3003/// visitJumpTable - Emit JumpTable node in the current MBB
3005 // Emit the code for the jump table
3006 assert(JT.SL && "Should set SDLoc for SelectionDAG!");
3007 assert(JT.Reg && "Should lower JT Header first!");
3008 EVT PTy = DAG.getTargetLoweringInfo().getJumpTableRegTy(DAG.getDataLayout());
3009 SDValue Index = DAG.getCopyFromReg(getControlRoot(), *JT.SL, JT.Reg, PTy);
3010 SDValue Table = DAG.getJumpTable(JT.JTI, PTy);
3011 SDValue BrJumpTable = DAG.getNode(ISD::BR_JT, *JT.SL, MVT::Other,
3012 Index.getValue(1), Table, Index);
3013 DAG.setRoot(BrJumpTable);
3014}
3015
3016/// visitJumpTableHeader - This function emits necessary code to produce index
3017/// in the JumpTable from switch case.
3019 JumpTableHeader &JTH,
3020 MachineBasicBlock *SwitchBB) {
3021 assert(JT.SL && "Should set SDLoc for SelectionDAG!");
3022 const SDLoc &dl = *JT.SL;
3023
3024 // Subtract the lowest switch case value from the value being switched on.
3025 SDValue SwitchOp = getValue(JTH.SValue);
3026 EVT VT = SwitchOp.getValueType();
3027 SDValue Sub = DAG.getNode(ISD::SUB, dl, VT, SwitchOp,
3028 DAG.getConstant(JTH.First, dl, VT));
3029
3030 // The SDNode we just created, which holds the value being switched on minus
3031 // the smallest case value, needs to be copied to a virtual register so it
3032 // can be used as an index into the jump table in a subsequent basic block.
3033 // This value may be smaller or larger than the target's pointer type, and
3034 // therefore require extension or truncating.
3035 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3036 SwitchOp =
3037 DAG.getZExtOrTrunc(Sub, dl, TLI.getJumpTableRegTy(DAG.getDataLayout()));
3038
3039 Register JumpTableReg =
3040 FuncInfo.CreateReg(TLI.getJumpTableRegTy(DAG.getDataLayout()));
3041 SDValue CopyTo =
3042 DAG.getCopyToReg(getControlRoot(), dl, JumpTableReg, SwitchOp);
3043 JT.Reg = JumpTableReg;
3044
3045 if (!JTH.FallthroughUnreachable) {
3046 // Emit the range check for the jump table, and branch to the default block
3047 // for the switch statement if the value being switched on exceeds the
3048 // largest case in the switch.
3049 SDValue CMP = DAG.getSetCC(
3050 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
3051 Sub.getValueType()),
3052 Sub, DAG.getConstant(JTH.Last - JTH.First, dl, VT), ISD::SETUGT);
3053
3054 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl,
3055 MVT::Other, CopyTo, CMP,
3056 DAG.getBasicBlock(JT.Default));
3057
3058 // Avoid emitting unnecessary branches to the next block.
3059 if (JT.MBB != NextBlock(SwitchBB))
3060 BrCond = DAG.getNode(ISD::BR, dl, MVT::Other, BrCond,
3061 DAG.getBasicBlock(JT.MBB));
3062
3063 DAG.setRoot(BrCond);
3064 } else {
3065 // Avoid emitting unnecessary branches to the next block.
3066 if (JT.MBB != NextBlock(SwitchBB))
3067 DAG.setRoot(DAG.getNode(ISD::BR, dl, MVT::Other, CopyTo,
3068 DAG.getBasicBlock(JT.MBB)));
3069 else
3070 DAG.setRoot(CopyTo);
3071 }
3072}
3073
3074/// Create a LOAD_STACK_GUARD node, and let it carry the target specific global
3075/// variable if there exists one.
3077 SDValue &Chain) {
3078 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3079 EVT PtrTy = TLI.getPointerTy(DAG.getDataLayout());
3080 EVT PtrMemTy = TLI.getPointerMemTy(DAG.getDataLayout());
3084 DAG.getMachineNode(TargetOpcode::LOAD_STACK_GUARD, DL, PtrTy, Chain);
3085 if (Global) {
3086 MachinePointerInfo MPInfo(Global);
3090 MPInfo, Flags, PtrTy.getSizeInBits() / 8, DAG.getEVTAlign(PtrTy));
3091 DAG.setNodeMemRefs(Node, {MemRef});
3092 }
3093 if (PtrTy != PtrMemTy)
3094 return DAG.getPtrExtOrTrunc(SDValue(Node, 0), DL, PtrMemTy);
3095 return SDValue(Node, 0);
3096}
3097
3098/// Codegen a new tail for a stack protector check ParentMBB which has had its
3099/// tail spliced into a stack protector check success bb.
3100///
3101/// For a high level explanation of how this fits into the stack protector
3102/// generation see the comment on the declaration of class
3103/// StackProtectorDescriptor.
3105 MachineBasicBlock *ParentBB) {
3106
3107 // First create the loads to the guard/stack slot for the comparison.
3108 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3109 auto &DL = DAG.getDataLayout();
3110 EVT PtrTy = TLI.getFrameIndexTy(DL);
3111 EVT PtrMemTy = TLI.getPointerMemTy(DL, DL.getAllocaAddrSpace());
3112
3113 MachineFrameInfo &MFI = ParentBB->getParent()->getFrameInfo();
3114 int FI = MFI.getStackProtectorIndex();
3115
3116 SDValue Guard;
3117 SDLoc dl = getCurSDLoc();
3118 SDValue StackSlotPtr = DAG.getFrameIndex(FI, PtrTy);
3119 const Module &M = *ParentBB->getParent()->getFunction().getParent();
3120 Align Align = DL.getPrefTypeAlign(
3121 PointerType::get(M.getContext(), DL.getAllocaAddrSpace()));
3122
3123 // Generate code to load the content of the guard slot.
3124 SDValue GuardVal = DAG.getLoad(
3125 PtrMemTy, dl, DAG.getEntryNode(), StackSlotPtr,
3126 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI), Align,
3128
3129 if (TLI.useStackGuardMixCookie())
3130 GuardVal = TLI.emitStackGuardMixCookie(DAG, GuardVal, dl, false);
3131
3132 // If we're using function-based instrumentation, call the guard check
3133 // function
3135 // Get the guard check function from the target and verify it exists since
3136 // we're using function-based instrumentation
3137 const Function *GuardCheckFn = TLI.getSSPStackGuardCheck(M);
3138 assert(GuardCheckFn && "Guard check function is null");
3139
3140 // The target provides a guard check function to validate the guard value.
3141 // Generate a call to that function with the content of the guard slot as
3142 // argument.
3143 FunctionType *FnTy = GuardCheckFn->getFunctionType();
3144 assert(FnTy->getNumParams() == 1 && "Invalid function signature");
3145
3147 TargetLowering::ArgListEntry Entry(GuardVal, FnTy->getParamType(0));
3148 if (GuardCheckFn->hasParamAttribute(0, Attribute::AttrKind::InReg))
3149 Entry.IsInReg = true;
3150 Args.push_back(Entry);
3151
3154 .setChain(DAG.getEntryNode())
3155 .setCallee(GuardCheckFn->getCallingConv(), FnTy->getReturnType(),
3156 getValue(GuardCheckFn), std::move(Args));
3157
3158 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
3159 DAG.setRoot(Result.second);
3160 return;
3161 }
3162
3163 // If useLoadStackGuardNode returns true, generate LOAD_STACK_GUARD.
3164 // Otherwise, emit a volatile load to retrieve the stack guard value.
3165 SDValue Chain = DAG.getEntryNode();
3166 if (TLI.useLoadStackGuardNode(M)) {
3167 Guard = getLoadStackGuard(DAG, dl, Chain);
3168 } else {
3169 if (const Value *IRGuard = TLI.getSDagStackGuard(M)) {
3170 SDValue GuardPtr = getValue(IRGuard);
3171 Guard = DAG.getLoad(PtrMemTy, dl, Chain, GuardPtr,
3172 MachinePointerInfo(IRGuard, 0), Align,
3174 } else {
3175 LLVMContext &Ctx = *DAG.getContext();
3176 Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
3177 Guard = DAG.getPOISON(PtrMemTy);
3178 }
3179 }
3180
3181 // Perform the comparison via a getsetcc.
3182 SDValue Cmp = DAG.getSetCC(
3183 dl, TLI.getSetCCResultType(DL, *DAG.getContext(), Guard.getValueType()),
3184 Guard, GuardVal, ISD::SETNE);
3185
3186 // If the guard/stackslot do not equal, branch to failure MBB.
3187 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl,
3188 MVT::Other, GuardVal.getOperand(0),
3189 Cmp, DAG.getBasicBlock(SPD.getFailureMBB()));
3190 // Otherwise branch to success MBB.
3191 SDValue Br = DAG.getNode(ISD::BR, dl,
3192 MVT::Other, BrCond,
3193 DAG.getBasicBlock(SPD.getSuccessMBB()));
3194
3195 DAG.setRoot(Br);
3196}
3197
3198/// Codegen the failure basic block for a stack protector check.
3199///
3200/// A failure stack protector machine basic block consists simply of a call to
3201/// __stack_chk_fail().
3202///
3203/// For a high level explanation of how this fits into the stack protector
3204/// generation see the comment on the declaration of class
3205/// StackProtectorDescriptor.
3208
3209 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3210 MachineBasicBlock *ParentBB = SPD.getParentMBB();
3211 const Module &M = *ParentBB->getParent()->getFunction().getParent();
3212 SDValue Chain;
3213
3214 // For -Oz builds with a guard check function, we use function-based
3215 // instrumentation. Otherwise, if we have a guard check function, we call it
3216 // in the failure block.
3217 auto *GuardCheckFn = TLI.getSSPStackGuardCheck(M);
3218 if (GuardCheckFn && !SPD.shouldEmitFunctionBasedCheckStackProtector()) {
3219 // First create the loads to the guard/stack slot for the comparison.
3220 auto &DL = DAG.getDataLayout();
3221 EVT PtrTy = TLI.getFrameIndexTy(DL);
3222 EVT PtrMemTy = TLI.getPointerMemTy(DL, DL.getAllocaAddrSpace());
3223
3224 MachineFrameInfo &MFI = ParentBB->getParent()->getFrameInfo();
3225 int FI = MFI.getStackProtectorIndex();
3226
3227 SDLoc dl = getCurSDLoc();
3228 SDValue StackSlotPtr = DAG.getFrameIndex(FI, PtrTy);
3229 Align Align = DL.getPrefTypeAlign(
3230 PointerType::get(M.getContext(), DL.getAllocaAddrSpace()));
3231
3232 // Generate code to load the content of the guard slot.
3233 SDValue GuardVal = DAG.getLoad(
3234 PtrMemTy, dl, DAG.getEntryNode(), StackSlotPtr,
3235 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI), Align,
3237
3238 if (TLI.useStackGuardMixCookie())
3239 GuardVal = TLI.emitStackGuardMixCookie(DAG, GuardVal, dl, true);
3240
3241 // The target provides a guard check function to validate the guard value.
3242 // Generate a call to that function with the content of the guard slot as
3243 // argument.
3244 FunctionType *FnTy = GuardCheckFn->getFunctionType();
3245 assert(FnTy->getNumParams() == 1 && "Invalid function signature");
3246
3248 TargetLowering::ArgListEntry Entry(GuardVal, FnTy->getParamType(0));
3249 if (GuardCheckFn->hasParamAttribute(0, Attribute::AttrKind::InReg))
3250 Entry.IsInReg = true;
3251 Args.push_back(Entry);
3252
3255 .setChain(DAG.getEntryNode())
3256 .setCallee(GuardCheckFn->getCallingConv(), FnTy->getReturnType(),
3257 getValue(GuardCheckFn), std::move(Args));
3258
3259 Chain = TLI.LowerCallTo(CLI).second;
3260 } else {
3262 CallOptions.setDiscardResult(true);
3263 Chain = TLI.makeLibCall(DAG, RTLIB::STACKPROTECTOR_CHECK_FAIL, MVT::isVoid,
3264 {}, CallOptions, getCurSDLoc())
3265 .second;
3266 }
3267
3268 // Emit a trap instruction if we are required to do so.
3269 const TargetOptions &TargetOpts = DAG.getTarget().Options;
3270 if (TargetOpts.TrapUnreachable && !TargetOpts.NoTrapAfterNoreturn)
3271 Chain = DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, Chain);
3272
3273 DAG.setRoot(Chain);
3274}
3275
3276/// visitBitTestHeader - This function emits necessary code to produce value
3277/// suitable for "bit tests"
3279 MachineBasicBlock *SwitchBB) {
3280 SDLoc dl = getCurSDLoc();
3281
3282 // Subtract the minimum value.
3283 SDValue SwitchOp = getValue(B.SValue);
3284 EVT VT = SwitchOp.getValueType();
3285 SDValue RangeSub =
3286 DAG.getNode(ISD::SUB, dl, VT, SwitchOp, DAG.getConstant(B.First, dl, VT));
3287
3288 // Determine the type of the test operands.
3289 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3290 bool UsePtrType = false;
3291 if (!TLI.isTypeLegal(VT)) {
3292 UsePtrType = true;
3293 } else {
3294 for (const BitTestCase &Case : B.Cases)
3295 if (!isUIntN(VT.getSizeInBits(), Case.Mask)) {
3296 // Switch table case range are encoded into series of masks.
3297 // Just use pointer type, it's guaranteed to fit.
3298 UsePtrType = true;
3299 break;
3300 }
3301 }
3302 SDValue Sub = RangeSub;
3303 if (UsePtrType) {
3304 VT = TLI.getPointerTy(DAG.getDataLayout());
3305 Sub = DAG.getZExtOrTrunc(Sub, dl, VT);
3306 }
3307
3308 B.RegVT = VT.getSimpleVT();
3309 B.Reg = FuncInfo.CreateReg(B.RegVT);
3310 SDValue CopyTo = DAG.getCopyToReg(getControlRoot(), dl, B.Reg, Sub);
3311
3312 MachineBasicBlock* MBB = B.Cases[0].ThisBB;
3313
3314 if (!B.FallthroughUnreachable)
3315 addSuccessorWithProb(SwitchBB, B.Default, B.DefaultProb);
3316 addSuccessorWithProb(SwitchBB, MBB, B.Prob);
3317 SwitchBB->normalizeSuccProbs();
3318
3319 SDValue Root = CopyTo;
3320 if (!B.FallthroughUnreachable) {
3321 // Conditional branch to the default block.
3322 SDValue RangeCmp = DAG.getSetCC(dl,
3323 TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
3324 RangeSub.getValueType()),
3325 RangeSub, DAG.getConstant(B.Range, dl, RangeSub.getValueType()),
3326 ISD::SETUGT);
3327
3328 Root = DAG.getNode(ISD::BRCOND, dl, MVT::Other, Root, RangeCmp,
3329 DAG.getBasicBlock(B.Default));
3330 }
3331
3332 // Avoid emitting unnecessary branches to the next block.
3333 if (MBB != NextBlock(SwitchBB))
3334 Root = DAG.getNode(ISD::BR, dl, MVT::Other, Root, DAG.getBasicBlock(MBB));
3335
3336 DAG.setRoot(Root);
3337}
3338
3339/// visitBitTestCase - this function produces one "bit test"
3341 MachineBasicBlock *NextMBB,
3342 BranchProbability BranchProbToNext,
3343 Register Reg, BitTestCase &B,
3344 MachineBasicBlock *SwitchBB) {
3345 SDLoc dl = getCurSDLoc();
3346 MVT VT = BB.RegVT;
3347 SDValue ShiftOp = DAG.getCopyFromReg(getControlRoot(), dl, Reg, VT);
3348 SDValue Cmp;
3349 unsigned PopCount = llvm::popcount(B.Mask);
3350 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3351 if (PopCount == 1) {
3352 // Testing for a single bit; just compare the shift count with what it
3353 // would need to be to shift a 1 bit in that position.
3354 Cmp = DAG.getSetCC(
3355 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3356 ShiftOp, DAG.getConstant(llvm::countr_zero(B.Mask), dl, VT),
3357 ISD::SETEQ);
3358 } else if (PopCount == BB.Range) {
3359 // There is only one zero bit in the range, test for it directly.
3360 Cmp = DAG.getSetCC(
3361 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3362 ShiftOp, DAG.getConstant(llvm::countr_one(B.Mask), dl, VT), ISD::SETNE);
3363 } else {
3364 // Make desired shift
3365 SDValue SwitchVal = DAG.getNode(ISD::SHL, dl, VT,
3366 DAG.getConstant(1, dl, VT), ShiftOp);
3367
3368 // Emit bit tests and jumps
3369 SDValue AndOp = DAG.getNode(ISD::AND, dl,
3370 VT, SwitchVal, DAG.getConstant(B.Mask, dl, VT));
3371 Cmp = DAG.getSetCC(
3372 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3373 AndOp, DAG.getConstant(0, dl, VT), ISD::SETNE);
3374 }
3375
3376 // The branch probability from SwitchBB to B.TargetBB is B.ExtraProb.
3377 addSuccessorWithProb(SwitchBB, B.TargetBB, B.ExtraProb);
3378 // The branch probability from SwitchBB to NextMBB is BranchProbToNext.
3379 addSuccessorWithProb(SwitchBB, NextMBB, BranchProbToNext);
3380 // It is not guaranteed that the sum of B.ExtraProb and BranchProbToNext is
3381 // one as they are relative probabilities (and thus work more like weights),
3382 // and hence we need to normalize them to let the sum of them become one.
3383 SwitchBB->normalizeSuccProbs();
3384
3385 SDValue BrAnd = DAG.getNode(ISD::BRCOND, dl,
3386 MVT::Other, getControlRoot(),
3387 Cmp, DAG.getBasicBlock(B.TargetBB));
3388
3389 // Avoid emitting unnecessary branches to the next block.
3390 if (NextMBB != NextBlock(SwitchBB))
3391 BrAnd = DAG.getNode(ISD::BR, dl, MVT::Other, BrAnd,
3392 DAG.getBasicBlock(NextMBB));
3393
3394 DAG.setRoot(BrAnd);
3395}
3396
3397void SelectionDAGBuilder::visitInvoke(const InvokeInst &I) {
3398 MachineBasicBlock *InvokeMBB = FuncInfo.MBB;
3399
3400 // Retrieve successors. Look through artificial IR level blocks like
3401 // catchswitch for successors.
3402 MachineBasicBlock *Return = FuncInfo.getMBB(I.getSuccessor(0));
3403 const BasicBlock *EHPadBB = I.getSuccessor(1);
3404 MachineBasicBlock *EHPadMBB = FuncInfo.getMBB(EHPadBB);
3405
3406 // Deopt and ptrauth bundles are lowered in helper functions, and we don't
3407 // have to do anything here to lower funclet bundles.
3408 failForInvalidBundles(I, "invokes",
3414
3415 const Value *Callee(I.getCalledOperand());
3416 const Function *Fn = dyn_cast<Function>(Callee);
3417 if (isa<InlineAsm>(Callee))
3418 visitInlineAsm(I, EHPadBB);
3419 else if (Fn && Fn->isIntrinsic()) {
3420 switch (Fn->getIntrinsicID()) {
3421 default:
3422 llvm_unreachable("Cannot invoke this intrinsic");
3423 case Intrinsic::donothing:
3424 // Ignore invokes to @llvm.donothing: jump directly to the next BB.
3425 case Intrinsic::seh_try_begin:
3426 case Intrinsic::seh_scope_begin:
3427 case Intrinsic::seh_try_end:
3428 case Intrinsic::seh_scope_end:
3429 if (EHPadMBB)
3430 // a block referenced by EH table
3431 // so dtor-funclet not removed by opts
3432 EHPadMBB->setMachineBlockAddressTaken();
3433 break;
3434 case Intrinsic::experimental_patchpoint_void:
3435 case Intrinsic::experimental_patchpoint:
3436 visitPatchpoint(I, EHPadBB);
3437 break;
3438 case Intrinsic::experimental_gc_statepoint:
3440 break;
3441 // wasm_throw, wasm_rethrow: This is usually done in visitTargetIntrinsic,
3442 // but these intrinsics are special because they can be invoked, so we
3443 // manually lower it to a DAG node here.
3444 case Intrinsic::wasm_throw: {
3446 std::array<SDValue, 4> Ops = {
3447 getControlRoot(), // inchain for the terminator node
3448 DAG.getTargetConstant(Intrinsic::wasm_throw, getCurSDLoc(),
3450 getValue(I.getArgOperand(0)), // tag
3451 getValue(I.getArgOperand(1)) // thrown value
3452 };
3453 SDVTList VTs = DAG.getVTList(ArrayRef<EVT>({MVT::Other})); // outchain
3454 DAG.setRoot(DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops));
3455 break;
3456 }
3457 case Intrinsic::wasm_rethrow: {
3458 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3459 std::array<SDValue, 2> Ops = {
3460 getControlRoot(), // inchain for the terminator node
3461 DAG.getTargetConstant(Intrinsic::wasm_rethrow, getCurSDLoc(),
3462 TLI.getPointerTy(DAG.getDataLayout()))};
3463 SDVTList VTs = DAG.getVTList(ArrayRef<EVT>({MVT::Other})); // outchain
3464 DAG.setRoot(DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops));
3465 break;
3466 }
3467 }
3468 } else if (I.hasDeoptState()) {
3469 // Currently we do not lower any intrinsic calls with deopt operand bundles.
3470 // Eventually we will support lowering the @llvm.experimental.deoptimize
3471 // intrinsic, and right now there are no plans to support other intrinsics
3472 // with deopt state.
3473 LowerCallSiteWithDeoptBundle(&I, getValue(Callee), EHPadBB);
3474 } else if (I.countOperandBundlesOfType(LLVMContext::OB_ptrauth)) {
3476 } else {
3477 LowerCallTo(I, getValue(Callee), false, false, EHPadBB);
3478 }
3479
3480 // If the value of the invoke is used outside of its defining block, make it
3481 // available as a virtual register.
3482 // We already took care of the exported value for the statepoint instruction
3483 // during call to the LowerStatepoint.
3484 if (!isa<GCStatepointInst>(I)) {
3486 }
3487
3489 BranchProbabilityInfo *BPI = FuncInfo.BPI;
3490 BranchProbability EHPadBBProb =
3491 BPI ? BPI->getEdgeProbability(InvokeMBB->getBasicBlock(), EHPadBB)
3493 findUnwindDestinations(FuncInfo, EHPadBB, EHPadBBProb, UnwindDests);
3494
3495 // Update successor info.
3496 addSuccessorWithProb(InvokeMBB, Return);
3497 for (auto &UnwindDest : UnwindDests) {
3498 UnwindDest.first->setIsEHPad();
3499 addSuccessorWithProb(InvokeMBB, UnwindDest.first, UnwindDest.second);
3500 }
3501 InvokeMBB->normalizeSuccProbs();
3502
3503 // Drop into normal successor.
3504 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other, getControlRoot(),
3505 DAG.getBasicBlock(Return)));
3506}
3507
3508/// The intrinsics currently supported by callbr are implicit control flow
3509/// intrinsics such as amdgcn.kill.
3510/// - they should be called (no "dontcall-" attributes)
3511/// - they do not touch memory on the target (= !TLI.getTgtMemIntrinsic())
3512/// - they do not need custom argument handling (no
3513/// TLI.CollectTargetIntrinsicOperands())
3514void SelectionDAGBuilder::visitCallBrIntrinsic(const CallBrInst &I) {
3515 TargetLowering::IntrinsicInfo Info;
3516 assert(!DAG.getTargetLoweringInfo().getTgtMemIntrinsic(
3517 Info, I, DAG.getMachineFunction(), I.getIntrinsicID()) &&
3518 "Intrinsic touches memory");
3519
3520 auto [HasChain, OnlyLoad] = getTargetIntrinsicCallProperties(I);
3521
3523 getTargetIntrinsicOperands(I, HasChain, OnlyLoad);
3524 SDVTList VTs = getTargetIntrinsicVTList(I, HasChain);
3525
3526 // Create the node.
3527 SDValue Result =
3528 getTargetNonMemIntrinsicNode(*I.getType(), HasChain, Ops, VTs);
3529 Result = handleTargetIntrinsicRet(I, HasChain, OnlyLoad, Result);
3530
3531 setValue(&I, Result);
3532}
3533
3534void SelectionDAGBuilder::visitCallBr(const CallBrInst &I) {
3535 MachineBasicBlock *CallBrMBB = FuncInfo.MBB;
3536
3537 if (I.isInlineAsm()) {
3538 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
3539 // have to do anything here to lower funclet bundles.
3540 failForInvalidBundles(I, "callbrs",
3542 visitInlineAsm(I);
3543 } else {
3544 assert(!I.hasOperandBundles() &&
3545 "Can't have operand bundles for intrinsics");
3546 visitCallBrIntrinsic(I);
3547 }
3549
3550 // Retrieve successors.
3551 SmallPtrSet<BasicBlock *, 8> Dests;
3552 Dests.insert(I.getDefaultDest());
3553 MachineBasicBlock *Return = FuncInfo.getMBB(I.getDefaultDest());
3554
3555 // Update successor info.
3556 addSuccessorWithProb(CallBrMBB, Return, BranchProbability::getOne());
3557 // TODO: For most of the cases where there is an intrinsic callbr, we're
3558 // having exactly one indirect target, which will be unreachable. As soon as
3559 // this changes, we might need to enhance
3560 // Target->setIsInlineAsmBrIndirectTarget or add something similar for
3561 // intrinsic indirect branches.
3562 if (I.isInlineAsm()) {
3563 for (BasicBlock *Dest : I.getIndirectDests()) {
3564 MachineBasicBlock *Target = FuncInfo.getMBB(Dest);
3565 Target->setIsInlineAsmBrIndirectTarget();
3566 // If we introduce a type of asm goto statement that is permitted to use
3567 // an indirect call instruction to jump to its labels, then we should add
3568 // a call to Target->setMachineBlockAddressTaken() here, to mark the
3569 // target block as requiring a BTI.
3570
3571 Target->setLabelMustBeEmitted();
3572 // Don't add duplicate machine successors.
3573 if (Dests.insert(Dest).second)
3574 addSuccessorWithProb(CallBrMBB, Target, BranchProbability::getZero());
3575 }
3576 }
3577 CallBrMBB->normalizeSuccProbs();
3578
3579 // Drop into default successor.
3580 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(),
3581 MVT::Other, getControlRoot(),
3582 DAG.getBasicBlock(Return)));
3583}
3584
3585void SelectionDAGBuilder::visitResume(const ResumeInst &RI) {
3586 llvm_unreachable("SelectionDAGBuilder shouldn't visit resume instructions!");
3587}
3588
3589void SelectionDAGBuilder::visitLandingPad(const LandingPadInst &LP) {
3590 assert(FuncInfo.MBB->isEHPad() &&
3591 "Call to landingpad not in landing pad!");
3592
3593 // If there aren't registers to copy the values into (e.g., during SjLj
3594 // exceptions), then don't bother to create these DAG nodes.
3595 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3596 const Constant *PersonalityFn = FuncInfo.Fn->getPersonalityFn();
3597 if (TLI.getExceptionPointerRegister(PersonalityFn) == 0 &&
3598 TLI.getExceptionSelectorRegister(PersonalityFn) == 0)
3599 return;
3600
3601 // If landingpad's return type is token type, we don't create DAG nodes
3602 // for its exception pointer and selector value. The extraction of exception
3603 // pointer or selector value from token type landingpads is not currently
3604 // supported.
3605 if (LP.getType()->isTokenTy())
3606 return;
3607
3608 SmallVector<EVT, 2> ValueVTs;
3609 SDLoc dl = getCurSDLoc();
3610 ComputeValueVTs(TLI, DAG.getDataLayout(), LP.getType(), ValueVTs);
3611 assert(ValueVTs.size() == 2 && "Only two-valued landingpads are supported");
3612
3613 // Get the two live-in registers as SDValues. The physregs have already been
3614 // copied into virtual registers.
3615 SDValue Ops[2];
3616 if (FuncInfo.ExceptionPointerVirtReg) {
3617 Ops[0] = DAG.getZExtOrTrunc(
3618 DAG.getCopyFromReg(DAG.getEntryNode(), dl,
3619 FuncInfo.ExceptionPointerVirtReg,
3620 TLI.getPointerTy(DAG.getDataLayout())),
3621 dl, ValueVTs[0]);
3622 } else {
3623 Ops[0] = DAG.getConstant(0, dl, TLI.getPointerTy(DAG.getDataLayout()));
3624 }
3625 Ops[1] = DAG.getZExtOrTrunc(
3626 DAG.getCopyFromReg(DAG.getEntryNode(), dl,
3627 FuncInfo.ExceptionSelectorVirtReg,
3628 TLI.getPointerTy(DAG.getDataLayout())),
3629 dl, ValueVTs[1]);
3630
3631 // Merge into one.
3632 SDValue Res = DAG.getNode(ISD::MERGE_VALUES, dl,
3633 DAG.getVTList(ValueVTs), Ops);
3634 setValue(&LP, Res);
3635}
3636
3639 // Update JTCases.
3640 for (JumpTableBlock &JTB : SL->JTCases)
3641 if (JTB.first.HeaderBB == First)
3642 JTB.first.HeaderBB = Last;
3643
3644 // Update BitTestCases.
3645 for (BitTestBlock &BTB : SL->BitTestCases)
3646 if (BTB.Parent == First)
3647 BTB.Parent = Last;
3648}
3649
3650void SelectionDAGBuilder::visitIndirectBr(const IndirectBrInst &I) {
3651 MachineBasicBlock *IndirectBrMBB = FuncInfo.MBB;
3652
3653 // Update machine-CFG edges with unique successors.
3655 for (unsigned i = 0, e = I.getNumSuccessors(); i != e; ++i) {
3656 BasicBlock *BB = I.getSuccessor(i);
3657 bool Inserted = Done.insert(BB).second;
3658 if (!Inserted)
3659 continue;
3660
3661 MachineBasicBlock *Succ = FuncInfo.getMBB(BB);
3662 addSuccessorWithProb(IndirectBrMBB, Succ);
3663 }
3664 IndirectBrMBB->normalizeSuccProbs();
3665
3667 MVT::Other, getControlRoot(),
3668 getValue(I.getAddress())));
3669}
3670
3671void SelectionDAGBuilder::visitUnreachable(const UnreachableInst &I) {
3672 if (!I.shouldLowerToTrap(DAG.getTarget().Options.TrapUnreachable,
3673 DAG.getTarget().Options.NoTrapAfterNoreturn))
3674 return;
3675
3676 DAG.setRoot(DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, DAG.getRoot()));
3677}
3678
3679void SelectionDAGBuilder::visitUnary(const User &I, unsigned Opcode) {
3680 SDNodeFlags Flags;
3681 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3682 Flags.copyFMF(*FPOp);
3683
3684 SDValue Op = getValue(I.getOperand(0));
3685 SDValue UnNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op.getValueType(),
3686 Op, Flags);
3687 setValue(&I, UnNodeValue);
3688}
3689
3690void SelectionDAGBuilder::visitBinary(const User &I, unsigned Opcode) {
3691 SDNodeFlags Flags;
3692 if (auto *OFBinOp = dyn_cast<OverflowingBinaryOperator>(&I)) {
3693 Flags.setNoSignedWrap(OFBinOp->hasNoSignedWrap());
3694 Flags.setNoUnsignedWrap(OFBinOp->hasNoUnsignedWrap());
3695 }
3696 if (auto *ExactOp = dyn_cast<PossiblyExactOperator>(&I))
3697 Flags.setExact(ExactOp->isExact());
3698 if (auto *DisjointOp = dyn_cast<PossiblyDisjointInst>(&I))
3699 Flags.setDisjoint(DisjointOp->isDisjoint());
3700 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3701 Flags.copyFMF(*FPOp);
3702
3703 SDValue Op1 = getValue(I.getOperand(0));
3704 SDValue Op2 = getValue(I.getOperand(1));
3705 SDValue BinNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(),
3706 Op1, Op2, Flags);
3707 setValue(&I, BinNodeValue);
3708}
3709
3710void SelectionDAGBuilder::visitShift(const User &I, unsigned Opcode) {
3711 SDValue Op1 = getValue(I.getOperand(0));
3712 SDValue Op2 = getValue(I.getOperand(1));
3713
3714 EVT ShiftTy = DAG.getTargetLoweringInfo().getShiftAmountTy(
3715 Op1.getValueType(), DAG.getDataLayout());
3716
3717 // Coerce the shift amount to the right type if we can. This exposes the
3718 // truncate or zext to optimization early.
3719 if (!I.getType()->isVectorTy() && Op2.getValueType() != ShiftTy) {
3721 "Unexpected shift type");
3722 Op2 = DAG.getZExtOrTrunc(Op2, getCurSDLoc(), ShiftTy);
3723 }
3724
3725 bool nuw = false;
3726 bool nsw = false;
3727 bool exact = false;
3728
3729 if (Opcode == ISD::SRL || Opcode == ISD::SRA || Opcode == ISD::SHL) {
3730
3731 if (const OverflowingBinaryOperator *OFBinOp =
3733 nuw = OFBinOp->hasNoUnsignedWrap();
3734 nsw = OFBinOp->hasNoSignedWrap();
3735 }
3736 if (const PossiblyExactOperator *ExactOp =
3738 exact = ExactOp->isExact();
3739 }
3740 SDNodeFlags Flags;
3741 Flags.setExact(exact);
3742 Flags.setNoSignedWrap(nsw);
3743 Flags.setNoUnsignedWrap(nuw);
3744 SDValue Res = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(), Op1, Op2,
3745 Flags);
3746 setValue(&I, Res);
3747}
3748
3749void SelectionDAGBuilder::visitSDiv(const User &I) {
3750 SDValue Op1 = getValue(I.getOperand(0));
3751 SDValue Op2 = getValue(I.getOperand(1));
3752
3753 SDNodeFlags Flags;
3754 Flags.setExact(isa<PossiblyExactOperator>(&I) &&
3755 cast<PossiblyExactOperator>(&I)->isExact());
3756 setValue(&I, DAG.getNode(ISD::SDIV, getCurSDLoc(), Op1.getValueType(), Op1,
3757 Op2, Flags));
3758}
3759
3760void SelectionDAGBuilder::visitICmp(const ICmpInst &I) {
3761 ICmpInst::Predicate predicate = I.getPredicate();
3762 SDValue Op1 = getValue(I.getOperand(0));
3763 SDValue Op2 = getValue(I.getOperand(1));
3764 ISD::CondCode Opcode = getICmpCondCode(predicate);
3765
3766 auto &TLI = DAG.getTargetLoweringInfo();
3767 EVT MemVT =
3768 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
3769
3770 // If a pointer's DAG type is larger than its memory type then the DAG values
3771 // are zero-extended. This breaks signed comparisons so truncate back to the
3772 // underlying type before doing the compare.
3773 if (Op1.getValueType() != MemVT) {
3774 Op1 = DAG.getPtrExtOrTrunc(Op1, getCurSDLoc(), MemVT);
3775 Op2 = DAG.getPtrExtOrTrunc(Op2, getCurSDLoc(), MemVT);
3776 }
3777
3778 SDNodeFlags Flags;
3779 Flags.setSameSign(I.hasSameSign());
3780 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
3781
3782 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3783 I.getType());
3784 setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Opcode));
3785}
3786
3787void SelectionDAGBuilder::visitFCmp(const FCmpInst &I) {
3788 FCmpInst::Predicate predicate = I.getPredicate();
3789 SDValue Op1 = getValue(I.getOperand(0));
3790 SDValue Op2 = getValue(I.getOperand(1));
3791
3792 ISD::CondCode Condition = getFCmpCondCode(predicate);
3793 auto *FPMO = cast<FPMathOperator>(&I);
3794 if (FPMO->hasNoNaNs() || TM.Options.NoNaNsFPMath)
3795 Condition = getFCmpCodeWithoutNaN(Condition);
3796
3797 SDNodeFlags Flags;
3798 Flags.copyFMF(*FPMO);
3799 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
3800
3801 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3802 I.getType());
3803 setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Condition));
3804}
3805
3806// Check if the condition of the select has one use or two users that are both
3807// selects with the same condition.
3808static bool hasOnlySelectUsers(const Value *Cond) {
3809 return llvm::all_of(Cond->users(), [](const Value *V) {
3810 return isa<SelectInst>(V);
3811 });
3812}
3813
3814void SelectionDAGBuilder::visitSelect(const User &I) {
3815 SmallVector<EVT, 4> ValueVTs;
3816 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
3817 ValueVTs);
3818 unsigned NumValues = ValueVTs.size();
3819 if (NumValues == 0) return;
3820
3821 SmallVector<SDValue, 4> Values(NumValues);
3822 SDValue Cond = getValue(I.getOperand(0));
3823 SDValue LHSVal = getValue(I.getOperand(1));
3824 SDValue RHSVal = getValue(I.getOperand(2));
3825 SmallVector<SDValue, 1> BaseOps(1, Cond);
3827 Cond.getValueType().isVector() ? ISD::VSELECT : ISD::SELECT;
3828
3829 bool IsUnaryAbs = false;
3830 bool Negate = false;
3831
3832 SDNodeFlags Flags;
3833 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3834 Flags.copyFMF(*FPOp);
3835
3836 Flags.setUnpredictable(
3837 cast<SelectInst>(I).getMetadata(LLVMContext::MD_unpredictable));
3838
3839 // Min/max matching is only viable if all output VTs are the same.
3840 if (all_equal(ValueVTs)) {
3841 EVT VT = ValueVTs[0];
3842 LLVMContext &Ctx = *DAG.getContext();
3843 auto &TLI = DAG.getTargetLoweringInfo();
3844
3845 // We care about the legality of the operation after it has been type
3846 // legalized.
3847 while (TLI.getTypeAction(Ctx, VT) != TargetLoweringBase::TypeLegal)
3848 VT = TLI.getTypeToTransformTo(Ctx, VT);
3849
3850 // If the vselect is legal, assume we want to leave this as a vector setcc +
3851 // vselect. Otherwise, if this is going to be scalarized, we want to see if
3852 // min/max is legal on the scalar type.
3853 bool UseScalarMinMax = VT.isVector() &&
3855
3856 // ValueTracking's select pattern matching does not account for -0.0,
3857 // so we can't lower to FMINIMUM/FMAXIMUM because those nodes specify that
3858 // -0.0 is less than +0.0.
3859 const Value *LHS, *RHS;
3860 auto SPR = matchSelectPattern(&I, LHS, RHS);
3862 switch (SPR.Flavor) {
3863 case SPF_UMAX: Opc = ISD::UMAX; break;
3864 case SPF_UMIN: Opc = ISD::UMIN; break;
3865 case SPF_SMAX: Opc = ISD::SMAX; break;
3866 case SPF_SMIN: Opc = ISD::SMIN; break;
3867 case SPF_FMINNUM:
3868 switch (SPR.NaNBehavior) {
3869 case SPNB_NA: llvm_unreachable("No NaN behavior for FP op?");
3870 case SPNB_RETURNS_NAN: break;
3871 case SPNB_RETURNS_OTHER: Opc = ISD::FMINNUM; break;
3872 case SPNB_RETURNS_ANY:
3874 (UseScalarMinMax &&
3876 Opc = ISD::FMINNUM;
3877 break;
3878 }
3879 break;
3880 case SPF_FMAXNUM:
3881 switch (SPR.NaNBehavior) {
3882 case SPNB_NA: llvm_unreachable("No NaN behavior for FP op?");
3883 case SPNB_RETURNS_NAN: break;
3884 case SPNB_RETURNS_OTHER: Opc = ISD::FMAXNUM; break;
3885 case SPNB_RETURNS_ANY:
3887 (UseScalarMinMax &&
3889 Opc = ISD::FMAXNUM;
3890 break;
3891 }
3892 break;
3893 case SPF_NABS:
3894 Negate = true;
3895 [[fallthrough]];
3896 case SPF_ABS:
3897 IsUnaryAbs = true;
3898 Opc = ISD::ABS;
3899 break;
3900 default: break;
3901 }
3902
3903 if (!IsUnaryAbs && Opc != ISD::DELETED_NODE &&
3904 (TLI.isOperationLegalOrCustom(Opc, VT) ||
3905 (UseScalarMinMax &&
3907 // If the underlying comparison instruction is used by any other
3908 // instruction, the consumed instructions won't be destroyed, so it is
3909 // not profitable to convert to a min/max.
3911 OpCode = Opc;
3912 LHSVal = getValue(LHS);
3913 RHSVal = getValue(RHS);
3914 BaseOps.clear();
3915 }
3916
3917 if (IsUnaryAbs) {
3918 OpCode = Opc;
3919 LHSVal = getValue(LHS);
3920 BaseOps.clear();
3921 }
3922 }
3923
3924 if (IsUnaryAbs) {
3925 for (unsigned i = 0; i != NumValues; ++i) {
3926 SDLoc dl = getCurSDLoc();
3927 EVT VT = LHSVal.getNode()->getValueType(LHSVal.getResNo() + i);
3928 Values[i] =
3929 DAG.getNode(OpCode, dl, VT, LHSVal.getValue(LHSVal.getResNo() + i));
3930 if (Negate)
3931 Values[i] = DAG.getNegative(Values[i], dl, VT);
3932 }
3933 } else {
3934 for (unsigned i = 0; i != NumValues; ++i) {
3935 SmallVector<SDValue, 3> Ops(BaseOps.begin(), BaseOps.end());
3936 Ops.push_back(SDValue(LHSVal.getNode(), LHSVal.getResNo() + i));
3937 Ops.push_back(SDValue(RHSVal.getNode(), RHSVal.getResNo() + i));
3938 Values[i] = DAG.getNode(
3939 OpCode, getCurSDLoc(),
3940 LHSVal.getNode()->getValueType(LHSVal.getResNo() + i), Ops, Flags);
3941 }
3942 }
3943
3945 DAG.getVTList(ValueVTs), Values));
3946}
3947
3948void SelectionDAGBuilder::visitTrunc(const User &I) {
3949 // TruncInst cannot be a no-op cast because sizeof(src) > sizeof(dest).
3950 SDValue N = getValue(I.getOperand(0));
3951 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3952 I.getType());
3953 SDNodeFlags Flags;
3954 if (auto *Trunc = dyn_cast<TruncInst>(&I)) {
3955 Flags.setNoSignedWrap(Trunc->hasNoSignedWrap());
3956 Flags.setNoUnsignedWrap(Trunc->hasNoUnsignedWrap());
3957 }
3958
3959 setValue(&I, DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), DestVT, N, Flags));
3960}
3961
3962void SelectionDAGBuilder::visitZExt(const User &I) {
3963 // ZExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
3964 // ZExt also can't be a cast to bool for same reason. So, nothing much to do
3965 SDValue N = getValue(I.getOperand(0));
3966 auto &TLI = DAG.getTargetLoweringInfo();
3967 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
3968
3969 SDNodeFlags Flags;
3970 if (auto *PNI = dyn_cast<PossiblyNonNegInst>(&I))
3971 Flags.setNonNeg(PNI->hasNonNeg());
3972
3973 // Eagerly use nonneg information to canonicalize towards sign_extend if
3974 // that is the target's preference.
3975 // TODO: Let the target do this later.
3976 if (Flags.hasNonNeg() &&
3977 TLI.isSExtCheaperThanZExt(N.getValueType(), DestVT)) {
3978 setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));
3979 return;
3980 }
3981
3982 setValue(&I, DAG.getNode(ISD::ZERO_EXTEND, getCurSDLoc(), DestVT, N, Flags));
3983}
3984
3985void SelectionDAGBuilder::visitSExt(const User &I) {
3986 // SExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
3987 // SExt also can't be a cast to bool for same reason. So, nothing much to do
3988 SDValue N = getValue(I.getOperand(0));
3989 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3990 I.getType());
3991 setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));
3992}
3993
3994void SelectionDAGBuilder::visitFPTrunc(const User &I) {
3995 // FPTrunc is never a no-op cast, no need to check
3996 SDValue N = getValue(I.getOperand(0));
3997 SDLoc dl = getCurSDLoc();
3998 SDNodeFlags Flags;
3999 if (auto *TruncInst = dyn_cast<FPMathOperator>(&I))
4000 Flags.copyFMF(*TruncInst);
4001 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4002 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4003 setValue(&I, DAG.getNode(ISD::FP_ROUND, dl, DestVT, N,
4004 DAG.getTargetConstant(
4005 0, dl, TLI.getPointerTy(DAG.getDataLayout())),
4006 Flags));
4007}
4008
4009void SelectionDAGBuilder::visitFPExt(const User &I) {
4010 // FPExt is never a no-op cast, no need to check
4011 SDValue N = getValue(I.getOperand(0));
4012 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4013 I.getType());
4014 SDNodeFlags Flags;
4015 if (auto *TruncInst = dyn_cast<FPMathOperator>(&I))
4016 Flags.copyFMF(*TruncInst);
4017 setValue(&I, DAG.getNode(ISD::FP_EXTEND, getCurSDLoc(), DestVT, N, Flags));
4018}
4019
4020void SelectionDAGBuilder::visitFPToUI(const User &I) {
4021 // FPToUI is never a no-op cast, no need to check
4022 SDValue N = getValue(I.getOperand(0));
4023 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4024 I.getType());
4025 setValue(&I, DAG.getNode(ISD::FP_TO_UINT, getCurSDLoc(), DestVT, N));
4026}
4027
4028void SelectionDAGBuilder::visitFPToSI(const User &I) {
4029 // FPToSI is never a no-op cast, no need to check
4030 SDValue N = getValue(I.getOperand(0));
4031 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4032 I.getType());
4033 setValue(&I, DAG.getNode(ISD::FP_TO_SINT, getCurSDLoc(), DestVT, N));
4034}
4035
4036void SelectionDAGBuilder::visitUIToFP(const User &I) {
4037 // UIToFP is never a no-op cast, no need to check
4038 SDValue N = getValue(I.getOperand(0));
4039 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4040 I.getType());
4041 SDNodeFlags Flags;
4042 if (auto *PNI = dyn_cast<PossiblyNonNegInst>(&I))
4043 Flags.setNonNeg(PNI->hasNonNeg());
4044
4045 setValue(&I, DAG.getNode(ISD::UINT_TO_FP, getCurSDLoc(), DestVT, N, Flags));
4046}
4047
4048void SelectionDAGBuilder::visitSIToFP(const User &I) {
4049 // SIToFP is never a no-op cast, no need to check
4050 SDValue N = getValue(I.getOperand(0));
4051 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4052 I.getType());
4053 setValue(&I, DAG.getNode(ISD::SINT_TO_FP, getCurSDLoc(), DestVT, N));
4054}
4055
4056void SelectionDAGBuilder::visitPtrToAddr(const User &I) {
4057 SDValue N = getValue(I.getOperand(0));
4058 // By definition the type of the ptrtoaddr must be equal to the address type.
4059 const auto &TLI = DAG.getTargetLoweringInfo();
4060 EVT AddrVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4061 // The address width must be smaller or equal to the pointer representation
4062 // width, so we lower ptrtoaddr as a truncate (possibly folded to a no-op).
4063 N = DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), AddrVT, N);
4064 setValue(&I, N);
4065}
4066
4067void SelectionDAGBuilder::visitPtrToInt(const User &I) {
4068 // What to do depends on the size of the integer and the size of the pointer.
4069 // We can either truncate, zero extend, or no-op, accordingly.
4070 SDValue N = getValue(I.getOperand(0));
4071 auto &TLI = DAG.getTargetLoweringInfo();
4072 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4073 I.getType());
4074 EVT PtrMemVT =
4075 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
4076 N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), PtrMemVT);
4077 N = DAG.getZExtOrTrunc(N, getCurSDLoc(), DestVT);
4078 setValue(&I, N);
4079}
4080
4081void SelectionDAGBuilder::visitIntToPtr(const User &I) {
4082 // What to do depends on the size of the integer and the size of the pointer.
4083 // We can either truncate, zero extend, or no-op, accordingly.
4084 SDValue N = getValue(I.getOperand(0));
4085 auto &TLI = DAG.getTargetLoweringInfo();
4086 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4087 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(), I.getType());
4088 N = DAG.getZExtOrTrunc(N, getCurSDLoc(), PtrMemVT);
4089 N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), DestVT);
4090 setValue(&I, N);
4091}
4092
4093void SelectionDAGBuilder::visitBitCast(const User &I) {
4094 SDValue N = getValue(I.getOperand(0));
4095 SDLoc dl = getCurSDLoc();
4096 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4097 I.getType());
4098
4099 // BitCast assures us that source and destination are the same size so this is
4100 // either a BITCAST or a no-op.
4101 if (DestVT != N.getValueType())
4102 setValue(&I, DAG.getNode(ISD::BITCAST, dl,
4103 DestVT, N)); // convert types.
4104 // Check if the original LLVM IR Operand was a ConstantInt, because getValue()
4105 // might fold any kind of constant expression to an integer constant and that
4106 // is not what we are looking for. Only recognize a bitcast of a genuine
4107 // constant integer as an opaque constant.
4108 else if(ConstantInt *C = dyn_cast<ConstantInt>(I.getOperand(0)))
4109 setValue(&I, DAG.getConstant(C->getValue(), dl, DestVT, /*isTarget=*/false,
4110 /*isOpaque*/true));
4111 else
4112 setValue(&I, N); // noop cast.
4113}
4114
4115void SelectionDAGBuilder::visitAddrSpaceCast(const User &I) {
4116 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4117 const Value *SV = I.getOperand(0);
4118 SDValue N = getValue(SV);
4119 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4120
4121 unsigned SrcAS = SV->getType()->getPointerAddressSpace();
4122 unsigned DestAS = I.getType()->getPointerAddressSpace();
4123
4124 if (!TM.isNoopAddrSpaceCast(SrcAS, DestAS))
4125 N = DAG.getAddrSpaceCast(getCurSDLoc(), DestVT, N, SrcAS, DestAS);
4126
4127 setValue(&I, N);
4128}
4129
4130void SelectionDAGBuilder::visitInsertElement(const User &I) {
4131 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4132 SDValue InVec = getValue(I.getOperand(0));
4133 SDValue InVal = getValue(I.getOperand(1));
4134 SDValue InIdx = DAG.getZExtOrTrunc(getValue(I.getOperand(2)), getCurSDLoc(),
4135 TLI.getVectorIdxTy(DAG.getDataLayout()));
4137 TLI.getValueType(DAG.getDataLayout(), I.getType()),
4138 InVec, InVal, InIdx));
4139}
4140
4141void SelectionDAGBuilder::visitExtractElement(const User &I) {
4142 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4143 SDValue InVec = getValue(I.getOperand(0));
4144 SDValue InIdx = DAG.getZExtOrTrunc(getValue(I.getOperand(1)), getCurSDLoc(),
4145 TLI.getVectorIdxTy(DAG.getDataLayout()));
4147 TLI.getValueType(DAG.getDataLayout(), I.getType()),
4148 InVec, InIdx));
4149}
4150
4151void SelectionDAGBuilder::visitShuffleVector(const User &I) {
4152 SDValue Src1 = getValue(I.getOperand(0));
4153 SDValue Src2 = getValue(I.getOperand(1));
4154 ArrayRef<int> Mask;
4155 if (auto *SVI = dyn_cast<ShuffleVectorInst>(&I))
4156 Mask = SVI->getShuffleMask();
4157 else
4158 Mask = cast<ConstantExpr>(I).getShuffleMask();
4159 SDLoc DL = getCurSDLoc();
4160 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4161 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4162 EVT SrcVT = Src1.getValueType();
4163
4164 if (all_of(Mask, [](int Elem) { return Elem == 0; }) &&
4165 VT.isScalableVector()) {
4166 // Canonical splat form of first element of first input vector.
4167 SDValue FirstElt =
4168 DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, SrcVT.getScalarType(), Src1,
4169 DAG.getVectorIdxConstant(0, DL));
4170 setValue(&I, DAG.getNode(ISD::SPLAT_VECTOR, DL, VT, FirstElt));
4171 return;
4172 }
4173
4174 // For now, we only handle splats for scalable vectors.
4175 // The DAGCombiner will perform a BUILD_VECTOR -> SPLAT_VECTOR transformation
4176 // for targets that support a SPLAT_VECTOR for non-scalable vector types.
4177 assert(!VT.isScalableVector() && "Unsupported scalable vector shuffle");
4178
4179 unsigned SrcNumElts = SrcVT.getVectorNumElements();
4180 unsigned MaskNumElts = Mask.size();
4181
4182 if (SrcNumElts == MaskNumElts) {
4183 setValue(&I, DAG.getVectorShuffle(VT, DL, Src1, Src2, Mask));
4184 return;
4185 }
4186
4187 // Normalize the shuffle vector since mask and vector length don't match.
4188 if (SrcNumElts < MaskNumElts) {
4189 // Mask is longer than the source vectors. We can use concatenate vector to
4190 // make the mask and vectors lengths match.
4191
4192 if (MaskNumElts % SrcNumElts == 0) {
4193 // Mask length is a multiple of the source vector length.
4194 // Check if the shuffle is some kind of concatenation of the input
4195 // vectors.
4196 unsigned NumConcat = MaskNumElts / SrcNumElts;
4197 bool IsConcat = true;
4198 SmallVector<int, 8> ConcatSrcs(NumConcat, -1);
4199 for (unsigned i = 0; i != MaskNumElts; ++i) {
4200 int Idx = Mask[i];
4201 if (Idx < 0)
4202 continue;
4203 // Ensure the indices in each SrcVT sized piece are sequential and that
4204 // the same source is used for the whole piece.
4205 if ((Idx % SrcNumElts != (i % SrcNumElts)) ||
4206 (ConcatSrcs[i / SrcNumElts] >= 0 &&
4207 ConcatSrcs[i / SrcNumElts] != (int)(Idx / SrcNumElts))) {
4208 IsConcat = false;
4209 break;
4210 }
4211 // Remember which source this index came from.
4212 ConcatSrcs[i / SrcNumElts] = Idx / SrcNumElts;
4213 }
4214
4215 // The shuffle is concatenating multiple vectors together. Just emit
4216 // a CONCAT_VECTORS operation.
4217 if (IsConcat) {
4218 SmallVector<SDValue, 8> ConcatOps;
4219 for (auto Src : ConcatSrcs) {
4220 if (Src < 0)
4221 ConcatOps.push_back(DAG.getUNDEF(SrcVT));
4222 else if (Src == 0)
4223 ConcatOps.push_back(Src1);
4224 else
4225 ConcatOps.push_back(Src2);
4226 }
4227 setValue(&I, DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, ConcatOps));
4228 return;
4229 }
4230 }
4231
4232 unsigned PaddedMaskNumElts = alignTo(MaskNumElts, SrcNumElts);
4233 unsigned NumConcat = PaddedMaskNumElts / SrcNumElts;
4234 EVT PaddedVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(),
4235 PaddedMaskNumElts);
4236
4237 // Pad both vectors with undefs to make them the same length as the mask.
4238 SDValue UndefVal = DAG.getUNDEF(SrcVT);
4239
4240 SmallVector<SDValue, 8> MOps1(NumConcat, UndefVal);
4241 SmallVector<SDValue, 8> MOps2(NumConcat, UndefVal);
4242 MOps1[0] = Src1;
4243 MOps2[0] = Src2;
4244
4245 Src1 = DAG.getNode(ISD::CONCAT_VECTORS, DL, PaddedVT, MOps1);
4246 Src2 = DAG.getNode(ISD::CONCAT_VECTORS, DL, PaddedVT, MOps2);
4247
4248 // Readjust mask for new input vector length.
4249 SmallVector<int, 8> MappedOps(PaddedMaskNumElts, -1);
4250 for (unsigned i = 0; i != MaskNumElts; ++i) {
4251 int Idx = Mask[i];
4252 if (Idx >= (int)SrcNumElts)
4253 Idx -= SrcNumElts - PaddedMaskNumElts;
4254 MappedOps[i] = Idx;
4255 }
4256
4257 SDValue Result = DAG.getVectorShuffle(PaddedVT, DL, Src1, Src2, MappedOps);
4258
4259 // If the concatenated vector was padded, extract a subvector with the
4260 // correct number of elements.
4261 if (MaskNumElts != PaddedMaskNumElts)
4262 Result = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Result,
4263 DAG.getVectorIdxConstant(0, DL));
4264
4265 setValue(&I, Result);
4266 return;
4267 }
4268
4269 assert(SrcNumElts > MaskNumElts);
4270
4271 // Analyze the access pattern of the vector to see if we can extract
4272 // two subvectors and do the shuffle.
4273 int StartIdx[2] = {-1, -1}; // StartIdx to extract from
4274 bool CanExtract = true;
4275 for (int Idx : Mask) {
4276 unsigned Input = 0;
4277 if (Idx < 0)
4278 continue;
4279
4280 if (Idx >= (int)SrcNumElts) {
4281 Input = 1;
4282 Idx -= SrcNumElts;
4283 }
4284
4285 // If all the indices come from the same MaskNumElts sized portion of
4286 // the sources we can use extract. Also make sure the extract wouldn't
4287 // extract past the end of the source.
4288 int NewStartIdx = alignDown(Idx, MaskNumElts);
4289 if (NewStartIdx + MaskNumElts > SrcNumElts ||
4290 (StartIdx[Input] >= 0 && StartIdx[Input] != NewStartIdx))
4291 CanExtract = false;
4292 // Make sure we always update StartIdx as we use it to track if all
4293 // elements are undef.
4294 StartIdx[Input] = NewStartIdx;
4295 }
4296
4297 if (StartIdx[0] < 0 && StartIdx[1] < 0) {
4298 setValue(&I, DAG.getUNDEF(VT)); // Vectors are not used.
4299 return;
4300 }
4301 if (CanExtract) {
4302 // Extract appropriate subvector and generate a vector shuffle
4303 for (unsigned Input = 0; Input < 2; ++Input) {
4304 SDValue &Src = Input == 0 ? Src1 : Src2;
4305 if (StartIdx[Input] < 0)
4306 Src = DAG.getUNDEF(VT);
4307 else {
4308 Src = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Src,
4309 DAG.getVectorIdxConstant(StartIdx[Input], DL));
4310 }
4311 }
4312
4313 // Calculate new mask.
4314 SmallVector<int, 8> MappedOps(Mask);
4315 for (int &Idx : MappedOps) {
4316 if (Idx >= (int)SrcNumElts)
4317 Idx -= SrcNumElts + StartIdx[1] - MaskNumElts;
4318 else if (Idx >= 0)
4319 Idx -= StartIdx[0];
4320 }
4321
4322 setValue(&I, DAG.getVectorShuffle(VT, DL, Src1, Src2, MappedOps));
4323 return;
4324 }
4325
4326 // We can't use either concat vectors or extract subvectors so fall back to
4327 // replacing the shuffle with extract and build vector.
4328 // to insert and build vector.
4329 EVT EltVT = VT.getVectorElementType();
4331 for (int Idx : Mask) {
4332 SDValue Res;
4333
4334 if (Idx < 0) {
4335 Res = DAG.getUNDEF(EltVT);
4336 } else {
4337 SDValue &Src = Idx < (int)SrcNumElts ? Src1 : Src2;
4338 if (Idx >= (int)SrcNumElts) Idx -= SrcNumElts;
4339
4340 Res = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Src,
4341 DAG.getVectorIdxConstant(Idx, DL));
4342 }
4343
4344 Ops.push_back(Res);
4345 }
4346
4347 setValue(&I, DAG.getBuildVector(VT, DL, Ops));
4348}
4349
4350void SelectionDAGBuilder::visitInsertValue(const InsertValueInst &I) {
4351 ArrayRef<unsigned> Indices = I.getIndices();
4352 const Value *Op0 = I.getOperand(0);
4353 const Value *Op1 = I.getOperand(1);
4354 Type *AggTy = I.getType();
4355 Type *ValTy = Op1->getType();
4356 bool IntoUndef = isa<UndefValue>(Op0);
4357 bool FromUndef = isa<UndefValue>(Op1);
4358
4359 unsigned LinearIndex = ComputeLinearIndex(AggTy, Indices);
4360
4361 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4362 SmallVector<EVT, 4> AggValueVTs;
4363 ComputeValueVTs(TLI, DAG.getDataLayout(), AggTy, AggValueVTs);
4364 SmallVector<EVT, 4> ValValueVTs;
4365 ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);
4366
4367 unsigned NumAggValues = AggValueVTs.size();
4368 unsigned NumValValues = ValValueVTs.size();
4369 SmallVector<SDValue, 4> Values(NumAggValues);
4370
4371 // Ignore an insertvalue that produces an empty object
4372 if (!NumAggValues) {
4373 setValue(&I, DAG.getUNDEF(MVT(MVT::Other)));
4374 return;
4375 }
4376
4377 SDValue Agg = getValue(Op0);
4378 unsigned i = 0;
4379 // Copy the beginning value(s) from the original aggregate.
4380 for (; i != LinearIndex; ++i)
4381 Values[i] = IntoUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4382 SDValue(Agg.getNode(), Agg.getResNo() + i);
4383 // Copy values from the inserted value(s).
4384 if (NumValValues) {
4385 SDValue Val = getValue(Op1);
4386 for (; i != LinearIndex + NumValValues; ++i)
4387 Values[i] = FromUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4388 SDValue(Val.getNode(), Val.getResNo() + i - LinearIndex);
4389 }
4390 // Copy remaining value(s) from the original aggregate.
4391 for (; i != NumAggValues; ++i)
4392 Values[i] = IntoUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4393 SDValue(Agg.getNode(), Agg.getResNo() + i);
4394
4396 DAG.getVTList(AggValueVTs), Values));
4397}
4398
4399void SelectionDAGBuilder::visitExtractValue(const ExtractValueInst &I) {
4400 ArrayRef<unsigned> Indices = I.getIndices();
4401 const Value *Op0 = I.getOperand(0);
4402 Type *AggTy = Op0->getType();
4403 Type *ValTy = I.getType();
4404 bool OutOfUndef = isa<UndefValue>(Op0);
4405
4406 unsigned LinearIndex = ComputeLinearIndex(AggTy, Indices);
4407
4408 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4409 SmallVector<EVT, 4> ValValueVTs;
4410 ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);
4411
4412 unsigned NumValValues = ValValueVTs.size();
4413
4414 // Ignore a extractvalue that produces an empty object
4415 if (!NumValValues) {
4416 setValue(&I, DAG.getUNDEF(MVT(MVT::Other)));
4417 return;
4418 }
4419
4420 SmallVector<SDValue, 4> Values(NumValValues);
4421
4422 SDValue Agg = getValue(Op0);
4423 // Copy out the selected value(s).
4424 for (unsigned i = LinearIndex; i != LinearIndex + NumValValues; ++i)
4425 Values[i - LinearIndex] =
4426 OutOfUndef ?
4427 DAG.getUNDEF(Agg.getNode()->getValueType(Agg.getResNo() + i)) :
4428 SDValue(Agg.getNode(), Agg.getResNo() + i);
4429
4431 DAG.getVTList(ValValueVTs), Values));
4432}
4433
4434void SelectionDAGBuilder::visitGetElementPtr(const User &I) {
4435 Value *Op0 = I.getOperand(0);
4436 // Note that the pointer operand may be a vector of pointers. Take the scalar
4437 // element which holds a pointer.
4438 unsigned AS = Op0->getType()->getScalarType()->getPointerAddressSpace();
4439 SDValue N = getValue(Op0);
4440 SDLoc dl = getCurSDLoc();
4441 auto &TLI = DAG.getTargetLoweringInfo();
4442 GEPNoWrapFlags NW = cast<GEPOperator>(I).getNoWrapFlags();
4443
4444 // For a vector GEP, keep the prefix scalar as long as possible, then
4445 // convert any scalars encountered after the first vector operand to vectors.
4446 bool IsVectorGEP = I.getType()->isVectorTy();
4447 ElementCount VectorElementCount =
4448 IsVectorGEP ? cast<VectorType>(I.getType())->getElementCount()
4450
4452 GTI != E; ++GTI) {
4453 const Value *Idx = GTI.getOperand();
4454 if (StructType *StTy = GTI.getStructTypeOrNull()) {
4455 unsigned Field = cast<Constant>(Idx)->getUniqueInteger().getZExtValue();
4456 if (Field) {
4457 // N = N + Offset
4458 uint64_t Offset =
4459 DAG.getDataLayout().getStructLayout(StTy)->getElementOffset(Field);
4460
4461 // In an inbounds GEP with an offset that is nonnegative even when
4462 // interpreted as signed, assume there is no unsigned overflow.
4463 SDNodeFlags Flags;
4464 if (NW.hasNoUnsignedWrap() ||
4465 (int64_t(Offset) >= 0 && NW.hasNoUnsignedSignedWrap()))
4467 Flags.setInBounds(NW.isInBounds());
4468
4469 N = DAG.getMemBasePlusOffset(
4470 N, DAG.getConstant(Offset, dl, N.getValueType()), dl, Flags);
4471 }
4472 } else {
4473 // IdxSize is the width of the arithmetic according to IR semantics.
4474 // In SelectionDAG, we may prefer to do arithmetic in a wider bitwidth
4475 // (and fix up the result later).
4476 unsigned IdxSize = DAG.getDataLayout().getIndexSizeInBits(AS);
4477 MVT IdxTy = MVT::getIntegerVT(IdxSize);
4478 TypeSize ElementSize =
4479 GTI.getSequentialElementStride(DAG.getDataLayout());
4480 // We intentionally mask away the high bits here; ElementSize may not
4481 // fit in IdxTy.
4482 APInt ElementMul(IdxSize, ElementSize.getKnownMinValue(),
4483 /*isSigned=*/false, /*implicitTrunc=*/true);
4484 bool ElementScalable = ElementSize.isScalable();
4485
4486 // If this is a scalar constant or a splat vector of constants,
4487 // handle it quickly.
4488 const auto *C = dyn_cast<Constant>(Idx);
4489 if (C && isa<VectorType>(C->getType()))
4490 C = C->getSplatValue();
4491
4492 const auto *CI = dyn_cast_or_null<ConstantInt>(C);
4493 if (CI && CI->isZero())
4494 continue;
4495 if (CI && !ElementScalable) {
4496 APInt Offs = ElementMul * CI->getValue().sextOrTrunc(IdxSize);
4497 LLVMContext &Context = *DAG.getContext();
4498 SDValue OffsVal;
4499 if (N.getValueType().isVector())
4500 OffsVal = DAG.getConstant(
4501 Offs, dl, EVT::getVectorVT(Context, IdxTy, VectorElementCount));
4502 else
4503 OffsVal = DAG.getConstant(Offs, dl, IdxTy);
4504
4505 // In an inbounds GEP with an offset that is nonnegative even when
4506 // interpreted as signed, assume there is no unsigned overflow.
4507 SDNodeFlags Flags;
4508 if (NW.hasNoUnsignedWrap() ||
4509 (Offs.isNonNegative() && NW.hasNoUnsignedSignedWrap()))
4510 Flags.setNoUnsignedWrap(true);
4511 Flags.setInBounds(NW.isInBounds());
4512
4513 OffsVal = DAG.getSExtOrTrunc(OffsVal, dl, N.getValueType());
4514
4515 N = DAG.getMemBasePlusOffset(N, OffsVal, dl, Flags);
4516 continue;
4517 }
4518
4519 // N = N + Idx * ElementMul;
4520 SDValue IdxN = getValue(Idx);
4521
4522 if (IdxN.getValueType().isVector() != N.getValueType().isVector()) {
4523 if (N.getValueType().isVector()) {
4524 EVT VT = EVT::getVectorVT(*Context, IdxN.getValueType(),
4525 VectorElementCount);
4526 IdxN = DAG.getSplat(VT, dl, IdxN);
4527 } else {
4528 EVT VT =
4529 EVT::getVectorVT(*Context, N.getValueType(), VectorElementCount);
4530 N = DAG.getSplat(VT, dl, N);
4531 }
4532 }
4533
4534 // If the index is smaller or larger than intptr_t, truncate or extend
4535 // it.
4536 IdxN = DAG.getSExtOrTrunc(IdxN, dl, N.getValueType());
4537
4538 SDNodeFlags ScaleFlags;
4539 // The multiplication of an index by the type size does not wrap the
4540 // pointer index type in a signed sense (mul nsw).
4542
4543 // The multiplication of an index by the type size does not wrap the
4544 // pointer index type in an unsigned sense (mul nuw).
4545 ScaleFlags.setNoUnsignedWrap(NW.hasNoUnsignedWrap());
4546
4547 if (ElementScalable) {
4548 EVT VScaleTy = N.getValueType().getScalarType();
4549 SDValue VScale = DAG.getNode(
4550 ISD::VSCALE, dl, VScaleTy,
4551 DAG.getConstant(ElementMul.getZExtValue(), dl, VScaleTy));
4552 if (N.getValueType().isVector())
4553 VScale = DAG.getSplatVector(N.getValueType(), dl, VScale);
4554 IdxN = DAG.getNode(ISD::MUL, dl, N.getValueType(), IdxN, VScale,
4555 ScaleFlags);
4556 } else {
4557 // If this is a multiply by a power of two, turn it into a shl
4558 // immediately. This is a very common case.
4559 if (ElementMul != 1) {
4560 if (ElementMul.isPowerOf2()) {
4561 unsigned Amt = ElementMul.logBase2();
4562 IdxN = DAG.getNode(
4563 ISD::SHL, dl, N.getValueType(), IdxN,
4564 DAG.getShiftAmountConstant(Amt, N.getValueType(), dl),
4565 ScaleFlags);
4566 } else {
4567 SDValue Scale = DAG.getConstant(ElementMul.getZExtValue(), dl,
4568 IdxN.getValueType());
4569 IdxN = DAG.getNode(ISD::MUL, dl, N.getValueType(), IdxN, Scale,
4570 ScaleFlags);
4571 }
4572 }
4573 }
4574
4575 // The successive addition of the current address, truncated to the
4576 // pointer index type and interpreted as an unsigned number, and each
4577 // offset, also interpreted as an unsigned number, does not wrap the
4578 // pointer index type (add nuw).
4579 SDNodeFlags AddFlags;
4580 AddFlags.setNoUnsignedWrap(NW.hasNoUnsignedWrap());
4581 AddFlags.setInBounds(NW.isInBounds());
4582
4583 N = DAG.getMemBasePlusOffset(N, IdxN, dl, AddFlags);
4584 }
4585 }
4586
4587 if (IsVectorGEP && !N.getValueType().isVector()) {
4588 EVT VT = EVT::getVectorVT(*Context, N.getValueType(), VectorElementCount);
4589 N = DAG.getSplat(VT, dl, N);
4590 }
4591
4592 MVT PtrTy = TLI.getPointerTy(DAG.getDataLayout(), AS);
4593 MVT PtrMemTy = TLI.getPointerMemTy(DAG.getDataLayout(), AS);
4594 if (IsVectorGEP) {
4595 PtrTy = MVT::getVectorVT(PtrTy, VectorElementCount);
4596 PtrMemTy = MVT::getVectorVT(PtrMemTy, VectorElementCount);
4597 }
4598
4599 if (PtrMemTy != PtrTy && !cast<GEPOperator>(I).isInBounds())
4600 N = DAG.getPtrExtendInReg(N, dl, PtrMemTy);
4601
4602 setValue(&I, N);
4603}
4604
4605void SelectionDAGBuilder::visitAlloca(const AllocaInst &I) {
4606 // If this is a fixed sized alloca in the entry block of the function,
4607 // allocate it statically on the stack.
4608 if (FuncInfo.StaticAllocaMap.count(&I))
4609 return; // getValue will auto-populate this.
4610
4611 SDLoc dl = getCurSDLoc();
4612 Type *Ty = I.getAllocatedType();
4613 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4614 auto &DL = DAG.getDataLayout();
4615 TypeSize TySize = DL.getTypeAllocSize(Ty);
4616 MaybeAlign Alignment = std::max(DL.getPrefTypeAlign(Ty), I.getAlign());
4617
4618 SDValue AllocSize = getValue(I.getArraySize());
4619
4620 EVT IntPtr = TLI.getPointerTy(DL, I.getAddressSpace());
4621 if (AllocSize.getValueType() != IntPtr)
4622 AllocSize = DAG.getZExtOrTrunc(AllocSize, dl, IntPtr);
4623
4624 AllocSize = DAG.getNode(
4625 ISD::MUL, dl, IntPtr, AllocSize,
4626 DAG.getZExtOrTrunc(DAG.getTypeSize(dl, MVT::i64, TySize), dl, IntPtr));
4627
4628 // Handle alignment. If the requested alignment is less than or equal to
4629 // the stack alignment, ignore it. If the size is greater than or equal to
4630 // the stack alignment, we note this in the DYNAMIC_STACKALLOC node.
4631 Align StackAlign = DAG.getSubtarget().getFrameLowering()->getStackAlign();
4632 if (*Alignment <= StackAlign)
4633 Alignment = std::nullopt;
4634
4635 const uint64_t StackAlignMask = StackAlign.value() - 1U;
4636 // Round the size of the allocation up to the stack alignment size
4637 // by add SA-1 to the size. This doesn't overflow because we're computing
4638 // an address inside an alloca.
4639 AllocSize = DAG.getNode(ISD::ADD, dl, AllocSize.getValueType(), AllocSize,
4640 DAG.getConstant(StackAlignMask, dl, IntPtr),
4642
4643 // Mask out the low bits for alignment purposes.
4644 AllocSize = DAG.getNode(ISD::AND, dl, AllocSize.getValueType(), AllocSize,
4645 DAG.getSignedConstant(~StackAlignMask, dl, IntPtr));
4646
4647 SDValue Ops[] = {
4648 getRoot(), AllocSize,
4649 DAG.getConstant(Alignment ? Alignment->value() : 0, dl, IntPtr)};
4650 SDVTList VTs = DAG.getVTList(AllocSize.getValueType(), MVT::Other);
4651 SDValue DSA = DAG.getNode(ISD::DYNAMIC_STACKALLOC, dl, VTs, Ops);
4652 setValue(&I, DSA);
4653 DAG.setRoot(DSA.getValue(1));
4654
4655 assert(FuncInfo.MF->getFrameInfo().hasVarSizedObjects());
4656}
4657
4658static const MDNode *getRangeMetadata(const Instruction &I) {
4659 return I.getMetadata(LLVMContext::MD_range);
4660}
4661
4662static std::optional<ConstantRange> getRange(const Instruction &I) {
4663 if (const auto *CB = dyn_cast<CallBase>(&I))
4664 if (std::optional<ConstantRange> CR = CB->getRange())
4665 return CR;
4666 if (const MDNode *Range = getRangeMetadata(I))
4668 return std::nullopt;
4669}
4670
4672 if (const auto *CB = dyn_cast<CallBase>(&I))
4673 return CB->getRetNoFPClass();
4674 return fcNone;
4675}
4676
4677void SelectionDAGBuilder::visitLoad(const LoadInst &I) {
4678 if (I.isAtomic())
4679 return visitAtomicLoad(I);
4680
4681 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4682 const Value *SV = I.getOperand(0);
4683 if (TLI.supportSwiftError()) {
4684 // Swifterror values can come from either a function parameter with
4685 // swifterror attribute or an alloca with swifterror attribute.
4686 if (const Argument *Arg = dyn_cast<Argument>(SV)) {
4687 if (Arg->hasSwiftErrorAttr())
4688 return visitLoadFromSwiftError(I);
4689 }
4690
4691 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(SV)) {
4692 if (Alloca->isSwiftError())
4693 return visitLoadFromSwiftError(I);
4694 }
4695 }
4696
4697 SDValue Ptr = getValue(SV);
4698
4699 Type *Ty = I.getType();
4700 SmallVector<EVT, 4> ValueVTs, MemVTs;
4702 ComputeValueVTs(TLI, DAG.getDataLayout(), Ty, ValueVTs, &MemVTs, &Offsets);
4703 unsigned NumValues = ValueVTs.size();
4704 if (NumValues == 0)
4705 return;
4706
4707 Align Alignment = I.getAlign();
4708 AAMDNodes AAInfo = I.getAAMetadata();
4709 const MDNode *Ranges = getRangeMetadata(I);
4710 bool isVolatile = I.isVolatile();
4711 MachineMemOperand::Flags MMOFlags =
4712 TLI.getLoadMemOperandFlags(I, DAG.getDataLayout(), AC, LibInfo);
4713
4714 SDValue Root;
4715 bool ConstantMemory = false;
4716 if (isVolatile)
4717 // Serialize volatile loads with other side effects.
4718 Root = getRoot();
4719 else if (NumValues > MaxParallelChains)
4720 Root = getMemoryRoot();
4721 else if (BatchAA &&
4722 BatchAA->pointsToConstantMemory(MemoryLocation(
4723 SV,
4724 LocationSize::precise(DAG.getDataLayout().getTypeStoreSize(Ty)),
4725 AAInfo))) {
4726 // Do not serialize (non-volatile) loads of constant memory with anything.
4727 Root = DAG.getEntryNode();
4728 ConstantMemory = true;
4730 } else {
4731 // Do not serialize non-volatile loads against each other.
4732 Root = DAG.getRoot();
4733 }
4734
4735 SDLoc dl = getCurSDLoc();
4736
4737 if (isVolatile)
4738 Root = TLI.prepareVolatileOrAtomicLoad(Root, dl, DAG);
4739
4740 SmallVector<SDValue, 4> Values(NumValues);
4741 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4742
4743 unsigned ChainI = 0;
4744 for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
4745 // Serializing loads here may result in excessive register pressure, and
4746 // TokenFactor places arbitrary choke points on the scheduler. SD scheduling
4747 // could recover a bit by hoisting nodes upward in the chain by recognizing
4748 // they are side-effect free or do not alias. The optimizer should really
4749 // avoid this case by converting large object/array copies to llvm.memcpy
4750 // (MaxParallelChains should always remain as failsafe).
4751 if (ChainI == MaxParallelChains) {
4752 assert(PendingLoads.empty() && "PendingLoads must be serialized first");
4753 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4754 ArrayRef(Chains.data(), ChainI));
4755 Root = Chain;
4756 ChainI = 0;
4757 }
4758
4759 // TODO: MachinePointerInfo only supports a fixed length offset.
4760 MachinePointerInfo PtrInfo =
4761 !Offsets[i].isScalable() || Offsets[i].isZero()
4762 ? MachinePointerInfo(SV, Offsets[i].getKnownMinValue())
4763 : MachinePointerInfo();
4764
4765 SDValue A = DAG.getObjectPtrOffset(dl, Ptr, Offsets[i]);
4766 SDValue L = DAG.getLoad(MemVTs[i], dl, Root, A, PtrInfo, Alignment,
4767 MMOFlags, AAInfo, Ranges);
4768 Chains[ChainI] = L.getValue(1);
4769
4770 if (MemVTs[i] != ValueVTs[i])
4771 L = DAG.getPtrExtOrTrunc(L, dl, ValueVTs[i]);
4772
4773 Values[i] = L;
4774 }
4775
4776 if (!ConstantMemory) {
4777 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4778 ArrayRef(Chains.data(), ChainI));
4779 if (isVolatile)
4780 DAG.setRoot(Chain);
4781 else
4782 PendingLoads.push_back(Chain);
4783 }
4784
4785 setValue(&I, DAG.getNode(ISD::MERGE_VALUES, dl,
4786 DAG.getVTList(ValueVTs), Values));
4787}
4788
4789void SelectionDAGBuilder::visitStoreToSwiftError(const StoreInst &I) {
4790 assert(DAG.getTargetLoweringInfo().supportSwiftError() &&
4791 "call visitStoreToSwiftError when backend supports swifterror");
4792
4793 SmallVector<EVT, 4> ValueVTs;
4794 SmallVector<uint64_t, 4> Offsets;
4795 const Value *SrcV = I.getOperand(0);
4796 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(),
4797 SrcV->getType(), ValueVTs, /*MemVTs=*/nullptr, &Offsets, 0);
4798 assert(ValueVTs.size() == 1 && Offsets[0] == 0 &&
4799 "expect a single EVT for swifterror");
4800
4801 SDValue Src = getValue(SrcV);
4802 // Create a virtual register, then update the virtual register.
4803 Register VReg =
4804 SwiftError.getOrCreateVRegDefAt(&I, FuncInfo.MBB, I.getPointerOperand());
4805 // Chain, DL, Reg, N or Chain, DL, Reg, N, Glue
4806 // Chain can be getRoot or getControlRoot.
4807 SDValue CopyNode = DAG.getCopyToReg(getRoot(), getCurSDLoc(), VReg,
4808 SDValue(Src.getNode(), Src.getResNo()));
4809 DAG.setRoot(CopyNode);
4810}
4811
4812void SelectionDAGBuilder::visitLoadFromSwiftError(const LoadInst &I) {
4813 assert(DAG.getTargetLoweringInfo().supportSwiftError() &&
4814 "call visitLoadFromSwiftError when backend supports swifterror");
4815
4816 assert(!I.isVolatile() &&
4817 !I.hasMetadata(LLVMContext::MD_nontemporal) &&
4818 !I.hasMetadata(LLVMContext::MD_invariant_load) &&
4819 "Support volatile, non temporal, invariant for load_from_swift_error");
4820
4821 const Value *SV = I.getOperand(0);
4822 Type *Ty = I.getType();
4823 assert(
4824 (!BatchAA ||
4825 !BatchAA->pointsToConstantMemory(MemoryLocation(
4826 SV, LocationSize::precise(DAG.getDataLayout().getTypeStoreSize(Ty)),
4827 I.getAAMetadata()))) &&
4828 "load_from_swift_error should not be constant memory");
4829
4830 SmallVector<EVT, 4> ValueVTs;
4831 SmallVector<uint64_t, 4> Offsets;
4832 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), Ty,
4833 ValueVTs, /*MemVTs=*/nullptr, &Offsets, 0);
4834 assert(ValueVTs.size() == 1 && Offsets[0] == 0 &&
4835 "expect a single EVT for swifterror");
4836
4837 // Chain, DL, Reg, VT, Glue or Chain, DL, Reg, VT
4838 SDValue L = DAG.getCopyFromReg(
4839 getRoot(), getCurSDLoc(),
4840 SwiftError.getOrCreateVRegUseAt(&I, FuncInfo.MBB, SV), ValueVTs[0]);
4841
4842 setValue(&I, L);
4843}
4844
4845void SelectionDAGBuilder::visitStore(const StoreInst &I) {
4846 if (I.isAtomic())
4847 return visitAtomicStore(I);
4848
4849 const Value *SrcV = I.getOperand(0);
4850 const Value *PtrV = I.getOperand(1);
4851
4852 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4853 if (TLI.supportSwiftError()) {
4854 // Swifterror values can come from either a function parameter with
4855 // swifterror attribute or an alloca with swifterror attribute.
4856 if (const Argument *Arg = dyn_cast<Argument>(PtrV)) {
4857 if (Arg->hasSwiftErrorAttr())
4858 return visitStoreToSwiftError(I);
4859 }
4860
4861 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(PtrV)) {
4862 if (Alloca->isSwiftError())
4863 return visitStoreToSwiftError(I);
4864 }
4865 }
4866
4867 SmallVector<EVT, 4> ValueVTs, MemVTs;
4869 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(),
4870 SrcV->getType(), ValueVTs, &MemVTs, &Offsets);
4871 unsigned NumValues = ValueVTs.size();
4872 if (NumValues == 0)
4873 return;
4874
4875 // Get the lowered operands. Note that we do this after
4876 // checking if NumResults is zero, because with zero results
4877 // the operands won't have values in the map.
4878 SDValue Src = getValue(SrcV);
4879 SDValue Ptr = getValue(PtrV);
4880
4881 SDValue Root = I.isVolatile() ? getRoot() : getMemoryRoot();
4882 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4883 SDLoc dl = getCurSDLoc();
4884 Align Alignment = I.getAlign();
4885 AAMDNodes AAInfo = I.getAAMetadata();
4886
4887 auto MMOFlags = TLI.getStoreMemOperandFlags(I, DAG.getDataLayout());
4888
4889 unsigned ChainI = 0;
4890 for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
4891 // See visitLoad comments.
4892 if (ChainI == MaxParallelChains) {
4893 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4894 ArrayRef(Chains.data(), ChainI));
4895 Root = Chain;
4896 ChainI = 0;
4897 }
4898
4899 // TODO: MachinePointerInfo only supports a fixed length offset.
4900 MachinePointerInfo PtrInfo =
4901 !Offsets[i].isScalable() || Offsets[i].isZero()
4902 ? MachinePointerInfo(PtrV, Offsets[i].getKnownMinValue())
4903 : MachinePointerInfo();
4904
4905 SDValue Add = DAG.getObjectPtrOffset(dl, Ptr, Offsets[i]);
4906 SDValue Val = SDValue(Src.getNode(), Src.getResNo() + i);
4907 if (MemVTs[i] != ValueVTs[i])
4908 Val = DAG.getPtrExtOrTrunc(Val, dl, MemVTs[i]);
4909 SDValue St =
4910 DAG.getStore(Root, dl, Val, Add, PtrInfo, Alignment, MMOFlags, AAInfo);
4911 Chains[ChainI] = St;
4912 }
4913
4914 SDValue StoreNode = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4915 ArrayRef(Chains.data(), ChainI));
4916 setValue(&I, StoreNode);
4917 DAG.setRoot(StoreNode);
4918}
4919
4920void SelectionDAGBuilder::visitMaskedStore(const CallInst &I,
4921 bool IsCompressing) {
4922 SDLoc sdl = getCurSDLoc();
4923
4924 Value *Src0Operand = I.getArgOperand(0);
4925 Value *PtrOperand = I.getArgOperand(1);
4926 Value *MaskOperand = I.getArgOperand(2);
4927 Align Alignment = I.getParamAlign(1).valueOrOne();
4928
4929 SDValue Ptr = getValue(PtrOperand);
4930 SDValue Src0 = getValue(Src0Operand);
4931 SDValue Mask = getValue(MaskOperand);
4932 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
4933
4934 EVT VT = Src0.getValueType();
4935
4936 auto MMOFlags = MachineMemOperand::MOStore;
4937 if (I.hasMetadata(LLVMContext::MD_nontemporal))
4939
4940 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
4941 MachinePointerInfo(PtrOperand), MMOFlags,
4942 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata());
4943
4944 const auto &TLI = DAG.getTargetLoweringInfo();
4945
4946 SDValue StoreNode =
4947 !IsCompressing && TTI->hasConditionalLoadStoreForType(
4948 I.getArgOperand(0)->getType(), /*IsStore=*/true)
4949 ? TLI.visitMaskedStore(DAG, sdl, getMemoryRoot(), MMO, Ptr, Src0,
4950 Mask)
4951 : DAG.getMaskedStore(getMemoryRoot(), sdl, Src0, Ptr, Offset, Mask,
4952 VT, MMO, ISD::UNINDEXED, /*Truncating=*/false,
4953 IsCompressing);
4954 DAG.setRoot(StoreNode);
4955 setValue(&I, StoreNode);
4956}
4957
4958// Get a uniform base for the Gather/Scatter intrinsic.
4959// The first argument of the Gather/Scatter intrinsic is a vector of pointers.
4960// We try to represent it as a base pointer + vector of indices.
4961// Usually, the vector of pointers comes from a 'getelementptr' instruction.
4962// The first operand of the GEP may be a single pointer or a vector of pointers
4963// Example:
4964// %gep.ptr = getelementptr i32, <8 x i32*> %vptr, <8 x i32> %ind
4965// or
4966// %gep.ptr = getelementptr i32, i32* %ptr, <8 x i32> %ind
4967// %res = call <8 x i32> @llvm.masked.gather.v8i32(<8 x i32*> %gep.ptr, ..
4968//
4969// When the first GEP operand is a single pointer - it is the uniform base we
4970// are looking for. If first operand of the GEP is a splat vector - we
4971// extract the splat value and use it as a uniform base.
4972// In all other cases the function returns 'false'.
4973static bool getUniformBase(const Value *Ptr, SDValue &Base, SDValue &Index,
4974 SDValue &Scale, SelectionDAGBuilder *SDB,
4975 const BasicBlock *CurBB, uint64_t ElemSize) {
4976 SelectionDAG& DAG = SDB->DAG;
4977 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4978 const DataLayout &DL = DAG.getDataLayout();
4979
4980 assert(Ptr->getType()->isVectorTy() && "Unexpected pointer type");
4981
4982 // Handle splat constant pointer.
4983 if (auto *C = dyn_cast<Constant>(Ptr)) {
4984 C = C->getSplatValue();
4985 if (!C)
4986 return false;
4987
4988 Base = SDB->getValue(C);
4989
4990 ElementCount NumElts = cast<VectorType>(Ptr->getType())->getElementCount();
4991 EVT VT = EVT::getVectorVT(*DAG.getContext(), TLI.getPointerTy(DL), NumElts);
4992 Index = DAG.getConstant(0, SDB->getCurSDLoc(), VT);
4993 Scale = DAG.getTargetConstant(1, SDB->getCurSDLoc(), TLI.getPointerTy(DL));
4994 return true;
4995 }
4996
4998 if (!GEP || GEP->getParent() != CurBB)
4999 return false;
5000
5001 if (GEP->getNumOperands() != 2)
5002 return false;
5003
5004 const Value *BasePtr = GEP->getPointerOperand();
5005 const Value *IndexVal = GEP->getOperand(GEP->getNumOperands() - 1);
5006
5007 // Make sure the base is scalar and the index is a vector.
5008 if (BasePtr->getType()->isVectorTy() || !IndexVal->getType()->isVectorTy())
5009 return false;
5010
5011 TypeSize ScaleVal = DL.getTypeAllocSize(GEP->getResultElementType());
5012 if (ScaleVal.isScalable())
5013 return false;
5014
5015 // Target may not support the required addressing mode.
5016 if (ScaleVal != 1 &&
5017 !TLI.isLegalScaleForGatherScatter(ScaleVal.getFixedValue(), ElemSize))
5018 return false;
5019
5020 Base = SDB->getValue(BasePtr);
5021 Index = SDB->getValue(IndexVal);
5022
5023 Scale =
5024 DAG.getTargetConstant(ScaleVal, SDB->getCurSDLoc(), TLI.getPointerTy(DL));
5025 return true;
5026}
5027
5028void SelectionDAGBuilder::visitMaskedScatter(const CallInst &I) {
5029 SDLoc sdl = getCurSDLoc();
5030
5031 // llvm.masked.scatter.*(Src0, Ptrs, Mask)
5032 const Value *Ptr = I.getArgOperand(1);
5033 SDValue Src0 = getValue(I.getArgOperand(0));
5034 SDValue Mask = getValue(I.getArgOperand(2));
5035 EVT VT = Src0.getValueType();
5036 Align Alignment = I.getParamAlign(1).valueOrOne();
5037 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5038
5039 SDValue Base;
5040 SDValue Index;
5041 SDValue Scale;
5042 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
5043 I.getParent(), VT.getScalarStoreSize());
5044
5045 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
5046 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5047 MachinePointerInfo(AS), MachineMemOperand::MOStore,
5048 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata());
5049 if (!UniformBase) {
5050 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5051 Index = getValue(Ptr);
5052 Scale =
5053 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5054 }
5055
5056 EVT IdxVT = Index.getValueType();
5057 EVT EltTy = IdxVT.getVectorElementType();
5058 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
5059 EVT NewIdxVT = IdxVT.changeVectorElementType(EltTy);
5060 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
5061 }
5062
5063 SDValue Ops[] = { getMemoryRoot(), Src0, Mask, Base, Index, Scale };
5064 SDValue Scatter = DAG.getMaskedScatter(DAG.getVTList(MVT::Other), VT, sdl,
5065 Ops, MMO, ISD::SIGNED_SCALED, false);
5066 DAG.setRoot(Scatter);
5067 setValue(&I, Scatter);
5068}
5069
5070void SelectionDAGBuilder::visitMaskedLoad(const CallInst &I, bool IsExpanding) {
5071 SDLoc sdl = getCurSDLoc();
5072
5073 Value *PtrOperand = I.getArgOperand(0);
5074 Value *MaskOperand = I.getArgOperand(1);
5075 Value *Src0Operand = I.getArgOperand(2);
5076 Align Alignment = I.getParamAlign(0).valueOrOne();
5077
5078 SDValue Ptr = getValue(PtrOperand);
5079 SDValue Src0 = getValue(Src0Operand);
5080 SDValue Mask = getValue(MaskOperand);
5081 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
5082
5083 EVT VT = Src0.getValueType();
5084 AAMDNodes AAInfo = I.getAAMetadata();
5085 const MDNode *Ranges = getRangeMetadata(I);
5086
5087 // Do not serialize masked loads of constant memory with anything.
5088 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
5089 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
5090
5091 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
5092
5093 auto MMOFlags = MachineMemOperand::MOLoad;
5094 if (I.hasMetadata(LLVMContext::MD_nontemporal))
5096 if (I.hasMetadata(LLVMContext::MD_invariant_load))
5098
5099 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5100 MachinePointerInfo(PtrOperand), MMOFlags,
5101 LocationSize::beforeOrAfterPointer(), Alignment, AAInfo, Ranges);
5102
5103 const auto &TLI = DAG.getTargetLoweringInfo();
5104
5105 // The Load/Res may point to different values and both of them are output
5106 // variables.
5107 SDValue Load;
5108 SDValue Res;
5109 if (!IsExpanding &&
5110 TTI->hasConditionalLoadStoreForType(Src0Operand->getType(),
5111 /*IsStore=*/false))
5112 Res = TLI.visitMaskedLoad(DAG, sdl, InChain, MMO, Load, Ptr, Src0, Mask);
5113 else
5114 Res = Load =
5115 DAG.getMaskedLoad(VT, sdl, InChain, Ptr, Offset, Mask, Src0, VT, MMO,
5116 ISD::UNINDEXED, ISD::NON_EXTLOAD, IsExpanding);
5117 if (AddToChain)
5118 PendingLoads.push_back(Load.getValue(1));
5119 setValue(&I, Res);
5120}
5121
5122void SelectionDAGBuilder::visitMaskedGather(const CallInst &I) {
5123 SDLoc sdl = getCurSDLoc();
5124
5125 // @llvm.masked.gather.*(Ptrs, Mask, Src0)
5126 const Value *Ptr = I.getArgOperand(0);
5127 SDValue Src0 = getValue(I.getArgOperand(2));
5128 SDValue Mask = getValue(I.getArgOperand(1));
5129
5130 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5131 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
5132 Align Alignment = I.getParamAlign(0).valueOrOne();
5133
5134 const MDNode *Ranges = getRangeMetadata(I);
5135
5136 SDValue Root = DAG.getRoot();
5137 SDValue Base;
5138 SDValue Index;
5139 SDValue Scale;
5140 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
5141 I.getParent(), VT.getScalarStoreSize());
5142 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
5143 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5144 MachinePointerInfo(AS), MachineMemOperand::MOLoad,
5145 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata(),
5146 Ranges);
5147
5148 if (!UniformBase) {
5149 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5150 Index = getValue(Ptr);
5151 Scale =
5152 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5153 }
5154
5155 EVT IdxVT = Index.getValueType();
5156 EVT EltTy = IdxVT.getVectorElementType();
5157 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
5158 EVT NewIdxVT = IdxVT.changeVectorElementType(EltTy);
5159 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
5160 }
5161
5162 SDValue Ops[] = { Root, Src0, Mask, Base, Index, Scale };
5163 SDValue Gather =
5164 DAG.getMaskedGather(DAG.getVTList(VT, MVT::Other), VT, sdl, Ops, MMO,
5166
5167 PendingLoads.push_back(Gather.getValue(1));
5168 setValue(&I, Gather);
5169}
5170
5171void SelectionDAGBuilder::visitAtomicCmpXchg(const AtomicCmpXchgInst &I) {
5172 SDLoc dl = getCurSDLoc();
5173 AtomicOrdering SuccessOrdering = I.getSuccessOrdering();
5174 AtomicOrdering FailureOrdering = I.getFailureOrdering();
5175 SyncScope::ID SSID = I.getSyncScopeID();
5176
5177 SDValue InChain = getRoot();
5178
5179 MVT MemVT = getValue(I.getCompareOperand()).getSimpleValueType();
5180 SDVTList VTs = DAG.getVTList(MemVT, MVT::i1, MVT::Other);
5181
5182 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5183 auto Flags = TLI.getAtomicMemOperandFlags(I, DAG.getDataLayout());
5184
5185 MachineFunction &MF = DAG.getMachineFunction();
5186 MachineMemOperand *MMO = MF.getMachineMemOperand(
5187 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5188 DAG.getEVTAlign(MemVT), AAMDNodes(), nullptr, SSID, SuccessOrdering,
5189 FailureOrdering);
5190
5192 dl, MemVT, VTs, InChain,
5193 getValue(I.getPointerOperand()),
5194 getValue(I.getCompareOperand()),
5195 getValue(I.getNewValOperand()), MMO);
5196
5197 SDValue OutChain = L.getValue(2);
5198
5199 setValue(&I, L);
5200 DAG.setRoot(OutChain);
5201}
5202
5203void SelectionDAGBuilder::visitAtomicRMW(const AtomicRMWInst &I) {
5204 SDLoc dl = getCurSDLoc();
5206 switch (I.getOperation()) {
5207 default: llvm_unreachable("Unknown atomicrmw operation");
5225 break;
5228 break;
5231 break;
5234 break;
5237 break;
5240 break;
5241 }
5242 AtomicOrdering Ordering = I.getOrdering();
5243 SyncScope::ID SSID = I.getSyncScopeID();
5244
5245 SDValue InChain = getRoot();
5246
5247 auto MemVT = getValue(I.getValOperand()).getSimpleValueType();
5248 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5249 auto Flags = TLI.getAtomicMemOperandFlags(I, DAG.getDataLayout());
5250
5251 MachineFunction &MF = DAG.getMachineFunction();
5252 MachineMemOperand *MMO = MF.getMachineMemOperand(
5253 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5254 DAG.getEVTAlign(MemVT), AAMDNodes(), nullptr, SSID, Ordering);
5255
5256 SDValue L =
5257 DAG.getAtomic(NT, dl, MemVT, InChain,
5258 getValue(I.getPointerOperand()), getValue(I.getValOperand()),
5259 MMO);
5260
5261 SDValue OutChain = L.getValue(1);
5262
5263 setValue(&I, L);
5264 DAG.setRoot(OutChain);
5265}
5266
5267void SelectionDAGBuilder::visitFence(const FenceInst &I) {
5268 SDLoc dl = getCurSDLoc();
5269 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5270 SDValue Ops[3];
5271 Ops[0] = getRoot();
5272 Ops[1] = DAG.getTargetConstant((unsigned)I.getOrdering(), dl,
5273 TLI.getFenceOperandTy(DAG.getDataLayout()));
5274 Ops[2] = DAG.getTargetConstant(I.getSyncScopeID(), dl,
5275 TLI.getFenceOperandTy(DAG.getDataLayout()));
5276 SDValue N = DAG.getNode(ISD::ATOMIC_FENCE, dl, MVT::Other, Ops);
5277 setValue(&I, N);
5278 DAG.setRoot(N);
5279}
5280
5281void SelectionDAGBuilder::visitAtomicLoad(const LoadInst &I) {
5282 SDLoc dl = getCurSDLoc();
5283 AtomicOrdering Order = I.getOrdering();
5284 SyncScope::ID SSID = I.getSyncScopeID();
5285
5286 SDValue InChain = getRoot();
5287
5288 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5289 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
5290 EVT MemVT = TLI.getMemValueType(DAG.getDataLayout(), I.getType());
5291
5292 if (!TLI.supportsUnalignedAtomics() &&
5293 I.getAlign().value() < MemVT.getSizeInBits() / 8)
5294 report_fatal_error("Cannot generate unaligned atomic load");
5295
5296 auto Flags = TLI.getLoadMemOperandFlags(I, DAG.getDataLayout(), AC, LibInfo);
5297
5298 const MDNode *Ranges = getRangeMetadata(I);
5299 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5300 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5301 I.getAlign(), AAMDNodes(), Ranges, SSID, Order);
5302
5303 InChain = TLI.prepareVolatileOrAtomicLoad(InChain, dl, DAG);
5304
5305 SDValue Ptr = getValue(I.getPointerOperand());
5306 SDValue L =
5307 DAG.getAtomicLoad(ISD::NON_EXTLOAD, dl, MemVT, MemVT, InChain, Ptr, MMO);
5308
5309 SDValue OutChain = L.getValue(1);
5310 if (MemVT != VT)
5311 L = DAG.getPtrExtOrTrunc(L, dl, VT);
5312
5313 setValue(&I, L);
5314 DAG.setRoot(OutChain);
5315}
5316
5317void SelectionDAGBuilder::visitAtomicStore(const StoreInst &I) {
5318 SDLoc dl = getCurSDLoc();
5319
5320 AtomicOrdering Ordering = I.getOrdering();
5321 SyncScope::ID SSID = I.getSyncScopeID();
5322
5323 SDValue InChain = getRoot();
5324
5325 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5326 EVT MemVT =
5327 TLI.getMemValueType(DAG.getDataLayout(), I.getValueOperand()->getType());
5328
5329 if (!TLI.supportsUnalignedAtomics() &&
5330 I.getAlign().value() < MemVT.getSizeInBits() / 8)
5331 report_fatal_error("Cannot generate unaligned atomic store");
5332
5333 auto Flags = TLI.getStoreMemOperandFlags(I, DAG.getDataLayout());
5334
5335 MachineFunction &MF = DAG.getMachineFunction();
5336 MachineMemOperand *MMO = MF.getMachineMemOperand(
5337 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5338 I.getAlign(), AAMDNodes(), nullptr, SSID, Ordering);
5339
5340 SDValue Val = getValue(I.getValueOperand());
5341 if (Val.getValueType() != MemVT)
5342 Val = DAG.getPtrExtOrTrunc(Val, dl, MemVT);
5343 SDValue Ptr = getValue(I.getPointerOperand());
5344
5345 SDValue OutChain =
5346 DAG.getAtomic(ISD::ATOMIC_STORE, dl, MemVT, InChain, Val, Ptr, MMO);
5347
5348 setValue(&I, OutChain);
5349 DAG.setRoot(OutChain);
5350}
5351
5352/// Check if this intrinsic call depends on the chain (1st return value)
5353/// and if it only *loads* memory.
5354/// Ignore the callsite's attributes. A specific call site may be marked with
5355/// readnone, but the lowering code will expect the chain based on the
5356/// definition.
5357std::pair<bool, bool>
5358SelectionDAGBuilder::getTargetIntrinsicCallProperties(const CallBase &I) {
5359 const Function *F = I.getCalledFunction();
5360 bool HasChain = !F->doesNotAccessMemory();
5361 bool OnlyLoad =
5362 HasChain && F->onlyReadsMemory() && F->willReturn() && F->doesNotThrow();
5363
5364 return {HasChain, OnlyLoad};
5365}
5366
5367SmallVector<SDValue, 8> SelectionDAGBuilder::getTargetIntrinsicOperands(
5368 const CallBase &I, bool HasChain, bool OnlyLoad,
5369 TargetLowering::IntrinsicInfo *TgtMemIntrinsicInfo) {
5370 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5371
5372 // Build the operand list.
5374 if (HasChain) { // If this intrinsic has side-effects, chainify it.
5375 if (OnlyLoad) {
5376 // We don't need to serialize loads against other loads.
5377 Ops.push_back(DAG.getRoot());
5378 } else {
5379 Ops.push_back(getRoot());
5380 }
5381 }
5382
5383 // Add the intrinsic ID as an integer operand if it's not a target intrinsic.
5384 if (!TgtMemIntrinsicInfo || TgtMemIntrinsicInfo->opc == ISD::INTRINSIC_VOID ||
5385 TgtMemIntrinsicInfo->opc == ISD::INTRINSIC_W_CHAIN)
5386 Ops.push_back(DAG.getTargetConstant(I.getIntrinsicID(), getCurSDLoc(),
5387 TLI.getPointerTy(DAG.getDataLayout())));
5388
5389 // Add all operands of the call to the operand list.
5390 for (unsigned i = 0, e = I.arg_size(); i != e; ++i) {
5391 const Value *Arg = I.getArgOperand(i);
5392 if (!I.paramHasAttr(i, Attribute::ImmArg)) {
5393 Ops.push_back(getValue(Arg));
5394 continue;
5395 }
5396
5397 // Use TargetConstant instead of a regular constant for immarg.
5398 EVT VT = TLI.getValueType(DAG.getDataLayout(), Arg->getType(), true);
5399 if (const ConstantInt *CI = dyn_cast<ConstantInt>(Arg)) {
5400 assert(CI->getBitWidth() <= 64 &&
5401 "large intrinsic immediates not handled");
5402 Ops.push_back(DAG.getTargetConstant(*CI, SDLoc(), VT));
5403 } else {
5404 Ops.push_back(
5405 DAG.getTargetConstantFP(*cast<ConstantFP>(Arg), SDLoc(), VT));
5406 }
5407 }
5408
5409 if (std::optional<OperandBundleUse> Bundle =
5410 I.getOperandBundle(LLVMContext::OB_deactivation_symbol)) {
5411 auto *Sym = Bundle->Inputs[0].get();
5412 SDValue SDSym = getValue(Sym);
5413 SDSym = DAG.getDeactivationSymbol(cast<GlobalValue>(Sym));
5414 Ops.push_back(SDSym);
5415 }
5416
5417 if (std::optional<OperandBundleUse> Bundle =
5418 I.getOperandBundle(LLVMContext::OB_convergencectrl)) {
5419 Value *Token = Bundle->Inputs[0].get();
5420 SDValue ConvControlToken = getValue(Token);
5421 assert(Ops.back().getValueType() != MVT::Glue &&
5422 "Did not expect another glue node here.");
5423 ConvControlToken =
5424 DAG.getNode(ISD::CONVERGENCECTRL_GLUE, {}, MVT::Glue, ConvControlToken);
5425 Ops.push_back(ConvControlToken);
5426 }
5427
5428 return Ops;
5429}
5430
5431SDVTList SelectionDAGBuilder::getTargetIntrinsicVTList(const CallBase &I,
5432 bool HasChain) {
5433 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5434
5435 SmallVector<EVT, 4> ValueVTs;
5436 ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);
5437
5438 if (HasChain)
5439 ValueVTs.push_back(MVT::Other);
5440
5441 return DAG.getVTList(ValueVTs);
5442}
5443
5444/// Get an INTRINSIC node for a target intrinsic which does not touch memory.
5445SDValue SelectionDAGBuilder::getTargetNonMemIntrinsicNode(
5446 const Type &IntrinsicVT, bool HasChain, ArrayRef<SDValue> Ops,
5447 const SDVTList &VTs) {
5448 if (!HasChain)
5449 return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, getCurSDLoc(), VTs, Ops);
5450 if (!IntrinsicVT.isVoidTy())
5451 return DAG.getNode(ISD::INTRINSIC_W_CHAIN, getCurSDLoc(), VTs, Ops);
5452 return DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops);
5453}
5454
5455/// Set root, convert return type if necessary and check alignment.
5456SDValue SelectionDAGBuilder::handleTargetIntrinsicRet(const CallBase &I,
5457 bool HasChain,
5458 bool OnlyLoad,
5459 SDValue Result) {
5460 if (HasChain) {
5461 SDValue Chain = Result.getValue(Result.getNode()->getNumValues() - 1);
5462 if (OnlyLoad)
5463 PendingLoads.push_back(Chain);
5464 else
5465 DAG.setRoot(Chain);
5466 }
5467
5468 if (I.getType()->isVoidTy())
5469 return Result;
5470
5471 if (MaybeAlign Alignment = I.getRetAlign(); InsertAssertAlign && Alignment) {
5472 // Insert `assertalign` node if there's an alignment.
5473 Result = DAG.getAssertAlign(getCurSDLoc(), Result, Alignment.valueOrOne());
5474 } else if (!isa<VectorType>(I.getType())) {
5475 Result = lowerRangeToAssertZExt(DAG, I, Result);
5476 }
5477
5478 return Result;
5479}
5480
5481/// visitTargetIntrinsic - Lower a call of a target intrinsic to an INTRINSIC
5482/// node.
5483void SelectionDAGBuilder::visitTargetIntrinsic(const CallInst &I,
5484 unsigned Intrinsic) {
5485 auto [HasChain, OnlyLoad] = getTargetIntrinsicCallProperties(I);
5486
5487 // Info is set by getTgtMemIntrinsic
5488 TargetLowering::IntrinsicInfo Info;
5489 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5490 bool IsTgtMemIntrinsic =
5491 TLI.getTgtMemIntrinsic(Info, I, DAG.getMachineFunction(), Intrinsic);
5492
5493 SmallVector<SDValue, 8> Ops = getTargetIntrinsicOperands(
5494 I, HasChain, OnlyLoad, IsTgtMemIntrinsic ? &Info : nullptr);
5495 SDVTList VTs = getTargetIntrinsicVTList(I, HasChain);
5496
5497 // Propagate fast-math-flags from IR to node(s).
5498 SDNodeFlags Flags;
5499 if (auto *FPMO = dyn_cast<FPMathOperator>(&I))
5500 Flags.copyFMF(*FPMO);
5501 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
5502
5503 // Create the node.
5505
5506 // In some cases, custom collection of operands from CallInst I may be needed.
5508 if (IsTgtMemIntrinsic) {
5509 // This is target intrinsic that touches memory
5510 //
5511 // TODO: We currently just fallback to address space 0 if getTgtMemIntrinsic
5512 // didn't yield anything useful.
5513 MachinePointerInfo MPI;
5514 if (Info.ptrVal)
5515 MPI = MachinePointerInfo(Info.ptrVal, Info.offset);
5516 else if (Info.fallbackAddressSpace)
5517 MPI = MachinePointerInfo(*Info.fallbackAddressSpace);
5518 EVT MemVT = Info.memVT;
5519 LocationSize Size = LocationSize::precise(Info.size);
5520 if (Size.hasValue() && !Size.getValue())
5522 Align Alignment = Info.align.value_or(DAG.getEVTAlign(MemVT));
5523 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5524 MPI, Info.flags, Size, Alignment, I.getAAMetadata(), /*Ranges=*/nullptr,
5525 Info.ssid, Info.order, Info.failureOrder);
5526 Result =
5527 DAG.getMemIntrinsicNode(Info.opc, getCurSDLoc(), VTs, Ops, MemVT, MMO);
5528 } else {
5529 Result = getTargetNonMemIntrinsicNode(*I.getType(), HasChain, Ops, VTs);
5530 }
5531
5532 Result = handleTargetIntrinsicRet(I, HasChain, OnlyLoad, Result);
5533
5534 setValue(&I, Result);
5535}
5536
5537/// GetSignificand - Get the significand and build it into a floating-point
5538/// number with exponent of 1:
5539///
5540/// Op = (Op & 0x007fffff) | 0x3f800000;
5541///
5542/// where Op is the hexadecimal representation of floating point value.
5544 SDValue t1 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
5545 DAG.getConstant(0x007fffff, dl, MVT::i32));
5546 SDValue t2 = DAG.getNode(ISD::OR, dl, MVT::i32, t1,
5547 DAG.getConstant(0x3f800000, dl, MVT::i32));
5548 return DAG.getNode(ISD::BITCAST, dl, MVT::f32, t2);
5549}
5550
5551/// GetExponent - Get the exponent:
5552///
5553/// (float)(int)(((Op & 0x7f800000) >> 23) - 127);
5554///
5555/// where Op is the hexadecimal representation of floating point value.
5557 const TargetLowering &TLI, const SDLoc &dl) {
5558 SDValue t0 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
5559 DAG.getConstant(0x7f800000, dl, MVT::i32));
5560 SDValue t1 = DAG.getNode(ISD::SRL, dl, MVT::i32, t0,
5561 DAG.getShiftAmountConstant(23, MVT::i32, dl));
5562 SDValue t2 = DAG.getNode(ISD::SUB, dl, MVT::i32, t1,
5563 DAG.getConstant(127, dl, MVT::i32));
5564 return DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, t2);
5565}
5566
5567/// getF32Constant - Get 32-bit floating point constant.
5568static SDValue getF32Constant(SelectionDAG &DAG, unsigned Flt,
5569 const SDLoc &dl) {
5570 return DAG.getConstantFP(APFloat(APFloat::IEEEsingle(), APInt(32, Flt)), dl,
5571 MVT::f32);
5572}
5573
5575 SelectionDAG &DAG) {
5576 // TODO: What fast-math-flags should be set on the floating-point nodes?
5577
5578 // IntegerPartOfX = ((int32_t)(t0);
5579 SDValue IntegerPartOfX = DAG.getNode(ISD::FP_TO_SINT, dl, MVT::i32, t0);
5580
5581 // FractionalPartOfX = t0 - (float)IntegerPartOfX;
5582 SDValue t1 = DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, IntegerPartOfX);
5583 SDValue X = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0, t1);
5584
5585 // IntegerPartOfX <<= 23;
5586 IntegerPartOfX = DAG.getNode(ISD::SHL, dl, MVT::i32, IntegerPartOfX,
5587 DAG.getShiftAmountConstant(23, MVT::i32, dl));
5588
5589 SDValue TwoToFractionalPartOfX;
5590 if (LimitFloatPrecision <= 6) {
5591 // For floating-point precision of 6:
5592 //
5593 // TwoToFractionalPartOfX =
5594 // 0.997535578f +
5595 // (0.735607626f + 0.252464424f * x) * x;
5596 //
5597 // error 0.0144103317, which is 6 bits
5598 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5599 getF32Constant(DAG, 0x3e814304, dl));
5600 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5601 getF32Constant(DAG, 0x3f3c50c8, dl));
5602 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5603 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5604 getF32Constant(DAG, 0x3f7f5e7e, dl));
5605 } else if (LimitFloatPrecision <= 12) {
5606 // For floating-point precision of 12:
5607 //
5608 // TwoToFractionalPartOfX =
5609 // 0.999892986f +
5610 // (0.696457318f +
5611 // (0.224338339f + 0.792043434e-1f * x) * x) * x;
5612 //
5613 // error 0.000107046256, which is 13 to 14 bits
5614 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5615 getF32Constant(DAG, 0x3da235e3, dl));
5616 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5617 getF32Constant(DAG, 0x3e65b8f3, dl));
5618 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5619 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5620 getF32Constant(DAG, 0x3f324b07, dl));
5621 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5622 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5623 getF32Constant(DAG, 0x3f7ff8fd, dl));
5624 } else { // LimitFloatPrecision <= 18
5625 // For floating-point precision of 18:
5626 //
5627 // TwoToFractionalPartOfX =
5628 // 0.999999982f +
5629 // (0.693148872f +
5630 // (0.240227044f +
5631 // (0.554906021e-1f +
5632 // (0.961591928e-2f +
5633 // (0.136028312e-2f + 0.157059148e-3f *x)*x)*x)*x)*x)*x;
5634 // error 2.47208000*10^(-7), which is better than 18 bits
5635 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5636 getF32Constant(DAG, 0x3924b03e, dl));
5637 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5638 getF32Constant(DAG, 0x3ab24b87, dl));
5639 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5640 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5641 getF32Constant(DAG, 0x3c1d8c17, dl));
5642 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5643 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5644 getF32Constant(DAG, 0x3d634a1d, dl));
5645 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5646 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5647 getF32Constant(DAG, 0x3e75fe14, dl));
5648 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5649 SDValue t11 = DAG.getNode(ISD::FADD, dl, MVT::f32, t10,
5650 getF32Constant(DAG, 0x3f317234, dl));
5651 SDValue t12 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t11, X);
5652 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t12,
5653 getF32Constant(DAG, 0x3f800000, dl));
5654 }
5655
5656 // Add the exponent into the result in integer domain.
5657 SDValue t13 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, TwoToFractionalPartOfX);
5658 return DAG.getNode(ISD::BITCAST, dl, MVT::f32,
5659 DAG.getNode(ISD::ADD, dl, MVT::i32, t13, IntegerPartOfX));
5660}
5661
5662/// expandExp - Lower an exp intrinsic. Handles the special sequences for
5663/// limited-precision mode.
5665 const TargetLowering &TLI, SDNodeFlags Flags) {
5666 if (Op.getValueType() == MVT::f32 &&
5668
5669 // Put the exponent in the right bit position for later addition to the
5670 // final result:
5671 //
5672 // t0 = Op * log2(e)
5673
5674 // TODO: What fast-math-flags should be set here?
5675 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, Op,
5676 DAG.getConstantFP(numbers::log2ef, dl, MVT::f32));
5677 return getLimitedPrecisionExp2(t0, dl, DAG);
5678 }
5679
5680 // No special expansion.
5681 return DAG.getNode(ISD::FEXP, dl, Op.getValueType(), Op, Flags);
5682}
5683
5684/// expandLog - Lower a log intrinsic. Handles the special sequences for
5685/// limited-precision mode.
5687 const TargetLowering &TLI, SDNodeFlags Flags) {
5688 // TODO: What fast-math-flags should be set on the floating-point nodes?
5689
5690 if (Op.getValueType() == MVT::f32 &&
5692 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5693
5694 // Scale the exponent by log(2).
5695 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5696 SDValue LogOfExponent =
5697 DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5698 DAG.getConstantFP(numbers::ln2f, dl, MVT::f32));
5699
5700 // Get the significand and build it into a floating-point number with
5701 // exponent of 1.
5702 SDValue X = GetSignificand(DAG, Op1, dl);
5703
5704 SDValue LogOfMantissa;
5705 if (LimitFloatPrecision <= 6) {
5706 // For floating-point precision of 6:
5707 //
5708 // LogofMantissa =
5709 // -1.1609546f +
5710 // (1.4034025f - 0.23903021f * x) * x;
5711 //
5712 // error 0.0034276066, which is better than 8 bits
5713 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5714 getF32Constant(DAG, 0xbe74c456, dl));
5715 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5716 getF32Constant(DAG, 0x3fb3a2b1, dl));
5717 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5718 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5719 getF32Constant(DAG, 0x3f949a29, dl));
5720 } else if (LimitFloatPrecision <= 12) {
5721 // For floating-point precision of 12:
5722 //
5723 // LogOfMantissa =
5724 // -1.7417939f +
5725 // (2.8212026f +
5726 // (-1.4699568f +
5727 // (0.44717955f - 0.56570851e-1f * x) * x) * x) * x;
5728 //
5729 // error 0.000061011436, which is 14 bits
5730 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5731 getF32Constant(DAG, 0xbd67b6d6, dl));
5732 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5733 getF32Constant(DAG, 0x3ee4f4b8, dl));
5734 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5735 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5736 getF32Constant(DAG, 0x3fbc278b, dl));
5737 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5738 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5739 getF32Constant(DAG, 0x40348e95, dl));
5740 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5741 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5742 getF32Constant(DAG, 0x3fdef31a, dl));
5743 } else { // LimitFloatPrecision <= 18
5744 // For floating-point precision of 18:
5745 //
5746 // LogOfMantissa =
5747 // -2.1072184f +
5748 // (4.2372794f +
5749 // (-3.7029485f +
5750 // (2.2781945f +
5751 // (-0.87823314f +
5752 // (0.19073739f - 0.17809712e-1f * x) * x) * x) * x) * x)*x;
5753 //
5754 // error 0.0000023660568, which is better than 18 bits
5755 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5756 getF32Constant(DAG, 0xbc91e5ac, dl));
5757 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5758 getF32Constant(DAG, 0x3e4350aa, dl));
5759 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5760 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5761 getF32Constant(DAG, 0x3f60d3e3, dl));
5762 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5763 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5764 getF32Constant(DAG, 0x4011cdf0, dl));
5765 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5766 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5767 getF32Constant(DAG, 0x406cfd1c, dl));
5768 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5769 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5770 getF32Constant(DAG, 0x408797cb, dl));
5771 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5772 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t10,
5773 getF32Constant(DAG, 0x4006dcab, dl));
5774 }
5775
5776 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, LogOfMantissa);
5777 }
5778
5779 // No special expansion.
5780 return DAG.getNode(ISD::FLOG, dl, Op.getValueType(), Op, Flags);
5781}
5782
5783/// expandLog2 - Lower a log2 intrinsic. Handles the special sequences for
5784/// limited-precision mode.
5786 const TargetLowering &TLI, SDNodeFlags Flags) {
5787 // TODO: What fast-math-flags should be set on the floating-point nodes?
5788
5789 if (Op.getValueType() == MVT::f32 &&
5791 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5792
5793 // Get the exponent.
5794 SDValue LogOfExponent = GetExponent(DAG, Op1, TLI, dl);
5795
5796 // Get the significand and build it into a floating-point number with
5797 // exponent of 1.
5798 SDValue X = GetSignificand(DAG, Op1, dl);
5799
5800 // Different possible minimax approximations of significand in
5801 // floating-point for various degrees of accuracy over [1,2].
5802 SDValue Log2ofMantissa;
5803 if (LimitFloatPrecision <= 6) {
5804 // For floating-point precision of 6:
5805 //
5806 // Log2ofMantissa = -1.6749035f + (2.0246817f - .34484768f * x) * x;
5807 //
5808 // error 0.0049451742, which is more than 7 bits
5809 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5810 getF32Constant(DAG, 0xbeb08fe0, dl));
5811 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5812 getF32Constant(DAG, 0x40019463, dl));
5813 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5814 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5815 getF32Constant(DAG, 0x3fd6633d, dl));
5816 } else if (LimitFloatPrecision <= 12) {
5817 // For floating-point precision of 12:
5818 //
5819 // Log2ofMantissa =
5820 // -2.51285454f +
5821 // (4.07009056f +
5822 // (-2.12067489f +
5823 // (.645142248f - 0.816157886e-1f * x) * x) * x) * x;
5824 //
5825 // error 0.0000876136000, which is better than 13 bits
5826 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5827 getF32Constant(DAG, 0xbda7262e, dl));
5828 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5829 getF32Constant(DAG, 0x3f25280b, dl));
5830 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5831 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5832 getF32Constant(DAG, 0x4007b923, dl));
5833 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5834 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5835 getF32Constant(DAG, 0x40823e2f, dl));
5836 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5837 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5838 getF32Constant(DAG, 0x4020d29c, dl));
5839 } else { // LimitFloatPrecision <= 18
5840 // For floating-point precision of 18:
5841 //
5842 // Log2ofMantissa =
5843 // -3.0400495f +
5844 // (6.1129976f +
5845 // (-5.3420409f +
5846 // (3.2865683f +
5847 // (-1.2669343f +
5848 // (0.27515199f -
5849 // 0.25691327e-1f * x) * x) * x) * x) * x) * x;
5850 //
5851 // error 0.0000018516, which is better than 18 bits
5852 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5853 getF32Constant(DAG, 0xbcd2769e, dl));
5854 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5855 getF32Constant(DAG, 0x3e8ce0b9, dl));
5856 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5857 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5858 getF32Constant(DAG, 0x3fa22ae7, dl));
5859 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5860 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5861 getF32Constant(DAG, 0x40525723, dl));
5862 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5863 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5864 getF32Constant(DAG, 0x40aaf200, dl));
5865 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5866 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5867 getF32Constant(DAG, 0x40c39dad, dl));
5868 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5869 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t10,
5870 getF32Constant(DAG, 0x4042902c, dl));
5871 }
5872
5873 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, Log2ofMantissa);
5874 }
5875
5876 // No special expansion.
5877 return DAG.getNode(ISD::FLOG2, dl, Op.getValueType(), Op, Flags);
5878}
5879
5880/// expandLog10 - Lower a log10 intrinsic. Handles the special sequences for
5881/// limited-precision mode.
5883 const TargetLowering &TLI, SDNodeFlags Flags) {
5884 // TODO: What fast-math-flags should be set on the floating-point nodes?
5885
5886 if (Op.getValueType() == MVT::f32 &&
5888 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5889
5890 // Scale the exponent by log10(2) [0.30102999f].
5891 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5892 SDValue LogOfExponent = DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5893 getF32Constant(DAG, 0x3e9a209a, dl));
5894
5895 // Get the significand and build it into a floating-point number with
5896 // exponent of 1.
5897 SDValue X = GetSignificand(DAG, Op1, dl);
5898
5899 SDValue Log10ofMantissa;
5900 if (LimitFloatPrecision <= 6) {
5901 // For floating-point precision of 6:
5902 //
5903 // Log10ofMantissa =
5904 // -0.50419619f +
5905 // (0.60948995f - 0.10380950f * x) * x;
5906 //
5907 // error 0.0014886165, which is 6 bits
5908 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5909 getF32Constant(DAG, 0xbdd49a13, dl));
5910 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5911 getF32Constant(DAG, 0x3f1c0789, dl));
5912 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5913 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5914 getF32Constant(DAG, 0x3f011300, dl));
5915 } else if (LimitFloatPrecision <= 12) {
5916 // For floating-point precision of 12:
5917 //
5918 // Log10ofMantissa =
5919 // -0.64831180f +
5920 // (0.91751397f +
5921 // (-0.31664806f + 0.47637168e-1f * x) * x) * x;
5922 //
5923 // error 0.00019228036, which is better than 12 bits
5924 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5925 getF32Constant(DAG, 0x3d431f31, dl));
5926 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
5927 getF32Constant(DAG, 0x3ea21fb2, dl));
5928 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5929 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5930 getF32Constant(DAG, 0x3f6ae232, dl));
5931 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5932 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
5933 getF32Constant(DAG, 0x3f25f7c3, dl));
5934 } else { // LimitFloatPrecision <= 18
5935 // For floating-point precision of 18:
5936 //
5937 // Log10ofMantissa =
5938 // -0.84299375f +
5939 // (1.5327582f +
5940 // (-1.0688956f +
5941 // (0.49102474f +
5942 // (-0.12539807f + 0.13508273e-1f * x) * x) * x) * x) * x;
5943 //
5944 // error 0.0000037995730, which is better than 18 bits
5945 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5946 getF32Constant(DAG, 0x3c5d51ce, dl));
5947 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
5948 getF32Constant(DAG, 0x3e00685a, dl));
5949 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5950 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5951 getF32Constant(DAG, 0x3efb6798, dl));
5952 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5953 SDValue t5 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
5954 getF32Constant(DAG, 0x3f88d192, dl));
5955 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5956 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5957 getF32Constant(DAG, 0x3fc4316c, dl));
5958 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5959 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t8,
5960 getF32Constant(DAG, 0x3f57ce70, dl));
5961 }
5962
5963 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, Log10ofMantissa);
5964 }
5965
5966 // No special expansion.
5967 return DAG.getNode(ISD::FLOG10, dl, Op.getValueType(), Op, Flags);
5968}
5969
5970/// expandExp2 - Lower an exp2 intrinsic. Handles the special sequences for
5971/// limited-precision mode.
5973 const TargetLowering &TLI, SDNodeFlags Flags) {
5974 if (Op.getValueType() == MVT::f32 &&
5976 return getLimitedPrecisionExp2(Op, dl, DAG);
5977
5978 // No special expansion.
5979 return DAG.getNode(ISD::FEXP2, dl, Op.getValueType(), Op, Flags);
5980}
5981
5982/// visitPow - Lower a pow intrinsic. Handles the special sequences for
5983/// limited-precision mode with x == 10.0f.
5985 SelectionDAG &DAG, const TargetLowering &TLI,
5986 SDNodeFlags Flags) {
5987 bool IsExp10 = false;
5988 if (LHS.getValueType() == MVT::f32 && RHS.getValueType() == MVT::f32 &&
5991 APFloat Ten(10.0f);
5992 IsExp10 = LHSC->isExactlyValue(Ten);
5993 }
5994 }
5995
5996 // TODO: What fast-math-flags should be set on the FMUL node?
5997 if (IsExp10) {
5998 // Put the exponent in the right bit position for later addition to the
5999 // final result:
6000 //
6001 // #define LOG2OF10 3.3219281f
6002 // t0 = Op * LOG2OF10;
6003 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, RHS,
6004 getF32Constant(DAG, 0x40549a78, dl));
6005 return getLimitedPrecisionExp2(t0, dl, DAG);
6006 }
6007
6008 // No special expansion.
6009 return DAG.getNode(ISD::FPOW, dl, LHS.getValueType(), LHS, RHS, Flags);
6010}
6011
6012/// ExpandPowI - Expand a llvm.powi intrinsic.
6014 SelectionDAG &DAG) {
6015 // If RHS is a constant, we can expand this out to a multiplication tree if
6016 // it's beneficial on the target, otherwise we end up lowering to a call to
6017 // __powidf2 (for example).
6019 unsigned Val = RHSC->getSExtValue();
6020
6021 // powi(x, 0) -> 1.0
6022 if (Val == 0)
6023 return DAG.getConstantFP(1.0, DL, LHS.getValueType());
6024
6026 Val, DAG.shouldOptForSize())) {
6027 // Get the exponent as a positive value.
6028 if ((int)Val < 0)
6029 Val = -Val;
6030 // We use the simple binary decomposition method to generate the multiply
6031 // sequence. There are more optimal ways to do this (for example,
6032 // powi(x,15) generates one more multiply than it should), but this has
6033 // the benefit of being both really simple and much better than a libcall.
6034 SDValue Res; // Logically starts equal to 1.0
6035 SDValue CurSquare = LHS;
6036 // TODO: Intrinsics should have fast-math-flags that propagate to these
6037 // nodes.
6038 while (Val) {
6039 if (Val & 1) {
6040 if (Res.getNode())
6041 Res =
6042 DAG.getNode(ISD::FMUL, DL, Res.getValueType(), Res, CurSquare);
6043 else
6044 Res = CurSquare; // 1.0*CurSquare.
6045 }
6046
6047 CurSquare = DAG.getNode(ISD::FMUL, DL, CurSquare.getValueType(),
6048 CurSquare, CurSquare);
6049 Val >>= 1;
6050 }
6051
6052 // If the original was negative, invert the result, producing 1/(x*x*x).
6053 if (RHSC->getSExtValue() < 0)
6054 Res = DAG.getNode(ISD::FDIV, DL, LHS.getValueType(),
6055 DAG.getConstantFP(1.0, DL, LHS.getValueType()), Res);
6056 return Res;
6057 }
6058 }
6059
6060 // Otherwise, expand to a libcall.
6061 return DAG.getNode(ISD::FPOWI, DL, LHS.getValueType(), LHS, RHS);
6062}
6063
6064static SDValue expandDivFix(unsigned Opcode, const SDLoc &DL,
6065 SDValue LHS, SDValue RHS, SDValue Scale,
6066 SelectionDAG &DAG, const TargetLowering &TLI) {
6067 EVT VT = LHS.getValueType();
6068 bool Signed = Opcode == ISD::SDIVFIX || Opcode == ISD::SDIVFIXSAT;
6069 bool Saturating = Opcode == ISD::SDIVFIXSAT || Opcode == ISD::UDIVFIXSAT;
6070 LLVMContext &Ctx = *DAG.getContext();
6071
6072 // If the type is legal but the operation isn't, this node might survive all
6073 // the way to operation legalization. If we end up there and we do not have
6074 // the ability to widen the type (if VT*2 is not legal), we cannot expand the
6075 // node.
6076
6077 // Coax the legalizer into expanding the node during type legalization instead
6078 // by bumping the size by one bit. This will force it to Promote, enabling the
6079 // early expansion and avoiding the need to expand later.
6080
6081 // We don't have to do this if Scale is 0; that can always be expanded, unless
6082 // it's a saturating signed operation. Those can experience true integer
6083 // division overflow, a case which we must avoid.
6084
6085 // FIXME: We wouldn't have to do this (or any of the early
6086 // expansion/promotion) if it was possible to expand a libcall of an
6087 // illegal type during operation legalization. But it's not, so things
6088 // get a bit hacky.
6089 unsigned ScaleInt = Scale->getAsZExtVal();
6090 if ((ScaleInt > 0 || (Saturating && Signed)) &&
6091 (TLI.isTypeLegal(VT) ||
6092 (VT.isVector() && TLI.isTypeLegal(VT.getVectorElementType())))) {
6094 Opcode, VT, ScaleInt);
6095 if (Action != TargetLowering::Legal && Action != TargetLowering::Custom) {
6096 EVT PromVT;
6097 if (VT.isScalarInteger())
6098 PromVT = EVT::getIntegerVT(Ctx, VT.getSizeInBits() + 1);
6099 else if (VT.isVector()) {
6100 PromVT = VT.getVectorElementType();
6101 PromVT = EVT::getIntegerVT(Ctx, PromVT.getSizeInBits() + 1);
6102 PromVT = EVT::getVectorVT(Ctx, PromVT, VT.getVectorElementCount());
6103 } else
6104 llvm_unreachable("Wrong VT for DIVFIX?");
6105 LHS = DAG.getExtOrTrunc(Signed, LHS, DL, PromVT);
6106 RHS = DAG.getExtOrTrunc(Signed, RHS, DL, PromVT);
6107 EVT ShiftTy = TLI.getShiftAmountTy(PromVT, DAG.getDataLayout());
6108 // For saturating operations, we need to shift up the LHS to get the
6109 // proper saturation width, and then shift down again afterwards.
6110 if (Saturating)
6111 LHS = DAG.getNode(ISD::SHL, DL, PromVT, LHS,
6112 DAG.getConstant(1, DL, ShiftTy));
6113 SDValue Res = DAG.getNode(Opcode, DL, PromVT, LHS, RHS, Scale);
6114 if (Saturating)
6115 Res = DAG.getNode(Signed ? ISD::SRA : ISD::SRL, DL, PromVT, Res,
6116 DAG.getConstant(1, DL, ShiftTy));
6117 return DAG.getZExtOrTrunc(Res, DL, VT);
6118 }
6119 }
6120
6121 return DAG.getNode(Opcode, DL, VT, LHS, RHS, Scale);
6122}
6123
6124// getUnderlyingArgRegs - Find underlying registers used for a truncated,
6125// bitcasted, or split argument. Returns a list of <Register, size in bits>
6126static void
6127getUnderlyingArgRegs(SmallVectorImpl<std::pair<Register, TypeSize>> &Regs,
6128 const SDValue &N) {
6129 switch (N.getOpcode()) {
6130 case ISD::CopyFromReg: {
6131 SDValue Op = N.getOperand(1);
6132 Regs.emplace_back(cast<RegisterSDNode>(Op)->getReg(),
6133 Op.getValueType().getSizeInBits());
6134 return;
6135 }
6136 case ISD::BITCAST:
6137 case ISD::AssertZext:
6138 case ISD::AssertSext:
6139 case ISD::TRUNCATE:
6140 getUnderlyingArgRegs(Regs, N.getOperand(0));
6141 return;
6142 case ISD::BUILD_PAIR:
6143 case ISD::BUILD_VECTOR:
6145 for (SDValue Op : N->op_values())
6146 getUnderlyingArgRegs(Regs, Op);
6147 return;
6148 default:
6149 return;
6150 }
6151}
6152
6153/// If the DbgValueInst is a dbg_value of a function argument, create the
6154/// corresponding DBG_VALUE machine instruction for it now. At the end of
6155/// instruction selection, they will be inserted to the entry BB.
6156/// We don't currently support this for variadic dbg_values, as they shouldn't
6157/// appear for function arguments or in the prologue.
6158bool SelectionDAGBuilder::EmitFuncArgumentDbgValue(
6159 const Value *V, DILocalVariable *Variable, DIExpression *Expr,
6160 DILocation *DL, FuncArgumentDbgValueKind Kind, const SDValue &N) {
6161 const Argument *Arg = dyn_cast<Argument>(V);
6162 if (!Arg)
6163 return false;
6164
6165 MachineFunction &MF = DAG.getMachineFunction();
6166 const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo();
6167
6168 // Helper to create DBG_INSTR_REFs or DBG_VALUEs, depending on what kind
6169 // we've been asked to pursue.
6170 auto MakeVRegDbgValue = [&](Register Reg, DIExpression *FragExpr,
6171 bool Indirect) {
6172 if (Reg.isVirtual() && MF.useDebugInstrRef()) {
6173 // For VRegs, in instruction referencing mode, create a DBG_INSTR_REF
6174 // pointing at the VReg, which will be patched up later.
6175 auto &Inst = TII->get(TargetOpcode::DBG_INSTR_REF);
6177 /* Reg */ Reg, /* isDef */ false, /* isImp */ false,
6178 /* isKill */ false, /* isDead */ false,
6179 /* isUndef */ false, /* isEarlyClobber */ false,
6180 /* SubReg */ 0, /* isDebug */ true)});
6181
6182 auto *NewDIExpr = FragExpr;
6183 // We don't have an "Indirect" field in DBG_INSTR_REF, fold that into
6184 // the DIExpression.
6185 if (Indirect)
6186 NewDIExpr = DIExpression::prepend(FragExpr, DIExpression::DerefBefore);
6188 NewDIExpr = DIExpression::prependOpcodes(NewDIExpr, Ops);
6189 return BuildMI(MF, DL, Inst, false, MOs, Variable, NewDIExpr);
6190 } else {
6191 // Create a completely standard DBG_VALUE.
6192 auto &Inst = TII->get(TargetOpcode::DBG_VALUE);
6193 return BuildMI(MF, DL, Inst, Indirect, Reg, Variable, FragExpr);
6194 }
6195 };
6196
6197 if (Kind == FuncArgumentDbgValueKind::Value) {
6198 // ArgDbgValues are hoisted to the beginning of the entry block. So we
6199 // should only emit as ArgDbgValue if the dbg.value intrinsic is found in
6200 // the entry block.
6201 bool IsInEntryBlock = FuncInfo.MBB == &FuncInfo.MF->front();
6202 if (!IsInEntryBlock)
6203 return false;
6204
6205 // ArgDbgValues are hoisted to the beginning of the entry block. So we
6206 // should only emit as ArgDbgValue if the dbg.value intrinsic describes a
6207 // variable that also is a param.
6208 //
6209 // Although, if we are at the top of the entry block already, we can still
6210 // emit using ArgDbgValue. This might catch some situations when the
6211 // dbg.value refers to an argument that isn't used in the entry block, so
6212 // any CopyToReg node would be optimized out and the only way to express
6213 // this DBG_VALUE is by using the physical reg (or FI) as done in this
6214 // method. ArgDbgValues are hoisted to the beginning of the entry block. So
6215 // we should only emit as ArgDbgValue if the Variable is an argument to the
6216 // current function, and the dbg.value intrinsic is found in the entry
6217 // block.
6218 bool VariableIsFunctionInputArg = Variable->isParameter() &&
6219 !DL->getInlinedAt();
6220 bool IsInPrologue = SDNodeOrder == LowestSDNodeOrder;
6221 if (!IsInPrologue && !VariableIsFunctionInputArg)
6222 return false;
6223
6224 // Here we assume that a function argument on IR level only can be used to
6225 // describe one input parameter on source level. If we for example have
6226 // source code like this
6227 //
6228 // struct A { long x, y; };
6229 // void foo(struct A a, long b) {
6230 // ...
6231 // b = a.x;
6232 // ...
6233 // }
6234 //
6235 // and IR like this
6236 //
6237 // define void @foo(i32 %a1, i32 %a2, i32 %b) {
6238 // entry:
6239 // call void @llvm.dbg.value(metadata i32 %a1, "a", DW_OP_LLVM_fragment
6240 // call void @llvm.dbg.value(metadata i32 %a2, "a", DW_OP_LLVM_fragment
6241 // call void @llvm.dbg.value(metadata i32 %b, "b",
6242 // ...
6243 // call void @llvm.dbg.value(metadata i32 %a1, "b"
6244 // ...
6245 //
6246 // then the last dbg.value is describing a parameter "b" using a value that
6247 // is an argument. But since we already has used %a1 to describe a parameter
6248 // we should not handle that last dbg.value here (that would result in an
6249 // incorrect hoisting of the DBG_VALUE to the function entry).
6250 // Notice that we allow one dbg.value per IR level argument, to accommodate
6251 // for the situation with fragments above.
6252 // If there is no node for the value being handled, we return true to skip
6253 // the normal generation of debug info, as it would kill existing debug
6254 // info for the parameter in case of duplicates.
6255 if (VariableIsFunctionInputArg) {
6256 unsigned ArgNo = Arg->getArgNo();
6257 if (ArgNo >= FuncInfo.DescribedArgs.size())
6258 FuncInfo.DescribedArgs.resize(ArgNo + 1, false);
6259 else if (!IsInPrologue && FuncInfo.DescribedArgs.test(ArgNo))
6260 return !NodeMap[V].getNode();
6261 FuncInfo.DescribedArgs.set(ArgNo);
6262 }
6263 }
6264
6265 bool IsIndirect = false;
6266 std::optional<MachineOperand> Op;
6267 // Some arguments' frame index is recorded during argument lowering.
6268 int FI = FuncInfo.getArgumentFrameIndex(Arg);
6269 if (FI != std::numeric_limits<int>::max())
6271
6273 if (!Op && N.getNode()) {
6274 getUnderlyingArgRegs(ArgRegsAndSizes, N);
6275 Register Reg;
6276 if (ArgRegsAndSizes.size() == 1)
6277 Reg = ArgRegsAndSizes.front().first;
6278
6279 if (Reg && Reg.isVirtual()) {
6280 MachineRegisterInfo &RegInfo = MF.getRegInfo();
6281 Register PR = RegInfo.getLiveInPhysReg(Reg);
6282 if (PR)
6283 Reg = PR;
6284 }
6285 if (Reg) {
6287 IsIndirect = Kind != FuncArgumentDbgValueKind::Value;
6288 }
6289 }
6290
6291 if (!Op && N.getNode()) {
6292 // Check if frame index is available.
6293 SDValue LCandidate = peekThroughBitcasts(N);
6294 if (LoadSDNode *LNode = dyn_cast<LoadSDNode>(LCandidate.getNode()))
6295 if (FrameIndexSDNode *FINode =
6296 dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
6297 Op = MachineOperand::CreateFI(FINode->getIndex());
6298 }
6299
6300 if (!Op) {
6301 // Create a DBG_VALUE for each decomposed value in ArgRegs to cover Reg
6302 auto splitMultiRegDbgValue = [&](ArrayRef<std::pair<Register, TypeSize>>
6303 SplitRegs) {
6304 unsigned Offset = 0;
6305 for (const auto &RegAndSize : SplitRegs) {
6306 // If the expression is already a fragment, the current register
6307 // offset+size might extend beyond the fragment. In this case, only
6308 // the register bits that are inside the fragment are relevant.
6309 int RegFragmentSizeInBits = RegAndSize.second;
6310 if (auto ExprFragmentInfo = Expr->getFragmentInfo()) {
6311 uint64_t ExprFragmentSizeInBits = ExprFragmentInfo->SizeInBits;
6312 // The register is entirely outside the expression fragment,
6313 // so is irrelevant for debug info.
6314 if (Offset >= ExprFragmentSizeInBits)
6315 break;
6316 // The register is partially outside the expression fragment, only
6317 // the low bits within the fragment are relevant for debug info.
6318 if (Offset + RegFragmentSizeInBits > ExprFragmentSizeInBits) {
6319 RegFragmentSizeInBits = ExprFragmentSizeInBits - Offset;
6320 }
6321 }
6322
6323 auto FragmentExpr = DIExpression::createFragmentExpression(
6324 Expr, Offset, RegFragmentSizeInBits);
6325 Offset += RegAndSize.second;
6326 // If a valid fragment expression cannot be created, the variable's
6327 // correct value cannot be determined and so it is set as poison.
6328 if (!FragmentExpr) {
6329 SDDbgValue *SDV = DAG.getConstantDbgValue(
6330 Variable, Expr, PoisonValue::get(V->getType()), DL, SDNodeOrder);
6331 DAG.AddDbgValue(SDV, false);
6332 continue;
6333 }
6334 MachineInstr *NewMI =
6335 MakeVRegDbgValue(RegAndSize.first, *FragmentExpr,
6336 Kind != FuncArgumentDbgValueKind::Value);
6337 FuncInfo.ArgDbgValues.push_back(NewMI);
6338 }
6339 };
6340
6341 // Check if ValueMap has reg number.
6343 VMI = FuncInfo.ValueMap.find(V);
6344 if (VMI != FuncInfo.ValueMap.end()) {
6345 const auto &TLI = DAG.getTargetLoweringInfo();
6346 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), VMI->second,
6347 V->getType(), std::nullopt);
6348 if (RFV.occupiesMultipleRegs()) {
6349 splitMultiRegDbgValue(RFV.getRegsAndSizes());
6350 return true;
6351 }
6352
6353 Op = MachineOperand::CreateReg(VMI->second, false);
6354 IsIndirect = Kind != FuncArgumentDbgValueKind::Value;
6355 } else if (ArgRegsAndSizes.size() > 1) {
6356 // This was split due to the calling convention, and no virtual register
6357 // mapping exists for the value.
6358 splitMultiRegDbgValue(ArgRegsAndSizes);
6359 return true;
6360 }
6361 }
6362
6363 if (!Op)
6364 return false;
6365
6366 assert(Variable->isValidLocationForIntrinsic(DL) &&
6367 "Expected inlined-at fields to agree");
6368 MachineInstr *NewMI = nullptr;
6369
6370 if (Op->isReg())
6371 NewMI = MakeVRegDbgValue(Op->getReg(), Expr, IsIndirect);
6372 else
6373 NewMI = BuildMI(MF, DL, TII->get(TargetOpcode::DBG_VALUE), true, *Op,
6374 Variable, Expr);
6375
6376 // Otherwise, use ArgDbgValues.
6377 FuncInfo.ArgDbgValues.push_back(NewMI);
6378 return true;
6379}
6380
6381/// Return the appropriate SDDbgValue based on N.
6382SDDbgValue *SelectionDAGBuilder::getDbgValue(SDValue N,
6383 DILocalVariable *Variable,
6384 DIExpression *Expr,
6385 const DebugLoc &dl,
6386 unsigned DbgSDNodeOrder) {
6387 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(N.getNode())) {
6388 // Construct a FrameIndexDbgValue for FrameIndexSDNodes so we can describe
6389 // stack slot locations.
6390 //
6391 // Consider "int x = 0; int *px = &x;". There are two kinds of interesting
6392 // debug values here after optimization:
6393 //
6394 // dbg.value(i32* %px, !"int *px", !DIExpression()), and
6395 // dbg.value(i32* %px, !"int x", !DIExpression(DW_OP_deref))
6396 //
6397 // Both describe the direct values of their associated variables.
6398 return DAG.getFrameIndexDbgValue(Variable, Expr, FISDN->getIndex(),
6399 /*IsIndirect*/ false, dl, DbgSDNodeOrder);
6400 }
6401 return DAG.getDbgValue(Variable, Expr, N.getNode(), N.getResNo(),
6402 /*IsIndirect*/ false, dl, DbgSDNodeOrder);
6403}
6404
6405static unsigned FixedPointIntrinsicToOpcode(unsigned Intrinsic) {
6406 switch (Intrinsic) {
6407 case Intrinsic::smul_fix:
6408 return ISD::SMULFIX;
6409 case Intrinsic::umul_fix:
6410 return ISD::UMULFIX;
6411 case Intrinsic::smul_fix_sat:
6412 return ISD::SMULFIXSAT;
6413 case Intrinsic::umul_fix_sat:
6414 return ISD::UMULFIXSAT;
6415 case Intrinsic::sdiv_fix:
6416 return ISD::SDIVFIX;
6417 case Intrinsic::udiv_fix:
6418 return ISD::UDIVFIX;
6419 case Intrinsic::sdiv_fix_sat:
6420 return ISD::SDIVFIXSAT;
6421 case Intrinsic::udiv_fix_sat:
6422 return ISD::UDIVFIXSAT;
6423 default:
6424 llvm_unreachable("Unhandled fixed point intrinsic");
6425 }
6426}
6427
6428/// Given a @llvm.call.preallocated.setup, return the corresponding
6429/// preallocated call.
6430static const CallBase *FindPreallocatedCall(const Value *PreallocatedSetup) {
6431 assert(cast<CallBase>(PreallocatedSetup)
6433 ->getIntrinsicID() == Intrinsic::call_preallocated_setup &&
6434 "expected call_preallocated_setup Value");
6435 for (const auto *U : PreallocatedSetup->users()) {
6436 auto *UseCall = cast<CallBase>(U);
6437 const Function *Fn = UseCall->getCalledFunction();
6438 if (!Fn || Fn->getIntrinsicID() != Intrinsic::call_preallocated_arg) {
6439 return UseCall;
6440 }
6441 }
6442 llvm_unreachable("expected corresponding call to preallocated setup/arg");
6443}
6444
6445/// If DI is a debug value with an EntryValue expression, lower it using the
6446/// corresponding physical register of the associated Argument value
6447/// (guaranteed to exist by the verifier).
6448bool SelectionDAGBuilder::visitEntryValueDbgValue(
6449 ArrayRef<const Value *> Values, DILocalVariable *Variable,
6450 DIExpression *Expr, DebugLoc DbgLoc) {
6451 if (!Expr->isEntryValue() || !hasSingleElement(Values))
6452 return false;
6453
6454 // These properties are guaranteed by the verifier.
6455 const Argument *Arg = cast<Argument>(Values[0]);
6456 assert(Arg->hasAttribute(Attribute::AttrKind::SwiftAsync));
6457
6458 auto ArgIt = FuncInfo.ValueMap.find(Arg);
6459 if (ArgIt == FuncInfo.ValueMap.end()) {
6460 LLVM_DEBUG(
6461 dbgs() << "Dropping dbg.value: expression is entry_value but "
6462 "couldn't find an associated register for the Argument\n");
6463 return true;
6464 }
6465 Register ArgVReg = ArgIt->getSecond();
6466
6467 for (auto [PhysReg, VirtReg] : FuncInfo.RegInfo->liveins())
6468 if (ArgVReg == VirtReg || ArgVReg == PhysReg) {
6469 SDDbgValue *SDV = DAG.getVRegDbgValue(
6470 Variable, Expr, PhysReg, false /*IsIndidrect*/, DbgLoc, SDNodeOrder);
6471 DAG.AddDbgValue(SDV, false /*treat as dbg.declare byval parameter*/);
6472 return true;
6473 }
6474 LLVM_DEBUG(dbgs() << "Dropping dbg.value: expression is entry_value but "
6475 "couldn't find a physical register\n");
6476 return true;
6477}
6478
6479/// Lower the call to the specified intrinsic function.
6480void SelectionDAGBuilder::visitConvergenceControl(const CallInst &I,
6481 unsigned Intrinsic) {
6482 SDLoc sdl = getCurSDLoc();
6483 switch (Intrinsic) {
6484 case Intrinsic::experimental_convergence_anchor:
6485 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_ANCHOR, sdl, MVT::Untyped));
6486 break;
6487 case Intrinsic::experimental_convergence_entry:
6488 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_ENTRY, sdl, MVT::Untyped));
6489 break;
6490 case Intrinsic::experimental_convergence_loop: {
6491 auto Bundle = I.getOperandBundle(LLVMContext::OB_convergencectrl);
6492 auto *Token = Bundle->Inputs[0].get();
6493 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_LOOP, sdl, MVT::Untyped,
6494 getValue(Token)));
6495 break;
6496 }
6497 }
6498}
6499
6500void SelectionDAGBuilder::visitVectorHistogram(const CallInst &I,
6501 unsigned IntrinsicID) {
6502 // For now, we're only lowering an 'add' histogram.
6503 // We can add others later, e.g. saturating adds, min/max.
6504 assert(IntrinsicID == Intrinsic::experimental_vector_histogram_add &&
6505 "Tried to lower unsupported histogram type");
6506 SDLoc sdl = getCurSDLoc();
6507 Value *Ptr = I.getOperand(0);
6508 SDValue Inc = getValue(I.getOperand(1));
6509 SDValue Mask = getValue(I.getOperand(2));
6510
6511 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6512 DataLayout TargetDL = DAG.getDataLayout();
6513 EVT VT = Inc.getValueType();
6514 Align Alignment = DAG.getEVTAlign(VT);
6515
6516 const MDNode *Ranges = getRangeMetadata(I);
6517
6518 SDValue Root = DAG.getRoot();
6519 SDValue Base;
6520 SDValue Index;
6521 SDValue Scale;
6522 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
6523 I.getParent(), VT.getScalarStoreSize());
6524
6525 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
6526
6527 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
6528 MachinePointerInfo(AS),
6530 MemoryLocation::UnknownSize, Alignment, I.getAAMetadata(), Ranges);
6531
6532 if (!UniformBase) {
6533 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
6534 Index = getValue(Ptr);
6535 Scale =
6536 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
6537 }
6538
6539 EVT IdxVT = Index.getValueType();
6540 EVT EltTy = IdxVT.getVectorElementType();
6541 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
6542 EVT NewIdxVT = IdxVT.changeVectorElementType(EltTy);
6543 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
6544 }
6545
6546 SDValue ID = DAG.getTargetConstant(IntrinsicID, sdl, MVT::i32);
6547
6548 SDValue Ops[] = {Root, Inc, Mask, Base, Index, Scale, ID};
6549 SDValue Histogram = DAG.getMaskedHistogram(DAG.getVTList(MVT::Other), VT, sdl,
6550 Ops, MMO, ISD::SIGNED_SCALED);
6551
6552 setValue(&I, Histogram);
6553 DAG.setRoot(Histogram);
6554}
6555
6556void SelectionDAGBuilder::visitVectorExtractLastActive(const CallInst &I,
6557 unsigned Intrinsic) {
6558 assert(Intrinsic == Intrinsic::experimental_vector_extract_last_active &&
6559 "Tried lowering invalid vector extract last");
6560 SDLoc sdl = getCurSDLoc();
6561 const DataLayout &Layout = DAG.getDataLayout();
6562 SDValue Data = getValue(I.getOperand(0));
6563 SDValue Mask = getValue(I.getOperand(1));
6564
6565 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6566 EVT ResVT = TLI.getValueType(Layout, I.getType());
6567
6568 EVT ExtVT = TLI.getVectorIdxTy(Layout);
6569 SDValue Idx = DAG.getNode(ISD::VECTOR_FIND_LAST_ACTIVE, sdl, ExtVT, Mask);
6570 SDValue Result = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, sdl, ResVT, Data, Idx);
6571
6572 Value *Default = I.getOperand(2);
6574 SDValue PassThru = getValue(Default);
6575 EVT BoolVT = Mask.getValueType().getScalarType();
6576 SDValue AnyActive = DAG.getNode(ISD::VECREDUCE_OR, sdl, BoolVT, Mask);
6577 Result = DAG.getSelect(sdl, ResVT, AnyActive, Result, PassThru);
6578 }
6579
6580 setValue(&I, Result);
6581}
6582
6583/// Lower the call to the specified intrinsic function.
6584void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
6585 unsigned Intrinsic) {
6586 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6587 SDLoc sdl = getCurSDLoc();
6588 DebugLoc dl = getCurDebugLoc();
6589 SDValue Res;
6590
6591 SDNodeFlags Flags;
6592 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
6593 Flags.copyFMF(*FPOp);
6594
6595 switch (Intrinsic) {
6596 default:
6597 // By default, turn this into a target intrinsic node.
6598 visitTargetIntrinsic(I, Intrinsic);
6599 return;
6600 case Intrinsic::vscale: {
6601 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6602 setValue(&I, DAG.getVScale(sdl, VT, APInt(VT.getSizeInBits(), 1)));
6603 return;
6604 }
6605 case Intrinsic::vastart: visitVAStart(I); return;
6606 case Intrinsic::vaend: visitVAEnd(I); return;
6607 case Intrinsic::vacopy: visitVACopy(I); return;
6608 case Intrinsic::returnaddress:
6609 setValue(&I, DAG.getNode(ISD::RETURNADDR, sdl,
6610 TLI.getValueType(DAG.getDataLayout(), I.getType()),
6611 getValue(I.getArgOperand(0))));
6612 return;
6613 case Intrinsic::addressofreturnaddress:
6614 setValue(&I,
6615 DAG.getNode(ISD::ADDROFRETURNADDR, sdl,
6616 TLI.getValueType(DAG.getDataLayout(), I.getType())));
6617 return;
6618 case Intrinsic::sponentry:
6619 setValue(&I,
6620 DAG.getNode(ISD::SPONENTRY, sdl,
6621 TLI.getValueType(DAG.getDataLayout(), I.getType())));
6622 return;
6623 case Intrinsic::frameaddress:
6624 setValue(&I, DAG.getNode(ISD::FRAMEADDR, sdl,
6625 TLI.getFrameIndexTy(DAG.getDataLayout()),
6626 getValue(I.getArgOperand(0))));
6627 return;
6628 case Intrinsic::read_volatile_register:
6629 case Intrinsic::read_register: {
6630 Value *Reg = I.getArgOperand(0);
6631 SDValue Chain = getRoot();
6633 DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
6634 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6635 Res = DAG.getNode(ISD::READ_REGISTER, sdl,
6636 DAG.getVTList(VT, MVT::Other), Chain, RegName);
6637 setValue(&I, Res);
6638 DAG.setRoot(Res.getValue(1));
6639 return;
6640 }
6641 case Intrinsic::write_register: {
6642 Value *Reg = I.getArgOperand(0);
6643 Value *RegValue = I.getArgOperand(1);
6644 SDValue Chain = getRoot();
6646 DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
6647 DAG.setRoot(DAG.getNode(ISD::WRITE_REGISTER, sdl, MVT::Other, Chain,
6648 RegName, getValue(RegValue)));
6649 return;
6650 }
6651 case Intrinsic::memcpy:
6652 case Intrinsic::memcpy_inline: {
6653 const auto &MCI = cast<MemCpyInst>(I);
6654 SDValue Dst = getValue(I.getArgOperand(0));
6655 SDValue Src = getValue(I.getArgOperand(1));
6656 SDValue Size = getValue(I.getArgOperand(2));
6657 assert((!MCI.isForceInlined() || isa<ConstantSDNode>(Size)) &&
6658 "memcpy_inline needs constant size");
6659 // @llvm.memcpy.inline defines 0 and 1 to both mean no alignment.
6660 Align DstAlign = MCI.getDestAlign().valueOrOne();
6661 Align SrcAlign = MCI.getSourceAlign().valueOrOne();
6662 Align Alignment = std::min(DstAlign, SrcAlign);
6663 bool isVol = MCI.isVolatile();
6664 // FIXME: Support passing different dest/src alignments to the memcpy DAG
6665 // node.
6666 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6667 SDValue MC = DAG.getMemcpy(Root, sdl, Dst, Src, Size, Alignment, isVol,
6668 MCI.isForceInlined(), &I, std::nullopt,
6669 MachinePointerInfo(I.getArgOperand(0)),
6670 MachinePointerInfo(I.getArgOperand(1)),
6671 I.getAAMetadata(), BatchAA);
6672 updateDAGForMaybeTailCall(MC);
6673 return;
6674 }
6675 case Intrinsic::memset:
6676 case Intrinsic::memset_inline: {
6677 const auto &MSII = cast<MemSetInst>(I);
6678 SDValue Dst = getValue(I.getArgOperand(0));
6679 SDValue Value = getValue(I.getArgOperand(1));
6680 SDValue Size = getValue(I.getArgOperand(2));
6681 assert((!MSII.isForceInlined() || isa<ConstantSDNode>(Size)) &&
6682 "memset_inline needs constant size");
6683 // @llvm.memset defines 0 and 1 to both mean no alignment.
6684 Align DstAlign = MSII.getDestAlign().valueOrOne();
6685 bool isVol = MSII.isVolatile();
6686 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6687 SDValue MC = DAG.getMemset(
6688 Root, sdl, Dst, Value, Size, DstAlign, isVol, MSII.isForceInlined(),
6689 &I, MachinePointerInfo(I.getArgOperand(0)), I.getAAMetadata());
6690 updateDAGForMaybeTailCall(MC);
6691 return;
6692 }
6693 case Intrinsic::memmove: {
6694 const auto &MMI = cast<MemMoveInst>(I);
6695 SDValue Op1 = getValue(I.getArgOperand(0));
6696 SDValue Op2 = getValue(I.getArgOperand(1));
6697 SDValue Op3 = getValue(I.getArgOperand(2));
6698 // @llvm.memmove defines 0 and 1 to both mean no alignment.
6699 Align DstAlign = MMI.getDestAlign().valueOrOne();
6700 Align SrcAlign = MMI.getSourceAlign().valueOrOne();
6701 Align Alignment = std::min(DstAlign, SrcAlign);
6702 bool isVol = MMI.isVolatile();
6703 // FIXME: Support passing different dest/src alignments to the memmove DAG
6704 // node.
6705 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6706 SDValue MM = DAG.getMemmove(Root, sdl, Op1, Op2, Op3, Alignment, isVol, &I,
6707 /* OverrideTailCall */ std::nullopt,
6708 MachinePointerInfo(I.getArgOperand(0)),
6709 MachinePointerInfo(I.getArgOperand(1)),
6710 I.getAAMetadata(), BatchAA);
6711 updateDAGForMaybeTailCall(MM);
6712 return;
6713 }
6714 case Intrinsic::memcpy_element_unordered_atomic: {
6715 auto &MI = cast<AnyMemCpyInst>(I);
6716 SDValue Dst = getValue(MI.getRawDest());
6717 SDValue Src = getValue(MI.getRawSource());
6718 SDValue Length = getValue(MI.getLength());
6719
6720 Type *LengthTy = MI.getLength()->getType();
6721 unsigned ElemSz = MI.getElementSizeInBytes();
6722 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6723 SDValue MC =
6724 DAG.getAtomicMemcpy(getRoot(), sdl, Dst, Src, Length, LengthTy, ElemSz,
6725 isTC, MachinePointerInfo(MI.getRawDest()),
6726 MachinePointerInfo(MI.getRawSource()));
6727 updateDAGForMaybeTailCall(MC);
6728 return;
6729 }
6730 case Intrinsic::memmove_element_unordered_atomic: {
6731 auto &MI = cast<AnyMemMoveInst>(I);
6732 SDValue Dst = getValue(MI.getRawDest());
6733 SDValue Src = getValue(MI.getRawSource());
6734 SDValue Length = getValue(MI.getLength());
6735
6736 Type *LengthTy = MI.getLength()->getType();
6737 unsigned ElemSz = MI.getElementSizeInBytes();
6738 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6739 SDValue MC =
6740 DAG.getAtomicMemmove(getRoot(), sdl, Dst, Src, Length, LengthTy, ElemSz,
6741 isTC, MachinePointerInfo(MI.getRawDest()),
6742 MachinePointerInfo(MI.getRawSource()));
6743 updateDAGForMaybeTailCall(MC);
6744 return;
6745 }
6746 case Intrinsic::memset_element_unordered_atomic: {
6747 auto &MI = cast<AnyMemSetInst>(I);
6748 SDValue Dst = getValue(MI.getRawDest());
6749 SDValue Val = getValue(MI.getValue());
6750 SDValue Length = getValue(MI.getLength());
6751
6752 Type *LengthTy = MI.getLength()->getType();
6753 unsigned ElemSz = MI.getElementSizeInBytes();
6754 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6755 SDValue MC =
6756 DAG.getAtomicMemset(getRoot(), sdl, Dst, Val, Length, LengthTy, ElemSz,
6757 isTC, MachinePointerInfo(MI.getRawDest()));
6758 updateDAGForMaybeTailCall(MC);
6759 return;
6760 }
6761 case Intrinsic::call_preallocated_setup: {
6762 const CallBase *PreallocatedCall = FindPreallocatedCall(&I);
6763 SDValue SrcValue = DAG.getSrcValue(PreallocatedCall);
6764 SDValue Res = DAG.getNode(ISD::PREALLOCATED_SETUP, sdl, MVT::Other,
6765 getRoot(), SrcValue);
6766 setValue(&I, Res);
6767 DAG.setRoot(Res);
6768 return;
6769 }
6770 case Intrinsic::call_preallocated_arg: {
6771 const CallBase *PreallocatedCall = FindPreallocatedCall(I.getOperand(0));
6772 SDValue SrcValue = DAG.getSrcValue(PreallocatedCall);
6773 SDValue Ops[3];
6774 Ops[0] = getRoot();
6775 Ops[1] = SrcValue;
6776 Ops[2] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(1)), sdl,
6777 MVT::i32); // arg index
6778 SDValue Res = DAG.getNode(
6780 DAG.getVTList(TLI.getPointerTy(DAG.getDataLayout()), MVT::Other), Ops);
6781 setValue(&I, Res);
6782 DAG.setRoot(Res.getValue(1));
6783 return;
6784 }
6785
6786 case Intrinsic::eh_typeid_for: {
6787 // Find the type id for the given typeinfo.
6788 GlobalValue *GV = ExtractTypeInfo(I.getArgOperand(0));
6789 unsigned TypeID = DAG.getMachineFunction().getTypeIDFor(GV);
6790 Res = DAG.getConstant(TypeID, sdl, MVT::i32);
6791 setValue(&I, Res);
6792 return;
6793 }
6794
6795 case Intrinsic::eh_return_i32:
6796 case Intrinsic::eh_return_i64:
6797 DAG.getMachineFunction().setCallsEHReturn(true);
6798 DAG.setRoot(DAG.getNode(ISD::EH_RETURN, sdl,
6799 MVT::Other,
6801 getValue(I.getArgOperand(0)),
6802 getValue(I.getArgOperand(1))));
6803 return;
6804 case Intrinsic::eh_unwind_init:
6805 DAG.getMachineFunction().setCallsUnwindInit(true);
6806 return;
6807 case Intrinsic::eh_dwarf_cfa:
6808 setValue(&I, DAG.getNode(ISD::EH_DWARF_CFA, sdl,
6809 TLI.getPointerTy(DAG.getDataLayout()),
6810 getValue(I.getArgOperand(0))));
6811 return;
6812 case Intrinsic::eh_sjlj_callsite: {
6813 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(0));
6814 assert(FuncInfo.getCurrentCallSite() == 0 && "Overlapping call sites!");
6815
6816 FuncInfo.setCurrentCallSite(CI->getZExtValue());
6817 return;
6818 }
6819 case Intrinsic::eh_sjlj_functioncontext: {
6820 // Get and store the index of the function context.
6821 MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo();
6822 AllocaInst *FnCtx =
6823 cast<AllocaInst>(I.getArgOperand(0)->stripPointerCasts());
6824 int FI = FuncInfo.StaticAllocaMap[FnCtx];
6826 return;
6827 }
6828 case Intrinsic::eh_sjlj_setjmp: {
6829 SDValue Ops[2];
6830 Ops[0] = getRoot();
6831 Ops[1] = getValue(I.getArgOperand(0));
6832 SDValue Op = DAG.getNode(ISD::EH_SJLJ_SETJMP, sdl,
6833 DAG.getVTList(MVT::i32, MVT::Other), Ops);
6834 setValue(&I, Op.getValue(0));
6835 DAG.setRoot(Op.getValue(1));
6836 return;
6837 }
6838 case Intrinsic::eh_sjlj_longjmp:
6839 DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_LONGJMP, sdl, MVT::Other,
6840 getRoot(), getValue(I.getArgOperand(0))));
6841 return;
6842 case Intrinsic::eh_sjlj_setup_dispatch:
6843 DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_SETUP_DISPATCH, sdl, MVT::Other,
6844 getRoot()));
6845 return;
6846 case Intrinsic::masked_gather:
6847 visitMaskedGather(I);
6848 return;
6849 case Intrinsic::masked_load:
6850 visitMaskedLoad(I);
6851 return;
6852 case Intrinsic::masked_scatter:
6853 visitMaskedScatter(I);
6854 return;
6855 case Intrinsic::masked_store:
6856 visitMaskedStore(I);
6857 return;
6858 case Intrinsic::masked_expandload:
6859 visitMaskedLoad(I, true /* IsExpanding */);
6860 return;
6861 case Intrinsic::masked_compressstore:
6862 visitMaskedStore(I, true /* IsCompressing */);
6863 return;
6864 case Intrinsic::powi:
6865 setValue(&I, ExpandPowI(sdl, getValue(I.getArgOperand(0)),
6866 getValue(I.getArgOperand(1)), DAG));
6867 return;
6868 case Intrinsic::log:
6869 setValue(&I, expandLog(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6870 return;
6871 case Intrinsic::log2:
6872 setValue(&I,
6873 expandLog2(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6874 return;
6875 case Intrinsic::log10:
6876 setValue(&I,
6877 expandLog10(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6878 return;
6879 case Intrinsic::exp:
6880 setValue(&I, expandExp(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6881 return;
6882 case Intrinsic::exp2:
6883 setValue(&I,
6884 expandExp2(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6885 return;
6886 case Intrinsic::pow:
6887 setValue(&I, expandPow(sdl, getValue(I.getArgOperand(0)),
6888 getValue(I.getArgOperand(1)), DAG, TLI, Flags));
6889 return;
6890 case Intrinsic::sqrt:
6891 case Intrinsic::fabs:
6892 case Intrinsic::sin:
6893 case Intrinsic::cos:
6894 case Intrinsic::tan:
6895 case Intrinsic::asin:
6896 case Intrinsic::acos:
6897 case Intrinsic::atan:
6898 case Intrinsic::sinh:
6899 case Intrinsic::cosh:
6900 case Intrinsic::tanh:
6901 case Intrinsic::exp10:
6902 case Intrinsic::floor:
6903 case Intrinsic::ceil:
6904 case Intrinsic::trunc:
6905 case Intrinsic::rint:
6906 case Intrinsic::nearbyint:
6907 case Intrinsic::round:
6908 case Intrinsic::roundeven:
6909 case Intrinsic::canonicalize: {
6910 unsigned Opcode;
6911 // clang-format off
6912 switch (Intrinsic) {
6913 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
6914 case Intrinsic::sqrt: Opcode = ISD::FSQRT; break;
6915 case Intrinsic::fabs: Opcode = ISD::FABS; break;
6916 case Intrinsic::sin: Opcode = ISD::FSIN; break;
6917 case Intrinsic::cos: Opcode = ISD::FCOS; break;
6918 case Intrinsic::tan: Opcode = ISD::FTAN; break;
6919 case Intrinsic::asin: Opcode = ISD::FASIN; break;
6920 case Intrinsic::acos: Opcode = ISD::FACOS; break;
6921 case Intrinsic::atan: Opcode = ISD::FATAN; break;
6922 case Intrinsic::sinh: Opcode = ISD::FSINH; break;
6923 case Intrinsic::cosh: Opcode = ISD::FCOSH; break;
6924 case Intrinsic::tanh: Opcode = ISD::FTANH; break;
6925 case Intrinsic::exp10: Opcode = ISD::FEXP10; break;
6926 case Intrinsic::floor: Opcode = ISD::FFLOOR; break;
6927 case Intrinsic::ceil: Opcode = ISD::FCEIL; break;
6928 case Intrinsic::trunc: Opcode = ISD::FTRUNC; break;
6929 case Intrinsic::rint: Opcode = ISD::FRINT; break;
6930 case Intrinsic::nearbyint: Opcode = ISD::FNEARBYINT; break;
6931 case Intrinsic::round: Opcode = ISD::FROUND; break;
6932 case Intrinsic::roundeven: Opcode = ISD::FROUNDEVEN; break;
6933 case Intrinsic::canonicalize: Opcode = ISD::FCANONICALIZE; break;
6934 }
6935 // clang-format on
6936
6937 setValue(&I, DAG.getNode(Opcode, sdl,
6938 getValue(I.getArgOperand(0)).getValueType(),
6939 getValue(I.getArgOperand(0)), Flags));
6940 return;
6941 }
6942 case Intrinsic::atan2:
6943 setValue(&I, DAG.getNode(ISD::FATAN2, sdl,
6944 getValue(I.getArgOperand(0)).getValueType(),
6945 getValue(I.getArgOperand(0)),
6946 getValue(I.getArgOperand(1)), Flags));
6947 return;
6948 case Intrinsic::lround:
6949 case Intrinsic::llround:
6950 case Intrinsic::lrint:
6951 case Intrinsic::llrint: {
6952 unsigned Opcode;
6953 // clang-format off
6954 switch (Intrinsic) {
6955 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
6956 case Intrinsic::lround: Opcode = ISD::LROUND; break;
6957 case Intrinsic::llround: Opcode = ISD::LLROUND; break;
6958 case Intrinsic::lrint: Opcode = ISD::LRINT; break;
6959 case Intrinsic::llrint: Opcode = ISD::LLRINT; break;
6960 }
6961 // clang-format on
6962
6963 EVT RetVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6964 setValue(&I, DAG.getNode(Opcode, sdl, RetVT,
6965 getValue(I.getArgOperand(0))));
6966 return;
6967 }
6968 case Intrinsic::minnum:
6969 setValue(&I, DAG.getNode(ISD::FMINNUM, sdl,
6970 getValue(I.getArgOperand(0)).getValueType(),
6971 getValue(I.getArgOperand(0)),
6972 getValue(I.getArgOperand(1)), Flags));
6973 return;
6974 case Intrinsic::maxnum:
6975 setValue(&I, DAG.getNode(ISD::FMAXNUM, sdl,
6976 getValue(I.getArgOperand(0)).getValueType(),
6977 getValue(I.getArgOperand(0)),
6978 getValue(I.getArgOperand(1)), Flags));
6979 return;
6980 case Intrinsic::minimum:
6981 setValue(&I, DAG.getNode(ISD::FMINIMUM, sdl,
6982 getValue(I.getArgOperand(0)).getValueType(),
6983 getValue(I.getArgOperand(0)),
6984 getValue(I.getArgOperand(1)), Flags));
6985 return;
6986 case Intrinsic::maximum:
6987 setValue(&I, DAG.getNode(ISD::FMAXIMUM, sdl,
6988 getValue(I.getArgOperand(0)).getValueType(),
6989 getValue(I.getArgOperand(0)),
6990 getValue(I.getArgOperand(1)), Flags));
6991 return;
6992 case Intrinsic::minimumnum:
6993 setValue(&I, DAG.getNode(ISD::FMINIMUMNUM, sdl,
6994 getValue(I.getArgOperand(0)).getValueType(),
6995 getValue(I.getArgOperand(0)),
6996 getValue(I.getArgOperand(1)), Flags));
6997 return;
6998 case Intrinsic::maximumnum:
6999 setValue(&I, DAG.getNode(ISD::FMAXIMUMNUM, sdl,
7000 getValue(I.getArgOperand(0)).getValueType(),
7001 getValue(I.getArgOperand(0)),
7002 getValue(I.getArgOperand(1)), Flags));
7003 return;
7004 case Intrinsic::copysign:
7005 setValue(&I, DAG.getNode(ISD::FCOPYSIGN, sdl,
7006 getValue(I.getArgOperand(0)).getValueType(),
7007 getValue(I.getArgOperand(0)),
7008 getValue(I.getArgOperand(1)), Flags));
7009 return;
7010 case Intrinsic::ldexp:
7011 setValue(&I, DAG.getNode(ISD::FLDEXP, sdl,
7012 getValue(I.getArgOperand(0)).getValueType(),
7013 getValue(I.getArgOperand(0)),
7014 getValue(I.getArgOperand(1)), Flags));
7015 return;
7016 case Intrinsic::modf:
7017 case Intrinsic::sincos:
7018 case Intrinsic::sincospi:
7019 case Intrinsic::frexp: {
7020 unsigned Opcode;
7021 switch (Intrinsic) {
7022 default:
7023 llvm_unreachable("unexpected intrinsic");
7024 case Intrinsic::sincos:
7025 Opcode = ISD::FSINCOS;
7026 break;
7027 case Intrinsic::sincospi:
7028 Opcode = ISD::FSINCOSPI;
7029 break;
7030 case Intrinsic::modf:
7031 Opcode = ISD::FMODF;
7032 break;
7033 case Intrinsic::frexp:
7034 Opcode = ISD::FFREXP;
7035 break;
7036 }
7037 SmallVector<EVT, 2> ValueVTs;
7038 ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);
7039 SDVTList VTs = DAG.getVTList(ValueVTs);
7040 setValue(
7041 &I, DAG.getNode(Opcode, sdl, VTs, getValue(I.getArgOperand(0)), Flags));
7042 return;
7043 }
7044 case Intrinsic::arithmetic_fence: {
7045 setValue(&I, DAG.getNode(ISD::ARITH_FENCE, sdl,
7046 getValue(I.getArgOperand(0)).getValueType(),
7047 getValue(I.getArgOperand(0)), Flags));
7048 return;
7049 }
7050 case Intrinsic::fma:
7051 setValue(&I, DAG.getNode(
7052 ISD::FMA, sdl, getValue(I.getArgOperand(0)).getValueType(),
7053 getValue(I.getArgOperand(0)), getValue(I.getArgOperand(1)),
7054 getValue(I.getArgOperand(2)), Flags));
7055 return;
7056#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
7057 case Intrinsic::INTRINSIC:
7058#include "llvm/IR/ConstrainedOps.def"
7059 visitConstrainedFPIntrinsic(cast<ConstrainedFPIntrinsic>(I));
7060 return;
7061#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID:
7062#include "llvm/IR/VPIntrinsics.def"
7063 visitVectorPredicationIntrinsic(cast<VPIntrinsic>(I));
7064 return;
7065 case Intrinsic::fptrunc_round: {
7066 // Get the last argument, the metadata and convert it to an integer in the
7067 // call
7068 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(1))->getMetadata();
7069 std::optional<RoundingMode> RoundMode =
7070 convertStrToRoundingMode(cast<MDString>(MD)->getString());
7071
7072 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7073
7074 // Propagate fast-math-flags from IR to node(s).
7075 SDNodeFlags Flags;
7076 Flags.copyFMF(*cast<FPMathOperator>(&I));
7077 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
7078
7080 Result = DAG.getNode(
7081 ISD::FPTRUNC_ROUND, sdl, VT, getValue(I.getArgOperand(0)),
7082 DAG.getTargetConstant((int)*RoundMode, sdl, MVT::i32));
7083 setValue(&I, Result);
7084
7085 return;
7086 }
7087 case Intrinsic::fmuladd: {
7088 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7089 if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
7090 TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), VT)) {
7091 setValue(&I, DAG.getNode(ISD::FMA, sdl,
7092 getValue(I.getArgOperand(0)).getValueType(),
7093 getValue(I.getArgOperand(0)),
7094 getValue(I.getArgOperand(1)),
7095 getValue(I.getArgOperand(2)), Flags));
7096 } else if (TLI.isOperationLegalOrCustom(ISD::FMULADD, VT)) {
7097 // TODO: Support splitting the vector.
7098 setValue(&I, DAG.getNode(ISD::FMULADD, sdl,
7099 getValue(I.getArgOperand(0)).getValueType(),
7100 getValue(I.getArgOperand(0)),
7101 getValue(I.getArgOperand(1)),
7102 getValue(I.getArgOperand(2)), Flags));
7103 } else {
7104 // TODO: Intrinsic calls should have fast-math-flags.
7105 SDValue Mul = DAG.getNode(
7106 ISD::FMUL, sdl, getValue(I.getArgOperand(0)).getValueType(),
7107 getValue(I.getArgOperand(0)), getValue(I.getArgOperand(1)), Flags);
7108 SDValue Add = DAG.getNode(ISD::FADD, sdl,
7109 getValue(I.getArgOperand(0)).getValueType(),
7110 Mul, getValue(I.getArgOperand(2)), Flags);
7111 setValue(&I, Add);
7112 }
7113 return;
7114 }
7115 case Intrinsic::convert_to_fp16:
7116 setValue(&I, DAG.getNode(ISD::BITCAST, sdl, MVT::i16,
7117 DAG.getNode(ISD::FP_ROUND, sdl, MVT::f16,
7118 getValue(I.getArgOperand(0)),
7119 DAG.getTargetConstant(0, sdl,
7120 MVT::i32))));
7121 return;
7122 case Intrinsic::convert_from_fp16:
7123 setValue(&I, DAG.getNode(ISD::FP_EXTEND, sdl,
7124 TLI.getValueType(DAG.getDataLayout(), I.getType()),
7125 DAG.getNode(ISD::BITCAST, sdl, MVT::f16,
7126 getValue(I.getArgOperand(0)))));
7127 return;
7128 case Intrinsic::fptosi_sat: {
7129 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7130 setValue(&I, DAG.getNode(ISD::FP_TO_SINT_SAT, sdl, VT,
7131 getValue(I.getArgOperand(0)),
7132 DAG.getValueType(VT.getScalarType())));
7133 return;
7134 }
7135 case Intrinsic::fptoui_sat: {
7136 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7137 setValue(&I, DAG.getNode(ISD::FP_TO_UINT_SAT, sdl, VT,
7138 getValue(I.getArgOperand(0)),
7139 DAG.getValueType(VT.getScalarType())));
7140 return;
7141 }
7142 case Intrinsic::set_rounding:
7143 Res = DAG.getNode(ISD::SET_ROUNDING, sdl, MVT::Other,
7144 {getRoot(), getValue(I.getArgOperand(0))});
7145 setValue(&I, Res);
7146 DAG.setRoot(Res.getValue(0));
7147 return;
7148 case Intrinsic::is_fpclass: {
7149 const DataLayout DLayout = DAG.getDataLayout();
7150 EVT DestVT = TLI.getValueType(DLayout, I.getType());
7151 EVT ArgVT = TLI.getValueType(DLayout, I.getArgOperand(0)->getType());
7152 FPClassTest Test = static_cast<FPClassTest>(
7153 cast<ConstantInt>(I.getArgOperand(1))->getZExtValue());
7154 MachineFunction &MF = DAG.getMachineFunction();
7155 const Function &F = MF.getFunction();
7156 SDValue Op = getValue(I.getArgOperand(0));
7157 SDNodeFlags Flags;
7158 Flags.setNoFPExcept(
7159 !F.getAttributes().hasFnAttr(llvm::Attribute::StrictFP));
7160 // If ISD::IS_FPCLASS should be expanded, do it right now, because the
7161 // expansion can use illegal types. Making expansion early allows
7162 // legalizing these types prior to selection.
7163 if (!TLI.isOperationLegal(ISD::IS_FPCLASS, ArgVT) &&
7164 !TLI.isOperationCustom(ISD::IS_FPCLASS, ArgVT)) {
7165 SDValue Result = TLI.expandIS_FPCLASS(DestVT, Op, Test, Flags, sdl, DAG);
7166 setValue(&I, Result);
7167 return;
7168 }
7169
7170 SDValue Check = DAG.getTargetConstant(Test, sdl, MVT::i32);
7171 SDValue V = DAG.getNode(ISD::IS_FPCLASS, sdl, DestVT, {Op, Check}, Flags);
7172 setValue(&I, V);
7173 return;
7174 }
7175 case Intrinsic::get_fpenv: {
7176 const DataLayout DLayout = DAG.getDataLayout();
7177 EVT EnvVT = TLI.getValueType(DLayout, I.getType());
7178 Align TempAlign = DAG.getEVTAlign(EnvVT);
7179 SDValue Chain = getRoot();
7180 // Use GET_FPENV if it is legal or custom. Otherwise use memory-based node
7181 // and temporary storage in stack.
7182 if (TLI.isOperationLegalOrCustom(ISD::GET_FPENV, EnvVT)) {
7183 Res = DAG.getNode(
7184 ISD::GET_FPENV, sdl,
7185 DAG.getVTList(TLI.getValueType(DAG.getDataLayout(), I.getType()),
7186 MVT::Other),
7187 Chain);
7188 } else {
7189 SDValue Temp = DAG.CreateStackTemporary(EnvVT, TempAlign.value());
7190 int SPFI = cast<FrameIndexSDNode>(Temp.getNode())->getIndex();
7191 auto MPI =
7192 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI);
7193 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
7195 TempAlign);
7196 Chain = DAG.getGetFPEnv(Chain, sdl, Temp, EnvVT, MMO);
7197 Res = DAG.getLoad(EnvVT, sdl, Chain, Temp, MPI);
7198 }
7199 setValue(&I, Res);
7200 DAG.setRoot(Res.getValue(1));
7201 return;
7202 }
7203 case Intrinsic::set_fpenv: {
7204 const DataLayout DLayout = DAG.getDataLayout();
7205 SDValue Env = getValue(I.getArgOperand(0));
7206 EVT EnvVT = Env.getValueType();
7207 Align TempAlign = DAG.getEVTAlign(EnvVT);
7208 SDValue Chain = getRoot();
7209 // If SET_FPENV is custom or legal, use it. Otherwise use loading
7210 // environment from memory.
7211 if (TLI.isOperationLegalOrCustom(ISD::SET_FPENV, EnvVT)) {
7212 Chain = DAG.getNode(ISD::SET_FPENV, sdl, MVT::Other, Chain, Env);
7213 } else {
7214 // Allocate space in stack, copy environment bits into it and use this
7215 // memory in SET_FPENV_MEM.
7216 SDValue Temp = DAG.CreateStackTemporary(EnvVT, TempAlign.value());
7217 int SPFI = cast<FrameIndexSDNode>(Temp.getNode())->getIndex();
7218 auto MPI =
7219 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI);
7220 Chain = DAG.getStore(Chain, sdl, Env, Temp, MPI, TempAlign,
7222 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
7224 TempAlign);
7225 Chain = DAG.getSetFPEnv(Chain, sdl, Temp, EnvVT, MMO);
7226 }
7227 DAG.setRoot(Chain);
7228 return;
7229 }
7230 case Intrinsic::reset_fpenv:
7231 DAG.setRoot(DAG.getNode(ISD::RESET_FPENV, sdl, MVT::Other, getRoot()));
7232 return;
7233 case Intrinsic::get_fpmode:
7234 Res = DAG.getNode(
7235 ISD::GET_FPMODE, sdl,
7236 DAG.getVTList(TLI.getValueType(DAG.getDataLayout(), I.getType()),
7237 MVT::Other),
7238 DAG.getRoot());
7239 setValue(&I, Res);
7240 DAG.setRoot(Res.getValue(1));
7241 return;
7242 case Intrinsic::set_fpmode:
7243 Res = DAG.getNode(ISD::SET_FPMODE, sdl, MVT::Other, {DAG.getRoot()},
7244 getValue(I.getArgOperand(0)));
7245 DAG.setRoot(Res);
7246 return;
7247 case Intrinsic::reset_fpmode: {
7248 Res = DAG.getNode(ISD::RESET_FPMODE, sdl, MVT::Other, getRoot());
7249 DAG.setRoot(Res);
7250 return;
7251 }
7252 case Intrinsic::pcmarker: {
7253 SDValue Tmp = getValue(I.getArgOperand(0));
7254 DAG.setRoot(DAG.getNode(ISD::PCMARKER, sdl, MVT::Other, getRoot(), Tmp));
7255 return;
7256 }
7257 case Intrinsic::readcyclecounter: {
7258 SDValue Op = getRoot();
7259 Res = DAG.getNode(ISD::READCYCLECOUNTER, sdl,
7260 DAG.getVTList(MVT::i64, MVT::Other), Op);
7261 setValue(&I, Res);
7262 DAG.setRoot(Res.getValue(1));
7263 return;
7264 }
7265 case Intrinsic::readsteadycounter: {
7266 SDValue Op = getRoot();
7267 Res = DAG.getNode(ISD::READSTEADYCOUNTER, sdl,
7268 DAG.getVTList(MVT::i64, MVT::Other), Op);
7269 setValue(&I, Res);
7270 DAG.setRoot(Res.getValue(1));
7271 return;
7272 }
7273 case Intrinsic::bitreverse:
7274 setValue(&I, DAG.getNode(ISD::BITREVERSE, sdl,
7275 getValue(I.getArgOperand(0)).getValueType(),
7276 getValue(I.getArgOperand(0))));
7277 return;
7278 case Intrinsic::bswap:
7279 setValue(&I, DAG.getNode(ISD::BSWAP, sdl,
7280 getValue(I.getArgOperand(0)).getValueType(),
7281 getValue(I.getArgOperand(0))));
7282 return;
7283 case Intrinsic::cttz: {
7284 SDValue Arg = getValue(I.getArgOperand(0));
7285 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
7286 EVT Ty = Arg.getValueType();
7287 setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTTZ : ISD::CTTZ_ZERO_UNDEF,
7288 sdl, Ty, Arg));
7289 return;
7290 }
7291 case Intrinsic::ctlz: {
7292 SDValue Arg = getValue(I.getArgOperand(0));
7293 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
7294 EVT Ty = Arg.getValueType();
7295 setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTLZ : ISD::CTLZ_ZERO_UNDEF,
7296 sdl, Ty, Arg));
7297 return;
7298 }
7299 case Intrinsic::ctpop: {
7300 SDValue Arg = getValue(I.getArgOperand(0));
7301 EVT Ty = Arg.getValueType();
7302 setValue(&I, DAG.getNode(ISD::CTPOP, sdl, Ty, Arg));
7303 return;
7304 }
7305 case Intrinsic::fshl:
7306 case Intrinsic::fshr: {
7307 bool IsFSHL = Intrinsic == Intrinsic::fshl;
7308 SDValue X = getValue(I.getArgOperand(0));
7309 SDValue Y = getValue(I.getArgOperand(1));
7310 SDValue Z = getValue(I.getArgOperand(2));
7311 EVT VT = X.getValueType();
7312
7313 if (X == Y) {
7314 auto RotateOpcode = IsFSHL ? ISD::ROTL : ISD::ROTR;
7315 setValue(&I, DAG.getNode(RotateOpcode, sdl, VT, X, Z));
7316 } else {
7317 auto FunnelOpcode = IsFSHL ? ISD::FSHL : ISD::FSHR;
7318 setValue(&I, DAG.getNode(FunnelOpcode, sdl, VT, X, Y, Z));
7319 }
7320 return;
7321 }
7322 case Intrinsic::sadd_sat: {
7323 SDValue Op1 = getValue(I.getArgOperand(0));
7324 SDValue Op2 = getValue(I.getArgOperand(1));
7325 setValue(&I, DAG.getNode(ISD::SADDSAT, sdl, Op1.getValueType(), Op1, Op2));
7326 return;
7327 }
7328 case Intrinsic::uadd_sat: {
7329 SDValue Op1 = getValue(I.getArgOperand(0));
7330 SDValue Op2 = getValue(I.getArgOperand(1));
7331 setValue(&I, DAG.getNode(ISD::UADDSAT, sdl, Op1.getValueType(), Op1, Op2));
7332 return;
7333 }
7334 case Intrinsic::ssub_sat: {
7335 SDValue Op1 = getValue(I.getArgOperand(0));
7336 SDValue Op2 = getValue(I.getArgOperand(1));
7337 setValue(&I, DAG.getNode(ISD::SSUBSAT, sdl, Op1.getValueType(), Op1, Op2));
7338 return;
7339 }
7340 case Intrinsic::usub_sat: {
7341 SDValue Op1 = getValue(I.getArgOperand(0));
7342 SDValue Op2 = getValue(I.getArgOperand(1));
7343 setValue(&I, DAG.getNode(ISD::USUBSAT, sdl, Op1.getValueType(), Op1, Op2));
7344 return;
7345 }
7346 case Intrinsic::sshl_sat:
7347 case Intrinsic::ushl_sat: {
7348 SDValue Op1 = getValue(I.getArgOperand(0));
7349 SDValue Op2 = getValue(I.getArgOperand(1));
7350
7351 EVT ShiftTy = DAG.getTargetLoweringInfo().getShiftAmountTy(
7352 Op1.getValueType(), DAG.getDataLayout());
7353
7354 // Coerce the shift amount to the right type if we can. This exposes the
7355 // truncate or zext to optimization early.
7356 if (!I.getType()->isVectorTy() && Op2.getValueType() != ShiftTy) {
7357 assert(ShiftTy.getSizeInBits() >=
7359 "Unexpected shift type");
7360 Op2 = DAG.getZExtOrTrunc(Op2, getCurSDLoc(), ShiftTy);
7361 }
7362
7363 unsigned Opc =
7364 Intrinsic == Intrinsic::sshl_sat ? ISD::SSHLSAT : ISD::USHLSAT;
7365 setValue(&I, DAG.getNode(Opc, sdl, Op1.getValueType(), Op1, Op2));
7366 return;
7367 }
7368 case Intrinsic::smul_fix:
7369 case Intrinsic::umul_fix:
7370 case Intrinsic::smul_fix_sat:
7371 case Intrinsic::umul_fix_sat: {
7372 SDValue Op1 = getValue(I.getArgOperand(0));
7373 SDValue Op2 = getValue(I.getArgOperand(1));
7374 SDValue Op3 = getValue(I.getArgOperand(2));
7375 setValue(&I, DAG.getNode(FixedPointIntrinsicToOpcode(Intrinsic), sdl,
7376 Op1.getValueType(), Op1, Op2, Op3));
7377 return;
7378 }
7379 case Intrinsic::sdiv_fix:
7380 case Intrinsic::udiv_fix:
7381 case Intrinsic::sdiv_fix_sat:
7382 case Intrinsic::udiv_fix_sat: {
7383 SDValue Op1 = getValue(I.getArgOperand(0));
7384 SDValue Op2 = getValue(I.getArgOperand(1));
7385 SDValue Op3 = getValue(I.getArgOperand(2));
7387 Op1, Op2, Op3, DAG, TLI));
7388 return;
7389 }
7390 case Intrinsic::smax: {
7391 SDValue Op1 = getValue(I.getArgOperand(0));
7392 SDValue Op2 = getValue(I.getArgOperand(1));
7393 setValue(&I, DAG.getNode(ISD::SMAX, sdl, Op1.getValueType(), Op1, Op2));
7394 return;
7395 }
7396 case Intrinsic::smin: {
7397 SDValue Op1 = getValue(I.getArgOperand(0));
7398 SDValue Op2 = getValue(I.getArgOperand(1));
7399 setValue(&I, DAG.getNode(ISD::SMIN, sdl, Op1.getValueType(), Op1, Op2));
7400 return;
7401 }
7402 case Intrinsic::umax: {
7403 SDValue Op1 = getValue(I.getArgOperand(0));
7404 SDValue Op2 = getValue(I.getArgOperand(1));
7405 setValue(&I, DAG.getNode(ISD::UMAX, sdl, Op1.getValueType(), Op1, Op2));
7406 return;
7407 }
7408 case Intrinsic::umin: {
7409 SDValue Op1 = getValue(I.getArgOperand(0));
7410 SDValue Op2 = getValue(I.getArgOperand(1));
7411 setValue(&I, DAG.getNode(ISD::UMIN, sdl, Op1.getValueType(), Op1, Op2));
7412 return;
7413 }
7414 case Intrinsic::abs: {
7415 // TODO: Preserve "int min is poison" arg in SDAG?
7416 SDValue Op1 = getValue(I.getArgOperand(0));
7417 setValue(&I, DAG.getNode(ISD::ABS, sdl, Op1.getValueType(), Op1));
7418 return;
7419 }
7420 case Intrinsic::scmp: {
7421 SDValue Op1 = getValue(I.getArgOperand(0));
7422 SDValue Op2 = getValue(I.getArgOperand(1));
7423 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7424 setValue(&I, DAG.getNode(ISD::SCMP, sdl, DestVT, Op1, Op2));
7425 break;
7426 }
7427 case Intrinsic::ucmp: {
7428 SDValue Op1 = getValue(I.getArgOperand(0));
7429 SDValue Op2 = getValue(I.getArgOperand(1));
7430 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7431 setValue(&I, DAG.getNode(ISD::UCMP, sdl, DestVT, Op1, Op2));
7432 break;
7433 }
7434 case Intrinsic::stacksave: {
7435 SDValue Op = getRoot();
7436 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7437 Res = DAG.getNode(ISD::STACKSAVE, sdl, DAG.getVTList(VT, MVT::Other), Op);
7438 setValue(&I, Res);
7439 DAG.setRoot(Res.getValue(1));
7440 return;
7441 }
7442 case Intrinsic::stackrestore:
7443 Res = getValue(I.getArgOperand(0));
7444 DAG.setRoot(DAG.getNode(ISD::STACKRESTORE, sdl, MVT::Other, getRoot(), Res));
7445 return;
7446 case Intrinsic::get_dynamic_area_offset: {
7447 SDValue Op = getRoot();
7448 EVT ResTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
7449 Res = DAG.getNode(ISD::GET_DYNAMIC_AREA_OFFSET, sdl, DAG.getVTList(ResTy),
7450 Op);
7451 DAG.setRoot(Op);
7452 setValue(&I, Res);
7453 return;
7454 }
7455 case Intrinsic::stackguard: {
7456 MachineFunction &MF = DAG.getMachineFunction();
7457 const Module &M = *MF.getFunction().getParent();
7458 EVT PtrTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
7459 SDValue Chain = getRoot();
7460 if (TLI.useLoadStackGuardNode(M)) {
7461 Res = getLoadStackGuard(DAG, sdl, Chain);
7462 Res = DAG.getPtrExtOrTrunc(Res, sdl, PtrTy);
7463 } else {
7464 const Value *Global = TLI.getSDagStackGuard(M);
7465 if (!Global) {
7466 LLVMContext &Ctx = *DAG.getContext();
7467 Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
7468 setValue(&I, DAG.getPOISON(PtrTy));
7469 return;
7470 }
7471
7472 Align Align = DAG.getDataLayout().getPrefTypeAlign(Global->getType());
7473 Res = DAG.getLoad(PtrTy, sdl, Chain, getValue(Global),
7474 MachinePointerInfo(Global, 0), Align,
7476 }
7477 if (TLI.useStackGuardMixCookie())
7478 Res = TLI.emitStackGuardMixCookie(DAG, Res, sdl, false);
7479 DAG.setRoot(Chain);
7480 setValue(&I, Res);
7481 return;
7482 }
7483 case Intrinsic::stackprotector: {
7484 // Emit code into the DAG to store the stack guard onto the stack.
7485 MachineFunction &MF = DAG.getMachineFunction();
7486 MachineFrameInfo &MFI = MF.getFrameInfo();
7487 const Module &M = *MF.getFunction().getParent();
7488 SDValue Src, Chain = getRoot();
7489
7490 if (TLI.useLoadStackGuardNode(M))
7491 Src = getLoadStackGuard(DAG, sdl, Chain);
7492 else
7493 Src = getValue(I.getArgOperand(0)); // The guard's value.
7494
7495 AllocaInst *Slot = cast<AllocaInst>(I.getArgOperand(1));
7496
7497 int FI = FuncInfo.StaticAllocaMap[Slot];
7498 MFI.setStackProtectorIndex(FI);
7499 EVT PtrTy = TLI.getFrameIndexTy(DAG.getDataLayout());
7500
7501 SDValue FIN = DAG.getFrameIndex(FI, PtrTy);
7502
7503 // Store the stack protector onto the stack.
7504 Res = DAG.getStore(
7505 Chain, sdl, Src, FIN,
7506 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI),
7507 MaybeAlign(), MachineMemOperand::MOVolatile);
7508 setValue(&I, Res);
7509 DAG.setRoot(Res);
7510 return;
7511 }
7512 case Intrinsic::objectsize:
7513 llvm_unreachable("llvm.objectsize.* should have been lowered already");
7514
7515 case Intrinsic::is_constant:
7516 llvm_unreachable("llvm.is.constant.* should have been lowered already");
7517
7518 case Intrinsic::annotation:
7519 case Intrinsic::ptr_annotation:
7520 case Intrinsic::launder_invariant_group:
7521 case Intrinsic::strip_invariant_group:
7522 // Drop the intrinsic, but forward the value
7523 setValue(&I, getValue(I.getOperand(0)));
7524 return;
7525
7526 case Intrinsic::type_test:
7527 case Intrinsic::public_type_test:
7528 setValue(&I, getValue(ConstantInt::getTrue(I.getType())));
7529 return;
7530
7531 case Intrinsic::assume:
7532 case Intrinsic::experimental_noalias_scope_decl:
7533 case Intrinsic::var_annotation:
7534 case Intrinsic::sideeffect:
7535 // Discard annotate attributes, noalias scope declarations, assumptions, and
7536 // artificial side-effects.
7537 return;
7538
7539 case Intrinsic::codeview_annotation: {
7540 // Emit a label associated with this metadata.
7541 MachineFunction &MF = DAG.getMachineFunction();
7542 MCSymbol *Label = MF.getContext().createTempSymbol("annotation", true);
7543 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(0))->getMetadata();
7544 MF.addCodeViewAnnotation(Label, cast<MDNode>(MD));
7545 Res = DAG.getLabelNode(ISD::ANNOTATION_LABEL, sdl, getRoot(), Label);
7546 DAG.setRoot(Res);
7547 return;
7548 }
7549
7550 case Intrinsic::init_trampoline: {
7551 const Function *F = cast<Function>(I.getArgOperand(1)->stripPointerCasts());
7552
7553 SDValue Ops[6];
7554 Ops[0] = getRoot();
7555 Ops[1] = getValue(I.getArgOperand(0));
7556 Ops[2] = getValue(I.getArgOperand(1));
7557 Ops[3] = getValue(I.getArgOperand(2));
7558 Ops[4] = DAG.getSrcValue(I.getArgOperand(0));
7559 Ops[5] = DAG.getSrcValue(F);
7560
7561 Res = DAG.getNode(ISD::INIT_TRAMPOLINE, sdl, MVT::Other, Ops);
7562
7563 DAG.setRoot(Res);
7564 return;
7565 }
7566 case Intrinsic::adjust_trampoline:
7567 setValue(&I, DAG.getNode(ISD::ADJUST_TRAMPOLINE, sdl,
7568 TLI.getPointerTy(DAG.getDataLayout()),
7569 getValue(I.getArgOperand(0))));
7570 return;
7571 case Intrinsic::gcroot: {
7572 assert(DAG.getMachineFunction().getFunction().hasGC() &&
7573 "only valid in functions with gc specified, enforced by Verifier");
7574 assert(GFI && "implied by previous");
7575 const Value *Alloca = I.getArgOperand(0)->stripPointerCasts();
7576 const Constant *TypeMap = cast<Constant>(I.getArgOperand(1));
7577
7578 FrameIndexSDNode *FI = cast<FrameIndexSDNode>(getValue(Alloca).getNode());
7579 GFI->addStackRoot(FI->getIndex(), TypeMap);
7580 return;
7581 }
7582 case Intrinsic::gcread:
7583 case Intrinsic::gcwrite:
7584 llvm_unreachable("GC failed to lower gcread/gcwrite intrinsics!");
7585 case Intrinsic::get_rounding:
7586 Res = DAG.getNode(ISD::GET_ROUNDING, sdl, {MVT::i32, MVT::Other}, getRoot());
7587 setValue(&I, Res);
7588 DAG.setRoot(Res.getValue(1));
7589 return;
7590
7591 case Intrinsic::expect:
7592 case Intrinsic::expect_with_probability:
7593 // Just replace __builtin_expect(exp, c) and
7594 // __builtin_expect_with_probability(exp, c, p) with EXP.
7595 setValue(&I, getValue(I.getArgOperand(0)));
7596 return;
7597
7598 case Intrinsic::ubsantrap:
7599 case Intrinsic::debugtrap:
7600 case Intrinsic::trap: {
7601 StringRef TrapFuncName =
7602 I.getAttributes().getFnAttr("trap-func-name").getValueAsString();
7603 if (TrapFuncName.empty()) {
7604 switch (Intrinsic) {
7605 case Intrinsic::trap:
7606 DAG.setRoot(DAG.getNode(ISD::TRAP, sdl, MVT::Other, getRoot()));
7607 break;
7608 case Intrinsic::debugtrap:
7609 DAG.setRoot(DAG.getNode(ISD::DEBUGTRAP, sdl, MVT::Other, getRoot()));
7610 break;
7611 case Intrinsic::ubsantrap:
7612 DAG.setRoot(DAG.getNode(
7613 ISD::UBSANTRAP, sdl, MVT::Other, getRoot(),
7614 DAG.getTargetConstant(
7615 cast<ConstantInt>(I.getArgOperand(0))->getZExtValue(), sdl,
7616 MVT::i32)));
7617 break;
7618 default: llvm_unreachable("unknown trap intrinsic");
7619 }
7620 DAG.addNoMergeSiteInfo(DAG.getRoot().getNode(),
7621 I.hasFnAttr(Attribute::NoMerge));
7622 return;
7623 }
7625 if (Intrinsic == Intrinsic::ubsantrap) {
7626 Value *Arg = I.getArgOperand(0);
7627 Args.emplace_back(Arg, getValue(Arg));
7628 }
7629
7630 TargetLowering::CallLoweringInfo CLI(DAG);
7631 CLI.setDebugLoc(sdl).setChain(getRoot()).setLibCallee(
7632 CallingConv::C, I.getType(),
7633 DAG.getExternalSymbol(TrapFuncName.data(),
7634 TLI.getPointerTy(DAG.getDataLayout())),
7635 std::move(Args));
7636 CLI.NoMerge = I.hasFnAttr(Attribute::NoMerge);
7637 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
7638 DAG.setRoot(Result.second);
7639 return;
7640 }
7641
7642 case Intrinsic::allow_runtime_check:
7643 case Intrinsic::allow_ubsan_check:
7644 setValue(&I, getValue(ConstantInt::getTrue(I.getType())));
7645 return;
7646
7647 case Intrinsic::uadd_with_overflow:
7648 case Intrinsic::sadd_with_overflow:
7649 case Intrinsic::usub_with_overflow:
7650 case Intrinsic::ssub_with_overflow:
7651 case Intrinsic::umul_with_overflow:
7652 case Intrinsic::smul_with_overflow: {
7654 switch (Intrinsic) {
7655 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
7656 case Intrinsic::uadd_with_overflow: Op = ISD::UADDO; break;
7657 case Intrinsic::sadd_with_overflow: Op = ISD::SADDO; break;
7658 case Intrinsic::usub_with_overflow: Op = ISD::USUBO; break;
7659 case Intrinsic::ssub_with_overflow: Op = ISD::SSUBO; break;
7660 case Intrinsic::umul_with_overflow: Op = ISD::UMULO; break;
7661 case Intrinsic::smul_with_overflow: Op = ISD::SMULO; break;
7662 }
7663 SDValue Op1 = getValue(I.getArgOperand(0));
7664 SDValue Op2 = getValue(I.getArgOperand(1));
7665
7666 EVT ResultVT = Op1.getValueType();
7667 EVT OverflowVT = MVT::i1;
7668 if (ResultVT.isVector())
7669 OverflowVT = EVT::getVectorVT(
7670 *Context, OverflowVT, ResultVT.getVectorElementCount());
7671
7672 SDVTList VTs = DAG.getVTList(ResultVT, OverflowVT);
7673 setValue(&I, DAG.getNode(Op, sdl, VTs, Op1, Op2));
7674 return;
7675 }
7676 case Intrinsic::prefetch: {
7677 SDValue Ops[5];
7678 unsigned rw = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
7680 Ops[0] = DAG.getRoot();
7681 Ops[1] = getValue(I.getArgOperand(0));
7682 Ops[2] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(1)), sdl,
7683 MVT::i32);
7684 Ops[3] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(2)), sdl,
7685 MVT::i32);
7686 Ops[4] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(3)), sdl,
7687 MVT::i32);
7688 SDValue Result = DAG.getMemIntrinsicNode(
7689 ISD::PREFETCH, sdl, DAG.getVTList(MVT::Other), Ops,
7690 EVT::getIntegerVT(*Context, 8), MachinePointerInfo(I.getArgOperand(0)),
7691 /* align */ std::nullopt, Flags);
7692
7693 // Chain the prefetch in parallel with any pending loads, to stay out of
7694 // the way of later optimizations.
7695 PendingLoads.push_back(Result);
7696 Result = getRoot();
7697 DAG.setRoot(Result);
7698 return;
7699 }
7700 case Intrinsic::lifetime_start:
7701 case Intrinsic::lifetime_end: {
7702 bool IsStart = (Intrinsic == Intrinsic::lifetime_start);
7703 // Stack coloring is not enabled in O0, discard region information.
7704 if (TM.getOptLevel() == CodeGenOptLevel::None)
7705 return;
7706
7707 const AllocaInst *LifetimeObject = dyn_cast<AllocaInst>(I.getArgOperand(0));
7708 if (!LifetimeObject)
7709 return;
7710
7711 // First check that the Alloca is static, otherwise it won't have a
7712 // valid frame index.
7713 auto SI = FuncInfo.StaticAllocaMap.find(LifetimeObject);
7714 if (SI == FuncInfo.StaticAllocaMap.end())
7715 return;
7716
7717 const int FrameIndex = SI->second;
7718 Res = DAG.getLifetimeNode(IsStart, sdl, getRoot(), FrameIndex);
7719 DAG.setRoot(Res);
7720 return;
7721 }
7722 case Intrinsic::pseudoprobe: {
7723 auto Guid = cast<ConstantInt>(I.getArgOperand(0))->getZExtValue();
7724 auto Index = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
7725 auto Attr = cast<ConstantInt>(I.getArgOperand(2))->getZExtValue();
7726 Res = DAG.getPseudoProbeNode(sdl, getRoot(), Guid, Index, Attr);
7727 DAG.setRoot(Res);
7728 return;
7729 }
7730 case Intrinsic::invariant_start:
7731 // Discard region information.
7732 setValue(&I,
7733 DAG.getUNDEF(TLI.getValueType(DAG.getDataLayout(), I.getType())));
7734 return;
7735 case Intrinsic::invariant_end:
7736 // Discard region information.
7737 return;
7738 case Intrinsic::clear_cache: {
7739 SDValue InputChain = DAG.getRoot();
7740 SDValue StartVal = getValue(I.getArgOperand(0));
7741 SDValue EndVal = getValue(I.getArgOperand(1));
7742 Res = DAG.getNode(ISD::CLEAR_CACHE, sdl, DAG.getVTList(MVT::Other),
7743 {InputChain, StartVal, EndVal});
7744 setValue(&I, Res);
7745 DAG.setRoot(Res);
7746 return;
7747 }
7748 case Intrinsic::donothing:
7749 case Intrinsic::seh_try_begin:
7750 case Intrinsic::seh_scope_begin:
7751 case Intrinsic::seh_try_end:
7752 case Intrinsic::seh_scope_end:
7753 // ignore
7754 return;
7755 case Intrinsic::experimental_stackmap:
7756 visitStackmap(I);
7757 return;
7758 case Intrinsic::experimental_patchpoint_void:
7759 case Intrinsic::experimental_patchpoint:
7760 visitPatchpoint(I);
7761 return;
7762 case Intrinsic::experimental_gc_statepoint:
7764 return;
7765 case Intrinsic::experimental_gc_result:
7766 visitGCResult(cast<GCResultInst>(I));
7767 return;
7768 case Intrinsic::experimental_gc_relocate:
7769 visitGCRelocate(cast<GCRelocateInst>(I));
7770 return;
7771 case Intrinsic::instrprof_cover:
7772 llvm_unreachable("instrprof failed to lower a cover");
7773 case Intrinsic::instrprof_increment:
7774 llvm_unreachable("instrprof failed to lower an increment");
7775 case Intrinsic::instrprof_timestamp:
7776 llvm_unreachable("instrprof failed to lower a timestamp");
7777 case Intrinsic::instrprof_value_profile:
7778 llvm_unreachable("instrprof failed to lower a value profiling call");
7779 case Intrinsic::instrprof_mcdc_parameters:
7780 llvm_unreachable("instrprof failed to lower mcdc parameters");
7781 case Intrinsic::instrprof_mcdc_tvbitmap_update:
7782 llvm_unreachable("instrprof failed to lower an mcdc tvbitmap update");
7783 case Intrinsic::localescape: {
7784 MachineFunction &MF = DAG.getMachineFunction();
7785 const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo();
7786
7787 // Directly emit some LOCAL_ESCAPE machine instrs. Label assignment emission
7788 // is the same on all targets.
7789 for (unsigned Idx = 0, E = I.arg_size(); Idx < E; ++Idx) {
7790 Value *Arg = I.getArgOperand(Idx)->stripPointerCasts();
7791 if (isa<ConstantPointerNull>(Arg))
7792 continue; // Skip null pointers. They represent a hole in index space.
7793 AllocaInst *Slot = cast<AllocaInst>(Arg);
7794 assert(FuncInfo.StaticAllocaMap.count(Slot) &&
7795 "can only escape static allocas");
7796 int FI = FuncInfo.StaticAllocaMap[Slot];
7797 MCSymbol *FrameAllocSym = MF.getContext().getOrCreateFrameAllocSymbol(
7799 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, dl,
7800 TII->get(TargetOpcode::LOCAL_ESCAPE))
7801 .addSym(FrameAllocSym)
7802 .addFrameIndex(FI);
7803 }
7804
7805 return;
7806 }
7807
7808 case Intrinsic::localrecover: {
7809 // i8* @llvm.localrecover(i8* %fn, i8* %fp, i32 %idx)
7810 MachineFunction &MF = DAG.getMachineFunction();
7811
7812 // Get the symbol that defines the frame offset.
7813 auto *Fn = cast<Function>(I.getArgOperand(0)->stripPointerCasts());
7814 auto *Idx = cast<ConstantInt>(I.getArgOperand(2));
7815 unsigned IdxVal =
7816 unsigned(Idx->getLimitedValue(std::numeric_limits<int>::max()));
7817 MCSymbol *FrameAllocSym = MF.getContext().getOrCreateFrameAllocSymbol(
7819
7820 Value *FP = I.getArgOperand(1);
7821 SDValue FPVal = getValue(FP);
7822 EVT PtrVT = FPVal.getValueType();
7823
7824 // Create a MCSymbol for the label to avoid any target lowering
7825 // that would make this PC relative.
7826 SDValue OffsetSym = DAG.getMCSymbol(FrameAllocSym, PtrVT);
7827 SDValue OffsetVal =
7828 DAG.getNode(ISD::LOCAL_RECOVER, sdl, PtrVT, OffsetSym);
7829
7830 // Add the offset to the FP.
7831 SDValue Add = DAG.getMemBasePlusOffset(FPVal, OffsetVal, sdl);
7832 setValue(&I, Add);
7833
7834 return;
7835 }
7836
7837 case Intrinsic::fake_use: {
7838 Value *V = I.getArgOperand(0);
7839 SDValue Ops[2];
7840 // For Values not declared or previously used in this basic block, the
7841 // NodeMap will not have an entry, and `getValue` will assert if V has no
7842 // valid register value.
7843 auto FakeUseValue = [&]() -> SDValue {
7844 SDValue &N = NodeMap[V];
7845 if (N.getNode())
7846 return N;
7847
7848 // If there's a virtual register allocated and initialized for this
7849 // value, use it.
7850 if (SDValue copyFromReg = getCopyFromRegs(V, V->getType()))
7851 return copyFromReg;
7852 // FIXME: Do we want to preserve constants? It seems pointless.
7853 if (isa<Constant>(V))
7854 return getValue(V);
7855 return SDValue();
7856 }();
7857 if (!FakeUseValue || FakeUseValue.isUndef())
7858 return;
7859 Ops[0] = getRoot();
7860 Ops[1] = FakeUseValue;
7861 // Also, do not translate a fake use with an undef operand, or any other
7862 // empty SDValues.
7863 if (!Ops[1] || Ops[1].isUndef())
7864 return;
7865 DAG.setRoot(DAG.getNode(ISD::FAKE_USE, sdl, MVT::Other, Ops));
7866 return;
7867 }
7868
7869 case Intrinsic::reloc_none: {
7870 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(0))->getMetadata();
7871 StringRef SymbolName = cast<MDString>(MD)->getString();
7872 SDValue Ops[2] = {
7873 getRoot(),
7874 DAG.getTargetExternalSymbol(
7875 SymbolName.data(), TLI.getProgramPointerTy(DAG.getDataLayout()))};
7876 DAG.setRoot(DAG.getNode(ISD::RELOC_NONE, sdl, MVT::Other, Ops));
7877 return;
7878 }
7879
7880 case Intrinsic::eh_exceptionpointer:
7881 case Intrinsic::eh_exceptioncode: {
7882 // Get the exception pointer vreg, copy from it, and resize it to fit.
7883 const auto *CPI = cast<CatchPadInst>(I.getArgOperand(0));
7884 MVT PtrVT = TLI.getPointerTy(DAG.getDataLayout());
7885 const TargetRegisterClass *PtrRC = TLI.getRegClassFor(PtrVT);
7886 Register VReg = FuncInfo.getCatchPadExceptionPointerVReg(CPI, PtrRC);
7887 SDValue N = DAG.getCopyFromReg(DAG.getEntryNode(), sdl, VReg, PtrVT);
7888 if (Intrinsic == Intrinsic::eh_exceptioncode)
7889 N = DAG.getZExtOrTrunc(N, sdl, MVT::i32);
7890 setValue(&I, N);
7891 return;
7892 }
7893 case Intrinsic::xray_customevent: {
7894 // Here we want to make sure that the intrinsic behaves as if it has a
7895 // specific calling convention.
7896 const auto &Triple = DAG.getTarget().getTargetTriple();
7897 if (!Triple.isAArch64(64) && Triple.getArch() != Triple::x86_64)
7898 return;
7899
7901
7902 // We want to say that we always want the arguments in registers.
7903 SDValue LogEntryVal = getValue(I.getArgOperand(0));
7904 SDValue StrSizeVal = getValue(I.getArgOperand(1));
7905 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
7906 SDValue Chain = getRoot();
7907 Ops.push_back(LogEntryVal);
7908 Ops.push_back(StrSizeVal);
7909 Ops.push_back(Chain);
7910
7911 // We need to enforce the calling convention for the callsite, so that
7912 // argument ordering is enforced correctly, and that register allocation can
7913 // see that some registers may be assumed clobbered and have to preserve
7914 // them across calls to the intrinsic.
7915 MachineSDNode *MN = DAG.getMachineNode(TargetOpcode::PATCHABLE_EVENT_CALL,
7916 sdl, NodeTys, Ops);
7917 SDValue patchableNode = SDValue(MN, 0);
7918 DAG.setRoot(patchableNode);
7919 setValue(&I, patchableNode);
7920 return;
7921 }
7922 case Intrinsic::xray_typedevent: {
7923 // Here we want to make sure that the intrinsic behaves as if it has a
7924 // specific calling convention.
7925 const auto &Triple = DAG.getTarget().getTargetTriple();
7926 if (!Triple.isAArch64(64) && Triple.getArch() != Triple::x86_64)
7927 return;
7928
7930
7931 // We want to say that we always want the arguments in registers.
7932 // It's unclear to me how manipulating the selection DAG here forces callers
7933 // to provide arguments in registers instead of on the stack.
7934 SDValue LogTypeId = getValue(I.getArgOperand(0));
7935 SDValue LogEntryVal = getValue(I.getArgOperand(1));
7936 SDValue StrSizeVal = getValue(I.getArgOperand(2));
7937 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
7938 SDValue Chain = getRoot();
7939 Ops.push_back(LogTypeId);
7940 Ops.push_back(LogEntryVal);
7941 Ops.push_back(StrSizeVal);
7942 Ops.push_back(Chain);
7943
7944 // We need to enforce the calling convention for the callsite, so that
7945 // argument ordering is enforced correctly, and that register allocation can
7946 // see that some registers may be assumed clobbered and have to preserve
7947 // them across calls to the intrinsic.
7948 MachineSDNode *MN = DAG.getMachineNode(
7949 TargetOpcode::PATCHABLE_TYPED_EVENT_CALL, sdl, NodeTys, Ops);
7950 SDValue patchableNode = SDValue(MN, 0);
7951 DAG.setRoot(patchableNode);
7952 setValue(&I, patchableNode);
7953 return;
7954 }
7955 case Intrinsic::experimental_deoptimize:
7957 return;
7958 case Intrinsic::stepvector:
7959 visitStepVector(I);
7960 return;
7961 case Intrinsic::vector_reduce_fadd:
7962 case Intrinsic::vector_reduce_fmul:
7963 case Intrinsic::vector_reduce_add:
7964 case Intrinsic::vector_reduce_mul:
7965 case Intrinsic::vector_reduce_and:
7966 case Intrinsic::vector_reduce_or:
7967 case Intrinsic::vector_reduce_xor:
7968 case Intrinsic::vector_reduce_smax:
7969 case Intrinsic::vector_reduce_smin:
7970 case Intrinsic::vector_reduce_umax:
7971 case Intrinsic::vector_reduce_umin:
7972 case Intrinsic::vector_reduce_fmax:
7973 case Intrinsic::vector_reduce_fmin:
7974 case Intrinsic::vector_reduce_fmaximum:
7975 case Intrinsic::vector_reduce_fminimum:
7976 visitVectorReduce(I, Intrinsic);
7977 return;
7978
7979 case Intrinsic::icall_branch_funnel: {
7981 Ops.push_back(getValue(I.getArgOperand(0)));
7982
7983 int64_t Offset;
7985 I.getArgOperand(1), Offset, DAG.getDataLayout()));
7986 if (!Base)
7988 "llvm.icall.branch.funnel operand must be a GlobalValue");
7989 Ops.push_back(DAG.getTargetGlobalAddress(Base, sdl, MVT::i64, 0));
7990
7991 struct BranchFunnelTarget {
7992 int64_t Offset;
7994 };
7996
7997 for (unsigned Op = 1, N = I.arg_size(); Op != N; Op += 2) {
7999 I.getArgOperand(Op), Offset, DAG.getDataLayout()));
8000 if (ElemBase != Base)
8001 report_fatal_error("all llvm.icall.branch.funnel operands must refer "
8002 "to the same GlobalValue");
8003
8004 SDValue Val = getValue(I.getArgOperand(Op + 1));
8005 auto *GA = dyn_cast<GlobalAddressSDNode>(Val);
8006 if (!GA)
8008 "llvm.icall.branch.funnel operand must be a GlobalValue");
8009 Targets.push_back({Offset, DAG.getTargetGlobalAddress(
8010 GA->getGlobal(), sdl, Val.getValueType(),
8011 GA->getOffset())});
8012 }
8013 llvm::sort(Targets,
8014 [](const BranchFunnelTarget &T1, const BranchFunnelTarget &T2) {
8015 return T1.Offset < T2.Offset;
8016 });
8017
8018 for (auto &T : Targets) {
8019 Ops.push_back(DAG.getTargetConstant(T.Offset, sdl, MVT::i32));
8020 Ops.push_back(T.Target);
8021 }
8022
8023 Ops.push_back(DAG.getRoot()); // Chain
8024 SDValue N(DAG.getMachineNode(TargetOpcode::ICALL_BRANCH_FUNNEL, sdl,
8025 MVT::Other, Ops),
8026 0);
8027 DAG.setRoot(N);
8028 setValue(&I, N);
8029 HasTailCall = true;
8030 return;
8031 }
8032
8033 case Intrinsic::wasm_landingpad_index:
8034 // Information this intrinsic contained has been transferred to
8035 // MachineFunction in SelectionDAGISel::PrepareEHLandingPad. We can safely
8036 // delete it now.
8037 return;
8038
8039 case Intrinsic::aarch64_settag:
8040 case Intrinsic::aarch64_settag_zero: {
8041 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
8042 bool ZeroMemory = Intrinsic == Intrinsic::aarch64_settag_zero;
8044 DAG, sdl, getRoot(), getValue(I.getArgOperand(0)),
8045 getValue(I.getArgOperand(1)), MachinePointerInfo(I.getArgOperand(0)),
8046 ZeroMemory);
8047 DAG.setRoot(Val);
8048 setValue(&I, Val);
8049 return;
8050 }
8051 case Intrinsic::amdgcn_cs_chain: {
8052 // At this point we don't care if it's amdgpu_cs_chain or
8053 // amdgpu_cs_chain_preserve.
8055
8056 Type *RetTy = I.getType();
8057 assert(RetTy->isVoidTy() && "Should not return");
8058
8059 SDValue Callee = getValue(I.getOperand(0));
8060
8061 // We only have 2 actual args: one for the SGPRs and one for the VGPRs.
8062 // We'll also tack the value of the EXEC mask at the end.
8064 Args.reserve(3);
8065
8066 for (unsigned Idx : {2, 3, 1}) {
8067 TargetLowering::ArgListEntry Arg(getValue(I.getOperand(Idx)),
8068 I.getOperand(Idx)->getType());
8069 Arg.setAttributes(&I, Idx);
8070 Args.push_back(Arg);
8071 }
8072
8073 assert(Args[0].IsInReg && "SGPR args should be marked inreg");
8074 assert(!Args[1].IsInReg && "VGPR args should not be marked inreg");
8075 Args[2].IsInReg = true; // EXEC should be inreg
8076
8077 // Forward the flags and any additional arguments.
8078 for (unsigned Idx = 4; Idx < I.arg_size(); ++Idx) {
8079 TargetLowering::ArgListEntry Arg(getValue(I.getOperand(Idx)),
8080 I.getOperand(Idx)->getType());
8081 Arg.setAttributes(&I, Idx);
8082 Args.push_back(Arg);
8083 }
8084
8085 TargetLowering::CallLoweringInfo CLI(DAG);
8086 CLI.setDebugLoc(getCurSDLoc())
8087 .setChain(getRoot())
8088 .setCallee(CC, RetTy, Callee, std::move(Args))
8089 .setNoReturn(true)
8090 .setTailCall(true)
8091 .setConvergent(I.isConvergent());
8092 CLI.CB = &I;
8093 std::pair<SDValue, SDValue> Result =
8094 lowerInvokable(CLI, /*EHPadBB*/ nullptr);
8095 (void)Result;
8096 assert(!Result.first.getNode() && !Result.second.getNode() &&
8097 "Should've lowered as tail call");
8098
8099 HasTailCall = true;
8100 return;
8101 }
8102 case Intrinsic::amdgcn_call_whole_wave: {
8104 bool isTailCall = I.isTailCall();
8105
8106 // The first argument is the callee. Skip it when assembling the call args.
8107 for (unsigned Idx = 1; Idx < I.arg_size(); ++Idx) {
8108 TargetLowering::ArgListEntry Arg(getValue(I.getArgOperand(Idx)),
8109 I.getArgOperand(Idx)->getType());
8110 Arg.setAttributes(&I, Idx);
8111
8112 // If we have an explicit sret argument that is an Instruction, (i.e., it
8113 // might point to function-local memory), we can't meaningfully tail-call.
8114 if (Arg.IsSRet && isa<Instruction>(I.getArgOperand(Idx)))
8115 isTailCall = false;
8116
8117 Args.push_back(Arg);
8118 }
8119
8120 SDValue ConvControlToken;
8121 if (auto Bundle = I.getOperandBundle(LLVMContext::OB_convergencectrl)) {
8122 auto *Token = Bundle->Inputs[0].get();
8123 ConvControlToken = getValue(Token);
8124 }
8125
8126 TargetLowering::CallLoweringInfo CLI(DAG);
8127 CLI.setDebugLoc(getCurSDLoc())
8128 .setChain(getRoot())
8129 .setCallee(CallingConv::AMDGPU_Gfx_WholeWave, I.getType(),
8130 getValue(I.getArgOperand(0)), std::move(Args))
8131 .setTailCall(isTailCall && canTailCall(I))
8132 .setIsPreallocated(
8133 I.countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0)
8134 .setConvergent(I.isConvergent())
8135 .setConvergenceControlToken(ConvControlToken);
8136 CLI.CB = &I;
8137
8138 std::pair<SDValue, SDValue> Result =
8139 lowerInvokable(CLI, /*EHPadBB=*/nullptr);
8140
8141 if (Result.first.getNode())
8142 setValue(&I, Result.first);
8143 return;
8144 }
8145 case Intrinsic::ptrmask: {
8146 SDValue Ptr = getValue(I.getOperand(0));
8147 SDValue Mask = getValue(I.getOperand(1));
8148
8149 // On arm64_32, pointers are 32 bits when stored in memory, but
8150 // zero-extended to 64 bits when in registers. Thus the mask is 32 bits to
8151 // match the index type, but the pointer is 64 bits, so the mask must be
8152 // zero-extended up to 64 bits to match the pointer.
8153 EVT PtrVT =
8154 TLI.getValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
8155 EVT MemVT =
8156 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
8157 assert(PtrVT == Ptr.getValueType());
8158 if (Mask.getValueType().getFixedSizeInBits() < MemVT.getFixedSizeInBits()) {
8159 // For AMDGPU buffer descriptors the mask is 48 bits, but the pointer is
8160 // 128-bit, so we have to pad the mask with ones for unused bits.
8161 auto HighOnes = DAG.getNode(
8162 ISD::SHL, sdl, PtrVT, DAG.getAllOnesConstant(sdl, PtrVT),
8163 DAG.getShiftAmountConstant(Mask.getValueType().getFixedSizeInBits(),
8164 PtrVT, sdl));
8165 Mask = DAG.getNode(ISD::OR, sdl, PtrVT,
8166 DAG.getZExtOrTrunc(Mask, sdl, PtrVT), HighOnes);
8167 } else if (Mask.getValueType() != PtrVT)
8168 Mask = DAG.getPtrExtOrTrunc(Mask, sdl, PtrVT);
8169
8170 assert(Mask.getValueType() == PtrVT);
8171 setValue(&I, DAG.getNode(ISD::AND, sdl, PtrVT, Ptr, Mask));
8172 return;
8173 }
8174 case Intrinsic::threadlocal_address: {
8175 setValue(&I, getValue(I.getOperand(0)));
8176 return;
8177 }
8178 case Intrinsic::get_active_lane_mask: {
8179 EVT CCVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8180 SDValue Index = getValue(I.getOperand(0));
8181 SDValue TripCount = getValue(I.getOperand(1));
8182 EVT ElementVT = Index.getValueType();
8183
8184 if (!TLI.shouldExpandGetActiveLaneMask(CCVT, ElementVT)) {
8185 setValue(&I, DAG.getNode(ISD::GET_ACTIVE_LANE_MASK, sdl, CCVT, Index,
8186 TripCount));
8187 return;
8188 }
8189
8190 EVT VecTy = EVT::getVectorVT(*DAG.getContext(), ElementVT,
8191 CCVT.getVectorElementCount());
8192
8193 SDValue VectorIndex = DAG.getSplat(VecTy, sdl, Index);
8194 SDValue VectorTripCount = DAG.getSplat(VecTy, sdl, TripCount);
8195 SDValue VectorStep = DAG.getStepVector(sdl, VecTy);
8196 SDValue VectorInduction = DAG.getNode(
8197 ISD::UADDSAT, sdl, VecTy, VectorIndex, VectorStep);
8198 SDValue SetCC = DAG.getSetCC(sdl, CCVT, VectorInduction,
8199 VectorTripCount, ISD::CondCode::SETULT);
8200 setValue(&I, SetCC);
8201 return;
8202 }
8203 case Intrinsic::experimental_get_vector_length: {
8204 assert(cast<ConstantInt>(I.getOperand(1))->getSExtValue() > 0 &&
8205 "Expected positive VF");
8206 unsigned VF = cast<ConstantInt>(I.getOperand(1))->getZExtValue();
8207 bool IsScalable = cast<ConstantInt>(I.getOperand(2))->isOne();
8208
8209 SDValue Count = getValue(I.getOperand(0));
8210 EVT CountVT = Count.getValueType();
8211
8212 if (!TLI.shouldExpandGetVectorLength(CountVT, VF, IsScalable)) {
8213 visitTargetIntrinsic(I, Intrinsic);
8214 return;
8215 }
8216
8217 // Expand to a umin between the trip count and the maximum elements the type
8218 // can hold.
8219 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8220
8221 // Extend the trip count to at least the result VT.
8222 if (CountVT.bitsLT(VT)) {
8223 Count = DAG.getNode(ISD::ZERO_EXTEND, sdl, VT, Count);
8224 CountVT = VT;
8225 }
8226
8227 SDValue MaxEVL = DAG.getElementCount(sdl, CountVT,
8228 ElementCount::get(VF, IsScalable));
8229
8230 SDValue UMin = DAG.getNode(ISD::UMIN, sdl, CountVT, Count, MaxEVL);
8231 // Clip to the result type if needed.
8232 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, sdl, VT, UMin);
8233
8234 setValue(&I, Trunc);
8235 return;
8236 }
8237 case Intrinsic::vector_partial_reduce_add: {
8238 SDValue Acc = getValue(I.getOperand(0));
8239 SDValue Input = getValue(I.getOperand(1));
8240 setValue(&I,
8241 DAG.getNode(ISD::PARTIAL_REDUCE_UMLA, sdl, Acc.getValueType(), Acc,
8242 Input, DAG.getConstant(1, sdl, Input.getValueType())));
8243 return;
8244 }
8245 case Intrinsic::vector_partial_reduce_fadd: {
8246 SDValue Acc = getValue(I.getOperand(0));
8247 SDValue Input = getValue(I.getOperand(1));
8248 setValue(&I, DAG.getNode(
8249 ISD::PARTIAL_REDUCE_FMLA, sdl, Acc.getValueType(), Acc,
8250 Input, DAG.getConstantFP(1.0, sdl, Input.getValueType())));
8251 return;
8252 }
8253 case Intrinsic::experimental_cttz_elts: {
8254 auto DL = getCurSDLoc();
8255 SDValue Op = getValue(I.getOperand(0));
8256 EVT OpVT = Op.getValueType();
8257
8258 if (!TLI.shouldExpandCttzElements(OpVT)) {
8259 visitTargetIntrinsic(I, Intrinsic);
8260 return;
8261 }
8262
8263 if (OpVT.getScalarType() != MVT::i1) {
8264 // Compare the input vector elements to zero & use to count trailing zeros
8265 SDValue AllZero = DAG.getConstant(0, DL, OpVT);
8266 OpVT = EVT::getVectorVT(*DAG.getContext(), MVT::i1,
8267 OpVT.getVectorElementCount());
8268 Op = DAG.getSetCC(DL, OpVT, Op, AllZero, ISD::SETNE);
8269 }
8270
8271 // If the zero-is-poison flag is set, we can assume the upper limit
8272 // of the result is VF-1.
8273 bool ZeroIsPoison =
8274 !cast<ConstantSDNode>(getValue(I.getOperand(1)))->isZero();
8275 ConstantRange VScaleRange(1, true); // Dummy value.
8276 if (isa<ScalableVectorType>(I.getOperand(0)->getType()))
8277 VScaleRange = getVScaleRange(I.getCaller(), 64);
8278 unsigned EltWidth = TLI.getBitWidthForCttzElements(
8279 I.getType(), OpVT.getVectorElementCount(), ZeroIsPoison, &VScaleRange);
8280
8281 MVT NewEltTy = MVT::getIntegerVT(EltWidth);
8282
8283 // Create the new vector type & get the vector length
8284 EVT NewVT = EVT::getVectorVT(*DAG.getContext(), NewEltTy,
8285 OpVT.getVectorElementCount());
8286
8287 SDValue VL =
8288 DAG.getElementCount(DL, NewEltTy, OpVT.getVectorElementCount());
8289
8290 SDValue StepVec = DAG.getStepVector(DL, NewVT);
8291 SDValue SplatVL = DAG.getSplat(NewVT, DL, VL);
8292 SDValue StepVL = DAG.getNode(ISD::SUB, DL, NewVT, SplatVL, StepVec);
8293 SDValue Ext = DAG.getNode(ISD::SIGN_EXTEND, DL, NewVT, Op);
8294 SDValue And = DAG.getNode(ISD::AND, DL, NewVT, StepVL, Ext);
8295 SDValue Max = DAG.getNode(ISD::VECREDUCE_UMAX, DL, NewEltTy, And);
8296 SDValue Sub = DAG.getNode(ISD::SUB, DL, NewEltTy, VL, Max);
8297
8298 EVT RetTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
8299 SDValue Ret = DAG.getZExtOrTrunc(Sub, DL, RetTy);
8300
8301 setValue(&I, Ret);
8302 return;
8303 }
8304 case Intrinsic::vector_insert: {
8305 SDValue Vec = getValue(I.getOperand(0));
8306 SDValue SubVec = getValue(I.getOperand(1));
8307 SDValue Index = getValue(I.getOperand(2));
8308
8309 // The intrinsic's index type is i64, but the SDNode requires an index type
8310 // suitable for the target. Convert the index as required.
8311 MVT VectorIdxTy = TLI.getVectorIdxTy(DAG.getDataLayout());
8312 if (Index.getValueType() != VectorIdxTy)
8313 Index = DAG.getVectorIdxConstant(Index->getAsZExtVal(), sdl);
8314
8315 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8316 setValue(&I, DAG.getNode(ISD::INSERT_SUBVECTOR, sdl, ResultVT, Vec, SubVec,
8317 Index));
8318 return;
8319 }
8320 case Intrinsic::vector_extract: {
8321 SDValue Vec = getValue(I.getOperand(0));
8322 SDValue Index = getValue(I.getOperand(1));
8323 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8324
8325 // The intrinsic's index type is i64, but the SDNode requires an index type
8326 // suitable for the target. Convert the index as required.
8327 MVT VectorIdxTy = TLI.getVectorIdxTy(DAG.getDataLayout());
8328 if (Index.getValueType() != VectorIdxTy)
8329 Index = DAG.getVectorIdxConstant(Index->getAsZExtVal(), sdl);
8330
8331 setValue(&I,
8332 DAG.getNode(ISD::EXTRACT_SUBVECTOR, sdl, ResultVT, Vec, Index));
8333 return;
8334 }
8335 case Intrinsic::experimental_vector_match: {
8336 SDValue Op1 = getValue(I.getOperand(0));
8337 SDValue Op2 = getValue(I.getOperand(1));
8338 SDValue Mask = getValue(I.getOperand(2));
8339 EVT Op1VT = Op1.getValueType();
8340 EVT Op2VT = Op2.getValueType();
8341 EVT ResVT = Mask.getValueType();
8342 unsigned SearchSize = Op2VT.getVectorNumElements();
8343
8344 // If the target has native support for this vector match operation, lower
8345 // the intrinsic untouched; otherwise, expand it below.
8346 if (!TLI.shouldExpandVectorMatch(Op1VT, SearchSize)) {
8347 visitTargetIntrinsic(I, Intrinsic);
8348 return;
8349 }
8350
8351 SDValue Ret = DAG.getConstant(0, sdl, ResVT);
8352
8353 for (unsigned i = 0; i < SearchSize; ++i) {
8354 SDValue Op2Elem = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, sdl,
8355 Op2VT.getVectorElementType(), Op2,
8356 DAG.getVectorIdxConstant(i, sdl));
8357 SDValue Splat = DAG.getNode(ISD::SPLAT_VECTOR, sdl, Op1VT, Op2Elem);
8358 SDValue Cmp = DAG.getSetCC(sdl, ResVT, Op1, Splat, ISD::SETEQ);
8359 Ret = DAG.getNode(ISD::OR, sdl, ResVT, Ret, Cmp);
8360 }
8361
8362 setValue(&I, DAG.getNode(ISD::AND, sdl, ResVT, Ret, Mask));
8363 return;
8364 }
8365 case Intrinsic::vector_reverse:
8366 visitVectorReverse(I);
8367 return;
8368 case Intrinsic::vector_splice:
8369 visitVectorSplice(I);
8370 return;
8371 case Intrinsic::callbr_landingpad:
8372 visitCallBrLandingPad(I);
8373 return;
8374 case Intrinsic::vector_interleave2:
8375 visitVectorInterleave(I, 2);
8376 return;
8377 case Intrinsic::vector_interleave3:
8378 visitVectorInterleave(I, 3);
8379 return;
8380 case Intrinsic::vector_interleave4:
8381 visitVectorInterleave(I, 4);
8382 return;
8383 case Intrinsic::vector_interleave5:
8384 visitVectorInterleave(I, 5);
8385 return;
8386 case Intrinsic::vector_interleave6:
8387 visitVectorInterleave(I, 6);
8388 return;
8389 case Intrinsic::vector_interleave7:
8390 visitVectorInterleave(I, 7);
8391 return;
8392 case Intrinsic::vector_interleave8:
8393 visitVectorInterleave(I, 8);
8394 return;
8395 case Intrinsic::vector_deinterleave2:
8396 visitVectorDeinterleave(I, 2);
8397 return;
8398 case Intrinsic::vector_deinterleave3:
8399 visitVectorDeinterleave(I, 3);
8400 return;
8401 case Intrinsic::vector_deinterleave4:
8402 visitVectorDeinterleave(I, 4);
8403 return;
8404 case Intrinsic::vector_deinterleave5:
8405 visitVectorDeinterleave(I, 5);
8406 return;
8407 case Intrinsic::vector_deinterleave6:
8408 visitVectorDeinterleave(I, 6);
8409 return;
8410 case Intrinsic::vector_deinterleave7:
8411 visitVectorDeinterleave(I, 7);
8412 return;
8413 case Intrinsic::vector_deinterleave8:
8414 visitVectorDeinterleave(I, 8);
8415 return;
8416 case Intrinsic::experimental_vector_compress:
8417 setValue(&I, DAG.getNode(ISD::VECTOR_COMPRESS, sdl,
8418 getValue(I.getArgOperand(0)).getValueType(),
8419 getValue(I.getArgOperand(0)),
8420 getValue(I.getArgOperand(1)),
8421 getValue(I.getArgOperand(2)), Flags));
8422 return;
8423 case Intrinsic::experimental_convergence_anchor:
8424 case Intrinsic::experimental_convergence_entry:
8425 case Intrinsic::experimental_convergence_loop:
8426 visitConvergenceControl(I, Intrinsic);
8427 return;
8428 case Intrinsic::experimental_vector_histogram_add: {
8429 visitVectorHistogram(I, Intrinsic);
8430 return;
8431 }
8432 case Intrinsic::experimental_vector_extract_last_active: {
8433 visitVectorExtractLastActive(I, Intrinsic);
8434 return;
8435 }
8436 case Intrinsic::loop_dependence_war_mask:
8437 setValue(&I,
8439 EVT::getEVT(I.getType()), getValue(I.getOperand(0)),
8440 getValue(I.getOperand(1)), getValue(I.getOperand(2)),
8441 DAG.getConstant(0, sdl, MVT::i64)));
8442 return;
8443 case Intrinsic::loop_dependence_raw_mask:
8444 setValue(&I,
8446 EVT::getEVT(I.getType()), getValue(I.getOperand(0)),
8447 getValue(I.getOperand(1)), getValue(I.getOperand(2)),
8448 DAG.getConstant(0, sdl, MVT::i64)));
8449 return;
8450 }
8451}
8452
8453void SelectionDAGBuilder::pushFPOpOutChain(SDValue Result,
8455 assert(Result.getNode()->getNumValues() == 2);
8456 SDValue OutChain = Result.getValue(1);
8457 assert(OutChain.getValueType() == MVT::Other);
8458
8459 // Instead of updating the root immediately, push the produced chain to the
8460 // appropriate list, deferring the update until the root is requested. In this
8461 // case, the nodes from the lists are chained using TokenFactor, indicating
8462 // that the operations are independent.
8463 //
8464 // In particular, the root is updated before any call that might access the
8465 // floating-point environment, except for constrained intrinsics.
8466 switch (EB) {
8469 PendingConstrainedFP.push_back(OutChain);
8470 break;
8472 PendingConstrainedFPStrict.push_back(OutChain);
8473 break;
8474 }
8475}
8476
8477void SelectionDAGBuilder::visitConstrainedFPIntrinsic(
8478 const ConstrainedFPIntrinsic &FPI) {
8479 SDLoc sdl = getCurSDLoc();
8480
8481 // We do not need to serialize constrained FP intrinsics against
8482 // each other or against (nonvolatile) loads, so they can be
8483 // chained like loads.
8485 SDValue Chain = getFPOperationRoot(EB);
8487 Opers.push_back(Chain);
8488 for (unsigned I = 0, E = FPI.getNonMetadataArgCount(); I != E; ++I)
8489 Opers.push_back(getValue(FPI.getArgOperand(I)));
8490
8491 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8492 EVT VT = TLI.getValueType(DAG.getDataLayout(), FPI.getType());
8493 SDVTList VTs = DAG.getVTList(VT, MVT::Other);
8494
8495 SDNodeFlags Flags;
8497 Flags.setNoFPExcept(true);
8498
8499 if (auto *FPOp = dyn_cast<FPMathOperator>(&FPI))
8500 Flags.copyFMF(*FPOp);
8501
8502 unsigned Opcode;
8503 switch (FPI.getIntrinsicID()) {
8504 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
8505#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
8506 case Intrinsic::INTRINSIC: \
8507 Opcode = ISD::STRICT_##DAGN; \
8508 break;
8509#include "llvm/IR/ConstrainedOps.def"
8510 case Intrinsic::experimental_constrained_fmuladd: {
8511 Opcode = ISD::STRICT_FMA;
8512 // Break fmuladd into fmul and fadd.
8513 if (TM.Options.AllowFPOpFusion == FPOpFusion::Strict ||
8514 !TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), VT)) {
8515 Opers.pop_back();
8516 SDValue Mul = DAG.getNode(ISD::STRICT_FMUL, sdl, VTs, Opers, Flags);
8517 pushFPOpOutChain(Mul, EB);
8518 Opcode = ISD::STRICT_FADD;
8519 Opers.clear();
8520 Opers.push_back(Mul.getValue(1));
8521 Opers.push_back(Mul.getValue(0));
8522 Opers.push_back(getValue(FPI.getArgOperand(2)));
8523 }
8524 break;
8525 }
8526 }
8527
8528 // A few strict DAG nodes carry additional operands that are not
8529 // set up by the default code above.
8530 switch (Opcode) {
8531 default: break;
8533 Opers.push_back(
8534 DAG.getTargetConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout())));
8535 break;
8536 case ISD::STRICT_FSETCC:
8537 case ISD::STRICT_FSETCCS: {
8538 auto *FPCmp = dyn_cast<ConstrainedFPCmpIntrinsic>(&FPI);
8539 ISD::CondCode Condition = getFCmpCondCode(FPCmp->getPredicate());
8540 if (TM.Options.NoNaNsFPMath)
8541 Condition = getFCmpCodeWithoutNaN(Condition);
8542 Opers.push_back(DAG.getCondCode(Condition));
8543 break;
8544 }
8545 }
8546
8547 SDValue Result = DAG.getNode(Opcode, sdl, VTs, Opers, Flags);
8548 pushFPOpOutChain(Result, EB);
8549
8550 SDValue FPResult = Result.getValue(0);
8551 setValue(&FPI, FPResult);
8552}
8553
8554static unsigned getISDForVPIntrinsic(const VPIntrinsic &VPIntrin) {
8555 std::optional<unsigned> ResOPC;
8556 switch (VPIntrin.getIntrinsicID()) {
8557 case Intrinsic::vp_ctlz: {
8558 bool IsZeroUndef = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8559 ResOPC = IsZeroUndef ? ISD::VP_CTLZ_ZERO_UNDEF : ISD::VP_CTLZ;
8560 break;
8561 }
8562 case Intrinsic::vp_cttz: {
8563 bool IsZeroUndef = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8564 ResOPC = IsZeroUndef ? ISD::VP_CTTZ_ZERO_UNDEF : ISD::VP_CTTZ;
8565 break;
8566 }
8567 case Intrinsic::vp_cttz_elts: {
8568 bool IsZeroPoison = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8569 ResOPC = IsZeroPoison ? ISD::VP_CTTZ_ELTS_ZERO_UNDEF : ISD::VP_CTTZ_ELTS;
8570 break;
8571 }
8572#define HELPER_MAP_VPID_TO_VPSD(VPID, VPSD) \
8573 case Intrinsic::VPID: \
8574 ResOPC = ISD::VPSD; \
8575 break;
8576#include "llvm/IR/VPIntrinsics.def"
8577 }
8578
8579 if (!ResOPC)
8581 "Inconsistency: no SDNode available for this VPIntrinsic!");
8582
8583 if (*ResOPC == ISD::VP_REDUCE_SEQ_FADD ||
8584 *ResOPC == ISD::VP_REDUCE_SEQ_FMUL) {
8585 if (VPIntrin.getFastMathFlags().allowReassoc())
8586 return *ResOPC == ISD::VP_REDUCE_SEQ_FADD ? ISD::VP_REDUCE_FADD
8587 : ISD::VP_REDUCE_FMUL;
8588 }
8589
8590 return *ResOPC;
8591}
8592
8593void SelectionDAGBuilder::visitVPLoad(
8594 const VPIntrinsic &VPIntrin, EVT VT,
8595 const SmallVectorImpl<SDValue> &OpValues) {
8596 SDLoc DL = getCurSDLoc();
8597 Value *PtrOperand = VPIntrin.getArgOperand(0);
8598 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8599 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8600 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8601 SDValue LD;
8602 // Do not serialize variable-length loads of constant memory with
8603 // anything.
8604 if (!Alignment)
8605 Alignment = DAG.getEVTAlign(VT);
8606 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8607 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8608 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8609 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8610 MachineMemOperand::Flags MMOFlags =
8611 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8612 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8613 MachinePointerInfo(PtrOperand), MMOFlags,
8614 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo, Ranges);
8615 LD = DAG.getLoadVP(VT, DL, InChain, OpValues[0], OpValues[1], OpValues[2],
8616 MMO, false /*IsExpanding */);
8617 if (AddToChain)
8618 PendingLoads.push_back(LD.getValue(1));
8619 setValue(&VPIntrin, LD);
8620}
8621
8622void SelectionDAGBuilder::visitVPLoadFF(
8623 const VPIntrinsic &VPIntrin, EVT VT, EVT EVLVT,
8624 const SmallVectorImpl<SDValue> &OpValues) {
8625 assert(OpValues.size() == 3 && "Unexpected number of operands");
8626 SDLoc DL = getCurSDLoc();
8627 Value *PtrOperand = VPIntrin.getArgOperand(0);
8628 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8629 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8630 const MDNode *Ranges = VPIntrin.getMetadata(LLVMContext::MD_range);
8631 SDValue LD;
8632 // Do not serialize variable-length loads of constant memory with
8633 // anything.
8634 if (!Alignment)
8635 Alignment = DAG.getEVTAlign(VT);
8636 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8637 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8638 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8639 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8640 MachinePointerInfo(PtrOperand), MachineMemOperand::MOLoad,
8641 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo, Ranges);
8642 LD = DAG.getLoadFFVP(VT, DL, InChain, OpValues[0], OpValues[1], OpValues[2],
8643 MMO);
8644 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, EVLVT, LD.getValue(1));
8645 if (AddToChain)
8646 PendingLoads.push_back(LD.getValue(2));
8647 setValue(&VPIntrin, DAG.getMergeValues({LD.getValue(0), Trunc}, DL));
8648}
8649
8650void SelectionDAGBuilder::visitVPGather(
8651 const VPIntrinsic &VPIntrin, EVT VT,
8652 const SmallVectorImpl<SDValue> &OpValues) {
8653 SDLoc DL = getCurSDLoc();
8654 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8655 Value *PtrOperand = VPIntrin.getArgOperand(0);
8656 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8657 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8658 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8659 SDValue LD;
8660 if (!Alignment)
8661 Alignment = DAG.getEVTAlign(VT.getScalarType());
8662 unsigned AS =
8663 PtrOperand->getType()->getScalarType()->getPointerAddressSpace();
8664 MachineMemOperand::Flags MMOFlags =
8665 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8666 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8667 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8668 *Alignment, AAInfo, Ranges);
8669 SDValue Base, Index, Scale;
8670 bool UniformBase =
8671 getUniformBase(PtrOperand, Base, Index, Scale, this, VPIntrin.getParent(),
8672 VT.getScalarStoreSize());
8673 if (!UniformBase) {
8674 Base = DAG.getConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout()));
8675 Index = getValue(PtrOperand);
8676 Scale = DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout()));
8677 }
8678 EVT IdxVT = Index.getValueType();
8679 EVT EltTy = IdxVT.getVectorElementType();
8680 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
8681 EVT NewIdxVT = IdxVT.changeVectorElementType(EltTy);
8682 Index = DAG.getNode(ISD::SIGN_EXTEND, DL, NewIdxVT, Index);
8683 }
8684 LD = DAG.getGatherVP(
8685 DAG.getVTList(VT, MVT::Other), VT, DL,
8686 {DAG.getRoot(), Base, Index, Scale, OpValues[1], OpValues[2]}, MMO,
8688 PendingLoads.push_back(LD.getValue(1));
8689 setValue(&VPIntrin, LD);
8690}
8691
8692void SelectionDAGBuilder::visitVPStore(
8693 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8694 SDLoc DL = getCurSDLoc();
8695 Value *PtrOperand = VPIntrin.getArgOperand(1);
8696 EVT VT = OpValues[0].getValueType();
8697 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8698 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8699 SDValue ST;
8700 if (!Alignment)
8701 Alignment = DAG.getEVTAlign(VT);
8702 SDValue Ptr = OpValues[1];
8703 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
8704 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8705 MachineMemOperand::Flags MMOFlags =
8706 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8707 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8708 MachinePointerInfo(PtrOperand), MMOFlags,
8709 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo);
8710 ST = DAG.getStoreVP(getMemoryRoot(), DL, OpValues[0], Ptr, Offset,
8711 OpValues[2], OpValues[3], VT, MMO, ISD::UNINDEXED,
8712 /* IsTruncating */ false, /*IsCompressing*/ false);
8713 DAG.setRoot(ST);
8714 setValue(&VPIntrin, ST);
8715}
8716
8717void SelectionDAGBuilder::visitVPScatter(
8718 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8719 SDLoc DL = getCurSDLoc();
8720 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8721 Value *PtrOperand = VPIntrin.getArgOperand(1);
8722 EVT VT = OpValues[0].getValueType();
8723 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8724 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8725 SDValue ST;
8726 if (!Alignment)
8727 Alignment = DAG.getEVTAlign(VT.getScalarType());
8728 unsigned AS =
8729 PtrOperand->getType()->getScalarType()->getPointerAddressSpace();
8730 MachineMemOperand::Flags MMOFlags =
8731 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8732 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8733 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8734 *Alignment, AAInfo);
8735 SDValue Base, Index, Scale;
8736 bool UniformBase =
8737 getUniformBase(PtrOperand, Base, Index, Scale, this, VPIntrin.getParent(),
8738 VT.getScalarStoreSize());
8739 if (!UniformBase) {
8740 Base = DAG.getConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout()));
8741 Index = getValue(PtrOperand);
8742 Scale = DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout()));
8743 }
8744 EVT IdxVT = Index.getValueType();
8745 EVT EltTy = IdxVT.getVectorElementType();
8746 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
8747 EVT NewIdxVT = IdxVT.changeVectorElementType(EltTy);
8748 Index = DAG.getNode(ISD::SIGN_EXTEND, DL, NewIdxVT, Index);
8749 }
8750 ST = DAG.getScatterVP(DAG.getVTList(MVT::Other), VT, DL,
8751 {getMemoryRoot(), OpValues[0], Base, Index, Scale,
8752 OpValues[2], OpValues[3]},
8753 MMO, ISD::SIGNED_SCALED);
8754 DAG.setRoot(ST);
8755 setValue(&VPIntrin, ST);
8756}
8757
8758void SelectionDAGBuilder::visitVPStridedLoad(
8759 const VPIntrinsic &VPIntrin, EVT VT,
8760 const SmallVectorImpl<SDValue> &OpValues) {
8761 SDLoc DL = getCurSDLoc();
8762 Value *PtrOperand = VPIntrin.getArgOperand(0);
8763 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8764 if (!Alignment)
8765 Alignment = DAG.getEVTAlign(VT.getScalarType());
8766 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8767 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8768 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8769 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8770 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8771 unsigned AS = PtrOperand->getType()->getPointerAddressSpace();
8772 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8773 MachineMemOperand::Flags MMOFlags =
8774 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8775 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8776 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8777 *Alignment, AAInfo, Ranges);
8778
8779 SDValue LD = DAG.getStridedLoadVP(VT, DL, InChain, OpValues[0], OpValues[1],
8780 OpValues[2], OpValues[3], MMO,
8781 false /*IsExpanding*/);
8782
8783 if (AddToChain)
8784 PendingLoads.push_back(LD.getValue(1));
8785 setValue(&VPIntrin, LD);
8786}
8787
8788void SelectionDAGBuilder::visitVPStridedStore(
8789 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8790 SDLoc DL = getCurSDLoc();
8791 Value *PtrOperand = VPIntrin.getArgOperand(1);
8792 EVT VT = OpValues[0].getValueType();
8793 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8794 if (!Alignment)
8795 Alignment = DAG.getEVTAlign(VT.getScalarType());
8796 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8797 unsigned AS = PtrOperand->getType()->getPointerAddressSpace();
8798 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8799 MachineMemOperand::Flags MMOFlags =
8800 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8801 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8802 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8803 *Alignment, AAInfo);
8804
8805 SDValue ST = DAG.getStridedStoreVP(
8806 getMemoryRoot(), DL, OpValues[0], OpValues[1],
8807 DAG.getUNDEF(OpValues[1].getValueType()), OpValues[2], OpValues[3],
8808 OpValues[4], VT, MMO, ISD::UNINDEXED, /*IsTruncating*/ false,
8809 /*IsCompressing*/ false);
8810
8811 DAG.setRoot(ST);
8812 setValue(&VPIntrin, ST);
8813}
8814
8815void SelectionDAGBuilder::visitVPCmp(const VPCmpIntrinsic &VPIntrin) {
8816 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8817 SDLoc DL = getCurSDLoc();
8818
8819 ISD::CondCode Condition;
8821 bool IsFP = VPIntrin.getOperand(0)->getType()->isFPOrFPVectorTy();
8822 if (IsFP) {
8823 // FIXME: Regular fcmps are FPMathOperators which may have fast-math (nnan)
8824 // flags, but calls that don't return floating-point types can't be
8825 // FPMathOperators, like vp.fcmp. This affects constrained fcmp too.
8826 Condition = getFCmpCondCode(CondCode);
8827 if (TM.Options.NoNaNsFPMath)
8828 Condition = getFCmpCodeWithoutNaN(Condition);
8829 } else {
8830 Condition = getICmpCondCode(CondCode);
8831 }
8832
8833 SDValue Op1 = getValue(VPIntrin.getOperand(0));
8834 SDValue Op2 = getValue(VPIntrin.getOperand(1));
8835 // #2 is the condition code
8836 SDValue MaskOp = getValue(VPIntrin.getOperand(3));
8837 SDValue EVL = getValue(VPIntrin.getOperand(4));
8838 MVT EVLParamVT = TLI.getVPExplicitVectorLengthTy();
8839 assert(EVLParamVT.isScalarInteger() && EVLParamVT.bitsGE(MVT::i32) &&
8840 "Unexpected target EVL type");
8841 EVL = DAG.getNode(ISD::ZERO_EXTEND, DL, EVLParamVT, EVL);
8842
8843 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
8844 VPIntrin.getType());
8845 setValue(&VPIntrin,
8846 DAG.getSetCCVP(DL, DestVT, Op1, Op2, Condition, MaskOp, EVL));
8847}
8848
8849void SelectionDAGBuilder::visitVectorPredicationIntrinsic(
8850 const VPIntrinsic &VPIntrin) {
8851 SDLoc DL = getCurSDLoc();
8852 unsigned Opcode = getISDForVPIntrinsic(VPIntrin);
8853
8854 auto IID = VPIntrin.getIntrinsicID();
8855
8856 if (const auto *CmpI = dyn_cast<VPCmpIntrinsic>(&VPIntrin))
8857 return visitVPCmp(*CmpI);
8858
8859 SmallVector<EVT, 4> ValueVTs;
8860 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8861 ComputeValueVTs(TLI, DAG.getDataLayout(), VPIntrin.getType(), ValueVTs);
8862 SDVTList VTs = DAG.getVTList(ValueVTs);
8863
8864 auto EVLParamPos = VPIntrinsic::getVectorLengthParamPos(IID);
8865
8866 MVT EVLParamVT = TLI.getVPExplicitVectorLengthTy();
8867 assert(EVLParamVT.isScalarInteger() && EVLParamVT.bitsGE(MVT::i32) &&
8868 "Unexpected target EVL type");
8869
8870 // Request operands.
8871 SmallVector<SDValue, 7> OpValues;
8872 for (unsigned I = 0; I < VPIntrin.arg_size(); ++I) {
8873 auto Op = getValue(VPIntrin.getArgOperand(I));
8874 if (I == EVLParamPos)
8875 Op = DAG.getNode(ISD::ZERO_EXTEND, DL, EVLParamVT, Op);
8876 OpValues.push_back(Op);
8877 }
8878
8879 switch (Opcode) {
8880 default: {
8881 SDNodeFlags SDFlags;
8882 if (auto *FPMO = dyn_cast<FPMathOperator>(&VPIntrin))
8883 SDFlags.copyFMF(*FPMO);
8884 SDValue Result = DAG.getNode(Opcode, DL, VTs, OpValues, SDFlags);
8885 setValue(&VPIntrin, Result);
8886 break;
8887 }
8888 case ISD::VP_LOAD:
8889 visitVPLoad(VPIntrin, ValueVTs[0], OpValues);
8890 break;
8891 case ISD::VP_LOAD_FF:
8892 visitVPLoadFF(VPIntrin, ValueVTs[0], ValueVTs[1], OpValues);
8893 break;
8894 case ISD::VP_GATHER:
8895 visitVPGather(VPIntrin, ValueVTs[0], OpValues);
8896 break;
8897 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
8898 visitVPStridedLoad(VPIntrin, ValueVTs[0], OpValues);
8899 break;
8900 case ISD::VP_STORE:
8901 visitVPStore(VPIntrin, OpValues);
8902 break;
8903 case ISD::VP_SCATTER:
8904 visitVPScatter(VPIntrin, OpValues);
8905 break;
8906 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
8907 visitVPStridedStore(VPIntrin, OpValues);
8908 break;
8909 case ISD::VP_FMULADD: {
8910 assert(OpValues.size() == 5 && "Unexpected number of operands");
8911 SDNodeFlags SDFlags;
8912 if (auto *FPMO = dyn_cast<FPMathOperator>(&VPIntrin))
8913 SDFlags.copyFMF(*FPMO);
8914 if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
8915 TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), ValueVTs[0])) {
8916 setValue(&VPIntrin, DAG.getNode(ISD::VP_FMA, DL, VTs, OpValues, SDFlags));
8917 } else {
8918 SDValue Mul = DAG.getNode(
8919 ISD::VP_FMUL, DL, VTs,
8920 {OpValues[0], OpValues[1], OpValues[3], OpValues[4]}, SDFlags);
8921 SDValue Add =
8922 DAG.getNode(ISD::VP_FADD, DL, VTs,
8923 {Mul, OpValues[2], OpValues[3], OpValues[4]}, SDFlags);
8924 setValue(&VPIntrin, Add);
8925 }
8926 break;
8927 }
8928 case ISD::VP_IS_FPCLASS: {
8929 const DataLayout DLayout = DAG.getDataLayout();
8930 EVT DestVT = TLI.getValueType(DLayout, VPIntrin.getType());
8931 auto Constant = OpValues[1]->getAsZExtVal();
8932 SDValue Check = DAG.getTargetConstant(Constant, DL, MVT::i32);
8933 SDValue V = DAG.getNode(ISD::VP_IS_FPCLASS, DL, DestVT,
8934 {OpValues[0], Check, OpValues[2], OpValues[3]});
8935 setValue(&VPIntrin, V);
8936 return;
8937 }
8938 case ISD::VP_INTTOPTR: {
8939 SDValue N = OpValues[0];
8940 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), VPIntrin.getType());
8941 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(), VPIntrin.getType());
8942 N = DAG.getVPPtrExtOrTrunc(getCurSDLoc(), DestVT, N, OpValues[1],
8943 OpValues[2]);
8944 N = DAG.getVPZExtOrTrunc(getCurSDLoc(), PtrMemVT, N, OpValues[1],
8945 OpValues[2]);
8946 setValue(&VPIntrin, N);
8947 break;
8948 }
8949 case ISD::VP_PTRTOINT: {
8950 SDValue N = OpValues[0];
8951 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
8952 VPIntrin.getType());
8953 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(),
8954 VPIntrin.getOperand(0)->getType());
8955 N = DAG.getVPPtrExtOrTrunc(getCurSDLoc(), PtrMemVT, N, OpValues[1],
8956 OpValues[2]);
8957 N = DAG.getVPZExtOrTrunc(getCurSDLoc(), DestVT, N, OpValues[1],
8958 OpValues[2]);
8959 setValue(&VPIntrin, N);
8960 break;
8961 }
8962 case ISD::VP_ABS:
8963 case ISD::VP_CTLZ:
8964 case ISD::VP_CTLZ_ZERO_UNDEF:
8965 case ISD::VP_CTTZ:
8966 case ISD::VP_CTTZ_ZERO_UNDEF:
8967 case ISD::VP_CTTZ_ELTS_ZERO_UNDEF:
8968 case ISD::VP_CTTZ_ELTS: {
8969 SDValue Result =
8970 DAG.getNode(Opcode, DL, VTs, {OpValues[0], OpValues[2], OpValues[3]});
8971 setValue(&VPIntrin, Result);
8972 break;
8973 }
8974 }
8975}
8976
8977SDValue SelectionDAGBuilder::lowerStartEH(SDValue Chain,
8978 const BasicBlock *EHPadBB,
8979 MCSymbol *&BeginLabel) {
8980 MachineFunction &MF = DAG.getMachineFunction();
8981
8982 // Insert a label before the invoke call to mark the try range. This can be
8983 // used to detect deletion of the invoke via the MachineModuleInfo.
8984 BeginLabel = MF.getContext().createTempSymbol();
8985
8986 // For SjLj, keep track of which landing pads go with which invokes
8987 // so as to maintain the ordering of pads in the LSDA.
8988 unsigned CallSiteIndex = FuncInfo.getCurrentCallSite();
8989 if (CallSiteIndex) {
8990 MF.setCallSiteBeginLabel(BeginLabel, CallSiteIndex);
8991 LPadToCallSiteMap[FuncInfo.getMBB(EHPadBB)].push_back(CallSiteIndex);
8992
8993 // Now that the call site is handled, stop tracking it.
8994 FuncInfo.setCurrentCallSite(0);
8995 }
8996
8997 return DAG.getEHLabel(getCurSDLoc(), Chain, BeginLabel);
8998}
8999
9000SDValue SelectionDAGBuilder::lowerEndEH(SDValue Chain, const InvokeInst *II,
9001 const BasicBlock *EHPadBB,
9002 MCSymbol *BeginLabel) {
9003 assert(BeginLabel && "BeginLabel should've been set");
9004
9005 MachineFunction &MF = DAG.getMachineFunction();
9006
9007 // Insert a label at the end of the invoke call to mark the try range. This
9008 // can be used to detect deletion of the invoke via the MachineModuleInfo.
9009 MCSymbol *EndLabel = MF.getContext().createTempSymbol();
9010 Chain = DAG.getEHLabel(getCurSDLoc(), Chain, EndLabel);
9011
9012 // Inform MachineModuleInfo of range.
9013 auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn());
9014 // There is a platform (e.g. wasm) that uses funclet style IR but does not
9015 // actually use outlined funclets and their LSDA info style.
9016 if (MF.hasEHFunclets() && isFuncletEHPersonality(Pers)) {
9017 assert(II && "II should've been set");
9018 WinEHFuncInfo *EHInfo = MF.getWinEHFuncInfo();
9019 EHInfo->addIPToStateRange(II, BeginLabel, EndLabel);
9020 } else if (!isScopedEHPersonality(Pers)) {
9021 assert(EHPadBB);
9022 MF.addInvoke(FuncInfo.getMBB(EHPadBB), BeginLabel, EndLabel);
9023 }
9024
9025 return Chain;
9026}
9027
9028std::pair<SDValue, SDValue>
9030 const BasicBlock *EHPadBB) {
9031 MCSymbol *BeginLabel = nullptr;
9032
9033 if (EHPadBB) {
9034 // Both PendingLoads and PendingExports must be flushed here;
9035 // this call might not return.
9036 (void)getRoot();
9037 DAG.setRoot(lowerStartEH(getControlRoot(), EHPadBB, BeginLabel));
9038 CLI.setChain(getRoot());
9039 }
9040
9041 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9042 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
9043
9044 assert((CLI.IsTailCall || Result.second.getNode()) &&
9045 "Non-null chain expected with non-tail call!");
9046 assert((Result.second.getNode() || !Result.first.getNode()) &&
9047 "Null value expected with tail call!");
9048
9049 if (!Result.second.getNode()) {
9050 // As a special case, a null chain means that a tail call has been emitted
9051 // and the DAG root is already updated.
9052 HasTailCall = true;
9053
9054 // Since there's no actual continuation from this block, nothing can be
9055 // relying on us setting vregs for them.
9056 PendingExports.clear();
9057 } else {
9058 DAG.setRoot(Result.second);
9059 }
9060
9061 if (EHPadBB) {
9062 DAG.setRoot(lowerEndEH(getRoot(), cast_or_null<InvokeInst>(CLI.CB), EHPadBB,
9063 BeginLabel));
9064 Result.second = getRoot();
9065 }
9066
9067 return Result;
9068}
9069
9071 bool isMustTailCall = CB.isMustTailCall();
9072
9073 // Avoid emitting tail calls in functions with the disable-tail-calls
9074 // attribute.
9075 const Function *Caller = CB.getParent()->getParent();
9076 if (!isMustTailCall &&
9077 Caller->getFnAttribute("disable-tail-calls").getValueAsBool())
9078 return false;
9079
9080 // We can't tail call inside a function with a swifterror argument. Lowering
9081 // does not support this yet. It would have to move into the swifterror
9082 // register before the call.
9083 if (DAG.getTargetLoweringInfo().supportSwiftError() &&
9084 Caller->getAttributes().hasAttrSomewhere(Attribute::SwiftError))
9085 return false;
9086
9087 // Check if target-independent constraints permit a tail call here.
9088 // Target-dependent constraints are checked within TLI->LowerCallTo.
9089 return isInTailCallPosition(CB, DAG.getTarget());
9090}
9091
9093 bool isTailCall, bool isMustTailCall,
9094 const BasicBlock *EHPadBB,
9095 const TargetLowering::PtrAuthInfo *PAI) {
9096 auto &DL = DAG.getDataLayout();
9097 FunctionType *FTy = CB.getFunctionType();
9098 Type *RetTy = CB.getType();
9099
9101 Args.reserve(CB.arg_size());
9102
9103 const Value *SwiftErrorVal = nullptr;
9104 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9105
9106 if (isTailCall)
9107 isTailCall = canTailCall(CB);
9108
9109 for (auto I = CB.arg_begin(), E = CB.arg_end(); I != E; ++I) {
9110 const Value *V = *I;
9111
9112 // Skip empty types
9113 if (V->getType()->isEmptyTy())
9114 continue;
9115
9116 SDValue ArgNode = getValue(V);
9117 TargetLowering::ArgListEntry Entry(ArgNode, V->getType());
9118 Entry.setAttributes(&CB, I - CB.arg_begin());
9119
9120 // Use swifterror virtual register as input to the call.
9121 if (Entry.IsSwiftError && TLI.supportSwiftError()) {
9122 SwiftErrorVal = V;
9123 // We find the virtual register for the actual swifterror argument.
9124 // Instead of using the Value, we use the virtual register instead.
9125 Entry.Node =
9126 DAG.getRegister(SwiftError.getOrCreateVRegUseAt(&CB, FuncInfo.MBB, V),
9127 EVT(TLI.getPointerTy(DL)));
9128 }
9129
9130 Args.push_back(Entry);
9131
9132 // If we have an explicit sret argument that is an Instruction, (i.e., it
9133 // might point to function-local memory), we can't meaningfully tail-call.
9134 if (Entry.IsSRet && isa<Instruction>(V))
9135 isTailCall = false;
9136 }
9137
9138 // If call site has a cfguardtarget operand bundle, create and add an
9139 // additional ArgListEntry.
9140 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_cfguardtarget)) {
9141 Value *V = Bundle->Inputs[0];
9143 Entry.IsCFGuardTarget = true;
9144 Args.push_back(Entry);
9145 }
9146
9147 // Disable tail calls if there is an swifterror argument. Targets have not
9148 // been updated to support tail calls.
9149 if (TLI.supportSwiftError() && SwiftErrorVal)
9150 isTailCall = false;
9151
9152 ConstantInt *CFIType = nullptr;
9153 if (CB.isIndirectCall()) {
9154 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_kcfi)) {
9155 if (!TLI.supportKCFIBundles())
9157 "Target doesn't support calls with kcfi operand bundles.");
9158 CFIType = cast<ConstantInt>(Bundle->Inputs[0]);
9159 assert(CFIType->getType()->isIntegerTy(32) && "Invalid CFI type");
9160 }
9161 }
9162
9163 SDValue ConvControlToken;
9164 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_convergencectrl)) {
9165 auto *Token = Bundle->Inputs[0].get();
9166 ConvControlToken = getValue(Token);
9167 }
9168
9169 GlobalValue *DeactivationSymbol = nullptr;
9171 DeactivationSymbol = cast<GlobalValue>(Bundle->Inputs[0].get());
9172 }
9173
9176 .setChain(getRoot())
9177 .setCallee(RetTy, FTy, Callee, std::move(Args), CB)
9178 .setTailCall(isTailCall)
9182 .setCFIType(CFIType)
9183 .setConvergenceControlToken(ConvControlToken)
9184 .setDeactivationSymbol(DeactivationSymbol);
9185
9186 // Set the pointer authentication info if we have it.
9187 if (PAI) {
9188 if (!TLI.supportPtrAuthBundles())
9190 "This target doesn't support calls with ptrauth operand bundles.");
9191 CLI.setPtrAuth(*PAI);
9192 }
9193
9194 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
9195
9196 if (Result.first.getNode()) {
9197 Result.first = lowerRangeToAssertZExt(DAG, CB, Result.first);
9198 Result.first = lowerNoFPClassToAssertNoFPClass(DAG, CB, Result.first);
9199 setValue(&CB, Result.first);
9200 }
9201
9202 // The last element of CLI.InVals has the SDValue for swifterror return.
9203 // Here we copy it to a virtual register and update SwiftErrorMap for
9204 // book-keeping.
9205 if (SwiftErrorVal && TLI.supportSwiftError()) {
9206 // Get the last element of InVals.
9207 SDValue Src = CLI.InVals.back();
9208 Register VReg =
9209 SwiftError.getOrCreateVRegDefAt(&CB, FuncInfo.MBB, SwiftErrorVal);
9210 SDValue CopyNode = CLI.DAG.getCopyToReg(Result.second, CLI.DL, VReg, Src);
9211 DAG.setRoot(CopyNode);
9212 }
9213}
9214
9215static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT,
9216 SelectionDAGBuilder &Builder) {
9217 // Check to see if this load can be trivially constant folded, e.g. if the
9218 // input is from a string literal.
9219 if (const Constant *LoadInput = dyn_cast<Constant>(PtrVal)) {
9220 // Cast pointer to the type we really want to load.
9221 Type *LoadTy =
9222 Type::getIntNTy(PtrVal->getContext(), LoadVT.getScalarSizeInBits());
9223 if (LoadVT.isVector())
9224 LoadTy = FixedVectorType::get(LoadTy, LoadVT.getVectorNumElements());
9225 if (const Constant *LoadCst =
9226 ConstantFoldLoadFromConstPtr(const_cast<Constant *>(LoadInput),
9227 LoadTy, Builder.DAG.getDataLayout()))
9228 return Builder.getValue(LoadCst);
9229 }
9230
9231 // Otherwise, we have to emit the load. If the pointer is to unfoldable but
9232 // still constant memory, the input chain can be the entry node.
9233 SDValue Root;
9234 bool ConstantMemory = false;
9235
9236 // Do not serialize (non-volatile) loads of constant memory with anything.
9237 if (Builder.BatchAA && Builder.BatchAA->pointsToConstantMemory(PtrVal)) {
9238 Root = Builder.DAG.getEntryNode();
9239 ConstantMemory = true;
9240 } else {
9241 // Do not serialize non-volatile loads against each other.
9242 Root = Builder.DAG.getRoot();
9243 }
9244
9245 SDValue Ptr = Builder.getValue(PtrVal);
9246 SDValue LoadVal =
9247 Builder.DAG.getLoad(LoadVT, Builder.getCurSDLoc(), Root, Ptr,
9248 MachinePointerInfo(PtrVal), Align(1));
9249
9250 if (!ConstantMemory)
9251 Builder.PendingLoads.push_back(LoadVal.getValue(1));
9252 return LoadVal;
9253}
9254
9255/// Record the value for an instruction that produces an integer result,
9256/// converting the type where necessary.
9257void SelectionDAGBuilder::processIntegerCallValue(const Instruction &I,
9258 SDValue Value,
9259 bool IsSigned) {
9260 EVT VT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9261 I.getType(), true);
9262 Value = DAG.getExtOrTrunc(IsSigned, Value, getCurSDLoc(), VT);
9263 setValue(&I, Value);
9264}
9265
9266/// See if we can lower a memcmp/bcmp call into an optimized form. If so, return
9267/// true and lower it. Otherwise return false, and it will be lowered like a
9268/// normal call.
9269/// The caller already checked that \p I calls the appropriate LibFunc with a
9270/// correct prototype.
9271bool SelectionDAGBuilder::visitMemCmpBCmpCall(const CallInst &I) {
9272 const Value *LHS = I.getArgOperand(0), *RHS = I.getArgOperand(1);
9273 const Value *Size = I.getArgOperand(2);
9274 const ConstantSDNode *CSize = dyn_cast<ConstantSDNode>(getValue(Size));
9275 if (CSize && CSize->getZExtValue() == 0) {
9276 EVT CallVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9277 I.getType(), true);
9278 setValue(&I, DAG.getConstant(0, getCurSDLoc(), CallVT));
9279 return true;
9280 }
9281
9282 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9283 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForMemcmp(
9284 DAG, getCurSDLoc(), DAG.getRoot(), getValue(LHS), getValue(RHS),
9285 getValue(Size), &I);
9286 if (Res.first.getNode()) {
9287 processIntegerCallValue(I, Res.first, true);
9288 PendingLoads.push_back(Res.second);
9289 return true;
9290 }
9291
9292 // memcmp(S1,S2,2) != 0 -> (*(short*)LHS != *(short*)RHS) != 0
9293 // memcmp(S1,S2,4) != 0 -> (*(int*)LHS != *(int*)RHS) != 0
9294 if (!CSize || !isOnlyUsedInZeroEqualityComparison(&I))
9295 return false;
9296
9297 // If the target has a fast compare for the given size, it will return a
9298 // preferred load type for that size. Require that the load VT is legal and
9299 // that the target supports unaligned loads of that type. Otherwise, return
9300 // INVALID.
9301 auto hasFastLoadsAndCompare = [&](unsigned NumBits) {
9302 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9303 MVT LVT = TLI.hasFastEqualityCompare(NumBits);
9304 if (LVT != MVT::INVALID_SIMPLE_VALUE_TYPE) {
9305 // TODO: Handle 5 byte compare as 4-byte + 1 byte.
9306 // TODO: Handle 8 byte compare on x86-32 as two 32-bit loads.
9307 // TODO: Check alignment of src and dest ptrs.
9308 unsigned DstAS = LHS->getType()->getPointerAddressSpace();
9309 unsigned SrcAS = RHS->getType()->getPointerAddressSpace();
9310 if (!TLI.isTypeLegal(LVT) ||
9311 !TLI.allowsMisalignedMemoryAccesses(LVT, SrcAS) ||
9312 !TLI.allowsMisalignedMemoryAccesses(LVT, DstAS))
9314 }
9315
9316 return LVT;
9317 };
9318
9319 // This turns into unaligned loads. We only do this if the target natively
9320 // supports the MVT we'll be loading or if it is small enough (<= 4) that
9321 // we'll only produce a small number of byte loads.
9322 MVT LoadVT;
9323 unsigned NumBitsToCompare = CSize->getZExtValue() * 8;
9324 switch (NumBitsToCompare) {
9325 default:
9326 return false;
9327 case 16:
9328 LoadVT = MVT::i16;
9329 break;
9330 case 32:
9331 LoadVT = MVT::i32;
9332 break;
9333 case 64:
9334 case 128:
9335 case 256:
9336 LoadVT = hasFastLoadsAndCompare(NumBitsToCompare);
9337 break;
9338 }
9339
9340 if (LoadVT == MVT::INVALID_SIMPLE_VALUE_TYPE)
9341 return false;
9342
9343 SDValue LoadL = getMemCmpLoad(LHS, LoadVT, *this);
9344 SDValue LoadR = getMemCmpLoad(RHS, LoadVT, *this);
9345
9346 // Bitcast to a wide integer type if the loads are vectors.
9347 if (LoadVT.isVector()) {
9348 EVT CmpVT = EVT::getIntegerVT(LHS->getContext(), LoadVT.getSizeInBits());
9349 LoadL = DAG.getBitcast(CmpVT, LoadL);
9350 LoadR = DAG.getBitcast(CmpVT, LoadR);
9351 }
9352
9353 SDValue Cmp = DAG.getSetCC(getCurSDLoc(), MVT::i1, LoadL, LoadR, ISD::SETNE);
9354 processIntegerCallValue(I, Cmp, false);
9355 return true;
9356}
9357
9358/// See if we can lower a memchr call into an optimized form. If so, return
9359/// true and lower it. Otherwise return false, and it will be lowered like a
9360/// normal call.
9361/// The caller already checked that \p I calls the appropriate LibFunc with a
9362/// correct prototype.
9363bool SelectionDAGBuilder::visitMemChrCall(const CallInst &I) {
9364 const Value *Src = I.getArgOperand(0);
9365 const Value *Char = I.getArgOperand(1);
9366 const Value *Length = I.getArgOperand(2);
9367
9368 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9369 std::pair<SDValue, SDValue> Res =
9370 TSI.EmitTargetCodeForMemchr(DAG, getCurSDLoc(), DAG.getRoot(),
9371 getValue(Src), getValue(Char), getValue(Length),
9372 MachinePointerInfo(Src));
9373 if (Res.first.getNode()) {
9374 setValue(&I, Res.first);
9375 PendingLoads.push_back(Res.second);
9376 return true;
9377 }
9378
9379 return false;
9380}
9381
9382/// See if we can lower a mempcpy call into an optimized form. If so, return
9383/// true and lower it. Otherwise return false, and it will be lowered like a
9384/// normal call.
9385/// The caller already checked that \p I calls the appropriate LibFunc with a
9386/// correct prototype.
9387bool SelectionDAGBuilder::visitMemPCpyCall(const CallInst &I) {
9388 SDValue Dst = getValue(I.getArgOperand(0));
9389 SDValue Src = getValue(I.getArgOperand(1));
9390 SDValue Size = getValue(I.getArgOperand(2));
9391
9392 Align DstAlign = DAG.InferPtrAlign(Dst).valueOrOne();
9393 Align SrcAlign = DAG.InferPtrAlign(Src).valueOrOne();
9394 // DAG::getMemcpy needs Alignment to be defined.
9395 Align Alignment = std::min(DstAlign, SrcAlign);
9396
9397 SDLoc sdl = getCurSDLoc();
9398
9399 // In the mempcpy context we need to pass in a false value for isTailCall
9400 // because the return pointer needs to be adjusted by the size of
9401 // the copied memory.
9402 SDValue Root = getMemoryRoot();
9403 SDValue MC = DAG.getMemcpy(
9404 Root, sdl, Dst, Src, Size, Alignment, false, false, /*CI=*/nullptr,
9405 std::nullopt, MachinePointerInfo(I.getArgOperand(0)),
9406 MachinePointerInfo(I.getArgOperand(1)), I.getAAMetadata());
9407 assert(MC.getNode() != nullptr &&
9408 "** memcpy should not be lowered as TailCall in mempcpy context **");
9409 DAG.setRoot(MC);
9410
9411 // Check if Size needs to be truncated or extended.
9412 Size = DAG.getSExtOrTrunc(Size, sdl, Dst.getValueType());
9413
9414 // Adjust return pointer to point just past the last dst byte.
9415 SDValue DstPlusSize = DAG.getMemBasePlusOffset(Dst, Size, sdl);
9416 setValue(&I, DstPlusSize);
9417 return true;
9418}
9419
9420/// See if we can lower a strcpy call into an optimized form. If so, return
9421/// true and lower it, otherwise return false and it will be lowered like a
9422/// normal call.
9423/// The caller already checked that \p I calls the appropriate LibFunc with a
9424/// correct prototype.
9425bool SelectionDAGBuilder::visitStrCpyCall(const CallInst &I, bool isStpcpy) {
9426 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9427
9428 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9429 std::pair<SDValue, SDValue> Res =
9431 getValue(Arg0), getValue(Arg1),
9432 MachinePointerInfo(Arg0),
9433 MachinePointerInfo(Arg1), isStpcpy);
9434 if (Res.first.getNode()) {
9435 setValue(&I, Res.first);
9436 DAG.setRoot(Res.second);
9437 return true;
9438 }
9439
9440 return false;
9441}
9442
9443/// See if we can lower a strcmp call into an optimized form. If so, return
9444/// true and lower it, otherwise return false and it will be lowered like a
9445/// normal call.
9446/// The caller already checked that \p I calls the appropriate LibFunc with a
9447/// correct prototype.
9448bool SelectionDAGBuilder::visitStrCmpCall(const CallInst &I) {
9449 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9450
9451 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9452 std::pair<SDValue, SDValue> Res =
9453 TSI.EmitTargetCodeForStrcmp(DAG, getCurSDLoc(), DAG.getRoot(),
9454 getValue(Arg0), getValue(Arg1),
9455 MachinePointerInfo(Arg0),
9456 MachinePointerInfo(Arg1));
9457 if (Res.first.getNode()) {
9458 processIntegerCallValue(I, Res.first, true);
9459 PendingLoads.push_back(Res.second);
9460 return true;
9461 }
9462
9463 return false;
9464}
9465
9466/// See if we can lower a strlen call into an optimized form. If so, return
9467/// true and lower it, otherwise return false and it will be lowered like a
9468/// normal call.
9469/// The caller already checked that \p I calls the appropriate LibFunc with a
9470/// correct prototype.
9471bool SelectionDAGBuilder::visitStrLenCall(const CallInst &I) {
9472 const Value *Arg0 = I.getArgOperand(0);
9473
9474 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9475 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrlen(
9476 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), &I);
9477 if (Res.first.getNode()) {
9478 processIntegerCallValue(I, Res.first, false);
9479 PendingLoads.push_back(Res.second);
9480 return true;
9481 }
9482
9483 return false;
9484}
9485
9486/// See if we can lower a strnlen call into an optimized form. If so, return
9487/// true and lower it, otherwise return false and it will be lowered like a
9488/// normal call.
9489/// The caller already checked that \p I calls the appropriate LibFunc with a
9490/// correct prototype.
9491bool SelectionDAGBuilder::visitStrNLenCall(const CallInst &I) {
9492 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9493
9494 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9495 std::pair<SDValue, SDValue> Res =
9496 TSI.EmitTargetCodeForStrnlen(DAG, getCurSDLoc(), DAG.getRoot(),
9497 getValue(Arg0), getValue(Arg1),
9498 MachinePointerInfo(Arg0));
9499 if (Res.first.getNode()) {
9500 processIntegerCallValue(I, Res.first, false);
9501 PendingLoads.push_back(Res.second);
9502 return true;
9503 }
9504
9505 return false;
9506}
9507
9508/// See if we can lower a unary floating-point operation into an SDNode with
9509/// the specified Opcode. If so, return true and lower it, otherwise return
9510/// false and it will be lowered like a normal call.
9511/// The caller already checked that \p I calls the appropriate LibFunc with a
9512/// correct prototype.
9513bool SelectionDAGBuilder::visitUnaryFloatCall(const CallInst &I,
9514 unsigned Opcode) {
9515 // We already checked this call's prototype; verify it doesn't modify errno.
9516 // Do not perform optimizations for call sites that require strict
9517 // floating-point semantics.
9518 if (!I.onlyReadsMemory() || I.isStrictFP())
9519 return false;
9520
9521 SDNodeFlags Flags;
9522 Flags.copyFMF(cast<FPMathOperator>(I));
9523
9524 SDValue Tmp = getValue(I.getArgOperand(0));
9525 setValue(&I,
9526 DAG.getNode(Opcode, getCurSDLoc(), Tmp.getValueType(), Tmp, Flags));
9527 return true;
9528}
9529
9530/// See if we can lower a binary floating-point operation into an SDNode with
9531/// the specified Opcode. If so, return true and lower it. Otherwise return
9532/// false, and it will be lowered like a normal call.
9533/// The caller already checked that \p I calls the appropriate LibFunc with a
9534/// correct prototype.
9535bool SelectionDAGBuilder::visitBinaryFloatCall(const CallInst &I,
9536 unsigned Opcode) {
9537 // We already checked this call's prototype; verify it doesn't modify errno.
9538 // Do not perform optimizations for call sites that require strict
9539 // floating-point semantics.
9540 if (!I.onlyReadsMemory() || I.isStrictFP())
9541 return false;
9542
9543 SDNodeFlags Flags;
9544 Flags.copyFMF(cast<FPMathOperator>(I));
9545
9546 SDValue Tmp0 = getValue(I.getArgOperand(0));
9547 SDValue Tmp1 = getValue(I.getArgOperand(1));
9548 EVT VT = Tmp0.getValueType();
9549 setValue(&I, DAG.getNode(Opcode, getCurSDLoc(), VT, Tmp0, Tmp1, Flags));
9550 return true;
9551}
9552
9553void SelectionDAGBuilder::visitCall(const CallInst &I) {
9554 // Handle inline assembly differently.
9555 if (I.isInlineAsm()) {
9556 visitInlineAsm(I);
9557 return;
9558 }
9559
9561
9562 if (Function *F = I.getCalledFunction()) {
9563 if (F->isDeclaration()) {
9564 // Is this an LLVM intrinsic?
9565 if (unsigned IID = F->getIntrinsicID()) {
9566 visitIntrinsicCall(I, IID);
9567 return;
9568 }
9569 }
9570
9571 // Check for well-known libc/libm calls. If the function is internal, it
9572 // can't be a library call. Don't do the check if marked as nobuiltin for
9573 // some reason.
9574 // This code should not handle libcalls that are already canonicalized to
9575 // intrinsics by the middle-end.
9576 LibFunc Func;
9577 if (!I.isNoBuiltin() && !F->hasLocalLinkage() && F->hasName() &&
9578 LibInfo->getLibFunc(*F, Func) && LibInfo->hasOptimizedCodeGen(Func)) {
9579 switch (Func) {
9580 default: break;
9581 case LibFunc_bcmp:
9582 if (visitMemCmpBCmpCall(I))
9583 return;
9584 break;
9585 case LibFunc_copysign:
9586 case LibFunc_copysignf:
9587 case LibFunc_copysignl:
9588 // We already checked this call's prototype; verify it doesn't modify
9589 // errno.
9590 if (I.onlyReadsMemory()) {
9591 SDValue LHS = getValue(I.getArgOperand(0));
9592 SDValue RHS = getValue(I.getArgOperand(1));
9594 LHS.getValueType(), LHS, RHS));
9595 return;
9596 }
9597 break;
9598 case LibFunc_fabs:
9599 case LibFunc_fabsf:
9600 case LibFunc_fabsl:
9601 // TODO: Remove this, already canonicalized by the middle-end.
9602 if (visitUnaryFloatCall(I, ISD::FABS))
9603 return;
9604 break;
9605 case LibFunc_sin:
9606 case LibFunc_sinf:
9607 case LibFunc_sinl:
9608 if (visitUnaryFloatCall(I, ISD::FSIN))
9609 return;
9610 break;
9611 case LibFunc_cos:
9612 case LibFunc_cosf:
9613 case LibFunc_cosl:
9614 if (visitUnaryFloatCall(I, ISD::FCOS))
9615 return;
9616 break;
9617 case LibFunc_tan:
9618 case LibFunc_tanf:
9619 case LibFunc_tanl:
9620 if (visitUnaryFloatCall(I, ISD::FTAN))
9621 return;
9622 break;
9623 case LibFunc_asin:
9624 case LibFunc_asinf:
9625 case LibFunc_asinl:
9626 if (visitUnaryFloatCall(I, ISD::FASIN))
9627 return;
9628 break;
9629 case LibFunc_acos:
9630 case LibFunc_acosf:
9631 case LibFunc_acosl:
9632 if (visitUnaryFloatCall(I, ISD::FACOS))
9633 return;
9634 break;
9635 case LibFunc_atan:
9636 case LibFunc_atanf:
9637 case LibFunc_atanl:
9638 if (visitUnaryFloatCall(I, ISD::FATAN))
9639 return;
9640 break;
9641 case LibFunc_atan2:
9642 case LibFunc_atan2f:
9643 case LibFunc_atan2l:
9644 if (visitBinaryFloatCall(I, ISD::FATAN2))
9645 return;
9646 break;
9647 case LibFunc_sinh:
9648 case LibFunc_sinhf:
9649 case LibFunc_sinhl:
9650 if (visitUnaryFloatCall(I, ISD::FSINH))
9651 return;
9652 break;
9653 case LibFunc_cosh:
9654 case LibFunc_coshf:
9655 case LibFunc_coshl:
9656 if (visitUnaryFloatCall(I, ISD::FCOSH))
9657 return;
9658 break;
9659 case LibFunc_tanh:
9660 case LibFunc_tanhf:
9661 case LibFunc_tanhl:
9662 if (visitUnaryFloatCall(I, ISD::FTANH))
9663 return;
9664 break;
9665 case LibFunc_sqrt:
9666 case LibFunc_sqrtf:
9667 case LibFunc_sqrtl:
9668 case LibFunc_sqrt_finite:
9669 case LibFunc_sqrtf_finite:
9670 case LibFunc_sqrtl_finite:
9671 if (visitUnaryFloatCall(I, ISD::FSQRT))
9672 return;
9673 break;
9674 case LibFunc_log2:
9675 case LibFunc_log2f:
9676 case LibFunc_log2l:
9677 if (visitUnaryFloatCall(I, ISD::FLOG2))
9678 return;
9679 break;
9680 case LibFunc_exp2:
9681 case LibFunc_exp2f:
9682 case LibFunc_exp2l:
9683 if (visitUnaryFloatCall(I, ISD::FEXP2))
9684 return;
9685 break;
9686 case LibFunc_exp10:
9687 case LibFunc_exp10f:
9688 case LibFunc_exp10l:
9689 if (visitUnaryFloatCall(I, ISD::FEXP10))
9690 return;
9691 break;
9692 case LibFunc_ldexp:
9693 case LibFunc_ldexpf:
9694 case LibFunc_ldexpl:
9695 if (visitBinaryFloatCall(I, ISD::FLDEXP))
9696 return;
9697 break;
9698 case LibFunc_memcmp:
9699 if (visitMemCmpBCmpCall(I))
9700 return;
9701 break;
9702 case LibFunc_mempcpy:
9703 if (visitMemPCpyCall(I))
9704 return;
9705 break;
9706 case LibFunc_memchr:
9707 if (visitMemChrCall(I))
9708 return;
9709 break;
9710 case LibFunc_strcpy:
9711 if (visitStrCpyCall(I, false))
9712 return;
9713 break;
9714 case LibFunc_stpcpy:
9715 if (visitStrCpyCall(I, true))
9716 return;
9717 break;
9718 case LibFunc_strcmp:
9719 if (visitStrCmpCall(I))
9720 return;
9721 break;
9722 case LibFunc_strlen:
9723 if (visitStrLenCall(I))
9724 return;
9725 break;
9726 case LibFunc_strnlen:
9727 if (visitStrNLenCall(I))
9728 return;
9729 break;
9730 }
9731 }
9732 }
9733
9734 if (I.countOperandBundlesOfType(LLVMContext::OB_ptrauth)) {
9735 LowerCallSiteWithPtrAuthBundle(cast<CallBase>(I), /*EHPadBB=*/nullptr);
9736 return;
9737 }
9738
9739 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
9740 // have to do anything here to lower funclet bundles.
9741 // CFGuardTarget bundles are lowered in LowerCallTo.
9743 I, "calls",
9748
9749 SDValue Callee = getValue(I.getCalledOperand());
9750
9751 if (I.hasDeoptState())
9752 LowerCallSiteWithDeoptBundle(&I, Callee, nullptr);
9753 else
9754 // Check if we can potentially perform a tail call. More detailed checking
9755 // is be done within LowerCallTo, after more information about the call is
9756 // known.
9757 LowerCallTo(I, Callee, I.isTailCall(), I.isMustTailCall());
9758}
9759
9761 const CallBase &CB, const BasicBlock *EHPadBB) {
9762 auto PAB = CB.getOperandBundle("ptrauth");
9763 const Value *CalleeV = CB.getCalledOperand();
9764
9765 // Gather the call ptrauth data from the operand bundle:
9766 // [ i32 <key>, i64 <discriminator> ]
9767 const auto *Key = cast<ConstantInt>(PAB->Inputs[0]);
9768 const Value *Discriminator = PAB->Inputs[1];
9769
9770 assert(Key->getType()->isIntegerTy(32) && "Invalid ptrauth key");
9771 assert(Discriminator->getType()->isIntegerTy(64) &&
9772 "Invalid ptrauth discriminator");
9773
9774 // Look through ptrauth constants to find the raw callee.
9775 // Do a direct unauthenticated call if we found it and everything matches.
9776 if (const auto *CalleeCPA = dyn_cast<ConstantPtrAuth>(CalleeV))
9777 if (CalleeCPA->isKnownCompatibleWith(Key, Discriminator,
9778 DAG.getDataLayout()))
9779 return LowerCallTo(CB, getValue(CalleeCPA->getPointer()), CB.isTailCall(),
9780 CB.isMustTailCall(), EHPadBB);
9781
9782 // Functions should never be ptrauth-called directly.
9783 assert(!isa<Function>(CalleeV) && "invalid direct ptrauth call");
9784
9785 // Otherwise, do an authenticated indirect call.
9786 TargetLowering::PtrAuthInfo PAI = {Key->getZExtValue(),
9787 getValue(Discriminator)};
9788
9789 LowerCallTo(CB, getValue(CalleeV), CB.isTailCall(), CB.isMustTailCall(),
9790 EHPadBB, &PAI);
9791}
9792
9793namespace {
9794
9795/// AsmOperandInfo - This contains information for each constraint that we are
9796/// lowering.
9797class SDISelAsmOperandInfo : public TargetLowering::AsmOperandInfo {
9798public:
9799 /// CallOperand - If this is the result output operand or a clobber
9800 /// this is null, otherwise it is the incoming operand to the CallInst.
9801 /// This gets modified as the asm is processed.
9802 SDValue CallOperand;
9803
9804 /// AssignedRegs - If this is a register or register class operand, this
9805 /// contains the set of register corresponding to the operand.
9806 RegsForValue AssignedRegs;
9807
9808 explicit SDISelAsmOperandInfo(const TargetLowering::AsmOperandInfo &info)
9809 : TargetLowering::AsmOperandInfo(info), CallOperand(nullptr, 0) {
9810 }
9811
9812 /// Whether or not this operand accesses memory
9813 bool hasMemory(const TargetLowering &TLI) const {
9814 // Indirect operand accesses access memory.
9815 if (isIndirect)
9816 return true;
9817
9818 for (const auto &Code : Codes)
9820 return true;
9821
9822 return false;
9823 }
9824};
9825
9826
9827} // end anonymous namespace
9828
9829/// Make sure that the output operand \p OpInfo and its corresponding input
9830/// operand \p MatchingOpInfo have compatible constraint types (otherwise error
9831/// out).
9832static void patchMatchingInput(const SDISelAsmOperandInfo &OpInfo,
9833 SDISelAsmOperandInfo &MatchingOpInfo,
9834 SelectionDAG &DAG) {
9835 if (OpInfo.ConstraintVT == MatchingOpInfo.ConstraintVT)
9836 return;
9837
9839 const auto &TLI = DAG.getTargetLoweringInfo();
9840
9841 std::pair<unsigned, const TargetRegisterClass *> MatchRC =
9842 TLI.getRegForInlineAsmConstraint(TRI, OpInfo.ConstraintCode,
9843 OpInfo.ConstraintVT);
9844 std::pair<unsigned, const TargetRegisterClass *> InputRC =
9845 TLI.getRegForInlineAsmConstraint(TRI, MatchingOpInfo.ConstraintCode,
9846 MatchingOpInfo.ConstraintVT);
9847 const bool OutOpIsIntOrFP =
9848 OpInfo.ConstraintVT.isInteger() || OpInfo.ConstraintVT.isFloatingPoint();
9849 const bool InOpIsIntOrFP = MatchingOpInfo.ConstraintVT.isInteger() ||
9850 MatchingOpInfo.ConstraintVT.isFloatingPoint();
9851 if ((OutOpIsIntOrFP != InOpIsIntOrFP) || (MatchRC.second != InputRC.second)) {
9852 // FIXME: error out in a more elegant fashion
9853 report_fatal_error("Unsupported asm: input constraint"
9854 " with a matching output constraint of"
9855 " incompatible type!");
9856 }
9857 MatchingOpInfo.ConstraintVT = OpInfo.ConstraintVT;
9858}
9859
9860/// Get a direct memory input to behave well as an indirect operand.
9861/// This may introduce stores, hence the need for a \p Chain.
9862/// \return The (possibly updated) chain.
9863static SDValue getAddressForMemoryInput(SDValue Chain, const SDLoc &Location,
9864 SDISelAsmOperandInfo &OpInfo,
9865 SelectionDAG &DAG) {
9866 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9867
9868 // If we don't have an indirect input, put it in the constpool if we can,
9869 // otherwise spill it to a stack slot.
9870 // TODO: This isn't quite right. We need to handle these according to
9871 // the addressing mode that the constraint wants. Also, this may take
9872 // an additional register for the computation and we don't want that
9873 // either.
9874
9875 // If the operand is a float, integer, or vector constant, spill to a
9876 // constant pool entry to get its address.
9877 const Value *OpVal = OpInfo.CallOperandVal;
9878 if (isa<ConstantFP>(OpVal) || isa<ConstantInt>(OpVal) ||
9880 OpInfo.CallOperand = DAG.getConstantPool(
9881 cast<Constant>(OpVal), TLI.getPointerTy(DAG.getDataLayout()));
9882 return Chain;
9883 }
9884
9885 // Otherwise, create a stack slot and emit a store to it before the asm.
9886 Type *Ty = OpVal->getType();
9887 auto &DL = DAG.getDataLayout();
9888 TypeSize TySize = DL.getTypeAllocSize(Ty);
9891 int StackID = 0;
9892 if (TySize.isScalable())
9893 StackID = TFI->getStackIDForScalableVectors();
9894 int SSFI = MF.getFrameInfo().CreateStackObject(TySize.getKnownMinValue(),
9895 DL.getPrefTypeAlign(Ty), false,
9896 nullptr, StackID);
9897 SDValue StackSlot = DAG.getFrameIndex(SSFI, TLI.getFrameIndexTy(DL));
9898 Chain = DAG.getTruncStore(Chain, Location, OpInfo.CallOperand, StackSlot,
9900 TLI.getMemValueType(DL, Ty));
9901 OpInfo.CallOperand = StackSlot;
9902
9903 return Chain;
9904}
9905
9906/// GetRegistersForValue - Assign registers (virtual or physical) for the
9907/// specified operand. We prefer to assign virtual registers, to allow the
9908/// register allocator to handle the assignment process. However, if the asm
9909/// uses features that we can't model on machineinstrs, we have SDISel do the
9910/// allocation. This produces generally horrible, but correct, code.
9911///
9912/// OpInfo describes the operand
9913/// RefOpInfo describes the matching operand if any, the operand otherwise
9914static std::optional<unsigned>
9916 SDISelAsmOperandInfo &OpInfo,
9917 SDISelAsmOperandInfo &RefOpInfo) {
9918 LLVMContext &Context = *DAG.getContext();
9919 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9920
9924
9925 // No work to do for memory/address operands.
9926 if (OpInfo.ConstraintType == TargetLowering::C_Memory ||
9927 OpInfo.ConstraintType == TargetLowering::C_Address)
9928 return std::nullopt;
9929
9930 // If this is a constraint for a single physreg, or a constraint for a
9931 // register class, find it.
9932 unsigned AssignedReg;
9933 const TargetRegisterClass *RC;
9934 std::tie(AssignedReg, RC) = TLI.getRegForInlineAsmConstraint(
9935 &TRI, RefOpInfo.ConstraintCode, RefOpInfo.ConstraintVT);
9936 // RC is unset only on failure. Return immediately.
9937 if (!RC)
9938 return std::nullopt;
9939
9940 // Get the actual register value type. This is important, because the user
9941 // may have asked for (e.g.) the AX register in i32 type. We need to
9942 // remember that AX is actually i16 to get the right extension.
9943 const MVT RegVT = *TRI.legalclasstypes_begin(*RC);
9944
9945 if (OpInfo.ConstraintVT != MVT::Other && RegVT != MVT::Untyped) {
9946 // If this is an FP operand in an integer register (or visa versa), or more
9947 // generally if the operand value disagrees with the register class we plan
9948 // to stick it in, fix the operand type.
9949 //
9950 // If this is an input value, the bitcast to the new type is done now.
9951 // Bitcast for output value is done at the end of visitInlineAsm().
9952 if ((OpInfo.Type == InlineAsm::isOutput ||
9953 OpInfo.Type == InlineAsm::isInput) &&
9954 !TRI.isTypeLegalForClass(*RC, OpInfo.ConstraintVT)) {
9955 // Try to convert to the first EVT that the reg class contains. If the
9956 // types are identical size, use a bitcast to convert (e.g. two differing
9957 // vector types). Note: output bitcast is done at the end of
9958 // visitInlineAsm().
9959 if (RegVT.getSizeInBits() == OpInfo.ConstraintVT.getSizeInBits()) {
9960 // Exclude indirect inputs while they are unsupported because the code
9961 // to perform the load is missing and thus OpInfo.CallOperand still
9962 // refers to the input address rather than the pointed-to value.
9963 if (OpInfo.Type == InlineAsm::isInput && !OpInfo.isIndirect)
9964 OpInfo.CallOperand =
9965 DAG.getNode(ISD::BITCAST, DL, RegVT, OpInfo.CallOperand);
9966 OpInfo.ConstraintVT = RegVT;
9967 // If the operand is an FP value and we want it in integer registers,
9968 // use the corresponding integer type. This turns an f64 value into
9969 // i64, which can be passed with two i32 values on a 32-bit machine.
9970 } else if (RegVT.isInteger() && OpInfo.ConstraintVT.isFloatingPoint()) {
9971 MVT VT = MVT::getIntegerVT(OpInfo.ConstraintVT.getSizeInBits());
9972 if (OpInfo.Type == InlineAsm::isInput)
9973 OpInfo.CallOperand =
9974 DAG.getNode(ISD::BITCAST, DL, VT, OpInfo.CallOperand);
9975 OpInfo.ConstraintVT = VT;
9976 }
9977 }
9978 }
9979
9980 // No need to allocate a matching input constraint since the constraint it's
9981 // matching to has already been allocated.
9982 if (OpInfo.isMatchingInputConstraint())
9983 return std::nullopt;
9984
9985 EVT ValueVT = OpInfo.ConstraintVT;
9986 if (OpInfo.ConstraintVT == MVT::Other)
9987 ValueVT = RegVT;
9988
9989 // Initialize NumRegs.
9990 unsigned NumRegs = 1;
9991 if (OpInfo.ConstraintVT != MVT::Other)
9992 NumRegs = TLI.getNumRegisters(Context, OpInfo.ConstraintVT, RegVT);
9993
9994 // If this is a constraint for a specific physical register, like {r17},
9995 // assign it now.
9996
9997 // If this associated to a specific register, initialize iterator to correct
9998 // place. If virtual, make sure we have enough registers
9999
10000 // Initialize iterator if necessary
10003
10004 // Do not check for single registers.
10005 if (AssignedReg) {
10006 I = std::find(I, RC->end(), AssignedReg);
10007 if (I == RC->end()) {
10008 // RC does not contain the selected register, which indicates a
10009 // mismatch between the register and the required type/bitwidth.
10010 return {AssignedReg};
10011 }
10012 }
10013
10014 for (; NumRegs; --NumRegs, ++I) {
10015 assert(I != RC->end() && "Ran out of registers to allocate!");
10016 Register R = AssignedReg ? Register(*I) : RegInfo.createVirtualRegister(RC);
10017 Regs.push_back(R);
10018 }
10019
10020 OpInfo.AssignedRegs = RegsForValue(Regs, RegVT, ValueVT);
10021 return std::nullopt;
10022}
10023
10024static unsigned
10026 const std::vector<SDValue> &AsmNodeOperands) {
10027 // Scan until we find the definition we already emitted of this operand.
10028 unsigned CurOp = InlineAsm::Op_FirstOperand;
10029 for (; OperandNo; --OperandNo) {
10030 // Advance to the next operand.
10031 unsigned OpFlag = AsmNodeOperands[CurOp]->getAsZExtVal();
10032 const InlineAsm::Flag F(OpFlag);
10033 assert(
10034 (F.isRegDefKind() || F.isRegDefEarlyClobberKind() || F.isMemKind()) &&
10035 "Skipped past definitions?");
10036 CurOp += F.getNumOperandRegisters() + 1;
10037 }
10038 return CurOp;
10039}
10040
10041namespace {
10042
10043class ExtraFlags {
10044 unsigned Flags = 0;
10045
10046public:
10047 explicit ExtraFlags(const CallBase &Call) {
10048 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
10049 if (IA->hasSideEffects())
10051 if (IA->isAlignStack())
10053 if (Call.isConvergent())
10055 Flags |= IA->getDialect() * InlineAsm::Extra_AsmDialect;
10056 }
10057
10058 void update(const TargetLowering::AsmOperandInfo &OpInfo) {
10059 // Ideally, we would only check against memory constraints. However, the
10060 // meaning of an Other constraint can be target-specific and we can't easily
10061 // reason about it. Therefore, be conservative and set MayLoad/MayStore
10062 // for Other constraints as well.
10065 if (OpInfo.Type == InlineAsm::isInput)
10067 else if (OpInfo.Type == InlineAsm::isOutput)
10069 else if (OpInfo.Type == InlineAsm::isClobber)
10071 }
10072 }
10073
10074 unsigned get() const { return Flags; }
10075};
10076
10077} // end anonymous namespace
10078
10079static bool isFunction(SDValue Op) {
10080 if (Op && Op.getOpcode() == ISD::GlobalAddress) {
10081 if (auto *GA = dyn_cast<GlobalAddressSDNode>(Op)) {
10082 auto Fn = dyn_cast_or_null<Function>(GA->getGlobal());
10083
10084 // In normal "call dllimport func" instruction (non-inlineasm) it force
10085 // indirect access by specifing call opcode. And usually specially print
10086 // asm with indirect symbol (i.g: "*") according to opcode. Inline asm can
10087 // not do in this way now. (In fact, this is similar with "Data Access"
10088 // action). So here we ignore dllimport function.
10089 if (Fn && !Fn->hasDLLImportStorageClass())
10090 return true;
10091 }
10092 }
10093 return false;
10094}
10095
10096/// visitInlineAsm - Handle a call to an InlineAsm object.
10097void SelectionDAGBuilder::visitInlineAsm(const CallBase &Call,
10098 const BasicBlock *EHPadBB) {
10099 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
10100
10101 /// ConstraintOperands - Information about all of the constraints.
10102 SmallVector<SDISelAsmOperandInfo, 16> ConstraintOperands;
10103
10104 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10106 DAG.getDataLayout(), DAG.getSubtarget().getRegisterInfo(), Call);
10107
10108 // First Pass: Calculate HasSideEffects and ExtraFlags (AlignStack,
10109 // AsmDialect, MayLoad, MayStore).
10110 bool HasSideEffect = IA->hasSideEffects();
10111 ExtraFlags ExtraInfo(Call);
10112
10113 for (auto &T : TargetConstraints) {
10114 ConstraintOperands.push_back(SDISelAsmOperandInfo(T));
10115 SDISelAsmOperandInfo &OpInfo = ConstraintOperands.back();
10116
10117 if (OpInfo.CallOperandVal)
10118 OpInfo.CallOperand = getValue(OpInfo.CallOperandVal);
10119
10120 if (!HasSideEffect)
10121 HasSideEffect = OpInfo.hasMemory(TLI);
10122
10123 // Determine if this InlineAsm MayLoad or MayStore based on the constraints.
10124 // FIXME: Could we compute this on OpInfo rather than T?
10125
10126 // Compute the constraint code and ConstraintType to use.
10128
10129 if (T.ConstraintType == TargetLowering::C_Immediate &&
10130 OpInfo.CallOperand && !isa<ConstantSDNode>(OpInfo.CallOperand))
10131 // We've delayed emitting a diagnostic like the "n" constraint because
10132 // inlining could cause an integer showing up.
10133 return emitInlineAsmError(Call, "constraint '" + Twine(T.ConstraintCode) +
10134 "' expects an integer constant "
10135 "expression");
10136
10137 ExtraInfo.update(T);
10138 }
10139
10140 // We won't need to flush pending loads if this asm doesn't touch
10141 // memory and is nonvolatile.
10142 SDValue Glue, Chain = (HasSideEffect) ? getRoot() : DAG.getRoot();
10143
10144 bool EmitEHLabels = isa<InvokeInst>(Call);
10145 if (EmitEHLabels) {
10146 assert(EHPadBB && "InvokeInst must have an EHPadBB");
10147 }
10148 bool IsCallBr = isa<CallBrInst>(Call);
10149
10150 if (IsCallBr || EmitEHLabels) {
10151 // If this is a callbr or invoke we need to flush pending exports since
10152 // inlineasm_br and invoke are terminators.
10153 // We need to do this before nodes are glued to the inlineasm_br node.
10154 Chain = getControlRoot();
10155 }
10156
10157 MCSymbol *BeginLabel = nullptr;
10158 if (EmitEHLabels) {
10159 Chain = lowerStartEH(Chain, EHPadBB, BeginLabel);
10160 }
10161
10162 int OpNo = -1;
10163 SmallVector<StringRef> AsmStrs;
10164 IA->collectAsmStrs(AsmStrs);
10165
10166 // Second pass over the constraints: compute which constraint option to use.
10167 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
10168 if (OpInfo.hasArg() || OpInfo.Type == InlineAsm::isOutput)
10169 OpNo++;
10170
10171 // If this is an output operand with a matching input operand, look up the
10172 // matching input. If their types mismatch, e.g. one is an integer, the
10173 // other is floating point, or their sizes are different, flag it as an
10174 // error.
10175 if (OpInfo.hasMatchingInput()) {
10176 SDISelAsmOperandInfo &Input = ConstraintOperands[OpInfo.MatchingInput];
10177 patchMatchingInput(OpInfo, Input, DAG);
10178 }
10179
10180 // Compute the constraint code and ConstraintType to use.
10181 TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
10182
10183 if ((OpInfo.ConstraintType == TargetLowering::C_Memory &&
10184 OpInfo.Type == InlineAsm::isClobber) ||
10185 OpInfo.ConstraintType == TargetLowering::C_Address)
10186 continue;
10187
10188 // In Linux PIC model, there are 4 cases about value/label addressing:
10189 //
10190 // 1: Function call or Label jmp inside the module.
10191 // 2: Data access (such as global variable, static variable) inside module.
10192 // 3: Function call or Label jmp outside the module.
10193 // 4: Data access (such as global variable) outside the module.
10194 //
10195 // Due to current llvm inline asm architecture designed to not "recognize"
10196 // the asm code, there are quite troubles for us to treat mem addressing
10197 // differently for same value/adress used in different instuctions.
10198 // For example, in pic model, call a func may in plt way or direclty
10199 // pc-related, but lea/mov a function adress may use got.
10200 //
10201 // Here we try to "recognize" function call for the case 1 and case 3 in
10202 // inline asm. And try to adjust the constraint for them.
10203 //
10204 // TODO: Due to current inline asm didn't encourage to jmp to the outsider
10205 // label, so here we don't handle jmp function label now, but we need to
10206 // enhance it (especilly in PIC model) if we meet meaningful requirements.
10207 if (OpInfo.isIndirect && isFunction(OpInfo.CallOperand) &&
10208 TLI.isInlineAsmTargetBranch(AsmStrs, OpNo) &&
10209 TM.getCodeModel() != CodeModel::Large) {
10210 OpInfo.isIndirect = false;
10211 OpInfo.ConstraintType = TargetLowering::C_Address;
10212 }
10213
10214 // If this is a memory input, and if the operand is not indirect, do what we
10215 // need to provide an address for the memory input.
10216 if (OpInfo.ConstraintType == TargetLowering::C_Memory &&
10217 !OpInfo.isIndirect) {
10218 assert((OpInfo.isMultipleAlternative ||
10219 (OpInfo.Type == InlineAsm::isInput)) &&
10220 "Can only indirectify direct input operands!");
10221
10222 // Memory operands really want the address of the value.
10223 Chain = getAddressForMemoryInput(Chain, getCurSDLoc(), OpInfo, DAG);
10224
10225 // There is no longer a Value* corresponding to this operand.
10226 OpInfo.CallOperandVal = nullptr;
10227
10228 // It is now an indirect operand.
10229 OpInfo.isIndirect = true;
10230 }
10231
10232 }
10233
10234 // AsmNodeOperands - The operands for the ISD::INLINEASM node.
10235 std::vector<SDValue> AsmNodeOperands;
10236 AsmNodeOperands.push_back(SDValue()); // reserve space for input chain
10237 AsmNodeOperands.push_back(DAG.getTargetExternalSymbol(
10238 IA->getAsmString().data(), TLI.getProgramPointerTy(DAG.getDataLayout())));
10239
10240 // If we have a !srcloc metadata node associated with it, we want to attach
10241 // this to the ultimately generated inline asm machineinstr. To do this, we
10242 // pass in the third operand as this (potentially null) inline asm MDNode.
10243 const MDNode *SrcLoc = Call.getMetadata("srcloc");
10244 AsmNodeOperands.push_back(DAG.getMDNode(SrcLoc));
10245
10246 // Remember the HasSideEffect, AlignStack, AsmDialect, MayLoad and MayStore
10247 // bits as operand 3.
10248 AsmNodeOperands.push_back(DAG.getTargetConstant(
10249 ExtraInfo.get(), getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10250
10251 // Third pass: Loop over operands to prepare DAG-level operands.. As part of
10252 // this, assign virtual and physical registers for inputs and otput.
10253 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
10254 // Assign Registers.
10255 SDISelAsmOperandInfo &RefOpInfo =
10256 OpInfo.isMatchingInputConstraint()
10257 ? ConstraintOperands[OpInfo.getMatchedOperand()]
10258 : OpInfo;
10259 const auto RegError =
10260 getRegistersForValue(DAG, getCurSDLoc(), OpInfo, RefOpInfo);
10261 if (RegError) {
10262 const MachineFunction &MF = DAG.getMachineFunction();
10263 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
10264 const char *RegName = TRI.getName(*RegError);
10265 emitInlineAsmError(Call, "register '" + Twine(RegName) +
10266 "' allocated for constraint '" +
10267 Twine(OpInfo.ConstraintCode) +
10268 "' does not match required type");
10269 return;
10270 }
10271
10272 auto DetectWriteToReservedRegister = [&]() {
10273 const MachineFunction &MF = DAG.getMachineFunction();
10274 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
10275 for (Register Reg : OpInfo.AssignedRegs.Regs) {
10276 if (Reg.isPhysical() && TRI.isInlineAsmReadOnlyReg(MF, Reg)) {
10277 const char *RegName = TRI.getName(Reg);
10278 emitInlineAsmError(Call, "write to reserved register '" +
10279 Twine(RegName) + "'");
10280 return true;
10281 }
10282 }
10283 return false;
10284 };
10285 assert((OpInfo.ConstraintType != TargetLowering::C_Address ||
10286 (OpInfo.Type == InlineAsm::isInput &&
10287 !OpInfo.isMatchingInputConstraint())) &&
10288 "Only address as input operand is allowed.");
10289
10290 switch (OpInfo.Type) {
10292 if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
10293 const InlineAsm::ConstraintCode ConstraintID =
10294 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10296 "Failed to convert memory constraint code to constraint id.");
10297
10298 // Add information to the INLINEASM node to know about this output.
10299 InlineAsm::Flag OpFlags(InlineAsm::Kind::Mem, 1);
10300 OpFlags.setMemConstraint(ConstraintID);
10301 AsmNodeOperands.push_back(DAG.getTargetConstant(OpFlags, getCurSDLoc(),
10302 MVT::i32));
10303 AsmNodeOperands.push_back(OpInfo.CallOperand);
10304 } else {
10305 // Otherwise, this outputs to a register (directly for C_Register /
10306 // C_RegisterClass, and a target-defined fashion for
10307 // C_Immediate/C_Other). Find a register that we can use.
10308 if (OpInfo.AssignedRegs.Regs.empty()) {
10309 emitInlineAsmError(
10310 Call, "couldn't allocate output register for constraint '" +
10311 Twine(OpInfo.ConstraintCode) + "'");
10312 return;
10313 }
10314
10315 if (DetectWriteToReservedRegister())
10316 return;
10317
10318 // Add information to the INLINEASM node to know that this register is
10319 // set.
10320 OpInfo.AssignedRegs.AddInlineAsmOperands(
10321 OpInfo.isEarlyClobber ? InlineAsm::Kind::RegDefEarlyClobber
10323 false, 0, getCurSDLoc(), DAG, AsmNodeOperands);
10324 }
10325 break;
10326
10327 case InlineAsm::isInput:
10328 case InlineAsm::isLabel: {
10329 SDValue InOperandVal = OpInfo.CallOperand;
10330
10331 if (OpInfo.isMatchingInputConstraint()) {
10332 // If this is required to match an output register we have already set,
10333 // just use its register.
10334 auto CurOp = findMatchingInlineAsmOperand(OpInfo.getMatchedOperand(),
10335 AsmNodeOperands);
10336 InlineAsm::Flag Flag(AsmNodeOperands[CurOp]->getAsZExtVal());
10337 if (Flag.isRegDefKind() || Flag.isRegDefEarlyClobberKind()) {
10338 if (OpInfo.isIndirect) {
10339 // This happens on gcc/testsuite/gcc.dg/pr8788-1.c
10340 emitInlineAsmError(Call, "inline asm not supported yet: "
10341 "don't know how to handle tied "
10342 "indirect register inputs");
10343 return;
10344 }
10345
10347 MachineFunction &MF = DAG.getMachineFunction();
10348 MachineRegisterInfo &MRI = MF.getRegInfo();
10349 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
10350 auto *R = cast<RegisterSDNode>(AsmNodeOperands[CurOp+1]);
10351 Register TiedReg = R->getReg();
10352 MVT RegVT = R->getSimpleValueType(0);
10353 const TargetRegisterClass *RC =
10354 TiedReg.isVirtual() ? MRI.getRegClass(TiedReg)
10355 : RegVT != MVT::Untyped ? TLI.getRegClassFor(RegVT)
10356 : TRI.getMinimalPhysRegClass(TiedReg);
10357 for (unsigned i = 0, e = Flag.getNumOperandRegisters(); i != e; ++i)
10358 Regs.push_back(MRI.createVirtualRegister(RC));
10359
10360 RegsForValue MatchedRegs(Regs, RegVT, InOperandVal.getValueType());
10361
10362 SDLoc dl = getCurSDLoc();
10363 // Use the produced MatchedRegs object to
10364 MatchedRegs.getCopyToRegs(InOperandVal, DAG, dl, Chain, &Glue, &Call);
10365 MatchedRegs.AddInlineAsmOperands(InlineAsm::Kind::RegUse, true,
10366 OpInfo.getMatchedOperand(), dl, DAG,
10367 AsmNodeOperands);
10368 break;
10369 }
10370
10371 assert(Flag.isMemKind() && "Unknown matching constraint!");
10372 assert(Flag.getNumOperandRegisters() == 1 &&
10373 "Unexpected number of operands");
10374 // Add information to the INLINEASM node to know about this input.
10375 // See InlineAsm.h isUseOperandTiedToDef.
10376 Flag.clearMemConstraint();
10377 Flag.setMatchingOp(OpInfo.getMatchedOperand());
10378 AsmNodeOperands.push_back(DAG.getTargetConstant(
10379 Flag, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10380 AsmNodeOperands.push_back(AsmNodeOperands[CurOp+1]);
10381 break;
10382 }
10383
10384 // Treat indirect 'X' constraint as memory.
10385 if (OpInfo.ConstraintType == TargetLowering::C_Other &&
10386 OpInfo.isIndirect)
10387 OpInfo.ConstraintType = TargetLowering::C_Memory;
10388
10389 if (OpInfo.ConstraintType == TargetLowering::C_Immediate ||
10390 OpInfo.ConstraintType == TargetLowering::C_Other) {
10391 std::vector<SDValue> Ops;
10392 TLI.LowerAsmOperandForConstraint(InOperandVal, OpInfo.ConstraintCode,
10393 Ops, DAG);
10394 if (Ops.empty()) {
10395 if (OpInfo.ConstraintType == TargetLowering::C_Immediate)
10396 if (isa<ConstantSDNode>(InOperandVal)) {
10397 emitInlineAsmError(Call, "value out of range for constraint '" +
10398 Twine(OpInfo.ConstraintCode) + "'");
10399 return;
10400 }
10401
10402 emitInlineAsmError(Call,
10403 "invalid operand for inline asm constraint '" +
10404 Twine(OpInfo.ConstraintCode) + "'");
10405 return;
10406 }
10407
10408 // Add information to the INLINEASM node to know about this input.
10409 InlineAsm::Flag ResOpType(InlineAsm::Kind::Imm, Ops.size());
10410 AsmNodeOperands.push_back(DAG.getTargetConstant(
10411 ResOpType, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10412 llvm::append_range(AsmNodeOperands, Ops);
10413 break;
10414 }
10415
10416 if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
10417 assert((OpInfo.isIndirect ||
10418 OpInfo.ConstraintType != TargetLowering::C_Memory) &&
10419 "Operand must be indirect to be a mem!");
10420 assert(InOperandVal.getValueType() ==
10421 TLI.getPointerTy(DAG.getDataLayout()) &&
10422 "Memory operands expect pointer values");
10423
10424 const InlineAsm::ConstraintCode ConstraintID =
10425 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10427 "Failed to convert memory constraint code to constraint id.");
10428
10429 // Add information to the INLINEASM node to know about this input.
10430 InlineAsm::Flag ResOpType(InlineAsm::Kind::Mem, 1);
10431 ResOpType.setMemConstraint(ConstraintID);
10432 AsmNodeOperands.push_back(DAG.getTargetConstant(ResOpType,
10433 getCurSDLoc(),
10434 MVT::i32));
10435 AsmNodeOperands.push_back(InOperandVal);
10436 break;
10437 }
10438
10439 if (OpInfo.ConstraintType == TargetLowering::C_Address) {
10440 const InlineAsm::ConstraintCode ConstraintID =
10441 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10443 "Failed to convert memory constraint code to constraint id.");
10444
10445 InlineAsm::Flag ResOpType(InlineAsm::Kind::Mem, 1);
10446
10447 SDValue AsmOp = InOperandVal;
10448 if (isFunction(InOperandVal)) {
10449 auto *GA = cast<GlobalAddressSDNode>(InOperandVal);
10450 ResOpType = InlineAsm::Flag(InlineAsm::Kind::Func, 1);
10451 AsmOp = DAG.getTargetGlobalAddress(GA->getGlobal(), getCurSDLoc(),
10452 InOperandVal.getValueType(),
10453 GA->getOffset());
10454 }
10455
10456 // Add information to the INLINEASM node to know about this input.
10457 ResOpType.setMemConstraint(ConstraintID);
10458
10459 AsmNodeOperands.push_back(
10460 DAG.getTargetConstant(ResOpType, getCurSDLoc(), MVT::i32));
10461
10462 AsmNodeOperands.push_back(AsmOp);
10463 break;
10464 }
10465
10466 if (OpInfo.ConstraintType != TargetLowering::C_RegisterClass &&
10467 OpInfo.ConstraintType != TargetLowering::C_Register) {
10468 emitInlineAsmError(Call, "unknown asm constraint '" +
10469 Twine(OpInfo.ConstraintCode) + "'");
10470 return;
10471 }
10472
10473 // TODO: Support this.
10474 if (OpInfo.isIndirect) {
10475 emitInlineAsmError(
10476 Call, "Don't know how to handle indirect register inputs yet "
10477 "for constraint '" +
10478 Twine(OpInfo.ConstraintCode) + "'");
10479 return;
10480 }
10481
10482 // Copy the input into the appropriate registers.
10483 if (OpInfo.AssignedRegs.Regs.empty()) {
10484 emitInlineAsmError(Call,
10485 "couldn't allocate input reg for constraint '" +
10486 Twine(OpInfo.ConstraintCode) + "'");
10487 return;
10488 }
10489
10490 if (DetectWriteToReservedRegister())
10491 return;
10492
10493 SDLoc dl = getCurSDLoc();
10494
10495 OpInfo.AssignedRegs.getCopyToRegs(InOperandVal, DAG, dl, Chain, &Glue,
10496 &Call);
10497
10498 OpInfo.AssignedRegs.AddInlineAsmOperands(InlineAsm::Kind::RegUse, false,
10499 0, dl, DAG, AsmNodeOperands);
10500 break;
10501 }
10503 // Add the clobbered value to the operand list, so that the register
10504 // allocator is aware that the physreg got clobbered.
10505 if (!OpInfo.AssignedRegs.Regs.empty())
10507 false, 0, getCurSDLoc(), DAG,
10508 AsmNodeOperands);
10509 break;
10510 }
10511 }
10512
10513 // Finish up input operands. Set the input chain and add the flag last.
10514 AsmNodeOperands[InlineAsm::Op_InputChain] = Chain;
10515 if (Glue.getNode()) AsmNodeOperands.push_back(Glue);
10516
10517 unsigned ISDOpc = IsCallBr ? ISD::INLINEASM_BR : ISD::INLINEASM;
10518 Chain = DAG.getNode(ISDOpc, getCurSDLoc(),
10519 DAG.getVTList(MVT::Other, MVT::Glue), AsmNodeOperands);
10520 Glue = Chain.getValue(1);
10521
10522 // Do additional work to generate outputs.
10523
10524 SmallVector<EVT, 1> ResultVTs;
10525 SmallVector<SDValue, 1> ResultValues;
10526 SmallVector<SDValue, 8> OutChains;
10527
10528 llvm::Type *CallResultType = Call.getType();
10529 ArrayRef<Type *> ResultTypes;
10530 if (StructType *StructResult = dyn_cast<StructType>(CallResultType))
10531 ResultTypes = StructResult->elements();
10532 else if (!CallResultType->isVoidTy())
10533 ResultTypes = ArrayRef(CallResultType);
10534
10535 auto CurResultType = ResultTypes.begin();
10536 auto handleRegAssign = [&](SDValue V) {
10537 assert(CurResultType != ResultTypes.end() && "Unexpected value");
10538 assert((*CurResultType)->isSized() && "Unexpected unsized type");
10539 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), *CurResultType);
10540 ++CurResultType;
10541 // If the type of the inline asm call site return value is different but has
10542 // same size as the type of the asm output bitcast it. One example of this
10543 // is for vectors with different width / number of elements. This can
10544 // happen for register classes that can contain multiple different value
10545 // types. The preg or vreg allocated may not have the same VT as was
10546 // expected.
10547 //
10548 // This can also happen for a return value that disagrees with the register
10549 // class it is put in, eg. a double in a general-purpose register on a
10550 // 32-bit machine.
10551 if (ResultVT != V.getValueType() &&
10552 ResultVT.getSizeInBits() == V.getValueSizeInBits())
10553 V = DAG.getNode(ISD::BITCAST, getCurSDLoc(), ResultVT, V);
10554 else if (ResultVT != V.getValueType() && ResultVT.isInteger() &&
10555 V.getValueType().isInteger()) {
10556 // If a result value was tied to an input value, the computed result
10557 // may have a wider width than the expected result. Extract the
10558 // relevant portion.
10559 V = DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), ResultVT, V);
10560 }
10561 assert(ResultVT == V.getValueType() && "Asm result value mismatch!");
10562 ResultVTs.push_back(ResultVT);
10563 ResultValues.push_back(V);
10564 };
10565
10566 // Deal with output operands.
10567 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
10568 if (OpInfo.Type == InlineAsm::isOutput) {
10569 SDValue Val;
10570 // Skip trivial output operands.
10571 if (OpInfo.AssignedRegs.Regs.empty())
10572 continue;
10573
10574 switch (OpInfo.ConstraintType) {
10577 Val = OpInfo.AssignedRegs.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(),
10578 Chain, &Glue, &Call);
10579 break;
10582 Val = TLI.LowerAsmOutputForConstraint(Chain, Glue, getCurSDLoc(),
10583 OpInfo, DAG);
10584 break;
10586 break; // Already handled.
10588 break; // Silence warning.
10590 assert(false && "Unexpected unknown constraint");
10591 }
10592
10593 // Indirect output manifest as stores. Record output chains.
10594 if (OpInfo.isIndirect) {
10595 const Value *Ptr = OpInfo.CallOperandVal;
10596 assert(Ptr && "Expected value CallOperandVal for indirect asm operand");
10597 SDValue Store = DAG.getStore(Chain, getCurSDLoc(), Val, getValue(Ptr),
10598 MachinePointerInfo(Ptr));
10599 OutChains.push_back(Store);
10600 } else {
10601 // generate CopyFromRegs to associated registers.
10602 assert(!Call.getType()->isVoidTy() && "Bad inline asm!");
10603 if (Val.getOpcode() == ISD::MERGE_VALUES) {
10604 for (const SDValue &V : Val->op_values())
10605 handleRegAssign(V);
10606 } else
10607 handleRegAssign(Val);
10608 }
10609 }
10610 }
10611
10612 // Set results.
10613 if (!ResultValues.empty()) {
10614 assert(CurResultType == ResultTypes.end() &&
10615 "Mismatch in number of ResultTypes");
10616 assert(ResultValues.size() == ResultTypes.size() &&
10617 "Mismatch in number of output operands in asm result");
10618
10620 DAG.getVTList(ResultVTs), ResultValues);
10621 setValue(&Call, V);
10622 }
10623
10624 // Collect store chains.
10625 if (!OutChains.empty())
10626 Chain = DAG.getNode(ISD::TokenFactor, getCurSDLoc(), MVT::Other, OutChains);
10627
10628 if (EmitEHLabels) {
10629 Chain = lowerEndEH(Chain, cast<InvokeInst>(&Call), EHPadBB, BeginLabel);
10630 }
10631
10632 // Only Update Root if inline assembly has a memory effect.
10633 if (ResultValues.empty() || HasSideEffect || !OutChains.empty() || IsCallBr ||
10634 EmitEHLabels)
10635 DAG.setRoot(Chain);
10636}
10637
10638void SelectionDAGBuilder::emitInlineAsmError(const CallBase &Call,
10639 const Twine &Message) {
10640 LLVMContext &Ctx = *DAG.getContext();
10641 Ctx.diagnose(DiagnosticInfoInlineAsm(Call, Message));
10642
10643 // Make sure we leave the DAG in a valid state
10644 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10645 SmallVector<EVT, 1> ValueVTs;
10646 ComputeValueVTs(TLI, DAG.getDataLayout(), Call.getType(), ValueVTs);
10647
10648 if (ValueVTs.empty())
10649 return;
10650
10652 for (const EVT &VT : ValueVTs)
10653 Ops.push_back(DAG.getUNDEF(VT));
10654
10655 setValue(&Call, DAG.getMergeValues(Ops, getCurSDLoc()));
10656}
10657
10658void SelectionDAGBuilder::visitVAStart(const CallInst &I) {
10659 DAG.setRoot(DAG.getNode(ISD::VASTART, getCurSDLoc(),
10660 MVT::Other, getRoot(),
10661 getValue(I.getArgOperand(0)),
10662 DAG.getSrcValue(I.getArgOperand(0))));
10663}
10664
10665void SelectionDAGBuilder::visitVAArg(const VAArgInst &I) {
10666 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10667 const DataLayout &DL = DAG.getDataLayout();
10668 SDValue V = DAG.getVAArg(
10669 TLI.getMemValueType(DAG.getDataLayout(), I.getType()), getCurSDLoc(),
10670 getRoot(), getValue(I.getOperand(0)), DAG.getSrcValue(I.getOperand(0)),
10671 DL.getABITypeAlign(I.getType()).value());
10672 DAG.setRoot(V.getValue(1));
10673
10674 if (I.getType()->isPointerTy())
10675 V = DAG.getPtrExtOrTrunc(
10676 V, getCurSDLoc(), TLI.getValueType(DAG.getDataLayout(), I.getType()));
10677 setValue(&I, V);
10678}
10679
10680void SelectionDAGBuilder::visitVAEnd(const CallInst &I) {
10681 DAG.setRoot(DAG.getNode(ISD::VAEND, getCurSDLoc(),
10682 MVT::Other, getRoot(),
10683 getValue(I.getArgOperand(0)),
10684 DAG.getSrcValue(I.getArgOperand(0))));
10685}
10686
10687void SelectionDAGBuilder::visitVACopy(const CallInst &I) {
10688 DAG.setRoot(DAG.getNode(ISD::VACOPY, getCurSDLoc(),
10689 MVT::Other, getRoot(),
10690 getValue(I.getArgOperand(0)),
10691 getValue(I.getArgOperand(1)),
10692 DAG.getSrcValue(I.getArgOperand(0)),
10693 DAG.getSrcValue(I.getArgOperand(1))));
10694}
10695
10697 const Instruction &I,
10698 SDValue Op) {
10699 std::optional<ConstantRange> CR = getRange(I);
10700
10701 if (!CR || CR->isFullSet() || CR->isEmptySet() || CR->isUpperWrapped())
10702 return Op;
10703
10704 APInt Lo = CR->getUnsignedMin();
10705 if (!Lo.isMinValue())
10706 return Op;
10707
10708 APInt Hi = CR->getUnsignedMax();
10709 unsigned Bits = std::max(Hi.getActiveBits(),
10710 static_cast<unsigned>(IntegerType::MIN_INT_BITS));
10711
10712 EVT SmallVT = EVT::getIntegerVT(*DAG.getContext(), Bits);
10713
10714 SDLoc SL = getCurSDLoc();
10715
10716 SDValue ZExt = DAG.getNode(ISD::AssertZext, SL, Op.getValueType(), Op,
10717 DAG.getValueType(SmallVT));
10718 unsigned NumVals = Op.getNode()->getNumValues();
10719 if (NumVals == 1)
10720 return ZExt;
10721
10723
10724 Ops.push_back(ZExt);
10725 for (unsigned I = 1; I != NumVals; ++I)
10726 Ops.push_back(Op.getValue(I));
10727
10728 return DAG.getMergeValues(Ops, SL);
10729}
10730
10732 SelectionDAG &DAG, const Instruction &I, SDValue Op) {
10733 FPClassTest Classes = getNoFPClass(I);
10734 if (Classes == fcNone)
10735 return Op;
10736
10737 SDLoc SL = getCurSDLoc();
10738 SDValue TestConst = DAG.getTargetConstant(Classes, SDLoc(), MVT::i32);
10739
10740 if (Op.getOpcode() != ISD::MERGE_VALUES) {
10741 return DAG.getNode(ISD::AssertNoFPClass, SL, Op.getValueType(), Op,
10742 TestConst);
10743 }
10744
10745 SmallVector<SDValue, 8> Ops(Op.getNumOperands());
10746 for (unsigned I = 0, E = Ops.size(); I != E; ++I) {
10747 SDValue MergeOp = Op.getOperand(I);
10748 Ops[I] = DAG.getNode(ISD::AssertNoFPClass, SL, MergeOp.getValueType(),
10749 MergeOp, TestConst);
10750 }
10751
10752 return DAG.getMergeValues(Ops, SL);
10753}
10754
10755/// Populate a CallLowerinInfo (into \p CLI) based on the properties of
10756/// the call being lowered.
10757///
10758/// This is a helper for lowering intrinsics that follow a target calling
10759/// convention or require stack pointer adjustment. Only a subset of the
10760/// intrinsic's operands need to participate in the calling convention.
10763 unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy,
10764 AttributeSet RetAttrs, bool IsPatchPoint) {
10766 Args.reserve(NumArgs);
10767
10768 // Populate the argument list.
10769 // Attributes for args start at offset 1, after the return attribute.
10770 for (unsigned ArgI = ArgIdx, ArgE = ArgIdx + NumArgs;
10771 ArgI != ArgE; ++ArgI) {
10772 const Value *V = Call->getOperand(ArgI);
10773
10774 assert(!V->getType()->isEmptyTy() && "Empty type passed to intrinsic.");
10775
10776 TargetLowering::ArgListEntry Entry(getValue(V), V->getType());
10777 Entry.setAttributes(Call, ArgI);
10778 Args.push_back(Entry);
10779 }
10780
10782 .setChain(getRoot())
10783 .setCallee(Call->getCallingConv(), ReturnTy, Callee, std::move(Args),
10784 RetAttrs)
10785 .setDiscardResult(Call->use_empty())
10786 .setIsPatchPoint(IsPatchPoint)
10788 Call->countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0);
10789}
10790
10791/// Add a stack map intrinsic call's live variable operands to a stackmap
10792/// or patchpoint target node's operand list.
10793///
10794/// Constants are converted to TargetConstants purely as an optimization to
10795/// avoid constant materialization and register allocation.
10796///
10797/// FrameIndex operands are converted to TargetFrameIndex so that ISEL does not
10798/// generate addess computation nodes, and so FinalizeISel can convert the
10799/// TargetFrameIndex into a DirectMemRefOp StackMap location. This avoids
10800/// address materialization and register allocation, but may also be required
10801/// for correctness. If a StackMap (or PatchPoint) intrinsic directly uses an
10802/// alloca in the entry block, then the runtime may assume that the alloca's
10803/// StackMap location can be read immediately after compilation and that the
10804/// location is valid at any point during execution (this is similar to the
10805/// assumption made by the llvm.gcroot intrinsic). If the alloca's location were
10806/// only available in a register, then the runtime would need to trap when
10807/// execution reaches the StackMap in order to read the alloca's location.
10808static void addStackMapLiveVars(const CallBase &Call, unsigned StartIdx,
10810 SelectionDAGBuilder &Builder) {
10811 SelectionDAG &DAG = Builder.DAG;
10812 for (unsigned I = StartIdx; I < Call.arg_size(); I++) {
10813 SDValue Op = Builder.getValue(Call.getArgOperand(I));
10814
10815 // Things on the stack are pointer-typed, meaning that they are already
10816 // legal and can be emitted directly to target nodes.
10818 Ops.push_back(DAG.getTargetFrameIndex(FI->getIndex(), Op.getValueType()));
10819 } else {
10820 // Otherwise emit a target independent node to be legalised.
10821 Ops.push_back(Builder.getValue(Call.getArgOperand(I)));
10822 }
10823 }
10824}
10825
10826/// Lower llvm.experimental.stackmap.
10827void SelectionDAGBuilder::visitStackmap(const CallInst &CI) {
10828 // void @llvm.experimental.stackmap(i64 <id>, i32 <numShadowBytes>,
10829 // [live variables...])
10830
10831 assert(CI.getType()->isVoidTy() && "Stackmap cannot return a value.");
10832
10833 SDValue Chain, InGlue, Callee;
10835
10836 SDLoc DL = getCurSDLoc();
10838
10839 // The stackmap intrinsic only records the live variables (the arguments
10840 // passed to it) and emits NOPS (if requested). Unlike the patchpoint
10841 // intrinsic, this won't be lowered to a function call. This means we don't
10842 // have to worry about calling conventions and target specific lowering code.
10843 // Instead we perform the call lowering right here.
10844 //
10845 // chain, flag = CALLSEQ_START(chain, 0, 0)
10846 // chain, flag = STACKMAP(id, nbytes, ..., chain, flag)
10847 // chain, flag = CALLSEQ_END(chain, 0, 0, flag)
10848 //
10849 Chain = DAG.getCALLSEQ_START(getRoot(), 0, 0, DL);
10850 InGlue = Chain.getValue(1);
10851
10852 // Add the STACKMAP operands, starting with DAG house-keeping.
10853 Ops.push_back(Chain);
10854 Ops.push_back(InGlue);
10855
10856 // Add the <id>, <numShadowBytes> operands.
10857 //
10858 // These do not require legalisation, and can be emitted directly to target
10859 // constant nodes.
10861 assert(ID.getValueType() == MVT::i64);
10862 SDValue IDConst =
10863 DAG.getTargetConstant(ID->getAsZExtVal(), DL, ID.getValueType());
10864 Ops.push_back(IDConst);
10865
10866 SDValue Shad = getValue(CI.getArgOperand(1));
10867 assert(Shad.getValueType() == MVT::i32);
10868 SDValue ShadConst =
10869 DAG.getTargetConstant(Shad->getAsZExtVal(), DL, Shad.getValueType());
10870 Ops.push_back(ShadConst);
10871
10872 // Add the live variables.
10873 addStackMapLiveVars(CI, 2, DL, Ops, *this);
10874
10875 // Create the STACKMAP node.
10876 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
10877 Chain = DAG.getNode(ISD::STACKMAP, DL, NodeTys, Ops);
10878 InGlue = Chain.getValue(1);
10879
10880 Chain = DAG.getCALLSEQ_END(Chain, 0, 0, InGlue, DL);
10881
10882 // Stackmaps don't generate values, so nothing goes into the NodeMap.
10883
10884 // Set the root to the target-lowered call chain.
10885 DAG.setRoot(Chain);
10886
10887 // Inform the Frame Information that we have a stackmap in this function.
10888 FuncInfo.MF->getFrameInfo().setHasStackMap();
10889}
10890
10891/// Lower llvm.experimental.patchpoint directly to its target opcode.
10892void SelectionDAGBuilder::visitPatchpoint(const CallBase &CB,
10893 const BasicBlock *EHPadBB) {
10894 // <ty> @llvm.experimental.patchpoint.<ty>(i64 <id>,
10895 // i32 <numBytes>,
10896 // i8* <target>,
10897 // i32 <numArgs>,
10898 // [Args...],
10899 // [live variables...])
10900
10902 bool IsAnyRegCC = CC == CallingConv::AnyReg;
10903 bool HasDef = !CB.getType()->isVoidTy();
10904 SDLoc dl = getCurSDLoc();
10906
10907 // Handle immediate and symbolic callees.
10908 if (auto* ConstCallee = dyn_cast<ConstantSDNode>(Callee))
10909 Callee = DAG.getIntPtrConstant(ConstCallee->getZExtValue(), dl,
10910 /*isTarget=*/true);
10911 else if (auto* SymbolicCallee = dyn_cast<GlobalAddressSDNode>(Callee))
10912 Callee = DAG.getTargetGlobalAddress(SymbolicCallee->getGlobal(),
10913 SDLoc(SymbolicCallee),
10914 SymbolicCallee->getValueType(0));
10915
10916 // Get the real number of arguments participating in the call <numArgs>
10918 unsigned NumArgs = NArgVal->getAsZExtVal();
10919
10920 // Skip the four meta args: <id>, <numNopBytes>, <target>, <numArgs>
10921 // Intrinsics include all meta-operands up to but not including CC.
10922 unsigned NumMetaOpers = PatchPointOpers::CCPos;
10923 assert(CB.arg_size() >= NumMetaOpers + NumArgs &&
10924 "Not enough arguments provided to the patchpoint intrinsic");
10925
10926 // For AnyRegCC the arguments are lowered later on manually.
10927 unsigned NumCallArgs = IsAnyRegCC ? 0 : NumArgs;
10928 Type *ReturnTy =
10929 IsAnyRegCC ? Type::getVoidTy(*DAG.getContext()) : CB.getType();
10930
10931 TargetLowering::CallLoweringInfo CLI(DAG);
10932 populateCallLoweringInfo(CLI, &CB, NumMetaOpers, NumCallArgs, Callee,
10933 ReturnTy, CB.getAttributes().getRetAttrs(), true);
10934 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
10935
10936 SDNode *CallEnd = Result.second.getNode();
10937 if (CallEnd->getOpcode() == ISD::EH_LABEL)
10938 CallEnd = CallEnd->getOperand(0).getNode();
10939 if (HasDef && (CallEnd->getOpcode() == ISD::CopyFromReg))
10940 CallEnd = CallEnd->getOperand(0).getNode();
10941
10942 /// Get a call instruction from the call sequence chain.
10943 /// Tail calls are not allowed.
10944 assert(CallEnd->getOpcode() == ISD::CALLSEQ_END &&
10945 "Expected a callseq node.");
10946 SDNode *Call = CallEnd->getOperand(0).getNode();
10947 bool HasGlue = Call->getGluedNode();
10948
10949 // Replace the target specific call node with the patchable intrinsic.
10951
10952 // Push the chain.
10953 Ops.push_back(*(Call->op_begin()));
10954
10955 // Optionally, push the glue (if any).
10956 if (HasGlue)
10957 Ops.push_back(*(Call->op_end() - 1));
10958
10959 // Push the register mask info.
10960 if (HasGlue)
10961 Ops.push_back(*(Call->op_end() - 2));
10962 else
10963 Ops.push_back(*(Call->op_end() - 1));
10964
10965 // Add the <id> and <numBytes> constants.
10967 Ops.push_back(DAG.getTargetConstant(IDVal->getAsZExtVal(), dl, MVT::i64));
10969 Ops.push_back(DAG.getTargetConstant(NBytesVal->getAsZExtVal(), dl, MVT::i32));
10970
10971 // Add the callee.
10972 Ops.push_back(Callee);
10973
10974 // Adjust <numArgs> to account for any arguments that have been passed on the
10975 // stack instead.
10976 // Call Node: Chain, Target, {Args}, RegMask, [Glue]
10977 unsigned NumCallRegArgs = Call->getNumOperands() - (HasGlue ? 4 : 3);
10978 NumCallRegArgs = IsAnyRegCC ? NumArgs : NumCallRegArgs;
10979 Ops.push_back(DAG.getTargetConstant(NumCallRegArgs, dl, MVT::i32));
10980
10981 // Add the calling convention
10982 Ops.push_back(DAG.getTargetConstant((unsigned)CC, dl, MVT::i32));
10983
10984 // Add the arguments we omitted previously. The register allocator should
10985 // place these in any free register.
10986 if (IsAnyRegCC)
10987 for (unsigned i = NumMetaOpers, e = NumMetaOpers + NumArgs; i != e; ++i)
10988 Ops.push_back(getValue(CB.getArgOperand(i)));
10989
10990 // Push the arguments from the call instruction.
10991 SDNode::op_iterator e = HasGlue ? Call->op_end()-2 : Call->op_end()-1;
10992 Ops.append(Call->op_begin() + 2, e);
10993
10994 // Push live variables for the stack map.
10995 addStackMapLiveVars(CB, NumMetaOpers + NumArgs, dl, Ops, *this);
10996
10997 SDVTList NodeTys;
10998 if (IsAnyRegCC && HasDef) {
10999 // Create the return types based on the intrinsic definition
11000 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11001 SmallVector<EVT, 3> ValueVTs;
11002 ComputeValueVTs(TLI, DAG.getDataLayout(), CB.getType(), ValueVTs);
11003 assert(ValueVTs.size() == 1 && "Expected only one return value type.");
11004
11005 // There is always a chain and a glue type at the end
11006 ValueVTs.push_back(MVT::Other);
11007 ValueVTs.push_back(MVT::Glue);
11008 NodeTys = DAG.getVTList(ValueVTs);
11009 } else
11010 NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
11011
11012 // Replace the target specific call node with a PATCHPOINT node.
11013 SDValue PPV = DAG.getNode(ISD::PATCHPOINT, dl, NodeTys, Ops);
11014
11015 // Update the NodeMap.
11016 if (HasDef) {
11017 if (IsAnyRegCC)
11018 setValue(&CB, SDValue(PPV.getNode(), 0));
11019 else
11020 setValue(&CB, Result.first);
11021 }
11022
11023 // Fixup the consumers of the intrinsic. The chain and glue may be used in the
11024 // call sequence. Furthermore the location of the chain and glue can change
11025 // when the AnyReg calling convention is used and the intrinsic returns a
11026 // value.
11027 if (IsAnyRegCC && HasDef) {
11028 SDValue From[] = {SDValue(Call, 0), SDValue(Call, 1)};
11029 SDValue To[] = {PPV.getValue(1), PPV.getValue(2)};
11030 DAG.ReplaceAllUsesOfValuesWith(From, To, 2);
11031 } else
11032 DAG.ReplaceAllUsesWith(Call, PPV.getNode());
11033 DAG.DeleteNode(Call);
11034
11035 // Inform the Frame Information that we have a patchpoint in this function.
11036 FuncInfo.MF->getFrameInfo().setHasPatchPoint();
11037}
11038
11039void SelectionDAGBuilder::visitVectorReduce(const CallInst &I,
11040 unsigned Intrinsic) {
11041 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11042 SDValue Op1 = getValue(I.getArgOperand(0));
11043 SDValue Op2;
11044 if (I.arg_size() > 1)
11045 Op2 = getValue(I.getArgOperand(1));
11046 SDLoc dl = getCurSDLoc();
11047 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
11048 SDValue Res;
11049 SDNodeFlags SDFlags;
11050 if (auto *FPMO = dyn_cast<FPMathOperator>(&I))
11051 SDFlags.copyFMF(*FPMO);
11052
11053 switch (Intrinsic) {
11054 case Intrinsic::vector_reduce_fadd:
11055 if (SDFlags.hasAllowReassociation())
11056 Res = DAG.getNode(ISD::FADD, dl, VT, Op1,
11057 DAG.getNode(ISD::VECREDUCE_FADD, dl, VT, Op2, SDFlags),
11058 SDFlags);
11059 else
11060 Res = DAG.getNode(ISD::VECREDUCE_SEQ_FADD, dl, VT, Op1, Op2, SDFlags);
11061 break;
11062 case Intrinsic::vector_reduce_fmul:
11063 if (SDFlags.hasAllowReassociation())
11064 Res = DAG.getNode(ISD::FMUL, dl, VT, Op1,
11065 DAG.getNode(ISD::VECREDUCE_FMUL, dl, VT, Op2, SDFlags),
11066 SDFlags);
11067 else
11068 Res = DAG.getNode(ISD::VECREDUCE_SEQ_FMUL, dl, VT, Op1, Op2, SDFlags);
11069 break;
11070 case Intrinsic::vector_reduce_add:
11071 Res = DAG.getNode(ISD::VECREDUCE_ADD, dl, VT, Op1);
11072 break;
11073 case Intrinsic::vector_reduce_mul:
11074 Res = DAG.getNode(ISD::VECREDUCE_MUL, dl, VT, Op1);
11075 break;
11076 case Intrinsic::vector_reduce_and:
11077 Res = DAG.getNode(ISD::VECREDUCE_AND, dl, VT, Op1);
11078 break;
11079 case Intrinsic::vector_reduce_or:
11080 Res = DAG.getNode(ISD::VECREDUCE_OR, dl, VT, Op1);
11081 break;
11082 case Intrinsic::vector_reduce_xor:
11083 Res = DAG.getNode(ISD::VECREDUCE_XOR, dl, VT, Op1);
11084 break;
11085 case Intrinsic::vector_reduce_smax:
11086 Res = DAG.getNode(ISD::VECREDUCE_SMAX, dl, VT, Op1);
11087 break;
11088 case Intrinsic::vector_reduce_smin:
11089 Res = DAG.getNode(ISD::VECREDUCE_SMIN, dl, VT, Op1);
11090 break;
11091 case Intrinsic::vector_reduce_umax:
11092 Res = DAG.getNode(ISD::VECREDUCE_UMAX, dl, VT, Op1);
11093 break;
11094 case Intrinsic::vector_reduce_umin:
11095 Res = DAG.getNode(ISD::VECREDUCE_UMIN, dl, VT, Op1);
11096 break;
11097 case Intrinsic::vector_reduce_fmax:
11098 Res = DAG.getNode(ISD::VECREDUCE_FMAX, dl, VT, Op1, SDFlags);
11099 break;
11100 case Intrinsic::vector_reduce_fmin:
11101 Res = DAG.getNode(ISD::VECREDUCE_FMIN, dl, VT, Op1, SDFlags);
11102 break;
11103 case Intrinsic::vector_reduce_fmaximum:
11104 Res = DAG.getNode(ISD::VECREDUCE_FMAXIMUM, dl, VT, Op1, SDFlags);
11105 break;
11106 case Intrinsic::vector_reduce_fminimum:
11107 Res = DAG.getNode(ISD::VECREDUCE_FMINIMUM, dl, VT, Op1, SDFlags);
11108 break;
11109 default:
11110 llvm_unreachable("Unhandled vector reduce intrinsic");
11111 }
11112 setValue(&I, Res);
11113}
11114
11115/// Returns an AttributeList representing the attributes applied to the return
11116/// value of the given call.
11119 if (CLI.RetSExt)
11120 Attrs.push_back(Attribute::SExt);
11121 if (CLI.RetZExt)
11122 Attrs.push_back(Attribute::ZExt);
11123 if (CLI.IsInReg)
11124 Attrs.push_back(Attribute::InReg);
11125
11126 return AttributeList::get(CLI.RetTy->getContext(), AttributeList::ReturnIndex,
11127 Attrs);
11128}
11129
11130/// TargetLowering::LowerCallTo - This is the default LowerCallTo
11131/// implementation, which just calls LowerCall.
11132/// FIXME: When all targets are
11133/// migrated to using LowerCall, this hook should be integrated into SDISel.
11134std::pair<SDValue, SDValue>
11136 LLVMContext &Context = CLI.RetTy->getContext();
11137
11138 // Handle the incoming return values from the call.
11139 CLI.Ins.clear();
11140 SmallVector<Type *, 4> RetOrigTys;
11142 auto &DL = CLI.DAG.getDataLayout();
11143 ComputeValueTypes(DL, CLI.OrigRetTy, RetOrigTys, &Offsets);
11144
11145 SmallVector<EVT, 4> RetVTs;
11146 if (CLI.RetTy != CLI.OrigRetTy) {
11147 assert(RetOrigTys.size() == 1 &&
11148 "Only supported for non-aggregate returns");
11149 RetVTs.push_back(getValueType(DL, CLI.RetTy));
11150 } else {
11151 for (Type *Ty : RetOrigTys)
11152 RetVTs.push_back(getValueType(DL, Ty));
11153 }
11154
11155 if (CLI.IsPostTypeLegalization) {
11156 // If we are lowering a libcall after legalization, split the return type.
11157 SmallVector<Type *, 4> OldRetOrigTys;
11158 SmallVector<EVT, 4> OldRetVTs;
11159 SmallVector<TypeSize, 4> OldOffsets;
11160 RetOrigTys.swap(OldRetOrigTys);
11161 RetVTs.swap(OldRetVTs);
11162 Offsets.swap(OldOffsets);
11163
11164 for (size_t i = 0, e = OldRetVTs.size(); i != e; ++i) {
11165 EVT RetVT = OldRetVTs[i];
11166 uint64_t Offset = OldOffsets[i];
11167 MVT RegisterVT = getRegisterType(Context, RetVT);
11168 unsigned NumRegs = getNumRegisters(Context, RetVT);
11169 unsigned RegisterVTByteSZ = RegisterVT.getSizeInBits() / 8;
11170 RetOrigTys.append(NumRegs, OldRetOrigTys[i]);
11171 RetVTs.append(NumRegs, RegisterVT);
11172 for (unsigned j = 0; j != NumRegs; ++j)
11173 Offsets.push_back(TypeSize::getFixed(Offset + j * RegisterVTByteSZ));
11174 }
11175 }
11176
11178 GetReturnInfo(CLI.CallConv, CLI.RetTy, getReturnAttrs(CLI), Outs, *this, DL);
11179
11180 bool CanLowerReturn =
11182 CLI.IsVarArg, Outs, Context, CLI.RetTy);
11183
11184 SDValue DemoteStackSlot;
11185 int DemoteStackIdx = -100;
11186 if (!CanLowerReturn) {
11187 // FIXME: equivalent assert?
11188 // assert(!CS.hasInAllocaArgument() &&
11189 // "sret demotion is incompatible with inalloca");
11190 uint64_t TySize = DL.getTypeAllocSize(CLI.RetTy);
11191 Align Alignment = DL.getPrefTypeAlign(CLI.RetTy);
11193 DemoteStackIdx =
11194 MF.getFrameInfo().CreateStackObject(TySize, Alignment, false);
11195 Type *StackSlotPtrType = PointerType::get(Context, DL.getAllocaAddrSpace());
11196
11197 DemoteStackSlot = CLI.DAG.getFrameIndex(DemoteStackIdx, getFrameIndexTy(DL));
11198 ArgListEntry Entry(DemoteStackSlot, StackSlotPtrType);
11199 Entry.IsSRet = true;
11200 Entry.Alignment = Alignment;
11201 CLI.getArgs().insert(CLI.getArgs().begin(), Entry);
11202 CLI.NumFixedArgs += 1;
11203 CLI.getArgs()[0].IndirectType = CLI.RetTy;
11204 CLI.RetTy = CLI.OrigRetTy = Type::getVoidTy(Context);
11205
11206 // sret demotion isn't compatible with tail-calls, since the sret argument
11207 // points into the callers stack frame.
11208 CLI.IsTailCall = false;
11209 } else {
11210 bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
11211 CLI.RetTy, CLI.CallConv, CLI.IsVarArg, DL);
11212 for (unsigned I = 0, E = RetVTs.size(); I != E; ++I) {
11213 ISD::ArgFlagsTy Flags;
11214 if (NeedsRegBlock) {
11215 Flags.setInConsecutiveRegs();
11216 if (I == RetVTs.size() - 1)
11217 Flags.setInConsecutiveRegsLast();
11218 }
11219 EVT VT = RetVTs[I];
11220 MVT RegisterVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11221 unsigned NumRegs =
11222 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11223 for (unsigned i = 0; i != NumRegs; ++i) {
11224 ISD::InputArg Ret(Flags, RegisterVT, VT, RetOrigTys[I],
11226 if (CLI.RetTy->isPointerTy()) {
11227 Ret.Flags.setPointer();
11229 cast<PointerType>(CLI.RetTy)->getAddressSpace());
11230 }
11231 if (CLI.RetSExt)
11232 Ret.Flags.setSExt();
11233 if (CLI.RetZExt)
11234 Ret.Flags.setZExt();
11235 if (CLI.IsInReg)
11236 Ret.Flags.setInReg();
11237 CLI.Ins.push_back(Ret);
11238 }
11239 }
11240 }
11241
11242 // We push in swifterror return as the last element of CLI.Ins.
11243 ArgListTy &Args = CLI.getArgs();
11244 if (supportSwiftError()) {
11245 for (const ArgListEntry &Arg : Args) {
11246 if (Arg.IsSwiftError) {
11247 ISD::ArgFlagsTy Flags;
11248 Flags.setSwiftError();
11250 PointerType::getUnqual(Context),
11251 /*Used=*/true, ISD::InputArg::NoArgIndex, 0);
11252 CLI.Ins.push_back(Ret);
11253 }
11254 }
11255 }
11256
11257 // Handle all of the outgoing arguments.
11258 CLI.Outs.clear();
11259 CLI.OutVals.clear();
11260 for (unsigned i = 0, e = Args.size(); i != e; ++i) {
11261 SmallVector<Type *, 4> OrigArgTys;
11262 ComputeValueTypes(DL, Args[i].OrigTy, OrigArgTys);
11263 // FIXME: Split arguments if CLI.IsPostTypeLegalization
11264 Type *FinalType = Args[i].Ty;
11265 if (Args[i].IsByVal)
11266 FinalType = Args[i].IndirectType;
11267 bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
11268 FinalType, CLI.CallConv, CLI.IsVarArg, DL);
11269 for (unsigned Value = 0, NumValues = OrigArgTys.size(); Value != NumValues;
11270 ++Value) {
11271 Type *OrigArgTy = OrigArgTys[Value];
11272 Type *ArgTy = OrigArgTy;
11273 if (Args[i].Ty != Args[i].OrigTy) {
11274 assert(Value == 0 && "Only supported for non-aggregate arguments");
11275 ArgTy = Args[i].Ty;
11276 }
11277
11278 EVT VT = getValueType(DL, ArgTy);
11279 SDValue Op = SDValue(Args[i].Node.getNode(),
11280 Args[i].Node.getResNo() + Value);
11281 ISD::ArgFlagsTy Flags;
11282
11283 // Certain targets (such as MIPS), may have a different ABI alignment
11284 // for a type depending on the context. Give the target a chance to
11285 // specify the alignment it wants.
11286 const Align OriginalAlignment(getABIAlignmentForCallingConv(ArgTy, DL));
11287 Flags.setOrigAlign(OriginalAlignment);
11288
11289 if (i >= CLI.NumFixedArgs)
11290 Flags.setVarArg();
11291 if (ArgTy->isPointerTy()) {
11292 Flags.setPointer();
11293 Flags.setPointerAddrSpace(cast<PointerType>(ArgTy)->getAddressSpace());
11294 }
11295 if (Args[i].IsZExt)
11296 Flags.setZExt();
11297 if (Args[i].IsSExt)
11298 Flags.setSExt();
11299 if (Args[i].IsNoExt)
11300 Flags.setNoExt();
11301 if (Args[i].IsInReg) {
11302 // If we are using vectorcall calling convention, a structure that is
11303 // passed InReg - is surely an HVA
11305 isa<StructType>(FinalType)) {
11306 // The first value of a structure is marked
11307 if (0 == Value)
11308 Flags.setHvaStart();
11309 Flags.setHva();
11310 }
11311 // Set InReg Flag
11312 Flags.setInReg();
11313 }
11314 if (Args[i].IsSRet)
11315 Flags.setSRet();
11316 if (Args[i].IsSwiftSelf)
11317 Flags.setSwiftSelf();
11318 if (Args[i].IsSwiftAsync)
11319 Flags.setSwiftAsync();
11320 if (Args[i].IsSwiftError)
11321 Flags.setSwiftError();
11322 if (Args[i].IsCFGuardTarget)
11323 Flags.setCFGuardTarget();
11324 if (Args[i].IsByVal)
11325 Flags.setByVal();
11326 if (Args[i].IsByRef)
11327 Flags.setByRef();
11328 if (Args[i].IsPreallocated) {
11329 Flags.setPreallocated();
11330 // Set the byval flag for CCAssignFn callbacks that don't know about
11331 // preallocated. This way we can know how many bytes we should've
11332 // allocated and how many bytes a callee cleanup function will pop. If
11333 // we port preallocated to more targets, we'll have to add custom
11334 // preallocated handling in the various CC lowering callbacks.
11335 Flags.setByVal();
11336 }
11337 if (Args[i].IsInAlloca) {
11338 Flags.setInAlloca();
11339 // Set the byval flag for CCAssignFn callbacks that don't know about
11340 // inalloca. This way we can know how many bytes we should've allocated
11341 // and how many bytes a callee cleanup function will pop. If we port
11342 // inalloca to more targets, we'll have to add custom inalloca handling
11343 // in the various CC lowering callbacks.
11344 Flags.setByVal();
11345 }
11346 Align MemAlign;
11347 if (Args[i].IsByVal || Args[i].IsInAlloca || Args[i].IsPreallocated) {
11348 unsigned FrameSize = DL.getTypeAllocSize(Args[i].IndirectType);
11349 Flags.setByValSize(FrameSize);
11350
11351 // info is not there but there are cases it cannot get right.
11352 if (auto MA = Args[i].Alignment)
11353 MemAlign = *MA;
11354 else
11355 MemAlign = getByValTypeAlignment(Args[i].IndirectType, DL);
11356 } else if (auto MA = Args[i].Alignment) {
11357 MemAlign = *MA;
11358 } else {
11359 MemAlign = OriginalAlignment;
11360 }
11361 Flags.setMemAlign(MemAlign);
11362 if (Args[i].IsNest)
11363 Flags.setNest();
11364 if (NeedsRegBlock)
11365 Flags.setInConsecutiveRegs();
11366
11367 MVT PartVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11368 unsigned NumParts =
11369 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11370 SmallVector<SDValue, 4> Parts(NumParts);
11371 ISD::NodeType ExtendKind = ISD::ANY_EXTEND;
11372
11373 if (Args[i].IsSExt)
11374 ExtendKind = ISD::SIGN_EXTEND;
11375 else if (Args[i].IsZExt)
11376 ExtendKind = ISD::ZERO_EXTEND;
11377
11378 // Conservatively only handle 'returned' on non-vectors that can be lowered,
11379 // for now.
11380 if (Args[i].IsReturned && !Op.getValueType().isVector() &&
11382 assert((CLI.RetTy == Args[i].Ty ||
11383 (CLI.RetTy->isPointerTy() && Args[i].Ty->isPointerTy() &&
11385 Args[i].Ty->getPointerAddressSpace())) &&
11386 RetVTs.size() == NumValues && "unexpected use of 'returned'");
11387 // Before passing 'returned' to the target lowering code, ensure that
11388 // either the register MVT and the actual EVT are the same size or that
11389 // the return value and argument are extended in the same way; in these
11390 // cases it's safe to pass the argument register value unchanged as the
11391 // return register value (although it's at the target's option whether
11392 // to do so)
11393 // TODO: allow code generation to take advantage of partially preserved
11394 // registers rather than clobbering the entire register when the
11395 // parameter extension method is not compatible with the return
11396 // extension method
11397 if ((NumParts * PartVT.getSizeInBits() == VT.getSizeInBits()) ||
11398 (ExtendKind != ISD::ANY_EXTEND && CLI.RetSExt == Args[i].IsSExt &&
11399 CLI.RetZExt == Args[i].IsZExt))
11400 Flags.setReturned();
11401 }
11402
11403 getCopyToParts(CLI.DAG, CLI.DL, Op, &Parts[0], NumParts, PartVT, CLI.CB,
11404 CLI.CallConv, ExtendKind);
11405
11406 for (unsigned j = 0; j != NumParts; ++j) {
11407 // if it isn't first piece, alignment must be 1
11408 // For scalable vectors the scalable part is currently handled
11409 // by individual targets, so we just use the known minimum size here.
11410 ISD::OutputArg MyFlags(
11411 Flags, Parts[j].getValueType().getSimpleVT(), VT, OrigArgTy, i,
11412 j * Parts[j].getValueType().getStoreSize().getKnownMinValue());
11413 if (NumParts > 1 && j == 0)
11414 MyFlags.Flags.setSplit();
11415 else if (j != 0) {
11416 MyFlags.Flags.setOrigAlign(Align(1));
11417 if (j == NumParts - 1)
11418 MyFlags.Flags.setSplitEnd();
11419 }
11420
11421 CLI.Outs.push_back(MyFlags);
11422 CLI.OutVals.push_back(Parts[j]);
11423 }
11424
11425 if (NeedsRegBlock && Value == NumValues - 1)
11426 CLI.Outs[CLI.Outs.size() - 1].Flags.setInConsecutiveRegsLast();
11427 }
11428 }
11429
11431 CLI.Chain = LowerCall(CLI, InVals);
11432
11433 // Update CLI.InVals to use outside of this function.
11434 CLI.InVals = InVals;
11435
11436 // Verify that the target's LowerCall behaved as expected.
11437 assert(CLI.Chain.getNode() && CLI.Chain.getValueType() == MVT::Other &&
11438 "LowerCall didn't return a valid chain!");
11439 assert((!CLI.IsTailCall || InVals.empty()) &&
11440 "LowerCall emitted a return value for a tail call!");
11441 assert((CLI.IsTailCall || InVals.size() == CLI.Ins.size()) &&
11442 "LowerCall didn't emit the correct number of values!");
11443
11444 // For a tail call, the return value is merely live-out and there aren't
11445 // any nodes in the DAG representing it. Return a special value to
11446 // indicate that a tail call has been emitted and no more Instructions
11447 // should be processed in the current block.
11448 if (CLI.IsTailCall) {
11449 CLI.DAG.setRoot(CLI.Chain);
11450 return std::make_pair(SDValue(), SDValue());
11451 }
11452
11453#ifndef NDEBUG
11454 for (unsigned i = 0, e = CLI.Ins.size(); i != e; ++i) {
11455 assert(InVals[i].getNode() && "LowerCall emitted a null value!");
11456 assert(EVT(CLI.Ins[i].VT) == InVals[i].getValueType() &&
11457 "LowerCall emitted a value with the wrong type!");
11458 }
11459#endif
11460
11461 SmallVector<SDValue, 4> ReturnValues;
11462 if (!CanLowerReturn) {
11463 // The instruction result is the result of loading from the
11464 // hidden sret parameter.
11465 MVT PtrVT = getPointerTy(DL, DL.getAllocaAddrSpace());
11466
11467 unsigned NumValues = RetVTs.size();
11468 ReturnValues.resize(NumValues);
11469 SmallVector<SDValue, 4> Chains(NumValues);
11470
11471 // An aggregate return value cannot wrap around the address space, so
11472 // offsets to its parts don't wrap either.
11474 Align HiddenSRetAlign = MF.getFrameInfo().getObjectAlign(DemoteStackIdx);
11475 for (unsigned i = 0; i < NumValues; ++i) {
11477 DemoteStackSlot, CLI.DAG.getConstant(Offsets[i], CLI.DL, PtrVT),
11479 SDValue L = CLI.DAG.getLoad(
11480 RetVTs[i], CLI.DL, CLI.Chain, Add,
11482 DemoteStackIdx, Offsets[i]),
11483 HiddenSRetAlign);
11484 ReturnValues[i] = L;
11485 Chains[i] = L.getValue(1);
11486 }
11487
11488 CLI.Chain = CLI.DAG.getNode(ISD::TokenFactor, CLI.DL, MVT::Other, Chains);
11489 } else {
11490 // Collect the legal value parts into potentially illegal values
11491 // that correspond to the original function's return values.
11492 std::optional<ISD::NodeType> AssertOp;
11493 if (CLI.RetSExt)
11494 AssertOp = ISD::AssertSext;
11495 else if (CLI.RetZExt)
11496 AssertOp = ISD::AssertZext;
11497 unsigned CurReg = 0;
11498 for (EVT VT : RetVTs) {
11499 MVT RegisterVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11500 unsigned NumRegs =
11501 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11502
11503 ReturnValues.push_back(getCopyFromParts(
11504 CLI.DAG, CLI.DL, &InVals[CurReg], NumRegs, RegisterVT, VT, nullptr,
11505 CLI.Chain, CLI.CallConv, AssertOp));
11506 CurReg += NumRegs;
11507 }
11508
11509 // For a function returning void, there is no return value. We can't create
11510 // such a node, so we just return a null return value in that case. In
11511 // that case, nothing will actually look at the value.
11512 if (ReturnValues.empty())
11513 return std::make_pair(SDValue(), CLI.Chain);
11514 }
11515
11516 SDValue Res = CLI.DAG.getNode(ISD::MERGE_VALUES, CLI.DL,
11517 CLI.DAG.getVTList(RetVTs), ReturnValues);
11518 return std::make_pair(Res, CLI.Chain);
11519}
11520
11521/// Places new result values for the node in Results (their number
11522/// and types must exactly match those of the original return values of
11523/// the node), or leaves Results empty, which indicates that the node is not
11524/// to be custom lowered after all.
11527 SelectionDAG &DAG) const {
11528 SDValue Res = LowerOperation(SDValue(N, 0), DAG);
11529
11530 if (!Res.getNode())
11531 return;
11532
11533 // If the original node has one result, take the return value from
11534 // LowerOperation as is. It might not be result number 0.
11535 if (N->getNumValues() == 1) {
11536 Results.push_back(Res);
11537 return;
11538 }
11539
11540 // If the original node has multiple results, then the return node should
11541 // have the same number of results.
11542 assert((N->getNumValues() == Res->getNumValues()) &&
11543 "Lowering returned the wrong number of results!");
11544
11545 // Places new result values base on N result number.
11546 for (unsigned I = 0, E = N->getNumValues(); I != E; ++I)
11547 Results.push_back(Res.getValue(I));
11548}
11549
11551 llvm_unreachable("LowerOperation not implemented for this target!");
11552}
11553
11555 Register Reg,
11556 ISD::NodeType ExtendType) {
11558 assert((Op.getOpcode() != ISD::CopyFromReg ||
11559 cast<RegisterSDNode>(Op.getOperand(1))->getReg() != Reg) &&
11560 "Copy from a reg to the same reg!");
11561 assert(!Reg.isPhysical() && "Is a physreg");
11562
11563 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11564 // If this is an InlineAsm we have to match the registers required, not the
11565 // notional registers required by the type.
11566
11567 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), Reg, V->getType(),
11568 std::nullopt); // This is not an ABI copy.
11569 SDValue Chain = DAG.getEntryNode();
11570
11571 if (ExtendType == ISD::ANY_EXTEND) {
11572 auto PreferredExtendIt = FuncInfo.PreferredExtendType.find(V);
11573 if (PreferredExtendIt != FuncInfo.PreferredExtendType.end())
11574 ExtendType = PreferredExtendIt->second;
11575 }
11576 RFV.getCopyToRegs(Op, DAG, getCurSDLoc(), Chain, nullptr, V, ExtendType);
11577 PendingExports.push_back(Chain);
11578}
11579
11581
11582/// isOnlyUsedInEntryBlock - If the specified argument is only used in the
11583/// entry block, return true. This includes arguments used by switches, since
11584/// the switch may expand into multiple basic blocks.
11585static bool isOnlyUsedInEntryBlock(const Argument *A, bool FastISel) {
11586 // With FastISel active, we may be splitting blocks, so force creation
11587 // of virtual registers for all non-dead arguments.
11588 if (FastISel)
11589 return A->use_empty();
11590
11591 const BasicBlock &Entry = A->getParent()->front();
11592 for (const User *U : A->users())
11593 if (cast<Instruction>(U)->getParent() != &Entry || isa<SwitchInst>(U))
11594 return false; // Use not in entry block.
11595
11596 return true;
11597}
11598
11600 DenseMap<const Argument *,
11601 std::pair<const AllocaInst *, const StoreInst *>>;
11602
11603/// Scan the entry block of the function in FuncInfo for arguments that look
11604/// like copies into a local alloca. Record any copied arguments in
11605/// ArgCopyElisionCandidates.
11606static void
11608 FunctionLoweringInfo *FuncInfo,
11609 ArgCopyElisionMapTy &ArgCopyElisionCandidates) {
11610 // Record the state of every static alloca used in the entry block. Argument
11611 // allocas are all used in the entry block, so we need approximately as many
11612 // entries as we have arguments.
11613 enum StaticAllocaInfo { Unknown, Clobbered, Elidable };
11615 unsigned NumArgs = FuncInfo->Fn->arg_size();
11616 StaticAllocas.reserve(NumArgs * 2);
11617
11618 auto GetInfoIfStaticAlloca = [&](const Value *V) -> StaticAllocaInfo * {
11619 if (!V)
11620 return nullptr;
11621 V = V->stripPointerCasts();
11622 const auto *AI = dyn_cast<AllocaInst>(V);
11623 if (!AI || !AI->isStaticAlloca() || !FuncInfo->StaticAllocaMap.count(AI))
11624 return nullptr;
11625 auto Iter = StaticAllocas.insert({AI, Unknown});
11626 return &Iter.first->second;
11627 };
11628
11629 // Look for stores of arguments to static allocas. Look through bitcasts and
11630 // GEPs to handle type coercions, as long as the alloca is fully initialized
11631 // by the store. Any non-store use of an alloca escapes it and any subsequent
11632 // unanalyzed store might write it.
11633 // FIXME: Handle structs initialized with multiple stores.
11634 for (const Instruction &I : FuncInfo->Fn->getEntryBlock()) {
11635 // Look for stores, and handle non-store uses conservatively.
11636 const auto *SI = dyn_cast<StoreInst>(&I);
11637 if (!SI) {
11638 // We will look through cast uses, so ignore them completely.
11639 if (I.isCast())
11640 continue;
11641 // Ignore debug info and pseudo op intrinsics, they don't escape or store
11642 // to allocas.
11643 if (I.isDebugOrPseudoInst())
11644 continue;
11645 // This is an unknown instruction. Assume it escapes or writes to all
11646 // static alloca operands.
11647 for (const Use &U : I.operands()) {
11648 if (StaticAllocaInfo *Info = GetInfoIfStaticAlloca(U))
11649 *Info = StaticAllocaInfo::Clobbered;
11650 }
11651 continue;
11652 }
11653
11654 // If the stored value is a static alloca, mark it as escaped.
11655 if (StaticAllocaInfo *Info = GetInfoIfStaticAlloca(SI->getValueOperand()))
11656 *Info = StaticAllocaInfo::Clobbered;
11657
11658 // Check if the destination is a static alloca.
11659 const Value *Dst = SI->getPointerOperand()->stripPointerCasts();
11660 StaticAllocaInfo *Info = GetInfoIfStaticAlloca(Dst);
11661 if (!Info)
11662 continue;
11663 const AllocaInst *AI = cast<AllocaInst>(Dst);
11664
11665 // Skip allocas that have been initialized or clobbered.
11666 if (*Info != StaticAllocaInfo::Unknown)
11667 continue;
11668
11669 // Check if the stored value is an argument, and that this store fully
11670 // initializes the alloca.
11671 // If the argument type has padding bits we can't directly forward a pointer
11672 // as the upper bits may contain garbage.
11673 // Don't elide copies from the same argument twice.
11674 const Value *Val = SI->getValueOperand()->stripPointerCasts();
11675 const auto *Arg = dyn_cast<Argument>(Val);
11676 if (!Arg || Arg->hasPassPointeeByValueCopyAttr() ||
11677 Arg->getType()->isEmptyTy() ||
11678 DL.getTypeStoreSize(Arg->getType()) !=
11679 DL.getTypeAllocSize(AI->getAllocatedType()) ||
11680 !DL.typeSizeEqualsStoreSize(Arg->getType()) ||
11681 ArgCopyElisionCandidates.count(Arg)) {
11682 *Info = StaticAllocaInfo::Clobbered;
11683 continue;
11684 }
11685
11686 LLVM_DEBUG(dbgs() << "Found argument copy elision candidate: " << *AI
11687 << '\n');
11688
11689 // Mark this alloca and store for argument copy elision.
11690 *Info = StaticAllocaInfo::Elidable;
11691 ArgCopyElisionCandidates.insert({Arg, {AI, SI}});
11692
11693 // Stop scanning if we've seen all arguments. This will happen early in -O0
11694 // builds, which is useful, because -O0 builds have large entry blocks and
11695 // many allocas.
11696 if (ArgCopyElisionCandidates.size() == NumArgs)
11697 break;
11698 }
11699}
11700
11701/// Try to elide argument copies from memory into a local alloca. Succeeds if
11702/// ArgVal is a load from a suitable fixed stack object.
11705 DenseMap<int, int> &ArgCopyElisionFrameIndexMap,
11706 SmallPtrSetImpl<const Instruction *> &ElidedArgCopyInstrs,
11707 ArgCopyElisionMapTy &ArgCopyElisionCandidates, const Argument &Arg,
11708 ArrayRef<SDValue> ArgVals, bool &ArgHasUses) {
11709 // Check if this is a load from a fixed stack object.
11710 auto *LNode = dyn_cast<LoadSDNode>(ArgVals[0]);
11711 if (!LNode)
11712 return;
11713 auto *FINode = dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode());
11714 if (!FINode)
11715 return;
11716
11717 // Check that the fixed stack object is the right size and alignment.
11718 // Look at the alignment that the user wrote on the alloca instead of looking
11719 // at the stack object.
11720 auto ArgCopyIter = ArgCopyElisionCandidates.find(&Arg);
11721 assert(ArgCopyIter != ArgCopyElisionCandidates.end());
11722 const AllocaInst *AI = ArgCopyIter->second.first;
11723 int FixedIndex = FINode->getIndex();
11724 int &AllocaIndex = FuncInfo.StaticAllocaMap[AI];
11725 int OldIndex = AllocaIndex;
11726 MachineFrameInfo &MFI = FuncInfo.MF->getFrameInfo();
11727 if (MFI.getObjectSize(FixedIndex) != MFI.getObjectSize(OldIndex)) {
11728 LLVM_DEBUG(
11729 dbgs() << " argument copy elision failed due to bad fixed stack "
11730 "object size\n");
11731 return;
11732 }
11733 Align RequiredAlignment = AI->getAlign();
11734 if (MFI.getObjectAlign(FixedIndex) < RequiredAlignment) {
11735 LLVM_DEBUG(dbgs() << " argument copy elision failed: alignment of alloca "
11736 "greater than stack argument alignment ("
11737 << DebugStr(RequiredAlignment) << " vs "
11738 << DebugStr(MFI.getObjectAlign(FixedIndex)) << ")\n");
11739 return;
11740 }
11741
11742 // Perform the elision. Delete the old stack object and replace its only use
11743 // in the variable info map. Mark the stack object as mutable and aliased.
11744 LLVM_DEBUG({
11745 dbgs() << "Eliding argument copy from " << Arg << " to " << *AI << '\n'
11746 << " Replacing frame index " << OldIndex << " with " << FixedIndex
11747 << '\n';
11748 });
11749 MFI.RemoveStackObject(OldIndex);
11750 MFI.setIsImmutableObjectIndex(FixedIndex, false);
11751 MFI.setIsAliasedObjectIndex(FixedIndex, true);
11752 AllocaIndex = FixedIndex;
11753 ArgCopyElisionFrameIndexMap.insert({OldIndex, FixedIndex});
11754 for (SDValue ArgVal : ArgVals)
11755 Chains.push_back(ArgVal.getValue(1));
11756
11757 // Avoid emitting code for the store implementing the copy.
11758 const StoreInst *SI = ArgCopyIter->second.second;
11759 ElidedArgCopyInstrs.insert(SI);
11760
11761 // Check for uses of the argument again so that we can avoid exporting ArgVal
11762 // if it is't used by anything other than the store.
11763 for (const Value *U : Arg.users()) {
11764 if (U != SI) {
11765 ArgHasUses = true;
11766 break;
11767 }
11768 }
11769}
11770
11771void SelectionDAGISel::LowerArguments(const Function &F) {
11772 SelectionDAG &DAG = SDB->DAG;
11773 SDLoc dl = SDB->getCurSDLoc();
11774 const DataLayout &DL = DAG.getDataLayout();
11776
11777 // In Naked functions we aren't going to save any registers.
11778 if (F.hasFnAttribute(Attribute::Naked))
11779 return;
11780
11781 if (!FuncInfo->CanLowerReturn) {
11782 // Put in an sret pointer parameter before all the other parameters.
11783 MVT ValueVT = TLI->getPointerTy(DL, DL.getAllocaAddrSpace());
11784
11785 ISD::ArgFlagsTy Flags;
11786 Flags.setSRet();
11787 MVT RegisterVT = TLI->getRegisterType(*DAG.getContext(), ValueVT);
11788 ISD::InputArg RetArg(Flags, RegisterVT, ValueVT, F.getReturnType(), true,
11790 Ins.push_back(RetArg);
11791 }
11792
11793 // Look for stores of arguments to static allocas. Mark such arguments with a
11794 // flag to ask the target to give us the memory location of that argument if
11795 // available.
11796 ArgCopyElisionMapTy ArgCopyElisionCandidates;
11798 ArgCopyElisionCandidates);
11799
11800 // Set up the incoming argument description vector.
11801 for (const Argument &Arg : F.args()) {
11802 unsigned ArgNo = Arg.getArgNo();
11804 ComputeValueTypes(DAG.getDataLayout(), Arg.getType(), Types);
11805 bool isArgValueUsed = !Arg.use_empty();
11806 Type *FinalType = Arg.getType();
11807 if (Arg.hasAttribute(Attribute::ByVal))
11808 FinalType = Arg.getParamByValType();
11809 bool NeedsRegBlock = TLI->functionArgumentNeedsConsecutiveRegisters(
11810 FinalType, F.getCallingConv(), F.isVarArg(), DL);
11811 for (unsigned Value = 0, NumValues = Types.size(); Value != NumValues;
11812 ++Value) {
11813 Type *ArgTy = Types[Value];
11814 EVT VT = TLI->getValueType(DL, ArgTy);
11815 ISD::ArgFlagsTy Flags;
11816
11817 if (ArgTy->isPointerTy()) {
11818 Flags.setPointer();
11819 Flags.setPointerAddrSpace(cast<PointerType>(ArgTy)->getAddressSpace());
11820 }
11821 if (Arg.hasAttribute(Attribute::ZExt))
11822 Flags.setZExt();
11823 if (Arg.hasAttribute(Attribute::SExt))
11824 Flags.setSExt();
11825 if (Arg.hasAttribute(Attribute::InReg)) {
11826 // If we are using vectorcall calling convention, a structure that is
11827 // passed InReg - is surely an HVA
11828 if (F.getCallingConv() == CallingConv::X86_VectorCall &&
11829 isa<StructType>(Arg.getType())) {
11830 // The first value of a structure is marked
11831 if (0 == Value)
11832 Flags.setHvaStart();
11833 Flags.setHva();
11834 }
11835 // Set InReg Flag
11836 Flags.setInReg();
11837 }
11838 if (Arg.hasAttribute(Attribute::StructRet))
11839 Flags.setSRet();
11840 if (Arg.hasAttribute(Attribute::SwiftSelf))
11841 Flags.setSwiftSelf();
11842 if (Arg.hasAttribute(Attribute::SwiftAsync))
11843 Flags.setSwiftAsync();
11844 if (Arg.hasAttribute(Attribute::SwiftError))
11845 Flags.setSwiftError();
11846 if (Arg.hasAttribute(Attribute::ByVal))
11847 Flags.setByVal();
11848 if (Arg.hasAttribute(Attribute::ByRef))
11849 Flags.setByRef();
11850 if (Arg.hasAttribute(Attribute::InAlloca)) {
11851 Flags.setInAlloca();
11852 // Set the byval flag for CCAssignFn callbacks that don't know about
11853 // inalloca. This way we can know how many bytes we should've allocated
11854 // and how many bytes a callee cleanup function will pop. If we port
11855 // inalloca to more targets, we'll have to add custom inalloca handling
11856 // in the various CC lowering callbacks.
11857 Flags.setByVal();
11858 }
11859 if (Arg.hasAttribute(Attribute::Preallocated)) {
11860 Flags.setPreallocated();
11861 // Set the byval flag for CCAssignFn callbacks that don't know about
11862 // preallocated. This way we can know how many bytes we should've
11863 // allocated and how many bytes a callee cleanup function will pop. If
11864 // we port preallocated to more targets, we'll have to add custom
11865 // preallocated handling in the various CC lowering callbacks.
11866 Flags.setByVal();
11867 }
11868
11869 // Certain targets (such as MIPS), may have a different ABI alignment
11870 // for a type depending on the context. Give the target a chance to
11871 // specify the alignment it wants.
11872 const Align OriginalAlignment(
11873 TLI->getABIAlignmentForCallingConv(ArgTy, DL));
11874 Flags.setOrigAlign(OriginalAlignment);
11875
11876 Align MemAlign;
11877 Type *ArgMemTy = nullptr;
11878 if (Flags.isByVal() || Flags.isInAlloca() || Flags.isPreallocated() ||
11879 Flags.isByRef()) {
11880 if (!ArgMemTy)
11881 ArgMemTy = Arg.getPointeeInMemoryValueType();
11882
11883 uint64_t MemSize = DL.getTypeAllocSize(ArgMemTy);
11884
11885 // For in-memory arguments, size and alignment should be passed from FE.
11886 // BE will guess if this info is not there but there are cases it cannot
11887 // get right.
11888 if (auto ParamAlign = Arg.getParamStackAlign())
11889 MemAlign = *ParamAlign;
11890 else if ((ParamAlign = Arg.getParamAlign()))
11891 MemAlign = *ParamAlign;
11892 else
11893 MemAlign = TLI->getByValTypeAlignment(ArgMemTy, DL);
11894 if (Flags.isByRef())
11895 Flags.setByRefSize(MemSize);
11896 else
11897 Flags.setByValSize(MemSize);
11898 } else if (auto ParamAlign = Arg.getParamStackAlign()) {
11899 MemAlign = *ParamAlign;
11900 } else {
11901 MemAlign = OriginalAlignment;
11902 }
11903 Flags.setMemAlign(MemAlign);
11904
11905 if (Arg.hasAttribute(Attribute::Nest))
11906 Flags.setNest();
11907 if (NeedsRegBlock)
11908 Flags.setInConsecutiveRegs();
11909 if (ArgCopyElisionCandidates.count(&Arg))
11910 Flags.setCopyElisionCandidate();
11911 if (Arg.hasAttribute(Attribute::Returned))
11912 Flags.setReturned();
11913
11914 MVT RegisterVT = TLI->getRegisterTypeForCallingConv(
11915 *CurDAG->getContext(), F.getCallingConv(), VT);
11916 unsigned NumRegs = TLI->getNumRegistersForCallingConv(
11917 *CurDAG->getContext(), F.getCallingConv(), VT);
11918 for (unsigned i = 0; i != NumRegs; ++i) {
11919 // For scalable vectors, use the minimum size; individual targets
11920 // are responsible for handling scalable vector arguments and
11921 // return values.
11922 ISD::InputArg MyFlags(
11923 Flags, RegisterVT, VT, ArgTy, isArgValueUsed, ArgNo,
11924 i * RegisterVT.getStoreSize().getKnownMinValue());
11925 if (NumRegs > 1 && i == 0)
11926 MyFlags.Flags.setSplit();
11927 // if it isn't first piece, alignment must be 1
11928 else if (i > 0) {
11929 MyFlags.Flags.setOrigAlign(Align(1));
11930 if (i == NumRegs - 1)
11931 MyFlags.Flags.setSplitEnd();
11932 }
11933 Ins.push_back(MyFlags);
11934 }
11935 if (NeedsRegBlock && Value == NumValues - 1)
11936 Ins[Ins.size() - 1].Flags.setInConsecutiveRegsLast();
11937 }
11938 }
11939
11940 // Call the target to set up the argument values.
11942 SDValue NewRoot = TLI->LowerFormalArguments(
11943 DAG.getRoot(), F.getCallingConv(), F.isVarArg(), Ins, dl, DAG, InVals);
11944
11945 // Verify that the target's LowerFormalArguments behaved as expected.
11946 assert(NewRoot.getNode() && NewRoot.getValueType() == MVT::Other &&
11947 "LowerFormalArguments didn't return a valid chain!");
11948 assert(InVals.size() == Ins.size() &&
11949 "LowerFormalArguments didn't emit the correct number of values!");
11950 LLVM_DEBUG({
11951 for (unsigned i = 0, e = Ins.size(); i != e; ++i) {
11952 assert(InVals[i].getNode() &&
11953 "LowerFormalArguments emitted a null value!");
11954 assert(EVT(Ins[i].VT) == InVals[i].getValueType() &&
11955 "LowerFormalArguments emitted a value with the wrong type!");
11956 }
11957 });
11958
11959 // Update the DAG with the new chain value resulting from argument lowering.
11960 DAG.setRoot(NewRoot);
11961
11962 // Set up the argument values.
11963 unsigned i = 0;
11964 if (!FuncInfo->CanLowerReturn) {
11965 // Create a virtual register for the sret pointer, and put in a copy
11966 // from the sret argument into it.
11967 MVT VT = TLI->getPointerTy(DL, DL.getAllocaAddrSpace());
11968 MVT RegVT = TLI->getRegisterType(*CurDAG->getContext(), VT);
11969 std::optional<ISD::NodeType> AssertOp;
11970 SDValue ArgValue =
11971 getCopyFromParts(DAG, dl, &InVals[0], 1, RegVT, VT, nullptr, NewRoot,
11972 F.getCallingConv(), AssertOp);
11973
11974 MachineFunction& MF = SDB->DAG.getMachineFunction();
11975 MachineRegisterInfo& RegInfo = MF.getRegInfo();
11976 Register SRetReg =
11977 RegInfo.createVirtualRegister(TLI->getRegClassFor(RegVT));
11978 FuncInfo->DemoteRegister = SRetReg;
11979 NewRoot =
11980 SDB->DAG.getCopyToReg(NewRoot, SDB->getCurSDLoc(), SRetReg, ArgValue);
11981 DAG.setRoot(NewRoot);
11982
11983 // i indexes lowered arguments. Bump it past the hidden sret argument.
11984 ++i;
11985 }
11986
11988 DenseMap<int, int> ArgCopyElisionFrameIndexMap;
11989 for (const Argument &Arg : F.args()) {
11990 SmallVector<SDValue, 4> ArgValues;
11991 SmallVector<EVT, 4> ValueVTs;
11992 ComputeValueVTs(*TLI, DAG.getDataLayout(), Arg.getType(), ValueVTs);
11993 unsigned NumValues = ValueVTs.size();
11994 if (NumValues == 0)
11995 continue;
11996
11997 bool ArgHasUses = !Arg.use_empty();
11998
11999 // Elide the copying store if the target loaded this argument from a
12000 // suitable fixed stack object.
12001 if (Ins[i].Flags.isCopyElisionCandidate()) {
12002 unsigned NumParts = 0;
12003 for (EVT VT : ValueVTs)
12004 NumParts += TLI->getNumRegistersForCallingConv(*CurDAG->getContext(),
12005 F.getCallingConv(), VT);
12006
12007 tryToElideArgumentCopy(*FuncInfo, Chains, ArgCopyElisionFrameIndexMap,
12008 ElidedArgCopyInstrs, ArgCopyElisionCandidates, Arg,
12009 ArrayRef(&InVals[i], NumParts), ArgHasUses);
12010 }
12011
12012 // If this argument is unused then remember its value. It is used to generate
12013 // debugging information.
12014 bool isSwiftErrorArg =
12015 TLI->supportSwiftError() &&
12016 Arg.hasAttribute(Attribute::SwiftError);
12017 if (!ArgHasUses && !isSwiftErrorArg) {
12018 SDB->setUnusedArgValue(&Arg, InVals[i]);
12019
12020 // Also remember any frame index for use in FastISel.
12021 if (FrameIndexSDNode *FI =
12023 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12024 }
12025
12026 for (unsigned Val = 0; Val != NumValues; ++Val) {
12027 EVT VT = ValueVTs[Val];
12028 MVT PartVT = TLI->getRegisterTypeForCallingConv(*CurDAG->getContext(),
12029 F.getCallingConv(), VT);
12030 unsigned NumParts = TLI->getNumRegistersForCallingConv(
12031 *CurDAG->getContext(), F.getCallingConv(), VT);
12032
12033 // Even an apparent 'unused' swifterror argument needs to be returned. So
12034 // we do generate a copy for it that can be used on return from the
12035 // function.
12036 if (ArgHasUses || isSwiftErrorArg) {
12037 std::optional<ISD::NodeType> AssertOp;
12038 if (Arg.hasAttribute(Attribute::SExt))
12039 AssertOp = ISD::AssertSext;
12040 else if (Arg.hasAttribute(Attribute::ZExt))
12041 AssertOp = ISD::AssertZext;
12042
12043 SDValue OutVal =
12044 getCopyFromParts(DAG, dl, &InVals[i], NumParts, PartVT, VT, nullptr,
12045 NewRoot, F.getCallingConv(), AssertOp);
12046
12047 FPClassTest NoFPClass = Arg.getNoFPClass();
12048 if (NoFPClass != fcNone) {
12049 SDValue SDNoFPClass = DAG.getTargetConstant(
12050 static_cast<uint64_t>(NoFPClass), dl, MVT::i32);
12051 OutVal = DAG.getNode(ISD::AssertNoFPClass, dl, OutVal.getValueType(),
12052 OutVal, SDNoFPClass);
12053 }
12054 ArgValues.push_back(OutVal);
12055 }
12056
12057 i += NumParts;
12058 }
12059
12060 // We don't need to do anything else for unused arguments.
12061 if (ArgValues.empty())
12062 continue;
12063
12064 // Note down frame index.
12065 if (FrameIndexSDNode *FI =
12066 dyn_cast<FrameIndexSDNode>(ArgValues[0].getNode()))
12067 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12068
12069 SDValue Res = DAG.getMergeValues(ArrayRef(ArgValues.data(), NumValues),
12070 SDB->getCurSDLoc());
12071
12072 SDB->setValue(&Arg, Res);
12073 if (!TM.Options.EnableFastISel && Res.getOpcode() == ISD::BUILD_PAIR) {
12074 // We want to associate the argument with the frame index, among
12075 // involved operands, that correspond to the lowest address. The
12076 // getCopyFromParts function, called earlier, is swapping the order of
12077 // the operands to BUILD_PAIR depending on endianness. The result of
12078 // that swapping is that the least significant bits of the argument will
12079 // be in the first operand of the BUILD_PAIR node, and the most
12080 // significant bits will be in the second operand.
12081 unsigned LowAddressOp = DAG.getDataLayout().isBigEndian() ? 1 : 0;
12082 if (LoadSDNode *LNode =
12083 dyn_cast<LoadSDNode>(Res.getOperand(LowAddressOp).getNode()))
12084 if (FrameIndexSDNode *FI =
12085 dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
12086 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12087 }
12088
12089 // Analyses past this point are naive and don't expect an assertion.
12090 if (Res.getOpcode() == ISD::AssertZext)
12091 Res = Res.getOperand(0);
12092
12093 // Update the SwiftErrorVRegDefMap.
12094 if (Res.getOpcode() == ISD::CopyFromReg && isSwiftErrorArg) {
12095 Register Reg = cast<RegisterSDNode>(Res.getOperand(1))->getReg();
12096 if (Reg.isVirtual())
12097 SwiftError->setCurrentVReg(FuncInfo->MBB, SwiftError->getFunctionArg(),
12098 Reg);
12099 }
12100
12101 // If this argument is live outside of the entry block, insert a copy from
12102 // wherever we got it to the vreg that other BB's will reference it as.
12103 if (Res.getOpcode() == ISD::CopyFromReg) {
12104 // If we can, though, try to skip creating an unnecessary vreg.
12105 // FIXME: This isn't very clean... it would be nice to make this more
12106 // general.
12107 Register Reg = cast<RegisterSDNode>(Res.getOperand(1))->getReg();
12108 if (Reg.isVirtual()) {
12109 FuncInfo->ValueMap[&Arg] = Reg;
12110 continue;
12111 }
12112 }
12113 if (!isOnlyUsedInEntryBlock(&Arg, TM.Options.EnableFastISel)) {
12114 FuncInfo->InitializeRegForValue(&Arg);
12115 SDB->CopyToExportRegsIfNeeded(&Arg);
12116 }
12117 }
12118
12119 if (!Chains.empty()) {
12120 Chains.push_back(NewRoot);
12121 NewRoot = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chains);
12122 }
12123
12124 DAG.setRoot(NewRoot);
12125
12126 assert(i == InVals.size() && "Argument register count mismatch!");
12127
12128 // If any argument copy elisions occurred and we have debug info, update the
12129 // stale frame indices used in the dbg.declare variable info table.
12130 if (!ArgCopyElisionFrameIndexMap.empty()) {
12131 for (MachineFunction::VariableDbgInfo &VI :
12132 MF->getInStackSlotVariableDbgInfo()) {
12133 auto I = ArgCopyElisionFrameIndexMap.find(VI.getStackSlot());
12134 if (I != ArgCopyElisionFrameIndexMap.end())
12135 VI.updateStackSlot(I->second);
12136 }
12137 }
12138
12139 // Finally, if the target has anything special to do, allow it to do so.
12141}
12142
12143/// Handle PHI nodes in successor blocks. Emit code into the SelectionDAG to
12144/// ensure constants are generated when needed. Remember the virtual registers
12145/// that need to be added to the Machine PHI nodes as input. We cannot just
12146/// directly add them, because expansion might result in multiple MBB's for one
12147/// BB. As such, the start of the BB might correspond to a different MBB than
12148/// the end.
12149void
12150SelectionDAGBuilder::HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) {
12151 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12152
12153 SmallPtrSet<MachineBasicBlock *, 4> SuccsHandled;
12154
12155 // Check PHI nodes in successors that expect a value to be available from this
12156 // block.
12157 for (const BasicBlock *SuccBB : successors(LLVMBB->getTerminator())) {
12158 if (!isa<PHINode>(SuccBB->begin())) continue;
12159 MachineBasicBlock *SuccMBB = FuncInfo.getMBB(SuccBB);
12160
12161 // If this terminator has multiple identical successors (common for
12162 // switches), only handle each succ once.
12163 if (!SuccsHandled.insert(SuccMBB).second)
12164 continue;
12165
12167
12168 // At this point we know that there is a 1-1 correspondence between LLVM PHI
12169 // nodes and Machine PHI nodes, but the incoming operands have not been
12170 // emitted yet.
12171 for (const PHINode &PN : SuccBB->phis()) {
12172 // Ignore dead phi's.
12173 if (PN.use_empty())
12174 continue;
12175
12176 // Skip empty types
12177 if (PN.getType()->isEmptyTy())
12178 continue;
12179
12180 Register Reg;
12181 const Value *PHIOp = PN.getIncomingValueForBlock(LLVMBB);
12182
12183 if (const auto *C = dyn_cast<Constant>(PHIOp)) {
12184 Register &RegOut = ConstantsOut[C];
12185 if (!RegOut) {
12186 RegOut = FuncInfo.CreateRegs(&PN);
12187 // We need to zero/sign extend ConstantInt phi operands to match
12188 // assumptions in FunctionLoweringInfo::ComputePHILiveOutRegInfo.
12189 ISD::NodeType ExtendType = ISD::ANY_EXTEND;
12190 if (auto *CI = dyn_cast<ConstantInt>(C))
12191 ExtendType = TLI.signExtendConstant(CI) ? ISD::SIGN_EXTEND
12193 CopyValueToVirtualRegister(C, RegOut, ExtendType);
12194 }
12195 Reg = RegOut;
12196 } else {
12198 FuncInfo.ValueMap.find(PHIOp);
12199 if (I != FuncInfo.ValueMap.end())
12200 Reg = I->second;
12201 else {
12202 assert(isa<AllocaInst>(PHIOp) &&
12203 FuncInfo.StaticAllocaMap.count(cast<AllocaInst>(PHIOp)) &&
12204 "Didn't codegen value into a register!??");
12205 Reg = FuncInfo.CreateRegs(&PN);
12207 }
12208 }
12209
12210 // Remember that this register needs to added to the machine PHI node as
12211 // the input for this MBB.
12212 SmallVector<EVT, 4> ValueVTs;
12213 ComputeValueVTs(TLI, DAG.getDataLayout(), PN.getType(), ValueVTs);
12214 for (EVT VT : ValueVTs) {
12215 const unsigned NumRegisters = TLI.getNumRegisters(*DAG.getContext(), VT);
12216 for (unsigned i = 0; i != NumRegisters; ++i)
12217 FuncInfo.PHINodesToUpdate.emplace_back(&*MBBI++, Reg + i);
12218 Reg += NumRegisters;
12219 }
12220 }
12221 }
12222
12223 ConstantsOut.clear();
12224}
12225
12226MachineBasicBlock *SelectionDAGBuilder::NextBlock(MachineBasicBlock *MBB) {
12228 if (++I == FuncInfo.MF->end())
12229 return nullptr;
12230 return &*I;
12231}
12232
12233/// During lowering new call nodes can be created (such as memset, etc.).
12234/// Those will become new roots of the current DAG, but complications arise
12235/// when they are tail calls. In such cases, the call lowering will update
12236/// the root, but the builder still needs to know that a tail call has been
12237/// lowered in order to avoid generating an additional return.
12238void SelectionDAGBuilder::updateDAGForMaybeTailCall(SDValue MaybeTC) {
12239 // If the node is null, we do have a tail call.
12240 if (MaybeTC.getNode() != nullptr)
12241 DAG.setRoot(MaybeTC);
12242 else
12243 HasTailCall = true;
12244}
12245
12246void SelectionDAGBuilder::lowerWorkItem(SwitchWorkListItem W, Value *Cond,
12247 MachineBasicBlock *SwitchMBB,
12248 MachineBasicBlock *DefaultMBB) {
12249 MachineFunction *CurMF = FuncInfo.MF;
12250 MachineBasicBlock *NextMBB = nullptr;
12252 if (++BBI != FuncInfo.MF->end())
12253 NextMBB = &*BBI;
12254
12255 unsigned Size = W.LastCluster - W.FirstCluster + 1;
12256
12257 BranchProbabilityInfo *BPI = FuncInfo.BPI;
12258
12259 if (Size == 2 && W.MBB == SwitchMBB) {
12260 // If any two of the cases has the same destination, and if one value
12261 // is the same as the other, but has one bit unset that the other has set,
12262 // use bit manipulation to do two compares at once. For example:
12263 // "if (X == 6 || X == 4)" -> "if ((X|2) == 6)"
12264 // TODO: This could be extended to merge any 2 cases in switches with 3
12265 // cases.
12266 // TODO: Handle cases where W.CaseBB != SwitchBB.
12267 CaseCluster &Small = *W.FirstCluster;
12268 CaseCluster &Big = *W.LastCluster;
12269
12270 if (Small.Low == Small.High && Big.Low == Big.High &&
12271 Small.MBB == Big.MBB) {
12272 const APInt &SmallValue = Small.Low->getValue();
12273 const APInt &BigValue = Big.Low->getValue();
12274
12275 // Check that there is only one bit different.
12276 APInt CommonBit = BigValue ^ SmallValue;
12277 if (CommonBit.isPowerOf2()) {
12278 SDValue CondLHS = getValue(Cond);
12279 EVT VT = CondLHS.getValueType();
12280 SDLoc DL = getCurSDLoc();
12281
12282 SDValue Or = DAG.getNode(ISD::OR, DL, VT, CondLHS,
12283 DAG.getConstant(CommonBit, DL, VT));
12284 SDValue Cond = DAG.getSetCC(
12285 DL, MVT::i1, Or, DAG.getConstant(BigValue | SmallValue, DL, VT),
12286 ISD::SETEQ);
12287
12288 // Update successor info.
12289 // Both Small and Big will jump to Small.BB, so we sum up the
12290 // probabilities.
12291 addSuccessorWithProb(SwitchMBB, Small.MBB, Small.Prob + Big.Prob);
12292 if (BPI)
12293 addSuccessorWithProb(
12294 SwitchMBB, DefaultMBB,
12295 // The default destination is the first successor in IR.
12296 BPI->getEdgeProbability(SwitchMBB->getBasicBlock(), (unsigned)0));
12297 else
12298 addSuccessorWithProb(SwitchMBB, DefaultMBB);
12299
12300 // Insert the true branch.
12301 SDValue BrCond =
12302 DAG.getNode(ISD::BRCOND, DL, MVT::Other, getControlRoot(), Cond,
12303 DAG.getBasicBlock(Small.MBB));
12304 // Insert the false branch.
12305 BrCond = DAG.getNode(ISD::BR, DL, MVT::Other, BrCond,
12306 DAG.getBasicBlock(DefaultMBB));
12307
12308 DAG.setRoot(BrCond);
12309 return;
12310 }
12311 }
12312 }
12313
12314 if (TM.getOptLevel() != CodeGenOptLevel::None) {
12315 // Here, we order cases by probability so the most likely case will be
12316 // checked first. However, two clusters can have the same probability in
12317 // which case their relative ordering is non-deterministic. So we use Low
12318 // as a tie-breaker as clusters are guaranteed to never overlap.
12319 llvm::sort(W.FirstCluster, W.LastCluster + 1,
12320 [](const CaseCluster &a, const CaseCluster &b) {
12321 return a.Prob != b.Prob ?
12322 a.Prob > b.Prob :
12323 a.Low->getValue().slt(b.Low->getValue());
12324 });
12325
12326 // Rearrange the case blocks so that the last one falls through if possible
12327 // without changing the order of probabilities.
12328 for (CaseClusterIt I = W.LastCluster; I > W.FirstCluster; ) {
12329 --I;
12330 if (I->Prob > W.LastCluster->Prob)
12331 break;
12332 if (I->Kind == CC_Range && I->MBB == NextMBB) {
12333 std::swap(*I, *W.LastCluster);
12334 break;
12335 }
12336 }
12337 }
12338
12339 // Compute total probability.
12340 BranchProbability DefaultProb = W.DefaultProb;
12341 BranchProbability UnhandledProbs = DefaultProb;
12342 for (CaseClusterIt I = W.FirstCluster; I <= W.LastCluster; ++I)
12343 UnhandledProbs += I->Prob;
12344
12345 MachineBasicBlock *CurMBB = W.MBB;
12346 for (CaseClusterIt I = W.FirstCluster, E = W.LastCluster; I <= E; ++I) {
12347 bool FallthroughUnreachable = false;
12348 MachineBasicBlock *Fallthrough;
12349 if (I == W.LastCluster) {
12350 // For the last cluster, fall through to the default destination.
12351 Fallthrough = DefaultMBB;
12352 FallthroughUnreachable = isa<UnreachableInst>(
12353 DefaultMBB->getBasicBlock()->getFirstNonPHIOrDbg());
12354 } else {
12355 Fallthrough = CurMF->CreateMachineBasicBlock(CurMBB->getBasicBlock());
12356 CurMF->insert(BBI, Fallthrough);
12357 // Put Cond in a virtual register to make it available from the new blocks.
12359 }
12360 UnhandledProbs -= I->Prob;
12361
12362 switch (I->Kind) {
12363 case CC_JumpTable: {
12364 // FIXME: Optimize away range check based on pivot comparisons.
12365 JumpTableHeader *JTH = &SL->JTCases[I->JTCasesIndex].first;
12366 SwitchCG::JumpTable *JT = &SL->JTCases[I->JTCasesIndex].second;
12367
12368 // The jump block hasn't been inserted yet; insert it here.
12369 MachineBasicBlock *JumpMBB = JT->MBB;
12370 CurMF->insert(BBI, JumpMBB);
12371
12372 auto JumpProb = I->Prob;
12373 auto FallthroughProb = UnhandledProbs;
12374
12375 // If the default statement is a target of the jump table, we evenly
12376 // distribute the default probability to successors of CurMBB. Also
12377 // update the probability on the edge from JumpMBB to Fallthrough.
12378 for (MachineBasicBlock::succ_iterator SI = JumpMBB->succ_begin(),
12379 SE = JumpMBB->succ_end();
12380 SI != SE; ++SI) {
12381 if (*SI == DefaultMBB) {
12382 JumpProb += DefaultProb / 2;
12383 FallthroughProb -= DefaultProb / 2;
12384 JumpMBB->setSuccProbability(SI, DefaultProb / 2);
12385 JumpMBB->normalizeSuccProbs();
12386 break;
12387 }
12388 }
12389
12390 // If the default clause is unreachable, propagate that knowledge into
12391 // JTH->FallthroughUnreachable which will use it to suppress the range
12392 // check.
12393 //
12394 // However, don't do this if we're doing branch target enforcement,
12395 // because a table branch _without_ a range check can be a tempting JOP
12396 // gadget - out-of-bounds inputs that are impossible in correct
12397 // execution become possible again if an attacker can influence the
12398 // control flow. So if an attacker doesn't already have a BTI bypass
12399 // available, we don't want them to be able to get one out of this
12400 // table branch.
12401 if (FallthroughUnreachable) {
12402 Function &CurFunc = CurMF->getFunction();
12403 if (!CurFunc.hasFnAttribute("branch-target-enforcement"))
12404 JTH->FallthroughUnreachable = true;
12405 }
12406
12407 if (!JTH->FallthroughUnreachable)
12408 addSuccessorWithProb(CurMBB, Fallthrough, FallthroughProb);
12409 addSuccessorWithProb(CurMBB, JumpMBB, JumpProb);
12410 CurMBB->normalizeSuccProbs();
12411
12412 // The jump table header will be inserted in our current block, do the
12413 // range check, and fall through to our fallthrough block.
12414 JTH->HeaderBB = CurMBB;
12415 JT->Default = Fallthrough; // FIXME: Move Default to JumpTableHeader.
12416
12417 // If we're in the right place, emit the jump table header right now.
12418 if (CurMBB == SwitchMBB) {
12419 visitJumpTableHeader(*JT, *JTH, SwitchMBB);
12420 JTH->Emitted = true;
12421 }
12422 break;
12423 }
12424 case CC_BitTests: {
12425 // FIXME: Optimize away range check based on pivot comparisons.
12426 BitTestBlock *BTB = &SL->BitTestCases[I->BTCasesIndex];
12427
12428 // The bit test blocks haven't been inserted yet; insert them here.
12429 for (BitTestCase &BTC : BTB->Cases)
12430 CurMF->insert(BBI, BTC.ThisBB);
12431
12432 // Fill in fields of the BitTestBlock.
12433 BTB->Parent = CurMBB;
12434 BTB->Default = Fallthrough;
12435
12436 BTB->DefaultProb = UnhandledProbs;
12437 // If the cases in bit test don't form a contiguous range, we evenly
12438 // distribute the probability on the edge to Fallthrough to two
12439 // successors of CurMBB.
12440 if (!BTB->ContiguousRange) {
12441 BTB->Prob += DefaultProb / 2;
12442 BTB->DefaultProb -= DefaultProb / 2;
12443 }
12444
12445 if (FallthroughUnreachable)
12446 BTB->FallthroughUnreachable = true;
12447
12448 // If we're in the right place, emit the bit test header right now.
12449 if (CurMBB == SwitchMBB) {
12450 visitBitTestHeader(*BTB, SwitchMBB);
12451 BTB->Emitted = true;
12452 }
12453 break;
12454 }
12455 case CC_Range: {
12456 const Value *RHS, *LHS, *MHS;
12457 ISD::CondCode CC;
12458 if (I->Low == I->High) {
12459 // Check Cond == I->Low.
12460 CC = ISD::SETEQ;
12461 LHS = Cond;
12462 RHS=I->Low;
12463 MHS = nullptr;
12464 } else {
12465 // Check I->Low <= Cond <= I->High.
12466 CC = ISD::SETLE;
12467 LHS = I->Low;
12468 MHS = Cond;
12469 RHS = I->High;
12470 }
12471
12472 // If Fallthrough is unreachable, fold away the comparison.
12473 if (FallthroughUnreachable)
12474 CC = ISD::SETTRUE;
12475
12476 // The false probability is the sum of all unhandled cases.
12477 CaseBlock CB(CC, LHS, RHS, MHS, I->MBB, Fallthrough, CurMBB,
12478 getCurSDLoc(), I->Prob, UnhandledProbs);
12479
12480 if (CurMBB == SwitchMBB)
12481 visitSwitchCase(CB, SwitchMBB);
12482 else
12483 SL->SwitchCases.push_back(CB);
12484
12485 break;
12486 }
12487 }
12488 CurMBB = Fallthrough;
12489 }
12490}
12491
12492void SelectionDAGBuilder::splitWorkItem(SwitchWorkList &WorkList,
12493 const SwitchWorkListItem &W,
12494 Value *Cond,
12495 MachineBasicBlock *SwitchMBB) {
12496 assert(W.FirstCluster->Low->getValue().slt(W.LastCluster->Low->getValue()) &&
12497 "Clusters not sorted?");
12498 assert(W.LastCluster - W.FirstCluster + 1 >= 2 && "Too small to split!");
12499
12500 auto [LastLeft, FirstRight, LeftProb, RightProb] =
12501 SL->computeSplitWorkItemInfo(W);
12502
12503 // Use the first element on the right as pivot since we will make less-than
12504 // comparisons against it.
12505 CaseClusterIt PivotCluster = FirstRight;
12506 assert(PivotCluster > W.FirstCluster);
12507 assert(PivotCluster <= W.LastCluster);
12508
12509 CaseClusterIt FirstLeft = W.FirstCluster;
12510 CaseClusterIt LastRight = W.LastCluster;
12511
12512 const ConstantInt *Pivot = PivotCluster->Low;
12513
12514 // New blocks will be inserted immediately after the current one.
12516 ++BBI;
12517
12518 // We will branch to the LHS if Value < Pivot. If LHS is a single cluster,
12519 // we can branch to its destination directly if it's squeezed exactly in
12520 // between the known lower bound and Pivot - 1.
12521 MachineBasicBlock *LeftMBB;
12522 if (FirstLeft == LastLeft && FirstLeft->Kind == CC_Range &&
12523 FirstLeft->Low == W.GE &&
12524 (FirstLeft->High->getValue() + 1LL) == Pivot->getValue()) {
12525 LeftMBB = FirstLeft->MBB;
12526 } else {
12527 LeftMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
12528 FuncInfo.MF->insert(BBI, LeftMBB);
12529 WorkList.push_back(
12530 {LeftMBB, FirstLeft, LastLeft, W.GE, Pivot, W.DefaultProb / 2});
12531 // Put Cond in a virtual register to make it available from the new blocks.
12533 }
12534
12535 // Similarly, we will branch to the RHS if Value >= Pivot. If RHS is a
12536 // single cluster, RHS.Low == Pivot, and we can branch to its destination
12537 // directly if RHS.High equals the current upper bound.
12538 MachineBasicBlock *RightMBB;
12539 if (FirstRight == LastRight && FirstRight->Kind == CC_Range &&
12540 W.LT && (FirstRight->High->getValue() + 1ULL) == W.LT->getValue()) {
12541 RightMBB = FirstRight->MBB;
12542 } else {
12543 RightMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
12544 FuncInfo.MF->insert(BBI, RightMBB);
12545 WorkList.push_back(
12546 {RightMBB, FirstRight, LastRight, Pivot, W.LT, W.DefaultProb / 2});
12547 // Put Cond in a virtual register to make it available from the new blocks.
12549 }
12550
12551 // Create the CaseBlock record that will be used to lower the branch.
12552 CaseBlock CB(ISD::SETLT, Cond, Pivot, nullptr, LeftMBB, RightMBB, W.MBB,
12553 getCurSDLoc(), LeftProb, RightProb);
12554
12555 if (W.MBB == SwitchMBB)
12556 visitSwitchCase(CB, SwitchMBB);
12557 else
12558 SL->SwitchCases.push_back(CB);
12559}
12560
12561// Scale CaseProb after peeling a case with the probablity of PeeledCaseProb
12562// from the swith statement.
12564 BranchProbability PeeledCaseProb) {
12565 if (PeeledCaseProb == BranchProbability::getOne())
12567 BranchProbability SwitchProb = PeeledCaseProb.getCompl();
12568
12569 uint32_t Numerator = CaseProb.getNumerator();
12570 uint32_t Denominator = SwitchProb.scale(CaseProb.getDenominator());
12571 return BranchProbability(Numerator, std::max(Numerator, Denominator));
12572}
12573
12574// Try to peel the top probability case if it exceeds the threshold.
12575// Return current MachineBasicBlock for the switch statement if the peeling
12576// does not occur.
12577// If the peeling is performed, return the newly created MachineBasicBlock
12578// for the peeled switch statement. Also update Clusters to remove the peeled
12579// case. PeeledCaseProb is the BranchProbability for the peeled case.
12580MachineBasicBlock *SelectionDAGBuilder::peelDominantCaseCluster(
12581 const SwitchInst &SI, CaseClusterVector &Clusters,
12582 BranchProbability &PeeledCaseProb) {
12583 MachineBasicBlock *SwitchMBB = FuncInfo.MBB;
12584 // Don't perform if there is only one cluster or optimizing for size.
12585 if (SwitchPeelThreshold > 100 || !FuncInfo.BPI || Clusters.size() < 2 ||
12586 TM.getOptLevel() == CodeGenOptLevel::None ||
12587 SwitchMBB->getParent()->getFunction().hasMinSize())
12588 return SwitchMBB;
12589
12590 BranchProbability TopCaseProb = BranchProbability(SwitchPeelThreshold, 100);
12591 unsigned PeeledCaseIndex = 0;
12592 bool SwitchPeeled = false;
12593 for (unsigned Index = 0; Index < Clusters.size(); ++Index) {
12594 CaseCluster &CC = Clusters[Index];
12595 if (CC.Prob < TopCaseProb)
12596 continue;
12597 TopCaseProb = CC.Prob;
12598 PeeledCaseIndex = Index;
12599 SwitchPeeled = true;
12600 }
12601 if (!SwitchPeeled)
12602 return SwitchMBB;
12603
12604 LLVM_DEBUG(dbgs() << "Peeled one top case in switch stmt, prob: "
12605 << TopCaseProb << "\n");
12606
12607 // Record the MBB for the peeled switch statement.
12608 MachineFunction::iterator BBI(SwitchMBB);
12609 ++BBI;
12610 MachineBasicBlock *PeeledSwitchMBB =
12611 FuncInfo.MF->CreateMachineBasicBlock(SwitchMBB->getBasicBlock());
12612 FuncInfo.MF->insert(BBI, PeeledSwitchMBB);
12613
12614 ExportFromCurrentBlock(SI.getCondition());
12615 auto PeeledCaseIt = Clusters.begin() + PeeledCaseIndex;
12616 SwitchWorkListItem W = {SwitchMBB, PeeledCaseIt, PeeledCaseIt,
12617 nullptr, nullptr, TopCaseProb.getCompl()};
12618 lowerWorkItem(W, SI.getCondition(), SwitchMBB, PeeledSwitchMBB);
12619
12620 Clusters.erase(PeeledCaseIt);
12621 for (CaseCluster &CC : Clusters) {
12622 LLVM_DEBUG(
12623 dbgs() << "Scale the probablity for one cluster, before scaling: "
12624 << CC.Prob << "\n");
12625 CC.Prob = scaleCaseProbality(CC.Prob, TopCaseProb);
12626 LLVM_DEBUG(dbgs() << "After scaling: " << CC.Prob << "\n");
12627 }
12628 PeeledCaseProb = TopCaseProb;
12629 return PeeledSwitchMBB;
12630}
12631
12632void SelectionDAGBuilder::visitSwitch(const SwitchInst &SI) {
12633 // Extract cases from the switch.
12634 BranchProbabilityInfo *BPI = FuncInfo.BPI;
12635 CaseClusterVector Clusters;
12636 Clusters.reserve(SI.getNumCases());
12637 for (auto I : SI.cases()) {
12638 MachineBasicBlock *Succ = FuncInfo.getMBB(I.getCaseSuccessor());
12639 const ConstantInt *CaseVal = I.getCaseValue();
12640 BranchProbability Prob =
12641 BPI ? BPI->getEdgeProbability(SI.getParent(), I.getSuccessorIndex())
12642 : BranchProbability(1, SI.getNumCases() + 1);
12643 Clusters.push_back(CaseCluster::range(CaseVal, CaseVal, Succ, Prob));
12644 }
12645
12646 MachineBasicBlock *DefaultMBB = FuncInfo.getMBB(SI.getDefaultDest());
12647
12648 // Cluster adjacent cases with the same destination. We do this at all
12649 // optimization levels because it's cheap to do and will make codegen faster
12650 // if there are many clusters.
12651 sortAndRangeify(Clusters);
12652
12653 // The branch probablity of the peeled case.
12654 BranchProbability PeeledCaseProb = BranchProbability::getZero();
12655 MachineBasicBlock *PeeledSwitchMBB =
12656 peelDominantCaseCluster(SI, Clusters, PeeledCaseProb);
12657
12658 // If there is only the default destination, jump there directly.
12659 MachineBasicBlock *SwitchMBB = FuncInfo.MBB;
12660 if (Clusters.empty()) {
12661 assert(PeeledSwitchMBB == SwitchMBB);
12662 SwitchMBB->addSuccessor(DefaultMBB);
12663 if (DefaultMBB != NextBlock(SwitchMBB)) {
12664 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
12665 getControlRoot(), DAG.getBasicBlock(DefaultMBB)));
12666 }
12667 return;
12668 }
12669
12670 SL->findJumpTables(Clusters, &SI, getCurSDLoc(), DefaultMBB, DAG.getPSI(),
12671 DAG.getBFI());
12672 SL->findBitTestClusters(Clusters, &SI);
12673
12674 LLVM_DEBUG({
12675 dbgs() << "Case clusters: ";
12676 for (const CaseCluster &C : Clusters) {
12677 if (C.Kind == CC_JumpTable)
12678 dbgs() << "JT:";
12679 if (C.Kind == CC_BitTests)
12680 dbgs() << "BT:";
12681
12682 C.Low->getValue().print(dbgs(), true);
12683 if (C.Low != C.High) {
12684 dbgs() << '-';
12685 C.High->getValue().print(dbgs(), true);
12686 }
12687 dbgs() << ' ';
12688 }
12689 dbgs() << '\n';
12690 });
12691
12692 assert(!Clusters.empty());
12693 SwitchWorkList WorkList;
12694 CaseClusterIt First = Clusters.begin();
12695 CaseClusterIt Last = Clusters.end() - 1;
12696 auto DefaultProb = getEdgeProbability(PeeledSwitchMBB, DefaultMBB);
12697 // Scale the branchprobability for DefaultMBB if the peel occurs and
12698 // DefaultMBB is not replaced.
12699 if (PeeledCaseProb != BranchProbability::getZero() &&
12700 DefaultMBB == FuncInfo.getMBB(SI.getDefaultDest()))
12701 DefaultProb = scaleCaseProbality(DefaultProb, PeeledCaseProb);
12702 WorkList.push_back(
12703 {PeeledSwitchMBB, First, Last, nullptr, nullptr, DefaultProb});
12704
12705 while (!WorkList.empty()) {
12706 SwitchWorkListItem W = WorkList.pop_back_val();
12707 unsigned NumClusters = W.LastCluster - W.FirstCluster + 1;
12708
12709 if (NumClusters > 3 && TM.getOptLevel() != CodeGenOptLevel::None &&
12710 !DefaultMBB->getParent()->getFunction().hasMinSize()) {
12711 // For optimized builds, lower large range as a balanced binary tree.
12712 splitWorkItem(WorkList, W, SI.getCondition(), SwitchMBB);
12713 continue;
12714 }
12715
12716 lowerWorkItem(W, SI.getCondition(), SwitchMBB, DefaultMBB);
12717 }
12718}
12719
12720void SelectionDAGBuilder::visitStepVector(const CallInst &I) {
12721 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12722 auto DL = getCurSDLoc();
12723 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12724 setValue(&I, DAG.getStepVector(DL, ResultVT));
12725}
12726
12727void SelectionDAGBuilder::visitVectorReverse(const CallInst &I) {
12728 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12729 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12730
12731 SDLoc DL = getCurSDLoc();
12732 SDValue V = getValue(I.getOperand(0));
12733 assert(VT == V.getValueType() && "Malformed vector.reverse!");
12734
12735 if (VT.isScalableVector()) {
12736 setValue(&I, DAG.getNode(ISD::VECTOR_REVERSE, DL, VT, V));
12737 return;
12738 }
12739
12740 // Use VECTOR_SHUFFLE for the fixed-length vector
12741 // to maintain existing behavior.
12742 SmallVector<int, 8> Mask;
12743 unsigned NumElts = VT.getVectorMinNumElements();
12744 for (unsigned i = 0; i != NumElts; ++i)
12745 Mask.push_back(NumElts - 1 - i);
12746
12747 setValue(&I, DAG.getVectorShuffle(VT, DL, V, DAG.getUNDEF(VT), Mask));
12748}
12749
12750void SelectionDAGBuilder::visitVectorDeinterleave(const CallInst &I,
12751 unsigned Factor) {
12752 auto DL = getCurSDLoc();
12753 SDValue InVec = getValue(I.getOperand(0));
12754
12755 SmallVector<EVT, 4> ValueVTs;
12756 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
12757 ValueVTs);
12758
12759 EVT OutVT = ValueVTs[0];
12760 unsigned OutNumElts = OutVT.getVectorMinNumElements();
12761
12762 SmallVector<SDValue, 4> SubVecs(Factor);
12763 for (unsigned i = 0; i != Factor; ++i) {
12764 assert(ValueVTs[i] == OutVT && "Expected VTs to be the same");
12765 SubVecs[i] = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, OutVT, InVec,
12766 DAG.getVectorIdxConstant(OutNumElts * i, DL));
12767 }
12768
12769 // Use VECTOR_SHUFFLE for fixed-length vectors with factor of 2 to benefit
12770 // from existing legalisation and combines.
12771 if (OutVT.isFixedLengthVector() && Factor == 2) {
12772 SDValue Even = DAG.getVectorShuffle(OutVT, DL, SubVecs[0], SubVecs[1],
12773 createStrideMask(0, 2, OutNumElts));
12774 SDValue Odd = DAG.getVectorShuffle(OutVT, DL, SubVecs[0], SubVecs[1],
12775 createStrideMask(1, 2, OutNumElts));
12776 SDValue Res = DAG.getMergeValues({Even, Odd}, getCurSDLoc());
12777 setValue(&I, Res);
12778 return;
12779 }
12780
12781 SDValue Res = DAG.getNode(ISD::VECTOR_DEINTERLEAVE, DL,
12782 DAG.getVTList(ValueVTs), SubVecs);
12783 setValue(&I, Res);
12784}
12785
12786void SelectionDAGBuilder::visitVectorInterleave(const CallInst &I,
12787 unsigned Factor) {
12788 auto DL = getCurSDLoc();
12789 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12790 EVT InVT = getValue(I.getOperand(0)).getValueType();
12791 EVT OutVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12792
12793 SmallVector<SDValue, 8> InVecs(Factor);
12794 for (unsigned i = 0; i < Factor; ++i) {
12795 InVecs[i] = getValue(I.getOperand(i));
12796 assert(InVecs[i].getValueType() == InVecs[0].getValueType() &&
12797 "Expected VTs to be the same");
12798 }
12799
12800 // Use VECTOR_SHUFFLE for fixed-length vectors with factor of 2 to benefit
12801 // from existing legalisation and combines.
12802 if (OutVT.isFixedLengthVector() && Factor == 2) {
12803 unsigned NumElts = InVT.getVectorMinNumElements();
12804 SDValue V = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, InVecs);
12805 setValue(&I, DAG.getVectorShuffle(OutVT, DL, V, DAG.getUNDEF(OutVT),
12806 createInterleaveMask(NumElts, 2)));
12807 return;
12808 }
12809
12810 SmallVector<EVT, 8> ValueVTs(Factor, InVT);
12811 SDValue Res =
12812 DAG.getNode(ISD::VECTOR_INTERLEAVE, DL, DAG.getVTList(ValueVTs), InVecs);
12813
12815 for (unsigned i = 0; i < Factor; ++i)
12816 Results[i] = Res.getValue(i);
12817
12818 Res = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, Results);
12819 setValue(&I, Res);
12820}
12821
12822void SelectionDAGBuilder::visitFreeze(const FreezeInst &I) {
12823 SmallVector<EVT, 4> ValueVTs;
12824 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
12825 ValueVTs);
12826 unsigned NumValues = ValueVTs.size();
12827 if (NumValues == 0) return;
12828
12829 SmallVector<SDValue, 4> Values(NumValues);
12830 SDValue Op = getValue(I.getOperand(0));
12831
12832 for (unsigned i = 0; i != NumValues; ++i)
12833 Values[i] = DAG.getNode(ISD::FREEZE, getCurSDLoc(), ValueVTs[i],
12834 SDValue(Op.getNode(), Op.getResNo() + i));
12835
12837 DAG.getVTList(ValueVTs), Values));
12838}
12839
12840void SelectionDAGBuilder::visitVectorSplice(const CallInst &I) {
12841 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12842 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12843
12844 SDLoc DL = getCurSDLoc();
12845 SDValue V1 = getValue(I.getOperand(0));
12846 SDValue V2 = getValue(I.getOperand(1));
12847 int64_t Imm = cast<ConstantInt>(I.getOperand(2))->getSExtValue();
12848
12849 // VECTOR_SHUFFLE doesn't support a scalable mask so use a dedicated node.
12850 if (VT.isScalableVector()) {
12851 setValue(
12852 &I, DAG.getNode(ISD::VECTOR_SPLICE, DL, VT, V1, V2,
12853 DAG.getSignedConstant(
12854 Imm, DL, TLI.getVectorIdxTy(DAG.getDataLayout()))));
12855 return;
12856 }
12857
12858 unsigned NumElts = VT.getVectorNumElements();
12859
12860 uint64_t Idx = (NumElts + Imm) % NumElts;
12861
12862 // Use VECTOR_SHUFFLE to maintain original behaviour for fixed-length vectors.
12863 SmallVector<int, 8> Mask;
12864 for (unsigned i = 0; i < NumElts; ++i)
12865 Mask.push_back(Idx + i);
12866 setValue(&I, DAG.getVectorShuffle(VT, DL, V1, V2, Mask));
12867}
12868
12869// Consider the following MIR after SelectionDAG, which produces output in
12870// phyregs in the first case or virtregs in the second case.
12871//
12872// INLINEASM_BR ..., implicit-def $ebx, ..., implicit-def $edx
12873// %5:gr32 = COPY $ebx
12874// %6:gr32 = COPY $edx
12875// %1:gr32 = COPY %6:gr32
12876// %0:gr32 = COPY %5:gr32
12877//
12878// INLINEASM_BR ..., def %5:gr32, ..., def %6:gr32
12879// %1:gr32 = COPY %6:gr32
12880// %0:gr32 = COPY %5:gr32
12881//
12882// Given %0, we'd like to return $ebx in the first case and %5 in the second.
12883// Given %1, we'd like to return $edx in the first case and %6 in the second.
12884//
12885// If a callbr has outputs, it will have a single mapping in FuncInfo.ValueMap
12886// to a single virtreg (such as %0). The remaining outputs monotonically
12887// increase in virtreg number from there. If a callbr has no outputs, then it
12888// should not have a corresponding callbr landingpad; in fact, the callbr
12889// landingpad would not even be able to refer to such a callbr.
12891 MachineInstr *MI = MRI.def_begin(Reg)->getParent();
12892 // There is definitely at least one copy.
12893 assert(MI->getOpcode() == TargetOpcode::COPY &&
12894 "start of copy chain MUST be COPY");
12895 Reg = MI->getOperand(1).getReg();
12896
12897 // If the copied register in the first copy must be virtual.
12898 assert(Reg.isVirtual() && "expected COPY of virtual register");
12899 MI = MRI.def_begin(Reg)->getParent();
12900
12901 // There may be an optional second copy.
12902 if (MI->getOpcode() == TargetOpcode::COPY) {
12903 assert(Reg.isVirtual() && "expected COPY of virtual register");
12904 Reg = MI->getOperand(1).getReg();
12905 assert(Reg.isPhysical() && "expected COPY of physical register");
12906 } else {
12907 // The start of the chain must be an INLINEASM_BR.
12908 assert(MI->getOpcode() == TargetOpcode::INLINEASM_BR &&
12909 "end of copy chain MUST be INLINEASM_BR");
12910 }
12911
12912 return Reg;
12913}
12914
12915// We must do this walk rather than the simpler
12916// setValue(&I, getCopyFromRegs(CBR, CBR->getType()));
12917// otherwise we will end up with copies of virtregs only valid along direct
12918// edges.
12919void SelectionDAGBuilder::visitCallBrLandingPad(const CallInst &I) {
12920 SmallVector<EVT, 8> ResultVTs;
12921 SmallVector<SDValue, 8> ResultValues;
12922 const auto *CBR =
12923 cast<CallBrInst>(I.getParent()->getUniquePredecessor()->getTerminator());
12924
12925 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12926 const TargetRegisterInfo *TRI = DAG.getSubtarget().getRegisterInfo();
12927 MachineRegisterInfo &MRI = DAG.getMachineFunction().getRegInfo();
12928
12929 Register InitialDef = FuncInfo.ValueMap[CBR];
12930 SDValue Chain = DAG.getRoot();
12931
12932 // Re-parse the asm constraints string.
12933 TargetLowering::AsmOperandInfoVector TargetConstraints =
12934 TLI.ParseConstraints(DAG.getDataLayout(), TRI, *CBR);
12935 for (auto &T : TargetConstraints) {
12936 SDISelAsmOperandInfo OpInfo(T);
12937 if (OpInfo.Type != InlineAsm::isOutput)
12938 continue;
12939
12940 // Pencil in OpInfo.ConstraintType and OpInfo.ConstraintVT based on the
12941 // individual constraint.
12942 TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
12943
12944 switch (OpInfo.ConstraintType) {
12947 // Fill in OpInfo.AssignedRegs.Regs.
12948 getRegistersForValue(DAG, getCurSDLoc(), OpInfo, OpInfo);
12949
12950 // getRegistersForValue may produce 1 to many registers based on whether
12951 // the OpInfo.ConstraintVT is legal on the target or not.
12952 for (Register &Reg : OpInfo.AssignedRegs.Regs) {
12953 Register OriginalDef = FollowCopyChain(MRI, InitialDef++);
12954 if (OriginalDef.isPhysical())
12955 FuncInfo.MBB->addLiveIn(OriginalDef);
12956 // Update the assigned registers to use the original defs.
12957 Reg = OriginalDef;
12958 }
12959
12960 SDValue V = OpInfo.AssignedRegs.getCopyFromRegs(
12961 DAG, FuncInfo, getCurSDLoc(), Chain, nullptr, CBR);
12962 ResultValues.push_back(V);
12963 ResultVTs.push_back(OpInfo.ConstraintVT);
12964 break;
12965 }
12967 SDValue Flag;
12968 SDValue V = TLI.LowerAsmOutputForConstraint(Chain, Flag, getCurSDLoc(),
12969 OpInfo, DAG);
12970 ++InitialDef;
12971 ResultValues.push_back(V);
12972 ResultVTs.push_back(OpInfo.ConstraintVT);
12973 break;
12974 }
12975 default:
12976 break;
12977 }
12978 }
12980 DAG.getVTList(ResultVTs), ResultValues);
12981 setValue(&I, V);
12982}
unsigned const MachineRegisterInfo * MRI
return SDValue()
static unsigned getIntrinsicID(const SDNode *N)
unsigned RegSize
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static msgpack::DocNode getNode(msgpack::DocNode DN, msgpack::Type Type, MCValue Val)
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
Function Alias Analysis Results
Atomic ordering constants.
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
This file implements the BitVector class.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Analysis containing CSE Info
Definition CSEInfo.cpp:27
This file contains the declarations for the subclasses of Constant, which represent the different fla...
dxil translate DXIL Translate Metadata
static AttributeList getReturnAttrs(FastISel::CallLoweringInfo &CLI)
Returns an AttributeList representing the attributes applied to the return value of the given call.
Definition FastISel.cpp:942
#define Check(C,...)
static Value * getCondition(Instruction *I)
Hexagon Common GEP
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Module.h This file contains the declarations for the Module class.
static void getRegistersForValue(MachineFunction &MF, MachineIRBuilder &MIRBuilder, GISelAsmOperandInfo &OpInfo, GISelAsmOperandInfo &RefOpInfo)
Assign virtual/physical registers for the specified register operand.
This file defines an InstructionCost class that is used when calculating the cost of an instruction,...
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define RegName(no)
lazy value info
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Machine Check Debug Module
static bool isUndef(const MachineInstr &MI)
Register Reg
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
static const Function * getCalledFunction(const Value *V)
This file provides utility analysis objects describing memory locations.
This file provides utility for Memory Model Relaxation Annotations (MMRAs).
This file contains the declarations for metadata subclasses.
Type::TypeID TypeID
#define T
#define T1
static 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)
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
static Type * getValueType(Value *V)
Returns the type of the given value/instruction V.
This file contains some templates that are useful if you are working with the STL at all.
static bool hasOnlySelectUsers(const Value *Cond)
static SDValue getLoadStackGuard(SelectionDAG &DAG, const SDLoc &DL, SDValue &Chain)
Create a LOAD_STACK_GUARD node, and let it carry the target specific global variable if there exists ...
static bool getUniformBase(const Value *Ptr, SDValue &Base, SDValue &Index, SDValue &Scale, SelectionDAGBuilder *SDB, const BasicBlock *CurBB, uint64_t ElemSize)
static void failForInvalidBundles(const CallBase &I, StringRef Name, ArrayRef< uint32_t > AllowedBundles)
static void addStackMapLiveVars(const CallBase &Call, unsigned StartIdx, const SDLoc &DL, SmallVectorImpl< SDValue > &Ops, SelectionDAGBuilder &Builder)
Add a stack map intrinsic call's live variable operands to a stackmap or patchpoint target node's ope...
static const unsigned MaxParallelChains
static SDValue expandPow(const SDLoc &dl, SDValue LHS, SDValue RHS, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
visitPow - Lower a pow intrinsic.
static const CallBase * FindPreallocatedCall(const Value *PreallocatedSetup)
Given a @llvm.call.preallocated.setup, return the corresponding preallocated call.
static cl::opt< unsigned > SwitchPeelThreshold("switch-peel-threshold", cl::Hidden, cl::init(66), cl::desc("Set the case probability threshold for peeling the case from a " "switch statement. A value greater than 100 will void this " "optimization"))
static cl::opt< bool > InsertAssertAlign("insert-assert-align", cl::init(true), cl::desc("Insert the experimental `assertalign` node."), cl::ReallyHidden)
static unsigned getISDForVPIntrinsic(const VPIntrinsic &VPIntrin)
static bool handleDanglingVariadicDebugInfo(SelectionDAG &DAG, DILocalVariable *Variable, DebugLoc DL, unsigned Order, SmallVectorImpl< Value * > &Values, DIExpression *Expression)
static unsigned findMatchingInlineAsmOperand(unsigned OperandNo, const std::vector< SDValue > &AsmNodeOperands)
static void patchMatchingInput(const SDISelAsmOperandInfo &OpInfo, SDISelAsmOperandInfo &MatchingOpInfo, SelectionDAG &DAG)
Make sure that the output operand OpInfo and its corresponding input operand MatchingOpInfo have comp...
static void findUnwindDestinations(FunctionLoweringInfo &FuncInfo, const BasicBlock *EHPadBB, BranchProbability Prob, SmallVectorImpl< std::pair< MachineBasicBlock *, BranchProbability > > &UnwindDests)
When an invoke or a cleanupret unwinds to the next EH pad, there are many places it could ultimately ...
static unsigned FixedPointIntrinsicToOpcode(unsigned Intrinsic)
static BranchProbability scaleCaseProbality(BranchProbability CaseProb, BranchProbability PeeledCaseProb)
static SDValue expandExp2(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandExp2 - Lower an exp2 intrinsic.
static SDValue expandDivFix(unsigned Opcode, const SDLoc &DL, SDValue LHS, SDValue RHS, SDValue Scale, SelectionDAG &DAG, const TargetLowering &TLI)
static SDValue getF32Constant(SelectionDAG &DAG, unsigned Flt, const SDLoc &dl)
getF32Constant - Get 32-bit floating point constant.
static SDValue widenVectorToPartType(SelectionDAG &DAG, SDValue Val, const SDLoc &DL, EVT PartVT)
static SDValue expandLog10(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandLog10 - Lower a log10 intrinsic.
DenseMap< const Argument *, std::pair< const AllocaInst *, const StoreInst * > > ArgCopyElisionMapTy
static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &dl, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, const Value *V, std::optional< CallingConv::ID > CallConv)
getCopyToPartsVector - Create a series of nodes that contain the specified value split into legal par...
static void getUnderlyingArgRegs(SmallVectorImpl< std::pair< Register, TypeSize > > &Regs, const SDValue &N)
static void getCopyToParts(SelectionDAG &DAG, const SDLoc &DL, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, const Value *V, std::optional< CallingConv::ID > CallConv=std::nullopt, ISD::NodeType ExtendKind=ISD::ANY_EXTEND)
getCopyToParts - Create a series of nodes that contain the specified value split into legal parts.
static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT, SelectionDAGBuilder &Builder)
static SDValue expandLog2(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandLog2 - Lower a log2 intrinsic.
static SDValue getAddressForMemoryInput(SDValue Chain, const SDLoc &Location, SDISelAsmOperandInfo &OpInfo, SelectionDAG &DAG)
Get a direct memory input to behave well as an indirect operand.
static bool isOnlyUsedInEntryBlock(const Argument *A, bool FastISel)
isOnlyUsedInEntryBlock - If the specified argument is only used in the entry block,...
static void diagnosePossiblyInvalidConstraint(LLVMContext &Ctx, const Value *V, const Twine &ErrMsg)
static bool collectInstructionDeps(SmallMapVector< const Instruction *, bool, 8 > *Deps, const Value *V, SmallMapVector< const Instruction *, bool, 8 > *Necessary=nullptr, unsigned Depth=0)
static void findArgumentCopyElisionCandidates(const DataLayout &DL, FunctionLoweringInfo *FuncInfo, ArgCopyElisionMapTy &ArgCopyElisionCandidates)
Scan the entry block of the function in FuncInfo for arguments that look like copies into a local all...
static bool isFunction(SDValue Op)
static SDValue GetExponent(SelectionDAG &DAG, SDValue Op, const TargetLowering &TLI, const SDLoc &dl)
GetExponent - Get the exponent:
static Register FollowCopyChain(MachineRegisterInfo &MRI, Register Reg)
static SDValue ExpandPowI(const SDLoc &DL, SDValue LHS, SDValue RHS, SelectionDAG &DAG)
ExpandPowI - Expand a llvm.powi intrinsic.
static SDValue expandLog(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandLog - Lower a log intrinsic.
static SDValue getCopyFromParts(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V, SDValue InChain, std::optional< CallingConv::ID > CC=std::nullopt, std::optional< ISD::NodeType > AssertOp=std::nullopt)
getCopyFromParts - Create a value that contains the specified legal parts combined into the value the...
static SDValue getLimitedPrecisionExp2(SDValue t0, const SDLoc &dl, SelectionDAG &DAG)
static SDValue GetSignificand(SelectionDAG &DAG, SDValue Op, const SDLoc &dl)
GetSignificand - Get the significand and build it into a floating-point number with exponent of 1:
static SDValue expandExp(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandExp - Lower an exp intrinsic.
static const MDNode * getRangeMetadata(const Instruction &I)
static cl::opt< unsigned, true > LimitFPPrecision("limit-float-precision", cl::desc("Generate low-precision inline sequences " "for some float libcalls"), cl::location(LimitFloatPrecision), cl::Hidden, cl::init(0))
static void tryToElideArgumentCopy(FunctionLoweringInfo &FuncInfo, SmallVectorImpl< SDValue > &Chains, DenseMap< int, int > &ArgCopyElisionFrameIndexMap, SmallPtrSetImpl< const Instruction * > &ElidedArgCopyInstrs, ArgCopyElisionMapTy &ArgCopyElisionCandidates, const Argument &Arg, ArrayRef< SDValue > ArgVals, bool &ArgHasUses)
Try to elide argument copies from memory into a local alloca.
static unsigned LimitFloatPrecision
LimitFloatPrecision - Generate low-precision inline sequences for some float libcalls (6,...
static SDValue getCopyFromPartsVector(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V, SDValue InChain, std::optional< CallingConv::ID > CC)
getCopyFromPartsVector - Create a value that contains the specified legal parts combined into the val...
static bool InBlock(const Value *V, const BasicBlock *BB)
static FPClassTest getNoFPClass(const Instruction &I)
static LLVM_ATTRIBUTE_ALWAYS_INLINE MVT::SimpleValueType getSimpleVT(const unsigned char *MatcherTable, unsigned &MatcherIndex)
getSimpleVT - Decode a value in MatcherTable, if it's a VBR encoded value, use GetVBR to decode it.
This file defines the SmallPtrSet class.
This file contains some functions that are useful when dealing with strings.
#define LLVM_DEBUG(...)
Definition Debug.h:114
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
This pass exposes codegen information to IR-level passes.
Value * RHS
Value * LHS
static const fltSemantics & IEEEsingle()
Definition APFloat.h:296
Class for arbitrary precision integers.
Definition APInt.h:78
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:335
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:441
an instruction to allocate memory on the stack
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
Type * getAllocatedType() const
Return the type that is being allocated by the instruction.
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
LLVM_ABI bool hasAttribute(Attribute::AttrKind Kind) const
Check if an argument has a given attribute.
Definition Function.cpp:339
unsigned getArgNo() const
Return the index of this formal argument in its containing function.
Definition Argument.h:50
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator end() const
Definition ArrayRef.h:131
size_t size() const
size - Get the array size.
Definition ArrayRef.h:142
iterator begin() const
Definition ArrayRef.h:130
bool empty() const
empty - Check if the array is empty.
Definition ArrayRef.h:137
A cache of @llvm.assume calls within a function.
An instruction that atomically checks whether a specified value is in a memory location,...
an instruction that atomically reads a memory location, combines it with another value,...
@ Add
*p = old + v
@ FAdd
*p = old + v
@ USubCond
Subtract only if no unsigned overflow.
@ FMinimum
*p = minimum(old, v) minimum matches the behavior of llvm.minimum.
@ Min
*p = old <signed v ? old : v
@ Sub
*p = old - v
@ And
*p = old & v
@ Xor
*p = old ^ v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ FMaximum
*p = maximum(old, v) maximum matches the behavior of llvm.maximum.
@ FSub
*p = old - v
@ UIncWrap
Increment one up to a maximum value.
@ Max
*p = old >signed v ? old : v
@ UMin
*p = old <unsigned v ? old : v
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
@ UMax
*p = old >unsigned v ? old : v
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
@ Nand
*p = ~(old & v)
This class holds the attributes for a particular argument, parameter, function, or return value.
Definition Attributes.h:361
LLVM Basic Block Representation.
Definition BasicBlock.h:62
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
InstListType::const_iterator const_iterator
Definition BasicBlock.h:171
LLVM_ABI bool isEntryBlock() const
Return true if this is the entry block of the containing function.
LLVM_ABI InstListType::const_iterator getFirstNonPHIOrDbg(bool SkipPseudoOp=true) const
Returns a pointer to the first instruction in this block that is not a PHINode or a debug intrinsic,...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
Definition BasicBlock.h:233
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
This class represents a no-op cast from one type to another.
The address of a basic block.
Definition Constants.h:907
Conditional or Unconditional Branch instruction.
Analysis providing branch probability information.
LLVM_ABI BranchProbability getEdgeProbability(const BasicBlock *Src, unsigned IndexInSuccessors) const
Get an edge's probability, relative to other out-edges of the Src.
LLVM_ABI bool isEdgeHot(const BasicBlock *Src, const BasicBlock *Dst) const
Test if an edge is hot relative to other out-edges of the Src.
static uint32_t getDenominator()
static BranchProbability getOne()
static BranchProbability getUnknown()
uint32_t getNumerator() const
LLVM_ABI uint64_t scale(uint64_t Num) const
Scale a large integer.
BranchProbability getCompl() const
static BranchProbability getZero()
static void normalizeProbabilities(ProbabilityIter Begin, ProbabilityIter End)
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
std::optional< OperandBundleUse > getOperandBundle(StringRef Name) const
Return an operand bundle by name, if present.
CallingConv::ID getCallingConv() const
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
LLVM_ABI bool isMustTailCall() const
Tests if this call site must be tail call optimized.
LLVM_ABI bool isIndirectCall() const
Return true if the callsite is an indirect call.
unsigned countOperandBundlesOfType(StringRef Name) const
Return the number of operand bundles with the tag Name attached to this instruction.
Value * getCalledOperand() const
Value * getArgOperand(unsigned i) const
User::op_iterator arg_end()
Return the iterator pointing to the end of the argument list.
bool isConvergent() const
Determine if the invoke is convergent.
FunctionType * getFunctionType() const
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
LLVM_ABI bool isTailCall() const
Tests if this call site is marked as a tail call.
CallBr instruction, tracking function calls that may not return control but instead transfer it to a ...
This class represents a function call, abstracting a target machine's calling convention.
This class is the base class for the comparison instructions.
Definition InstrTypes.h:664
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:676
ConstantDataSequential - A vector or array constant whose element type is a simple 1/2/4/8-byte integ...
Definition Constants.h:601
A constant value that is initialized with an expression using other constant values.
Definition Constants.h:1133
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:285
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:222
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:171
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:162
A signed pointer, in the ptrauth sense.
Definition Constants.h:1040
uint64_t getZExtValue() const
Constant Vector Declarations.
Definition Constants.h:525
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:215
Records a position in IR for a source label (DILabel).
Base class for non-instruction debug metadata records that have positions within IR.
DebugLoc getDebugLoc() const
Record of a variable value-assignment, aka a non instruction representation of the dbg....
LLVM_ABI Value * getVariableLocationOp(unsigned OpIdx) const
DIExpression * getExpression() const
DILocalVariable * getVariable() const
LLVM_ABI iterator_range< location_op_iterator > location_ops() const
Get the locations corresponding to the variable referenced by the debug info intrinsic.
A debug info location.
Definition DebugLoc.h:123
LLVM_ABI DILocation * getInlinedAt() const
Definition DebugLoc.cpp:67
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:178
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
Definition DenseMap.h:74
bool empty() const
Definition DenseMap.h:109
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT, true > const_iterator
Definition DenseMap.h:75
iterator end()
Definition DenseMap.h:81
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:241
void reserve(size_type NumEntries)
Grow the densemap so that it can contain at least NumEntries items before resizing again.
Definition DenseMap.h:114
Diagnostic information for inline asm reporting.
static constexpr ElementCount getFixed(ScalarTy MinVal)
Definition TypeSize.h:309
static constexpr ElementCount get(ScalarTy MinVal, bool Scalable)
Definition TypeSize.h:315
constexpr bool isScalar() const
Exactly one element.
Definition TypeSize.h:320
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
Class representing an expression and its matching format.
This instruction extracts a struct member or array element value from an aggregate value.
This instruction compares its operands according to the predicate given to the constructor.
This is a fast-path instruction selection class that generates poor code and doesn't support illegal ...
Definition FastISel.h:66
bool allowReassoc() const
Flag queries.
Definition FMF.h:64
An instruction for ordering other memory operations.
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
Definition Type.cpp:802
This class represents a freeze function that returns random concrete value if an operand is either a ...
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
BranchProbabilityInfo * BPI
MachineBasicBlock * getMBB(const BasicBlock *BB) const
DenseMap< const AllocaInst *, int > StaticAllocaMap
StaticAllocaMap - Keep track of frame indices for fixed sized allocas in the entry block.
const LiveOutInfo * GetLiveOutRegInfo(Register Reg)
GetLiveOutRegInfo - Gets LiveOutInfo for a register, returning NULL if the register is a PHI destinat...
MachineBasicBlock * MBB
MBB - The current block.
Class to represent function types.
unsigned getNumParams() const
Return the number of fixed parameters this function type requires.
Type * getParamType(unsigned i) const
Parameter type accessors.
Type * getReturnType() const
Data structure describing the variable locations in a function.
const BasicBlock & getEntryBlock() const
Definition Function.h:807
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Definition Function.h:209
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
Definition Function.h:244
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition Function.h:703
bool hasParamAttribute(unsigned ArgNo, Attribute::AttrKind Kind) const
check if an attributes is in the list of attributes.
Definition Function.cpp:742
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
Definition Function.h:270
Constant * getPersonalityFn() const
Get the personality function associated with this function.
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:352
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
Definition Function.h:249
size_t arg_size() const
Definition Function.h:899
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:730
Garbage collection metadata for a single function.
Definition GCMetadata.h:80
bool hasNoUnsignedSignedWrap() const
bool hasNoUnsignedWrap() const
bool isInBounds() const
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
bool hasDLLImportStorageClass() const
Module * getParent()
Get the module that this global value is contained inside of...
This instruction compares its operands according to the predicate given to the constructor.
Indirect Branch Instruction.
This instruction inserts a struct field of array element value into an aggregate value.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
LLVM_ABI FastMathFlags getFastMathFlags() const LLVM_READONLY
Convenience function for getting all the fast-math flags, which must be an operator which supports th...
LLVM_ABI AAMDNodes getAAMetadata() const
Returns the AA metadata for this instruction.
@ MIN_INT_BITS
Minimum number of bits that can be specified.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
Invoke instruction.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
LLVM_ABI void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
The landingpad instruction holds all of the information necessary to generate correct exception handl...
A helper class to return the specified delimiter string after the first invocation of operator String...
An instruction for reading from memory.
static LocationSize precise(uint64_t Value)
static constexpr LocationSize beforeOrAfterPointer()
Any location before or after the base pointer (but still within the underlying object).
LLVM_ABI MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
LLVM_ABI MCSymbol * getOrCreateFrameAllocSymbol(const Twine &FuncName, unsigned Idx)
Gets a symbol that will be defined to the final stack offset of a local variable after codegen.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
Metadata node.
Definition Metadata.h:1078
Machine Value Type.
@ INVALID_SIMPLE_VALUE_TYPE
uint64_t getScalarSizeInBits() const
unsigned getVectorNumElements() const
bool isVector() const
Return true if this is a vector value type.
bool isInteger() const
Return true if this is an integer or a vector integer type.
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
ElementCount getVectorElementCount() const
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
bool bitsGE(MVT VT) const
Return true if this has no less bits than VT.
bool isScalarInteger() const
Return true if this is an integer, not including vectors.
static MVT getVectorVT(MVT VT, unsigned NumElements)
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
static MVT getIntegerVT(unsigned BitWidth)
void normalizeSuccProbs()
Normalize probabilities of all successors so that the sum of them becomes one.
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
LLVM_ABI void setSuccProbability(succ_iterator I, BranchProbability Prob)
Set successor probability of a given iterator.
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
SmallVectorImpl< MachineBasicBlock * >::iterator succ_iterator
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
void setIsEHContTarget(bool V=true)
Indicates if this is a target of Windows EH Continuation Guard.
void setIsEHFuncletEntry(bool V=true)
Indicates if this is the entry block of an EH funclet.
MachineInstrBundleIterator< MachineInstr > iterator
void setIsEHScopeEntry(bool V=true)
Indicates if this is the entry block of an EH scope, i.e., the block that that used to have a catchpa...
void setMachineBlockAddressTaken()
Set this block to indicate that its address is used as something other than the target of a terminato...
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
void setIsImmutableObjectIndex(int ObjectIdx, bool IsImmutable)
Marks the immutability of an object.
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
bool hasOpaqueSPAdjustment() const
Returns true if the function contains opaque dynamic stack adjustments.
int getStackProtectorIndex() const
Return the index for the stack protector object.
void setIsAliasedObjectIndex(int ObjectIdx, bool IsAliased)
Set "maybe pointed to by an LLVM IR value" for an object.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
void RemoveStackObject(int ObjectIdx)
Remove or mark dead a statically sized stack object.
void setFunctionContextIndex(int I)
const WinEHFuncInfo * getWinEHFuncInfo() const
getWinEHFuncInfo - Return information about how the current function uses Windows exception handling.
bool useDebugInstrRef() const
Returns true if the function's variable locations are tracked with instruction referencing.
void setCallSiteBeginLabel(MCSymbol *BeginLabel, unsigned Site)
Map the begin label for a call site.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, Align base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MCContext & getContext() const
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
void addCodeViewAnnotation(MCSymbol *Label, MDNode *MD)
Record annotations associated with a particular label.
Function & getFunction()
Return the LLVM function that this machine code represents.
BasicBlockListType::iterator iterator
void setHasEHContTarget(bool V)
void addInvoke(MachineBasicBlock *LandingPad, MCSymbol *BeginLabel, MCSymbol *EndLabel)
Provide the begin and end labels of an invoke style call and associate it with a try landing pad bloc...
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineInstr - Allocate a new MachineInstr.
void insert(iterator MBBI, MachineBasicBlock *MBB)
const MachineInstrBuilder & addSym(MCSymbol *Sym, unsigned char TargetFlags=0) const
const MachineInstrBuilder & addFrameIndex(int Idx) const
Representation of each machine instruction.
A description of a memory reference used in the backend.
Flags
Flags values. These may be or'd together.
@ MOVolatile
The memory access is volatile.
@ MODereferenceable
The memory access is dereferenceable (i.e., doesn't trap).
@ MOLoad
The memory access reads data.
@ MONonTemporal
The memory access is non-temporal.
@ MOInvariant
The memory access always returns the same value (or traps).
@ MOStore
The memory access writes data.
static MachineOperand CreateReg(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false, bool isRenamable=false)
static MachineOperand CreateFI(int Idx)
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLVM_ABI MCRegister getLiveInPhysReg(Register VReg) const
getLiveInPhysReg - If VReg is a live-in virtual register, return the corresponding live-in physical r...
An SDNode that represents everything that will be needed to construct a MachineInstr.
bool contains(const KeyT &Key) const
Definition MapVector.h:146
std::pair< iterator, bool > try_emplace(const KeyT &Key, Ts &&...Args)
Definition MapVector.h:116
static MemoryLocation getAfter(const Value *Ptr, const AAMDNodes &AATags=AAMDNodes())
Return a location that may access any location after Ptr, while remaining within the underlying objec...
Metadata wrapper in the Value hierarchy.
Definition Metadata.h:183
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:79
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Definition Register.h:83
Resume the propagation of an exception.
Return a value (possibly void), from a function.
Holds the information from a dbg_label node through SDISel.
static SDDbgOperand fromNode(SDNode *Node, unsigned ResNo)
static SDDbgOperand fromFrameIdx(unsigned FrameIdx)
static SDDbgOperand fromVReg(Register VReg)
static SDDbgOperand fromConst(const Value *Const)
Holds the information from a dbg_value node through SDISel.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
iterator_range< value_op_iterator > op_values() const
unsigned getIROrder() const
Return the node ordering.
uint64_t getAsZExtVal() const
Helper method returns the zero-extended integer value of a ConstantSDNode.
unsigned getNumValues() const
Return the number of values defined/returned by this operator.
const SDValue & getOperand(unsigned Num) const
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDNode * getNode() const
get the SDNode which holds the desired result
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
TypeSize getValueSizeInBits() const
Returns the size of the value in bits.
const SDValue & getOperand(unsigned i) const
unsigned getResNo() const
get the index which selects a specific result in the SDNode
MVT getSimpleValueType() const
Return the simple ValueType of the referenced return value.
unsigned getOpcode() const
SelectionDAGBuilder - This is the common target-independent lowering implementation that is parameter...
SDValue getValue(const Value *V)
getValue - Return an SDValue for the given Value.
DenseMap< const Constant *, Register > ConstantsOut
void addDanglingDebugInfo(SmallVectorImpl< Value * > &Values, DILocalVariable *Var, DIExpression *Expr, bool IsVariadic, DebugLoc DL, unsigned Order)
Register a dbg_value which relies on a Value which we have not yet seen.
void visitDbgInfo(const Instruction &I)
void clearDanglingDebugInfo()
Clear the dangling debug information map.
void LowerCallTo(const CallBase &CB, SDValue Callee, bool IsTailCall, bool IsMustTailCall, const BasicBlock *EHPadBB=nullptr, const TargetLowering::PtrAuthInfo *PAI=nullptr)
void clear()
Clear out the current SelectionDAG and the associated state and prepare this SelectionDAGBuilder obje...
void visitBitTestHeader(SwitchCG::BitTestBlock &B, MachineBasicBlock *SwitchBB)
visitBitTestHeader - This function emits necessary code to produce value suitable for "bit tests"
void LowerStatepoint(const GCStatepointInst &I, const BasicBlock *EHPadBB=nullptr)
std::unique_ptr< SDAGSwitchLowering > SL
SDValue lowerRangeToAssertZExt(SelectionDAG &DAG, const Instruction &I, SDValue Op)
bool HasTailCall
This is set to true if a call in the current block has been translated as a tail call.
bool ShouldEmitAsBranches(const std::vector< SwitchCG::CaseBlock > &Cases)
If the set of cases should be emitted as a series of branches, return true.
void EmitBranchForMergedCondition(const Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB, BranchProbability TProb, BranchProbability FProb, bool InvertCond)
EmitBranchForMergedCondition - Helper method for FindMergedConditions.
void LowerDeoptimizeCall(const CallInst *CI)
void LowerCallSiteWithDeoptBundle(const CallBase *Call, SDValue Callee, const BasicBlock *EHPadBB)
SwiftErrorValueTracking & SwiftError
Information about the swifterror values used throughout the function.
SDValue getNonRegisterValue(const Value *V)
getNonRegisterValue - Return an SDValue for the given Value, but don't look in FuncInfo....
const TargetTransformInfo * TTI
DenseMap< MachineBasicBlock *, SmallVector< unsigned, 4 > > LPadToCallSiteMap
Map a landing pad to the call site indexes.
SDValue lowerNoFPClassToAssertNoFPClass(SelectionDAG &DAG, const Instruction &I, SDValue Op)
void handleDebugDeclare(Value *Address, DILocalVariable *Variable, DIExpression *Expression, DebugLoc DL)
bool shouldKeepJumpConditionsTogether(const FunctionLoweringInfo &FuncInfo, const BranchInst &I, Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs, TargetLoweringBase::CondMergingParams Params) const
StatepointLoweringState StatepointLowering
State used while lowering a statepoint sequence (gc_statepoint, gc_relocate, and gc_result).
void visitBitTestCase(SwitchCG::BitTestBlock &BB, MachineBasicBlock *NextMBB, BranchProbability BranchProbToNext, Register Reg, SwitchCG::BitTestCase &B, MachineBasicBlock *SwitchBB)
visitBitTestCase - this function produces one "bit test"
bool canTailCall(const CallBase &CB) const
void populateCallLoweringInfo(TargetLowering::CallLoweringInfo &CLI, const CallBase *Call, unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy, AttributeSet RetAttrs, bool IsPatchPoint)
Populate a CallLowerinInfo (into CLI) based on the properties of the call being lowered.
void CopyValueToVirtualRegister(const Value *V, Register Reg, ISD::NodeType ExtendType=ISD::ANY_EXTEND)
void salvageUnresolvedDbgValue(const Value *V, DanglingDebugInfo &DDI)
For the given dangling debuginfo record, perform last-ditch efforts to resolve the debuginfo to somet...
SmallVector< SDValue, 8 > PendingLoads
Loads are not emitted to the program immediately.
GCFunctionInfo * GFI
Garbage collection metadata for the function.
void init(GCFunctionInfo *gfi, BatchAAResults *BatchAA, AssumptionCache *AC, const TargetLibraryInfo *li, const TargetTransformInfo &TTI)
SDValue getRoot()
Similar to getMemoryRoot, but also flushes PendingConstrainedFP(Strict) items.
void ExportFromCurrentBlock(const Value *V)
ExportFromCurrentBlock - If this condition isn't known to be exported from the current basic block,...
void resolveOrClearDbgInfo()
Evict any dangling debug information, attempting to salvage it first.
std::pair< SDValue, SDValue > lowerInvokable(TargetLowering::CallLoweringInfo &CLI, const BasicBlock *EHPadBB=nullptr)
SDValue getMemoryRoot()
Return the current virtual root of the Selection DAG, flushing any PendingLoad items.
void resolveDanglingDebugInfo(const Value *V, SDValue Val)
If we saw an earlier dbg_value referring to V, generate the debug data structures now that we've seen...
void visit(const Instruction &I)
void dropDanglingDebugInfo(const DILocalVariable *Variable, const DIExpression *Expr)
If we have dangling debug info that describes Variable, or an overlapping part of variable considerin...
SDValue getCopyFromRegs(const Value *V, Type *Ty)
If there was virtual register allocated for the value V emit CopyFromReg of the specified type Ty.
void CopyToExportRegsIfNeeded(const Value *V)
CopyToExportRegsIfNeeded - If the given value has virtual registers created for it,...
void handleKillDebugValue(DILocalVariable *Var, DIExpression *Expr, DebugLoc DbgLoc, unsigned Order)
Create a record for a kill location debug intrinsic.
void visitJumpTable(SwitchCG::JumpTable &JT)
visitJumpTable - Emit JumpTable node in the current MBB
SDValue getFPOperationRoot(fp::ExceptionBehavior EB)
Return the current virtual root of the Selection DAG, flushing PendingConstrainedFP or PendingConstra...
void visitJumpTableHeader(SwitchCG::JumpTable &JT, SwitchCG::JumpTableHeader &JTH, MachineBasicBlock *SwitchBB)
visitJumpTableHeader - This function emits necessary code to produce index in the JumpTable from swit...
void LowerCallSiteWithPtrAuthBundle(const CallBase &CB, const BasicBlock *EHPadBB)
static const unsigned LowestSDNodeOrder
Lowest valid SDNodeOrder.
FunctionLoweringInfo & FuncInfo
Information about the function as a whole.
void setValue(const Value *V, SDValue NewN)
void FindMergedConditions(const Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB, Instruction::BinaryOps Opc, BranchProbability TProb, BranchProbability FProb, bool InvertCond)
const TargetLibraryInfo * LibInfo
bool isExportableFromCurrentBlock(const Value *V, const BasicBlock *FromBB)
void visitSPDescriptorParent(StackProtectorDescriptor &SPD, MachineBasicBlock *ParentBB)
Codegen a new tail for a stack protector check ParentMBB which has had its tail spliced into a stack ...
bool handleDebugValue(ArrayRef< const Value * > Values, DILocalVariable *Var, DIExpression *Expr, DebugLoc DbgLoc, unsigned Order, bool IsVariadic)
For a given list of Values, attempt to create and record a SDDbgValue in the SelectionDAG.
SDValue getControlRoot()
Similar to getRoot, but instead of flushing all the PendingLoad items, flush all the PendingExports (...
void UpdateSplitBlock(MachineBasicBlock *First, MachineBasicBlock *Last)
When an MBB was split during scheduling, update the references that need to refer to the last resulti...
SDValue getValueImpl(const Value *V)
getValueImpl - Helper function for getValue and getNonRegisterValue.
void visitSwitchCase(SwitchCG::CaseBlock &CB, MachineBasicBlock *SwitchBB)
visitSwitchCase - Emits the necessary code to represent a single node in the binary search tree resul...
void visitSPDescriptorFailure(StackProtectorDescriptor &SPD)
Codegen the failure basic block for a stack protector check.
std::unique_ptr< FunctionLoweringInfo > FuncInfo
SmallPtrSet< const Instruction *, 4 > ElidedArgCopyInstrs
const TargetLowering * TLI
MachineRegisterInfo * RegInfo
std::unique_ptr< SwiftErrorValueTracking > SwiftError
virtual void emitFunctionEntryCode()
std::unique_ptr< SelectionDAGBuilder > SDB
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrnlen(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src, SDValue MaxLength, MachinePointerInfo SrcPtrInfo) const
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrlen(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src, const CallInst *CI) const
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrcpy(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dest, SDValue Src, MachinePointerInfo DestPtrInfo, MachinePointerInfo SrcPtrInfo, bool isStpcpy) const
Emit target-specific code that performs a strcpy or stpcpy, in cases where that is faster than a libc...
virtual std::pair< SDValue, SDValue > EmitTargetCodeForMemchr(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Src, SDValue Char, SDValue Length, MachinePointerInfo SrcPtrInfo) const
Emit target-specific code that performs a memchr, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForMemcmp(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, SDValue Op3, const CallInst *CI) const
Emit target-specific code that performs a memcmp/bcmp, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrcmp(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, MachinePointerInfo Op1PtrInfo, MachinePointerInfo Op2PtrInfo) const
Emit target-specific code that performs a strcmp, in cases where that is faster than a libcall.
virtual SDValue EmitTargetCodeForSetTag(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Addr, SDValue Size, MachinePointerInfo DstPtrInfo, bool ZeroData) const
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
SDValue getExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT, unsigned Opcode)
Convert Op, which must be of integer type, to the integer type VT, by either any/sign/zero-extending ...
const SDValue & getRoot() const
Return the root tag of the SelectionDAG.
const TargetSubtargetInfo & getSubtarget() const
SDValue getCopyToReg(SDValue Chain, const SDLoc &dl, Register Reg, SDValue N)
LLVM_ABI SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
LLVM_ABI SDValue getShiftAmountConstant(uint64_t Val, EVT VT, const SDLoc &DL)
LLVM_ABI MachineSDNode * getMachineNode(unsigned Opcode, const SDLoc &dl, EVT VT)
These are used for target selectors to create a new node with specified return type(s),...
LLVM_ABI void ExtractVectorElements(SDValue Op, SmallVectorImpl< SDValue > &Args, unsigned Start=0, unsigned Count=0, EVT EltVT=EVT())
Append the extracted elements from Start to Count out of the vector Op in Args.
LLVM_ABI SDValue getConstantPool(const Constant *C, EVT VT, MaybeAlign Align=std::nullopt, int Offs=0, bool isT=false, unsigned TargetFlags=0)
LLVM_ABI SDValue getConstantFP(double Val, const SDLoc &DL, EVT VT, bool isTarget=false)
Create a ConstantFPSDNode wrapping a constant value.
LLVM_ABI SDValue getRegister(Register Reg, EVT VT)
LLVM_ABI SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr)
Loads are not normal binary operators: their result type is not determined by their operands,...
LLVM_ABI Align getEVTAlign(EVT MemoryVT) const
Compute the default alignment value for the given type.
LLVM_ABI bool shouldOptForSize() const
const TargetLowering & getTargetLoweringInfo() const
static constexpr unsigned MaxRecursionDepth
LLVM_ABI void AddDbgValue(SDDbgValue *DB, bool isParameter)
Add a dbg_value SDNode.
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Ops)
Return an ISD::BUILD_VECTOR node.
LLVM_ABI SDValue getBitcast(EVT VT, SDValue V)
Return a bitcast using the SDLoc of the value operand, and casting to the provided type.
LLVM_ABI SDDbgValue * getDbgValueList(DIVariable *Var, DIExpression *Expr, ArrayRef< SDDbgOperand > Locs, ArrayRef< SDNode * > Dependencies, bool IsIndirect, const DebugLoc &DL, unsigned O, bool IsVariadic)
Creates a SDDbgValue node from a list of locations.
SDValue getCopyFromReg(SDValue Chain, const SDLoc &dl, Register Reg, EVT VT)
LLVM_ABI void setNodeMemRefs(MachineSDNode *N, ArrayRef< MachineMemOperand * > NewMemRefs)
Mutate the specified machine node's memory references to the provided list.
const DataLayout & getDataLayout() const
SDValue getTargetFrameIndex(int FI, EVT VT)
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getMemBasePlusOffset(SDValue Base, TypeSize Offset, const SDLoc &DL, const SDNodeFlags Flags=SDNodeFlags())
Returns sum of the base pointer and offset.
LLVM_ABI SDValue getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
LLVM_ABI SDValue getBasicBlock(MachineBasicBlock *MBB)
LLVM_ABI SDValue getPtrExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either truncating it or perform...
LLVM_ABI SDValue getAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either any-extending or truncat...
LLVM_ABI SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI SDValue getValueType(EVT)
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
LLVM_ABI SDValue getFPExtendOrRound(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of float type, to the float type VT, by either extending or rounding (by tr...
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
LLVM_ABI SDValue getVectorIdxConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
MachineFunction & getMachineFunction() const
LLVM_ABI SDValue getFrameIndex(int FI, EVT VT, bool isTarget=false)
LLVM_ABI SDValue getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either zero-extending or trunca...
LLVMContext * getContext() const
const SDValue & setRoot(SDValue N)
Set the current root tag of the SelectionDAG.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void swap(SmallVectorImpl &RHS)
void resize(size_type N)
void push_back(const T &Elt)
pointer data()
Return a pointer to the vector's buffer, even if empty().
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Encapsulates all of the information needed to generate a stack protector check, and signals to isel w...
MachineBasicBlock * getSuccessMBB()
MachineBasicBlock * getFailureMBB()
MachineBasicBlock * getParentMBB()
bool shouldEmitFunctionBasedCheckStackProtector() const
An instruction for storing to memory.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:143
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:140
Multiway switch.
Information about stack frame layout on the target.
virtual TargetStackID::Value getStackIDForScalableVectors() const
Returns the StackID that scalable vectors should be associated with.
Provides information about what library functions are available for the current target.
virtual Align getByValTypeAlignment(Type *Ty, const DataLayout &DL) const
Returns the desired alignment for ByVal or InAlloca aggregate function arguments in the caller parame...
virtual bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF, EVT) const
Return true if an FMA operation is faster than a pair of fmul and fadd instructions.
EVT getMemValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
EVT getValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Return the EVT corresponding to this LLVM type.
LegalizeAction
This enum indicates whether operations are valid for a target, and if not, what action should be used...
virtual 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 Value * getSDagStackGuard(const Module &M) const
Return the variable that's previously inserted by insertSSPDeclarations, if any, otherwise return nul...
virtual unsigned getNumRegisters(LLVMContext &Context, EVT VT, std::optional< MVT > RegisterVT=std::nullopt) const
Return the number of registers that this ValueType will eventually require.
unsigned getBitWidthForCttzElements(Type *RetTy, ElementCount EC, bool ZeroIsPoison, const ConstantRange *VScaleRange) const
Return the minimum number of bits required to hold the maximum possible number of trailing zero vecto...
virtual bool shouldExtendGSIndex(EVT VT, EVT &EltTy) const
Returns true if the index type for a masked gather/scatter requires extending.
virtual unsigned getVectorTypeBreakdownForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const
Certain targets such as MIPS require that some types such as vectors are always broken down into scal...
Function * getSSPStackGuardCheck(const Module &M) const
If the target has a standard stack protection check function that performs validation and error handl...
Register getStackPointerRegisterToSaveRestore() const
If a physical register, this specifies the register that llvm.savestack/llvm.restorestack should save...
LegalizeAction getFixedPointOperationAction(unsigned Op, EVT VT, unsigned Scale) const
Some fixed point operations may be natively supported by the target but only for specific scales.
MachineMemOperand::Flags getAtomicMemOperandFlags(const Instruction &AI, const DataLayout &DL) const
virtual bool 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 bool getTgtMemIntrinsic(IntrinsicInfo &, const CallBase &, MachineFunction &, unsigned) const
Given an intrinsic, checks if on the target the intrinsic will need to map to a MemIntrinsicNode (tou...
virtual EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const
Return the ValueType of the result of SETCC operations.
MachineMemOperand::Flags getLoadMemOperandFlags(const LoadInst &LI, const DataLayout &DL, AssumptionCache *AC=nullptr, const TargetLibraryInfo *LibInfo=nullptr) const
virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
MVT getProgramPointerTy(const DataLayout &DL) const
Return the type for code pointers, which is determined by the program address space specified through...
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
bool isOperationLegal(unsigned Op, EVT VT) const
Return true if the specified operation is legal on this target.
virtual bool shouldExpandVectorMatch(EVT VT, unsigned SearchSize) const
Return true if the @llvm.experimental.vector.match intrinsic should be expanded for vector type ‘VT’ ...
virtual MVT getFenceOperandTy(const DataLayout &DL) const
Return the type for operands of fence.
virtual bool shouldExpandGetVectorLength(EVT CountVT, unsigned VF, bool IsScalable) const
bool isOperationLegalOrCustom(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal with custom lower...
virtual MVT hasFastEqualityCompare(unsigned NumBits) const
Return the preferred operand type if the target has a quick way to compare integer values of the give...
MachineMemOperand::Flags getStoreMemOperandFlags(const StoreInst &SI, const DataLayout &DL) const
virtual bool shouldExpandCttzElements(EVT VT) const
Return true if the @llvm.experimental.cttz.elts intrinsic should be expanded using generic code in Se...
virtual bool signExtendConstant(const ConstantInt *C) const
Return true if this constant should be sign extended when promoting to a larger type.
LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const
Return how we should legalize values of this type, either it is already legal (return 'Legal') or we ...
virtual Register getExceptionPointerRegister(const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception address on entry to an ...
bool supportsUnalignedAtomics() const
Whether the target supports unaligned atomic operations.
std::vector< ArgListEntry > ArgListTy
bool isBeneficialToExpandPowI(int64_t Exponent, bool OptForSize) const
Return true if it is beneficial to expand an @llvm.powi.
virtual bool useStackGuardMixCookie() const
If this function returns true, stack protection checks should mix the stack guard value before checki...
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 InlineAsm::ConstraintCode getInlineAsmMemConstraint(StringRef ConstraintCode) const
std::vector< AsmOperandInfo > AsmOperandInfoVector
SDValue expandIS_FPCLASS(EVT ResultVT, SDValue Op, FPClassTest Test, SDNodeFlags Flags, const SDLoc &DL, SelectionDAG &DAG) const
Expand check for floating point class.
virtual SDValue prepareVolatileOrAtomicLoad(SDValue Chain, const SDLoc &DL, SelectionDAG &DAG) const
This callback is used to prepare for a volatile or atomic load.
virtual ConstraintType getConstraintType(StringRef Constraint) const
Given a constraint, return the type of constraint it is for this target.
virtual bool splitValueIntoRegisterParts(SelectionDAG &DAG, const SDLoc &DL, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, std::optional< CallingConv::ID > CC) const
Target-specific splitting of values into parts that fit a register storing a legal type.
virtual SDValue joinRegisterPartsIntoValue(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, std::optional< CallingConv::ID > CC) const
Target-specific combining of register parts into its original value.
virtual SDValue LowerCall(CallLoweringInfo &, SmallVectorImpl< SDValue > &) const
This hook must be implemented to lower calls into the specified DAG.
std::pair< SDValue, SDValue > LowerCallTo(CallLoweringInfo &CLI) const
This function lowers an abstract call to a function into an actual call.
virtual SDValue LowerAsmOutputForConstraint(SDValue &Chain, SDValue &Glue, const SDLoc &DL, const AsmOperandInfo &OpInfo, SelectionDAG &DAG) const
virtual std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const
Given a physical register constraint (e.g.
virtual SDValue emitStackGuardMixCookie(SelectionDAG &DAG, SDValue Val, const SDLoc &DL, bool FailureBB) const
virtual AsmOperandInfoVector ParseConstraints(const DataLayout &DL, const TargetRegisterInfo *TRI, const CallBase &Call) const
Split up the constraint string from the inline assembly value into the specific constraints and their...
virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const
This callback is invoked for operations that are unsupported by the target, which are registered to u...
virtual bool functionArgumentNeedsConsecutiveRegisters(Type *Ty, CallingConv::ID CallConv, bool isVarArg, const DataLayout &DL) const
For some targets, an LLVM struct type must be broken down into multiple simple types,...
virtual void ComputeConstraintToUse(AsmOperandInfo &OpInfo, SDValue Op, SelectionDAG *DAG=nullptr) const
Determines the constraint code and constraint type to use for the specific AsmOperandInfo,...
virtual void CollectTargetIntrinsicOperands(const CallInst &I, SmallVectorImpl< SDValue > &Ops, SelectionDAG &DAG) const
virtual SDValue visitMaskedStore(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, MachineMemOperand *MMO, SDValue Ptr, SDValue Val, SDValue Mask) const
virtual bool useLoadStackGuardNode(const Module &M) const
If this function returns true, SelectionDAGBuilder emits a LOAD_STACK_GUARD node when it is lowering ...
virtual void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint, std::vector< SDValue > &Ops, SelectionDAG &DAG) const
Lower the specified operand into the Ops vector.
std::pair< SDValue, SDValue > makeLibCall(SelectionDAG &DAG, RTLIB::LibcallImpl LibcallImpl, EVT RetVT, ArrayRef< SDValue > Ops, MakeLibCallOptions CallOptions, const SDLoc &dl, SDValue Chain=SDValue()) const
Returns a pair of (return value, chain).
virtual void LowerOperationWrapper(SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG) const
This callback is invoked by the type legalizer to legalize nodes with an illegal operand type but leg...
virtual bool isInlineAsmTargetBranch(const SmallVectorImpl< StringRef > &AsmStrs, unsigned OpNo) const
On x86, return true if the operand with index OpNo is a CALL or JUMP instruction, which can use eithe...
virtual MVT getJumpTableRegTy(const DataLayout &DL) const
virtual bool CanLowerReturn(CallingConv::ID, MachineFunction &, bool, const SmallVectorImpl< ISD::OutputArg > &, LLVMContext &, const Type *RetTy) const
This hook should be implemented to check whether the return values described by the Outs array can fi...
CodeGenOptLevel getOptLevel() const
Returns the optimization level: None, Less, Default, or Aggressive.
unsigned NoTrapAfterNoreturn
Do not emit a trap instruction for 'unreachable' IR instructions behind noreturn calls,...
unsigned TrapUnreachable
Emit target-specific trap instruction for 'unreachable' IR instructions.
unsigned getID() const
Return the register class ID number.
iterator begin() const
begin/end - Return all of the registers in this class.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
@ TCK_Latency
The latency of instruction.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:343
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
LLVM_ABI bool isEmptyTy() const
Return true if this type is empty, that is, it has no elements or all of its elements are empty.
Definition Type.cpp:180
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:273
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:267
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:280
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:352
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:128
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:293
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:240
bool isTokenTy() const
Return true if this is 'token'.
Definition Type.h:234
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
Definition Type.cpp:300
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Definition Type.h:225
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:139
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:285
Value * getOperand(unsigned i) const
Definition User.h:233
unsigned getNumOperands() const
Definition User.h:255
op_iterator op_end()
Definition User.h:287
This class represents the va_arg llvm instruction, which returns an argument of the specified type gi...
LLVM_ABI CmpInst::Predicate getPredicate() const
This is the common base class for vector predication intrinsics.
static LLVM_ABI std::optional< unsigned > getVectorLengthParamPos(Intrinsic::ID IntrinsicID)
LLVM_ABI MaybeAlign getPointerAlignment() const
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:439
iterator_range< user_iterator > users()
Definition Value.h:426
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:708
bool use_empty() const
Definition Value.h:346
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.cpp:1106
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
Base class of all SIMD vector types.
Type * getElementType() const
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:230
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
const ParentTy * getParent() const
Definition ilist_node.h:34
A raw_ostream that writes to an std::string.
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char SymbolName[]
Key for Kernel::Metadata::mSymbolName.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
Definition CallingConv.h:60
@ AMDGPU_CS_Chain
Used on AMDGPUs to give the middle-end more control over argument placement.
@ X86_VectorCall
MSVC calling convention that passes vectors and vector aggregates in SSE registers.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:41
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition ISDOpcodes.h:256
@ STACKRESTORE
STACKRESTORE has two operands, an input chain and a pointer to restore to it returns an output chain.
@ STACKSAVE
STACKSAVE - STACKSAVE has one operand, an input chain.
@ CTLZ_ZERO_UNDEF
Definition ISDOpcodes.h:782
@ 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:506
@ DELETED_NODE
DELETED_NODE - This is an illegal value that is used to catch errors.
Definition ISDOpcodes.h:45
@ SET_FPENV
Sets the current floating-point environment.
@ LOOP_DEPENDENCE_RAW_MASK
@ VECREDUCE_SEQ_FADD
Generic reduction nodes.
@ EH_SJLJ_LONGJMP
OUTCHAIN = EH_SJLJ_LONGJMP(INCHAIN, buffer) This corresponds to the eh.sjlj.longjmp intrinsic.
Definition ISDOpcodes.h:163
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition ISDOpcodes.h:595
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:773
@ SMULFIX
RESULT = [US]MULFIX(LHS, RHS, SCALE) - Perform fixed point multiplication on 2 integers with the same...
Definition ISDOpcodes.h:389
@ 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:259
@ SMULFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
Definition ISDOpcodes.h:395
@ 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:843
@ ATOMIC_LOAD_USUB_COND
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:513
@ 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:215
@ EH_SJLJ_SETUP_DISPATCH
OUTCHAIN = EH_SJLJ_SETUP_DISPATCH(INCHAIN) The target initializes the dispatch table here.
Definition ISDOpcodes.h:167
@ GlobalAddress
Definition ISDOpcodes.h:88
@ 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:870
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition ISDOpcodes.h:579
@ VECREDUCE_FMAX
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:412
@ 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:746
@ 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:523
@ FPTRUNC_ROUND
FPTRUNC_ROUND - This corresponds to the fptrunc_round intrinsic.
Definition ISDOpcodes.h:510
@ FAKE_USE
FAKE_USE represents a use of the operand but does not do anything.
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
Definition ISDOpcodes.h:983
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
Definition ISDOpcodes.h:249
@ 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:402
@ EH_LABEL
EH_LABEL - Represents a label in mid basic block used to track locations needed for debug and excepti...
@ ATOMIC_LOAD_USUB_SAT
@ EH_RETURN
OUTCHAIN = EH_RETURN(INCHAIN, OFFSET, HANDLER) - This node represents 'eh_return' gcc dwarf builtin,...
Definition ISDOpcodes.h:151
@ ANNOTATION_LABEL
ANNOTATION_LABEL - Represents a mid basic block label used by annotations.
@ SET_ROUNDING
Set rounding mode.
Definition ISDOpcodes.h:965
@ CONVERGENCECTRL_GLUE
This does not correspond to any convergence control intrinsic.
@ PARTIAL_REDUCE_UMLA
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:834
@ PREALLOCATED_SETUP
PREALLOCATED_SETUP - This has 2 operands: an input chain and a SRCVALUE with the preallocated call Va...
@ READSTEADYCOUNTER
READSTEADYCOUNTER - This corresponds to the readfixedcounter intrinsic.
@ ADDROFRETURNADDR
ADDROFRETURNADDR - Represents the llvm.addressofreturnaddress intrinsic.
Definition ISDOpcodes.h:117
@ CONVERGENCECTRL_ENTRY
@ BR
Control flow instructions. These all have token chains.
@ VECREDUCE_FADD
These reductions have relaxed evaluation order semantics, and have a single vector operand.
@ CTTZ_ZERO_UNDEF
Bit counting operators with an undefined result for zero inputs.
Definition ISDOpcodes.h:781
@ 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:347
@ 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:630
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition ISDOpcodes.h:536
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
Definition ISDOpcodes.h:543
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition ISDOpcodes.h:369
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:786
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
Definition ISDOpcodes.h:242
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition ISDOpcodes.h:671
@ 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:225
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition ISDOpcodes.h:343
@ 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:960
@ 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:764
@ 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:609
@ EntryToken
EntryToken - This is the marker used to indicate the start of a region.
Definition ISDOpcodes.h:48
@ READ_REGISTER
READ_REGISTER, WRITE_REGISTER - This node represents llvm.register on the DAG, which implements the n...
Definition ISDOpcodes.h:134
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition ISDOpcodes.h:571
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:840
@ 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:130
@ 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:381
@ PATCHPOINT
The llvm.experimental.patchpoint.
@ SMULO
Same for multiplication.
Definition ISDOpcodes.h:351
@ ATOMIC_LOAD_FMINIMUM
@ DYNAMIC_STACKALLOC
DYNAMIC_STACKALLOC - Allocate some number of bytes on the stack aligned to a specified boundary.
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:726
@ VECTOR_REVERSE
VECTOR_REVERSE(VECTOR) - Returns a vector, of the same type as VECTOR, whose elements are shuffled us...
Definition ISDOpcodes.h:635
@ SDIVFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
Definition ISDOpcodes.h:408
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:968
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition ISDOpcodes.h:795
@ PCMARKER
PCMARKER - This corresponds to the pcmarker intrinsic.
@ INLINEASM_BR
INLINEASM_BR - Branching version of inline asm. Used by asm-goto.
@ EH_DWARF_CFA
EH_DWARF_CFA - This node represents the pointer to the DWARF Canonical Frame Address (CFA),...
Definition ISDOpcodes.h:145
@ FRAMEADDR
FRAMEADDR, RETURNADDR - These nodes represent llvm.frameaddress and llvm.returnaddress on the DAG.
Definition ISDOpcodes.h:110
@ ATOMIC_LOAD_UDEC_WRAP
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition ISDOpcodes.h:495
@ 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:916
@ 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:738
@ TRAP
TRAP - Trapping instruction.
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition ISDOpcodes.h:200
@ SCMP
[US]CMP - 3-way comparison of signed or unsigned integers.
Definition ISDOpcodes.h:734
@ STRICT_FADD
Constrained versions of the binary floating point operators.
Definition ISDOpcodes.h:422
@ 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:236
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition ISDOpcodes.h:560
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:53
@ VECTOR_SPLICE
VECTOR_SPLICE(VEC1, VEC2, IMM) - Returns a subvector of the same type as VEC1/VEC2 from CONCAT_VECTOR...
Definition ISDOpcodes.h:656
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition ISDOpcodes.h:949
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
Definition ISDOpcodes.h:698
@ 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:935
@ VECREDUCE_FMINIMUM
@ EH_SJLJ_SETJMP
RESULT, OUTCHAIN = EH_SJLJ_SETJMP(INCHAIN, buffer) This corresponds to the eh.sjlj....
Definition ISDOpcodes.h:157
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:846
@ BRCOND
BRCOND - Conditional branch.
@ VECREDUCE_SEQ_FMUL
@ CATCHRET
CATCHRET - Represents a return from a catch block funclet.
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition ISDOpcodes.h:62
@ ATOMIC_LOAD_UINC_WRAP
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition ISDOpcodes.h:529
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition ISDOpcodes.h:360
@ VECTOR_DEINTERLEAVE
VECTOR_DEINTERLEAVE(VEC1, VEC2, ...) - Returns N vectors from N input vectors, where N is the factor ...
Definition ISDOpcodes.h:619
@ GET_DYNAMIC_AREA_OFFSET
GET_DYNAMIC_AREA_OFFSET - get offset from native SP to the address of the most recent dynamic alloca.
@ FMINIMUMNUM
FMINIMUMNUM/FMAXIMUMNUM - minimumnum/maximumnum that is same with FMINNUM_IEEE and FMAXNUM_IEEE besid...
@ ADJUST_TRAMPOLINE
ADJUST_TRAMPOLINE - This corresponds to the adjust_trampoline intrinsic.
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition ISDOpcodes.h:208
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:551
@ LOOP_DEPENDENCE_WAR_MASK
The llvm.loop.dependence.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM.
Flag
These should be considered private to the implementation of the MCInstrDesc class.
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
bool match(Val *V, const Pattern &P)
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
TwoOps_match< Val_t, Idx_t, Instruction::ExtractElement > m_ExtractElt(const Val_t &Val, const Idx_t &Idx)
Matches ExtractElementInst.
IntrinsicID_match m_VScale()
Matches a call to llvm.vscale().
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
Offsets
Offsets in bytes from the start of the input buffer.
std::pair< JumpTableHeader, JumpTable > JumpTableBlock
void sortAndRangeify(CaseClusterVector &Clusters)
Sort Clusters and merge adjacent cases.
std::vector< CaseCluster > CaseClusterVector
@ CC_Range
A cluster of adjacent case labels with the same destination, or just one case.
@ CC_JumpTable
A cluster of cases suitable for jump table lowering.
@ CC_BitTests
A cluster of cases suitable for bit test lowering.
SmallVector< SwitchWorkListItem, 4 > SwitchWorkList
CaseClusterVector::iterator CaseClusterIt
initializer< Ty > init(const Ty &Val)
LocationClass< Ty > location(Ty &L)
@ DW_OP_LLVM_arg
Only used in LLVM metadata.
Definition Dwarf.h:149
ExceptionBehavior
Exception behavior used for floating point operations.
Definition FPEnv.h:39
@ ebStrict
This corresponds to "fpexcept.strict".
Definition FPEnv.h:42
@ ebMayTrap
This corresponds to "fpexcept.maytrap".
Definition FPEnv.h:41
@ ebIgnore
This corresponds to "fpexcept.ignore".
Definition FPEnv.h:40
constexpr float log2ef
Definition MathExtras.h:51
constexpr double e
constexpr float ln2f
Definition MathExtras.h:49
NodeAddr< FuncNode * > Func
Definition RDFGraph.h:393
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
Definition Threading.h:280
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition MathExtras.h:344
@ Offset
Definition DWP.cpp:532
@ Length
Definition DWP.cpp:532
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred)
getICmpCondCode - Return the ISD condition code corresponding to the given LLVM IR integer condition ...
Definition Analysis.cpp:241
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1737
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:1667
LLVM_ABI void GetReturnInfo(CallingConv::ID CC, Type *ReturnType, AttributeList attr, SmallVectorImpl< ISD::OutputArg > &Outs, const TargetLowering &TLI, const DataLayout &DL)
Given an LLVM IR type and return type attributes, compute the return value EVTs and flags,...
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
LLVM_ABI bool isOnlyUsedInZeroEqualityComparison(const Instruction *CxtI)
void ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, Type *Ty, SmallVectorImpl< EVT > &ValueVTs, SmallVectorImpl< EVT > *MemVTs=nullptr, SmallVectorImpl< TypeSize > *Offsets=nullptr, TypeSize StartingOffset=TypeSize::getZero())
ComputeValueVTs - Given an LLVM IR type, compute a sequence of EVTs that represent all the individual...
Definition Analysis.cpp:119
LLVM_ABI SDValue peekThroughBitcasts(SDValue V)
Return the non-bitcasted source operand of V if it exists.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
@ Done
Definition Threading.h:60
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition bit.h:293
LLVM_ABI void diagnoseDontCall(const CallInst &CI)
auto successors(const MachineBasicBlock *BB)
bool isIntOrFPConstant(SDValue V)
Return true if V is either a integer or FP constant.
static ConstantRange getRange(Value *Op, SCCPSolver &Solver, const SmallPtrSetImpl< Value * > &InsertedValues)
Helper for getting ranges from Solver.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2184
Value * GetPointerBaseWithConstantOffset(Value *Ptr, int64_t &Offset, const DataLayout &DL, bool AllowNonInbounds=true)
Analyze the specified pointer to see if it can be expressed as a base pointer plus a constant offset.
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition MathExtras.h:243
auto cast_or_null(const Y &Val)
Definition Casting.h:714
constexpr T alignDown(U Value, V Align, W Skew=0)
Returns the largest unsigned integer less than or equal to Value and is Skew mod Align.
Definition MathExtras.h:546
gep_type_iterator gep_type_end(const User *GEP)
constexpr int popcount(T Value) noexcept
Count the number of set bits in a value.
Definition bit.h:154
LLVM_ABI ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
detail::concat_range< ValueT, RangeTs... > concat(RangeTs &&...Ranges)
Returns a concatenated range across two or more ranges.
Definition STLExtras.h:1150
bool isScopedEHPersonality(EHPersonality Pers)
Returns true if this personality uses scope-style EH IR instructions: catchswitch,...
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition bit.h:202
void ComputeValueTypes(const DataLayout &DL, Type *Ty, SmallVectorImpl< Type * > &Types, SmallVectorImpl< TypeSize > *Offsets=nullptr, TypeSize StartingOffset=TypeSize::getZero())
Given an LLVM IR type, compute non-aggregate subtypes.
Definition Analysis.cpp:72
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1744
LLVM_ABI llvm::SmallVector< int, 16 > createStrideMask(unsigned Start, unsigned Stride, unsigned VF)
Create a stride shuffle mask.
@ SPF_ABS
Floating point maxnum.
@ SPF_NABS
Absolute value.
@ SPF_FMAXNUM
Floating point minnum.
@ SPF_UMIN
Signed minimum.
@ SPF_UMAX
Signed maximum.
@ SPF_SMAX
Unsigned minimum.
@ SPF_FMINNUM
Unsigned maximum.
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
detail::zippy< detail::zip_first, T, U, Args... > zip_first(T &&t, U &&u, Args &&...args)
zip iterator that, for the sake of efficiency, assumes the first iteratee to be the shortest.
Definition STLExtras.h:852
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1634
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI SelectPatternResult matchSelectPattern(Value *V, Value *&LHS, Value *&RHS, Instruction::CastOps *CastOp=nullptr, unsigned Depth=0)
Pattern match integer [SU]MIN, [SU]MAX and ABS idioms, returning the kind and providing the out param...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:167
generic_gep_type_iterator<> gep_type_iterator
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
auto succ_size(const MachineBasicBlock *BB)
bool hasSingleElement(ContainerTy &&C)
Returns true if the given container only contains a single element.
Definition STLExtras.h:300
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
ISD::CondCode getFCmpCondCode(FCmpInst::Predicate Pred)
getFCmpCondCode - Return the ISD condition code corresponding to the given LLVM IR floating-point con...
Definition Analysis.cpp:207
LLVM_ABI EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
LLVM_ABI Value * salvageDebugInfoImpl(Instruction &I, uint64_t CurrentLocOps, SmallVectorImpl< uint64_t > &Ops, SmallVectorImpl< Value * > &AdditionalValues)
Definition Local.cpp:2274
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Global
Append to llvm.global_dtors.
AtomicOrdering
Atomic ordering for LLVM's memory model.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
bool isFuncletEHPersonality(EHPersonality Pers)
Returns true if this is a personality function that invokes handler funclets (which must return to it...
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:189
LLVM_ABI bool isAssignmentTrackingEnabled(const Module &M)
Return true if assignment tracking is enabled for module M.
LLVM_ABI llvm::SmallVector< int, 16 > createInterleaveMask(unsigned VF, unsigned NumVecs)
Create an interleave shuffle mask.
@ UMin
Unsigned integer min implemented in terms of select(cmp()).
@ Or
Bitwise or logical OR of integers.
@ Mul
Product of integers.
@ And
Bitwise or logical AND of integers.
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:144
@ SPNB_RETURNS_NAN
NaN behavior not applicable.
@ SPNB_RETURNS_OTHER
Given one NaN input, returns the NaN.
@ SPNB_RETURNS_ANY
Given one NaN input, returns the non-NaN.
bool isInTailCallPosition(const CallBase &Call, const TargetMachine &TM, bool ReturnsFirstArg=false)
Test if the given instruction is in a position to be optimized with a tail-call.
Definition Analysis.cpp:543
DWARFExpression::Operation Op
ISD::CondCode getFCmpCodeWithoutNaN(ISD::CondCode CC)
getFCmpCodeWithoutNaN - Given an ISD condition code comparing floats, return the equivalent code if w...
Definition Analysis.cpp:229
ArrayRef(const T &OneElt) -> ArrayRef< T >
bool isAsynchronousEHPersonality(EHPersonality Pers)
Returns true if this personality function catches asynchronous exceptions.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI std::optional< RoundingMode > convertStrToRoundingMode(StringRef)
Returns a valid RoundingMode enumerator when given a string that is valid as input in constrained int...
Definition FPEnv.cpp:25
gep_type_iterator gep_type_begin(const User *GEP)
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
Definition STLExtras.h:2168
GlobalValue * ExtractTypeInfo(Value *V)
ExtractTypeInfo - Returns the type info, possibly bitcast, encoded in V.
Definition Analysis.cpp:185
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1945
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:2156
LLVM_ABI Constant * ConstantFoldLoadFromConstPtr(Constant *C, Type *Ty, APInt Offset, const DataLayout &DL)
Return the value that a load from C with offset Offset would produce if it is constant and determinab...
unsigned ComputeLinearIndex(Type *Ty, const unsigned *Indices, const unsigned *IndicesEnd, unsigned CurIndex=0)
Compute the linearized index of a member in a nested aggregate/struct/array.
Definition Analysis.cpp:33
T bit_floor(T Value)
Returns the largest integral power of two no greater than Value if Value is nonzero.
Definition bit.h:330
@ Default
The result values are uniform if and only if all operands are uniform.
Definition Uniformity.h:20
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:180
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:872
#define N
#define NC
Definition regutils.h:42
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:77
Extended Value Type.
Definition ValueTypes.h:35
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
Definition ValueTypes.h:395
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
Definition ValueTypes.h:74
uint64_t getScalarStoreSize() const
Definition ValueTypes.h:402
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition ValueTypes.h:284
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:300
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition ValueTypes.h:147
ElementCount getVectorElementCount() const
Definition ValueTypes.h:350
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:373
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition ValueTypes.h:359
static LLVM_ABI EVT getEVT(Type *Ty, bool HandleUnknown=false)
Return the value type corresponding to the specified type.
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:316
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition ValueTypes.h:65
bool isRISCVVectorTuple() const
Return true if this is a vector value type.
Definition ValueTypes.h:179
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
Definition ValueTypes.h:381
bool isFixedLengthVector() const
Definition ValueTypes.h:181
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:168
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition ValueTypes.h:323
bool bitsGE(EVT VT) const
Return true if this has no less bits than VT.
Definition ValueTypes.h:292
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
Definition ValueTypes.h:174
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:328
bool isScalarInteger() const
Return true if this is an integer, but not a vector.
Definition ValueTypes.h:157
EVT changeVectorElementType(EVT EltVT) const
Return a VT for a vector type whose attributes match ourselves with the exception of the element type...
Definition ValueTypes.h:102
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition ValueTypes.h:336
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition ValueTypes.h:152
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:248
This class contains a discriminated union of information about pointers in memory operands,...
static LLVM_ABI MachinePointerInfo getUnknownStack(MachineFunction &MF)
Stack memory without other information.
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
A lightweight accessor for an operand bundle meant to be passed around by value.
This struct represents the registers (physical or virtual) that a particular set of values is assigne...
SmallVector< std::pair< Register, TypeSize >, 4 > getRegsAndSizes() const
Return a list of registers and their sizes.
RegsForValue()=default
SmallVector< unsigned, 4 > RegCount
This list holds the number of registers for each value.
SmallVector< EVT, 4 > ValueVTs
The value types of the values, which may not be legal, and may need be promoted or synthesized from o...
SmallVector< Register, 4 > Regs
This list holds the registers assigned to the values.
void AddInlineAsmOperands(InlineAsm::Kind Code, bool HasMatching, unsigned MatchingIdx, const SDLoc &dl, SelectionDAG &DAG, std::vector< SDValue > &Ops) const
Add this value to the specified inlineasm node operand list.
SDValue getCopyFromRegs(SelectionDAG &DAG, FunctionLoweringInfo &FuncInfo, const SDLoc &dl, SDValue &Chain, SDValue *Glue, const Value *V=nullptr) const
Emit a series of CopyFromReg nodes that copies from this value and returns the result as a ValueVTs v...
SmallVector< MVT, 4 > RegVTs
The value types of the registers.
void getCopyToRegs(SDValue Val, SelectionDAG &DAG, const SDLoc &dl, SDValue &Chain, SDValue *Glue, const Value *V=nullptr, ISD::NodeType PreferredExtendType=ISD::ANY_EXTEND) const
Emit a series of CopyToReg nodes that copies the specified value into the registers specified by this...
std::optional< CallingConv::ID > CallConv
Records if this value needs to be treated in an ABI dependant manner, different to normal type legali...
bool occupiesMultipleRegs() const
Check if the total RegCount is greater than one.
These are IR-level optimization flags that may be propagated to SDNodes.
void copyFMF(const FPMathOperator &FPMO)
Propagate the fast-math-flags from an IR FPMathOperator.
void setUnpredictable(bool b)
bool hasAllowReassociation() const
void setNoUnsignedWrap(bool b)
void setNoSignedWrap(bool b)
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
A MapVector that performs no allocations if smaller than a certain size.
Definition MapVector.h:276
This structure is used to communicate between SelectionDAGBuilder and SDISel for the code generation ...
SDLoc DL
The debug location of the instruction this CaseBlock was produced from.
static CaseCluster range(const ConstantInt *Low, const ConstantInt *High, MachineBasicBlock *MBB, BranchProbability Prob)
This contains information for each constraint that we are lowering.
TargetLowering::ConstraintType ConstraintType
Information about the constraint code, e.g.
This structure contains all information that is necessary for lowering calls.
CallLoweringInfo & setConvergent(bool Value=true)
CallLoweringInfo & setDeactivationSymbol(GlobalValue *Sym)
CallLoweringInfo & setCFIType(const ConstantInt *Type)
SmallVector< ISD::InputArg, 32 > Ins
Type * OrigRetTy
Original unlegalized return type.
CallLoweringInfo & setDiscardResult(bool Value=true)
CallLoweringInfo & setIsPatchPoint(bool Value=true)
CallLoweringInfo & setDebugLoc(const SDLoc &dl)
CallLoweringInfo & setTailCall(bool Value=true)
CallLoweringInfo & setIsPreallocated(bool Value=true)
CallLoweringInfo & setConvergenceControlToken(SDValue Token)
SmallVector< ISD::OutputArg, 32 > Outs
Type * RetTy
Same as OrigRetTy, or partially legalized for soft float libcalls.
CallLoweringInfo & setChain(SDValue InChain)
CallLoweringInfo & setPtrAuth(PtrAuthInfo Value)
CallLoweringInfo & setCallee(CallingConv::ID CC, Type *ResultType, SDValue Target, ArgListTy &&ArgsList, AttributeSet ResultAttrs={})
This structure is used to pass arguments to makeLibCall function.
MakeLibCallOptions & setDiscardResult(bool Value=true)
This structure contains the information necessary for lowering pointer-authenticating indirect calls.
void addIPToStateRange(const InvokeInst *II, MCSymbol *InvokeBegin, MCSymbol *InvokeEnd)