LLVM 23.0.0git
SelectionDAGBuilder.cpp
Go to the documentation of this file.
1//===- SelectionDAGBuilder.cpp - Selection-DAG building -------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This implements routines for translating from LLVM IR into SelectionDAG IR.
10//
11//===----------------------------------------------------------------------===//
12
13#include "SelectionDAGBuilder.h"
14#include "SDNodeDbgValue.h"
15#include "llvm/ADT/APFloat.h"
16#include "llvm/ADT/APInt.h"
17#include "llvm/ADT/BitVector.h"
18#include "llvm/ADT/STLExtras.h"
21#include "llvm/ADT/StringRef.h"
22#include "llvm/ADT/Twine.h"
26#include "llvm/Analysis/Loads.h"
58#include "llvm/IR/Argument.h"
59#include "llvm/IR/Attributes.h"
60#include "llvm/IR/BasicBlock.h"
61#include "llvm/IR/CFG.h"
62#include "llvm/IR/CallingConv.h"
63#include "llvm/IR/Constant.h"
65#include "llvm/IR/Constants.h"
66#include "llvm/IR/DataLayout.h"
67#include "llvm/IR/DebugInfo.h"
72#include "llvm/IR/Function.h"
74#include "llvm/IR/InlineAsm.h"
75#include "llvm/IR/InstrTypes.h"
78#include "llvm/IR/Intrinsics.h"
79#include "llvm/IR/IntrinsicsAArch64.h"
80#include "llvm/IR/IntrinsicsAMDGPU.h"
81#include "llvm/IR/IntrinsicsWebAssembly.h"
82#include "llvm/IR/LLVMContext.h"
84#include "llvm/IR/Metadata.h"
85#include "llvm/IR/Module.h"
86#include "llvm/IR/Operator.h"
88#include "llvm/IR/Statepoint.h"
89#include "llvm/IR/Type.h"
90#include "llvm/IR/User.h"
91#include "llvm/IR/Value.h"
92#include "llvm/MC/MCContext.h"
97#include "llvm/Support/Debug.h"
105#include <cstddef>
106#include <limits>
107#include <optional>
108#include <tuple>
109
110using namespace llvm;
111using namespace PatternMatch;
112using namespace SwitchCG;
113
114#define DEBUG_TYPE "isel"
115
116/// LimitFloatPrecision - Generate low-precision inline sequences for
117/// some float libcalls (6, 8 or 12 bits).
118static unsigned LimitFloatPrecision;
119
120static cl::opt<bool>
121 InsertAssertAlign("insert-assert-align", cl::init(true),
122 cl::desc("Insert the experimental `assertalign` node."),
124
126 LimitFPPrecision("limit-float-precision",
127 cl::desc("Generate low-precision inline sequences "
128 "for some float libcalls"),
130 cl::init(0));
131
133 "switch-peel-threshold", cl::Hidden, cl::init(66),
134 cl::desc("Set the case probability threshold for peeling the case from a "
135 "switch statement. A value greater than 100 will void this "
136 "optimization"));
137
138// Limit the width of DAG chains. This is important in general to prevent
139// DAG-based analysis from blowing up. For example, alias analysis and
140// load clustering may not complete in reasonable time. It is difficult to
141// recognize and avoid this situation within each individual analysis, and
142// future analyses are likely to have the same behavior. Limiting DAG width is
143// the safe approach and will be especially important with global DAGs.
144//
145// MaxParallelChains default is arbitrarily high to avoid affecting
146// optimization, but could be lowered to improve compile time. Any ld-ld-st-st
147// sequence over this should have been converted to llvm.memcpy by the
148// frontend. It is easy to induce this behavior with .ll code such as:
149// %buffer = alloca [4096 x i8]
150// %data = load [4096 x i8]* %argPtr
151// store [4096 x i8] %data, [4096 x i8]* %buffer
152static const unsigned MaxParallelChains = 64;
153
155 const SDValue *Parts, unsigned NumParts,
156 MVT PartVT, EVT ValueVT, const Value *V,
157 SDValue InChain,
158 std::optional<CallingConv::ID> CC);
159
160/// getCopyFromParts - Create a value that contains the specified legal parts
161/// combined into the value they represent. If the parts combine to a type
162/// larger than ValueVT then AssertOp can be used to specify whether the extra
163/// bits are known to be zero (ISD::AssertZext) or sign extended from ValueVT
164/// (ISD::AssertSext).
165static SDValue
166getCopyFromParts(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts,
167 unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V,
168 SDValue InChain,
169 std::optional<CallingConv::ID> CC = std::nullopt,
170 std::optional<ISD::NodeType> AssertOp = std::nullopt) {
171 // Let the target assemble the parts if it wants to
172 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
173 if (SDValue Val = TLI.joinRegisterPartsIntoValue(DAG, DL, Parts, NumParts,
174 PartVT, ValueVT, CC))
175 return Val;
176
177 if (ValueVT.isVector())
178 return getCopyFromPartsVector(DAG, DL, Parts, NumParts, PartVT, ValueVT, V,
179 InChain, CC);
180
181 assert(NumParts > 0 && "No parts to assemble!");
182 SDValue Val = Parts[0];
183
184 if (NumParts > 1) {
185 // Assemble the value from multiple parts.
186 if (ValueVT.isInteger()) {
187 unsigned PartBits = PartVT.getSizeInBits();
188 unsigned ValueBits = ValueVT.getSizeInBits();
189
190 // Assemble the power of 2 part.
191 unsigned RoundParts = llvm::bit_floor(NumParts);
192 unsigned RoundBits = PartBits * RoundParts;
193 EVT RoundVT = RoundBits == ValueBits ?
194 ValueVT : EVT::getIntegerVT(*DAG.getContext(), RoundBits);
195 SDValue Lo, Hi;
196
197 EVT HalfVT = EVT::getIntegerVT(*DAG.getContext(), RoundBits/2);
198
199 if (RoundParts > 2) {
200 Lo = getCopyFromParts(DAG, DL, Parts, RoundParts / 2, PartVT, HalfVT, V,
201 InChain);
202 Hi = getCopyFromParts(DAG, DL, Parts + RoundParts / 2, RoundParts / 2,
203 PartVT, HalfVT, V, InChain);
204 } else {
205 Lo = DAG.getNode(ISD::BITCAST, DL, HalfVT, Parts[0]);
206 Hi = DAG.getNode(ISD::BITCAST, DL, HalfVT, Parts[1]);
207 }
208
209 if (DAG.getDataLayout().isBigEndian())
210 std::swap(Lo, Hi);
211
212 Val = DAG.getNode(ISD::BUILD_PAIR, DL, RoundVT, Lo, Hi);
213
214 if (RoundParts < NumParts) {
215 // Assemble the trailing non-power-of-2 part.
216 unsigned OddParts = NumParts - RoundParts;
217 EVT OddVT = EVT::getIntegerVT(*DAG.getContext(), OddParts * PartBits);
218 Hi = getCopyFromParts(DAG, DL, Parts + RoundParts, OddParts, PartVT,
219 OddVT, V, InChain, CC);
220
221 // Combine the round and odd parts.
222 Lo = Val;
223 if (DAG.getDataLayout().isBigEndian())
224 std::swap(Lo, Hi);
225 EVT TotalVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
226 Hi = DAG.getNode(ISD::ANY_EXTEND, DL, TotalVT, Hi);
227 Hi = DAG.getNode(
228 ISD::SHL, DL, TotalVT, Hi,
229 DAG.getShiftAmountConstant(Lo.getValueSizeInBits(), TotalVT, DL));
230 Lo = DAG.getNode(ISD::ZERO_EXTEND, DL, TotalVT, Lo);
231 Val = DAG.getNode(ISD::OR, DL, TotalVT, Lo, Hi);
232 }
233 } else if (PartVT.isFloatingPoint()) {
234 // FP split into multiple FP parts (for ppcf128)
235 assert(ValueVT == EVT(MVT::ppcf128) && PartVT == MVT::f64 &&
236 "Unexpected split");
237 SDValue Lo, Hi;
238 Lo = DAG.getNode(ISD::BITCAST, DL, EVT(MVT::f64), Parts[0]);
239 Hi = DAG.getNode(ISD::BITCAST, DL, EVT(MVT::f64), Parts[1]);
240 if (TLI.hasBigEndianPartOrdering(ValueVT, DAG.getDataLayout()))
241 std::swap(Lo, Hi);
242 Val = DAG.getNode(ISD::BUILD_PAIR, DL, ValueVT, Lo, Hi);
243 } else {
244 // FP split into integer parts (soft fp)
245 assert(ValueVT.isFloatingPoint() && PartVT.isInteger() &&
246 !PartVT.isVector() && "Unexpected split");
247 EVT IntVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
248 Val = getCopyFromParts(DAG, DL, Parts, NumParts, PartVT, IntVT, V,
249 InChain, CC);
250 }
251 }
252
253 // There is now one part, held in Val. Correct it to match ValueVT.
254 // PartEVT is the type of the register class that holds the value.
255 // ValueVT is the type of the inline asm operation.
256 EVT PartEVT = Val.getValueType();
257
258 if (PartEVT == ValueVT)
259 return Val;
260
261 if (PartEVT.isInteger() && ValueVT.isFloatingPoint() &&
262 ValueVT.bitsLT(PartEVT)) {
263 // For an FP value in an integer part, we need to truncate to the right
264 // width first.
265 PartEVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
266 Val = DAG.getNode(ISD::TRUNCATE, DL, PartEVT, Val);
267 }
268
269 // Handle types that have the same size.
270 if (PartEVT.getSizeInBits() == ValueVT.getSizeInBits())
271 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
272
273 // Handle types with different sizes.
274 if (PartEVT.isInteger() && ValueVT.isInteger()) {
275 if (ValueVT.bitsLT(PartEVT)) {
276 // For a truncate, see if we have any information to
277 // indicate whether the truncated bits will always be
278 // zero or sign-extension.
279 if (AssertOp)
280 Val = DAG.getNode(*AssertOp, DL, PartEVT, Val,
281 DAG.getValueType(ValueVT));
282 return DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
283 }
284 return DAG.getNode(ISD::ANY_EXTEND, DL, ValueVT, Val);
285 }
286
287 if (PartEVT.isFloatingPoint() && ValueVT.isFloatingPoint()) {
288 // FP_ROUND's are always exact here.
289 if (ValueVT.bitsLT(Val.getValueType())) {
290
291 SDValue NoChange =
293
294 if (DAG.getMachineFunction().getFunction().getAttributes().hasFnAttr(
295 llvm::Attribute::StrictFP)) {
296 return DAG.getNode(ISD::STRICT_FP_ROUND, DL,
297 DAG.getVTList(ValueVT, MVT::Other), InChain, Val,
298 NoChange);
299 }
300
301 return DAG.getNode(ISD::FP_ROUND, DL, ValueVT, Val, NoChange);
302 }
303
304 return DAG.getNode(ISD::FP_EXTEND, DL, ValueVT, Val);
305 }
306
307 // Handle MMX to a narrower integer type by bitcasting MMX to integer and
308 // then truncating.
309 if (PartEVT == MVT::x86mmx && ValueVT.isInteger() &&
310 ValueVT.bitsLT(PartEVT)) {
311 Val = DAG.getNode(ISD::BITCAST, DL, MVT::i64, Val);
312 return DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
313 }
314
315 report_fatal_error("Unknown mismatch in getCopyFromParts!");
316}
317
319 const Twine &ErrMsg) {
321 if (!I)
322 return Ctx.emitError(ErrMsg);
323
324 if (const CallInst *CI = dyn_cast<CallInst>(I))
325 if (CI->isInlineAsm()) {
326 return Ctx.diagnose(DiagnosticInfoInlineAsm(
327 *CI, ErrMsg + ", possible invalid constraint for vector type"));
328 }
329
330 return Ctx.emitError(I, ErrMsg);
331}
332
333/// getCopyFromPartsVector - Create a value that contains the specified legal
334/// parts combined into the value they represent. If the parts combine to a
335/// type larger than ValueVT then AssertOp can be used to specify whether the
336/// extra bits are known to be zero (ISD::AssertZext) or sign extended from
337/// ValueVT (ISD::AssertSext).
339 const SDValue *Parts, unsigned NumParts,
340 MVT PartVT, EVT ValueVT, const Value *V,
341 SDValue InChain,
342 std::optional<CallingConv::ID> CallConv) {
343 assert(ValueVT.isVector() && "Not a vector value");
344 assert(NumParts > 0 && "No parts to assemble!");
345 const bool IsABIRegCopy = CallConv.has_value();
346
347 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
348 SDValue Val = Parts[0];
349
350 // Handle a multi-element vector.
351 if (NumParts > 1) {
352 EVT IntermediateVT;
353 MVT RegisterVT;
354 unsigned NumIntermediates;
355 unsigned NumRegs;
356
357 if (IsABIRegCopy) {
359 *DAG.getContext(), *CallConv, ValueVT, IntermediateVT,
360 NumIntermediates, RegisterVT);
361 } else {
362 NumRegs =
363 TLI.getVectorTypeBreakdown(*DAG.getContext(), ValueVT, IntermediateVT,
364 NumIntermediates, RegisterVT);
365 }
366
367 assert(NumRegs == NumParts && "Part count doesn't match vector breakdown!");
368 NumParts = NumRegs; // Silence a compiler warning.
369 assert(RegisterVT == PartVT && "Part type doesn't match vector breakdown!");
370 assert(RegisterVT.getSizeInBits() ==
371 Parts[0].getSimpleValueType().getSizeInBits() &&
372 "Part type sizes don't match!");
373
374 // Assemble the parts into intermediate operands.
375 SmallVector<SDValue, 8> Ops(NumIntermediates);
376 if (NumIntermediates == NumParts) {
377 // If the register was not expanded, truncate or copy the value,
378 // as appropriate.
379 for (unsigned i = 0; i != NumParts; ++i)
380 Ops[i] = getCopyFromParts(DAG, DL, &Parts[i], 1, PartVT, IntermediateVT,
381 V, InChain, CallConv);
382 } else if (NumParts > 0) {
383 // If the intermediate type was expanded, build the intermediate
384 // operands from the parts.
385 assert(NumParts % NumIntermediates == 0 &&
386 "Must expand into a divisible number of parts!");
387 unsigned Factor = NumParts / NumIntermediates;
388 for (unsigned i = 0; i != NumIntermediates; ++i)
389 Ops[i] = getCopyFromParts(DAG, DL, &Parts[i * Factor], Factor, PartVT,
390 IntermediateVT, V, InChain, CallConv);
391 }
392
393 // Build a vector with BUILD_VECTOR or CONCAT_VECTORS from the
394 // intermediate operands.
395 EVT BuiltVectorTy =
396 IntermediateVT.isVector()
398 *DAG.getContext(), IntermediateVT.getScalarType(),
399 IntermediateVT.getVectorElementCount() * NumParts)
401 IntermediateVT.getScalarType(),
402 NumIntermediates);
403 Val = DAG.getNode(IntermediateVT.isVector() ? ISD::CONCAT_VECTORS
405 DL, BuiltVectorTy, Ops);
406 }
407
408 // There is now one part, held in Val. Correct it to match ValueVT.
409 EVT PartEVT = Val.getValueType();
410
411 if (PartEVT == ValueVT)
412 return Val;
413
414 if (PartEVT.isVector()) {
415 // Vector/Vector bitcast.
416 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits())
417 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
418
419 // If the parts vector has more elements than the value vector, then we
420 // have a vector widening case (e.g. <2 x float> -> <4 x float>).
421 // Extract the elements we want.
422 if (PartEVT.getVectorElementCount() != ValueVT.getVectorElementCount()) {
425 (PartEVT.getVectorElementCount().isScalable() ==
426 ValueVT.getVectorElementCount().isScalable()) &&
427 "Cannot narrow, it would be a lossy transformation");
428 PartEVT =
430 ValueVT.getVectorElementCount());
431 Val = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, PartEVT, Val,
432 DAG.getVectorIdxConstant(0, DL));
433 if (PartEVT == ValueVT)
434 return Val;
435 if (PartEVT.isInteger() && ValueVT.isFloatingPoint())
436 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
437
438 // Vector/Vector bitcast (e.g. <2 x bfloat> -> <2 x half>).
439 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits())
440 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
441 }
442
443 // Promoted vector extract
444 return DAG.getAnyExtOrTrunc(Val, DL, ValueVT);
445 }
446
447 // Trivial bitcast if the types are the same size and the destination
448 // vector type is legal.
449 if (PartEVT.getSizeInBits() == ValueVT.getSizeInBits() &&
450 TLI.isTypeLegal(ValueVT))
451 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
452
453 if (ValueVT.getVectorNumElements() != 1) {
454 // Certain ABIs require that vectors are passed as integers. For vectors
455 // are the same size, this is an obvious bitcast.
456 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits()) {
457 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
458 } else if (ValueVT.bitsLT(PartEVT)) {
459 const uint64_t ValueSize = ValueVT.getFixedSizeInBits();
460 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
461 // Drop the extra bits.
462 Val = DAG.getNode(ISD::TRUNCATE, DL, IntermediateType, Val);
463 return DAG.getBitcast(ValueVT, Val);
464 }
465
467 *DAG.getContext(), V, "non-trivial scalar-to-vector conversion");
468 return DAG.getUNDEF(ValueVT);
469 }
470
471 // Handle cases such as i8 -> <1 x i1>
472 EVT ValueSVT = ValueVT.getVectorElementType();
473 if (ValueVT.getVectorNumElements() == 1 && ValueSVT != PartEVT) {
474 unsigned ValueSize = ValueSVT.getSizeInBits();
475 if (ValueSize == PartEVT.getSizeInBits()) {
476 Val = DAG.getNode(ISD::BITCAST, DL, ValueSVT, Val);
477 } else if (ValueSVT.isFloatingPoint() && PartEVT.isInteger()) {
478 // It's possible a scalar floating point type gets softened to integer and
479 // then promoted to a larger integer. If PartEVT is the larger integer
480 // we need to truncate it and then bitcast to the FP type.
481 assert(ValueSVT.bitsLT(PartEVT) && "Unexpected types");
482 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
483 Val = DAG.getNode(ISD::TRUNCATE, DL, IntermediateType, Val);
484 Val = DAG.getBitcast(ValueSVT, Val);
485 } else {
486 Val = ValueVT.isFloatingPoint()
487 ? DAG.getFPExtendOrRound(Val, DL, ValueSVT)
488 : DAG.getAnyExtOrTrunc(Val, DL, ValueSVT);
489 }
490 }
491
492 return DAG.getBuildVector(ValueVT, DL, Val);
493}
494
495static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &dl,
496 SDValue Val, SDValue *Parts, unsigned NumParts,
497 MVT PartVT, const Value *V,
498 std::optional<CallingConv::ID> CallConv);
499
500/// getCopyToParts - Create a series of nodes that contain the specified value
501/// split into legal parts. If the parts contain more bits than Val, then, for
502/// integers, ExtendKind can be used to specify how to generate the extra bits.
503static void
505 unsigned NumParts, MVT PartVT, const Value *V,
506 std::optional<CallingConv::ID> CallConv = std::nullopt,
507 ISD::NodeType ExtendKind = ISD::ANY_EXTEND) {
508 // Let the target split the parts if it wants to
509 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
510 if (TLI.splitValueIntoRegisterParts(DAG, DL, Val, Parts, NumParts, PartVT,
511 CallConv))
512 return;
513 EVT ValueVT = Val.getValueType();
514
515 // Handle the vector case separately.
516 if (ValueVT.isVector())
517 return getCopyToPartsVector(DAG, DL, Val, Parts, NumParts, PartVT, V,
518 CallConv);
519
520 unsigned OrigNumParts = NumParts;
522 "Copying to an illegal type!");
523
524 if (NumParts == 0)
525 return;
526
527 assert(!ValueVT.isVector() && "Vector case handled elsewhere");
528 EVT PartEVT = PartVT;
529 if (PartEVT == ValueVT) {
530 assert(NumParts == 1 && "No-op copy with multiple parts!");
531 Parts[0] = Val;
532 return;
533 }
534
535 unsigned PartBits = PartVT.getSizeInBits();
536 if (NumParts * PartBits > ValueVT.getSizeInBits()) {
537 // If the parts cover more bits than the value has, promote the value.
538 if (PartVT.isFloatingPoint() && ValueVT.isFloatingPoint()) {
539 assert(NumParts == 1 && "Do not know what to promote to!");
540 Val = DAG.getNode(ISD::FP_EXTEND, DL, PartVT, Val);
541 } else {
542 if (ValueVT.isFloatingPoint()) {
543 // FP values need to be bitcast, then extended if they are being put
544 // into a larger container.
545 ValueVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
546 Val = DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
547 }
548 assert((PartVT.isInteger() || PartVT == MVT::x86mmx) &&
549 ValueVT.isInteger() &&
550 "Unknown mismatch!");
551 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
552 Val = DAG.getNode(ExtendKind, DL, ValueVT, Val);
553 if (PartVT == MVT::x86mmx)
554 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
555 }
556 } else if (PartBits == ValueVT.getSizeInBits()) {
557 // Different types of the same size.
558 assert(NumParts == 1 && PartEVT != ValueVT);
559 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
560 } else if (NumParts * PartBits < ValueVT.getSizeInBits()) {
561 // If the parts cover less bits than value has, truncate the value.
562 assert((PartVT.isInteger() || PartVT == MVT::x86mmx) &&
563 ValueVT.isInteger() &&
564 "Unknown mismatch!");
565 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
566 Val = DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
567 if (PartVT == MVT::x86mmx)
568 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
569 }
570
571 // The value may have changed - recompute ValueVT.
572 ValueVT = Val.getValueType();
573 assert(NumParts * PartBits == ValueVT.getSizeInBits() &&
574 "Failed to tile the value with PartVT!");
575
576 if (NumParts == 1) {
577 if (PartEVT != ValueVT) {
579 "scalar-to-vector conversion failed");
580 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
581 }
582
583 Parts[0] = Val;
584 return;
585 }
586
587 // Expand the value into multiple parts.
588 if (NumParts & (NumParts - 1)) {
589 // The number of parts is not a power of 2. Split off and copy the tail.
590 assert(PartVT.isInteger() && ValueVT.isInteger() &&
591 "Do not know what to expand to!");
592 unsigned RoundParts = llvm::bit_floor(NumParts);
593 unsigned RoundBits = RoundParts * PartBits;
594 unsigned OddParts = NumParts - RoundParts;
595 SDValue OddVal = DAG.getNode(ISD::SRL, DL, ValueVT, Val,
596 DAG.getShiftAmountConstant(RoundBits, ValueVT, DL));
597
598 getCopyToParts(DAG, DL, OddVal, Parts + RoundParts, OddParts, PartVT, V,
599 CallConv);
600
601 if (DAG.getDataLayout().isBigEndian())
602 // The odd parts were reversed by getCopyToParts - unreverse them.
603 std::reverse(Parts + RoundParts, Parts + NumParts);
604
605 NumParts = RoundParts;
606 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
607 Val = DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
608 }
609
610 // The number of parts is a power of 2. Repeatedly bisect the value using
611 // EXTRACT_ELEMENT.
612 Parts[0] = DAG.getNode(ISD::BITCAST, DL,
614 ValueVT.getSizeInBits()),
615 Val);
616
617 for (unsigned StepSize = NumParts; StepSize > 1; StepSize /= 2) {
618 for (unsigned i = 0; i < NumParts; i += StepSize) {
619 unsigned ThisBits = StepSize * PartBits / 2;
620 EVT ThisVT = EVT::getIntegerVT(*DAG.getContext(), ThisBits);
621 SDValue &Part0 = Parts[i];
622 SDValue &Part1 = Parts[i+StepSize/2];
623
624 Part1 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL,
625 ThisVT, Part0, DAG.getIntPtrConstant(1, DL));
626 Part0 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL,
627 ThisVT, Part0, DAG.getIntPtrConstant(0, DL));
628
629 if (ThisBits == PartBits && ThisVT != PartVT) {
630 Part0 = DAG.getNode(ISD::BITCAST, DL, PartVT, Part0);
631 Part1 = DAG.getNode(ISD::BITCAST, DL, PartVT, Part1);
632 }
633 }
634 }
635
636 if (DAG.getDataLayout().isBigEndian())
637 std::reverse(Parts, Parts + OrigNumParts);
638}
639
641 const SDLoc &DL, EVT PartVT) {
642 if (!PartVT.isVector())
643 return SDValue();
644
645 EVT ValueVT = Val.getValueType();
646 EVT PartEVT = PartVT.getVectorElementType();
647 EVT ValueEVT = ValueVT.getVectorElementType();
648 ElementCount PartNumElts = PartVT.getVectorElementCount();
649 ElementCount ValueNumElts = ValueVT.getVectorElementCount();
650
651 // We only support widening vectors with equivalent element types and
652 // fixed/scalable properties. If a target needs to widen a fixed-length type
653 // to a scalable one, it should be possible to use INSERT_SUBVECTOR below.
654 if (ElementCount::isKnownLE(PartNumElts, ValueNumElts) ||
655 PartNumElts.isScalable() != ValueNumElts.isScalable())
656 return SDValue();
657
658 // Have a try for bf16 because some targets share its ABI with fp16.
659 if (ValueEVT == MVT::bf16 && PartEVT == MVT::f16) {
661 "Cannot widen to illegal type");
662 Val = DAG.getNode(
664 ValueVT.changeVectorElementType(*DAG.getContext(), MVT::f16), Val);
665 } else if (PartEVT != ValueEVT) {
666 return SDValue();
667 }
668
669 // Widening a scalable vector to another scalable vector is done by inserting
670 // the vector into a larger undef one.
671 if (PartNumElts.isScalable())
672 return DAG.getNode(ISD::INSERT_SUBVECTOR, DL, PartVT, DAG.getUNDEF(PartVT),
673 Val, DAG.getVectorIdxConstant(0, DL));
674
675 // Vector widening case, e.g. <2 x float> -> <4 x float>. Shuffle in
676 // undef elements.
678 DAG.ExtractVectorElements(Val, Ops);
679 SDValue EltUndef = DAG.getUNDEF(PartEVT);
680 Ops.append((PartNumElts - ValueNumElts).getFixedValue(), EltUndef);
681
682 // FIXME: Use CONCAT for 2x -> 4x.
683 return DAG.getBuildVector(PartVT, DL, Ops);
684}
685
686/// getCopyToPartsVector - Create a series of nodes that contain the specified
687/// value split into legal parts.
688static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &DL,
689 SDValue Val, SDValue *Parts, unsigned NumParts,
690 MVT PartVT, const Value *V,
691 std::optional<CallingConv::ID> CallConv) {
692 EVT ValueVT = Val.getValueType();
693 assert(ValueVT.isVector() && "Not a vector");
694 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
695 const bool IsABIRegCopy = CallConv.has_value();
696
697 if (NumParts == 1) {
698 EVT PartEVT = PartVT;
699 if (PartEVT == ValueVT) {
700 // Nothing to do.
701 } else if (PartVT.getSizeInBits() == ValueVT.getSizeInBits()) {
702 // Bitconvert vector->vector case.
703 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
704 } else if (SDValue Widened = widenVectorToPartType(DAG, Val, DL, PartVT)) {
705 Val = Widened;
706 } else if (PartVT.isVector() &&
708 ValueVT.getVectorElementType()) &&
709 PartEVT.getVectorElementCount() ==
710 ValueVT.getVectorElementCount()) {
711
712 // Promoted vector extract
713 Val = DAG.getAnyExtOrTrunc(Val, DL, PartVT);
714 } else if (PartEVT.isVector() &&
715 PartEVT.getVectorElementType() !=
716 ValueVT.getVectorElementType() &&
717 TLI.getTypeAction(*DAG.getContext(), ValueVT) ==
719 // Combination of widening and promotion.
720 EVT WidenVT =
722 PartVT.getVectorElementCount());
723 SDValue Widened = widenVectorToPartType(DAG, Val, DL, WidenVT);
724 Val = DAG.getAnyExtOrTrunc(Widened, DL, PartVT);
725 } else {
726 // Don't extract an integer from a float vector. This can happen if the
727 // FP type gets softened to integer and then promoted. The promotion
728 // prevents it from being picked up by the earlier bitcast case.
729 if (ValueVT.getVectorElementCount().isScalar() &&
730 (!ValueVT.isFloatingPoint() || !PartVT.isInteger())) {
731 // If we reach this condition and PartVT is FP, this means that
732 // ValueVT is also FP and both have a different size, otherwise we
733 // would have bitcasted them. Producing an EXTRACT_VECTOR_ELT here
734 // would be invalid since that would mean the smaller FP type has to
735 // be extended to the larger one.
736 if (PartVT.isFloatingPoint()) {
737 Val = DAG.getBitcast(ValueVT.getScalarType(), Val);
738 Val = DAG.getNode(ISD::FP_EXTEND, DL, PartVT, Val);
739 } else
740 Val = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, PartVT, Val,
741 DAG.getVectorIdxConstant(0, DL));
742 } else {
743 uint64_t ValueSize = ValueVT.getFixedSizeInBits();
744 assert(PartVT.getFixedSizeInBits() > ValueSize &&
745 "lossy conversion of vector to scalar type");
746 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
747 Val = DAG.getBitcast(IntermediateType, Val);
748 Val = DAG.getAnyExtOrTrunc(Val, DL, PartVT);
749 }
750 }
751
752 assert(Val.getValueType() == PartVT && "Unexpected vector part value type");
753 Parts[0] = Val;
754 return;
755 }
756
757 // Handle a multi-element vector.
758 EVT IntermediateVT;
759 MVT RegisterVT;
760 unsigned NumIntermediates;
761 unsigned NumRegs;
762 if (IsABIRegCopy) {
764 *DAG.getContext(), *CallConv, ValueVT, IntermediateVT, NumIntermediates,
765 RegisterVT);
766 } else {
767 NumRegs =
768 TLI.getVectorTypeBreakdown(*DAG.getContext(), ValueVT, IntermediateVT,
769 NumIntermediates, RegisterVT);
770 }
771
772 assert(NumRegs == NumParts && "Part count doesn't match vector breakdown!");
773 NumParts = NumRegs; // Silence a compiler warning.
774 assert(RegisterVT == PartVT && "Part type doesn't match vector breakdown!");
775
776 assert(IntermediateVT.isScalableVector() == ValueVT.isScalableVector() &&
777 "Mixing scalable and fixed vectors when copying in parts");
778
779 std::optional<ElementCount> DestEltCnt;
780
781 if (IntermediateVT.isVector())
782 DestEltCnt = IntermediateVT.getVectorElementCount() * NumIntermediates;
783 else
784 DestEltCnt = ElementCount::getFixed(NumIntermediates);
785
786 EVT BuiltVectorTy = EVT::getVectorVT(
787 *DAG.getContext(), IntermediateVT.getScalarType(), *DestEltCnt);
788
789 if (ValueVT == BuiltVectorTy) {
790 // Nothing to do.
791 } else if (ValueVT.getSizeInBits() == BuiltVectorTy.getSizeInBits()) {
792 // Bitconvert vector->vector case.
793 Val = DAG.getNode(ISD::BITCAST, DL, BuiltVectorTy, Val);
794 } else {
795 if (BuiltVectorTy.getVectorElementType().bitsGT(
796 ValueVT.getVectorElementType())) {
797 // Integer promotion.
798 ValueVT = EVT::getVectorVT(*DAG.getContext(),
799 BuiltVectorTy.getVectorElementType(),
800 ValueVT.getVectorElementCount());
801 Val = DAG.getNode(ISD::ANY_EXTEND, DL, ValueVT, Val);
802 }
803
804 if (SDValue Widened = widenVectorToPartType(DAG, Val, DL, BuiltVectorTy)) {
805 Val = Widened;
806 }
807 }
808
809 assert(Val.getValueType() == BuiltVectorTy && "Unexpected vector value type");
810
811 // Split the vector into intermediate operands.
812 SmallVector<SDValue, 8> Ops(NumIntermediates);
813 for (unsigned i = 0; i != NumIntermediates; ++i) {
814 if (IntermediateVT.isVector()) {
815 // This does something sensible for scalable vectors - see the
816 // definition of EXTRACT_SUBVECTOR for further details.
817 unsigned IntermediateNumElts = IntermediateVT.getVectorMinNumElements();
818 Ops[i] =
819 DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, IntermediateVT, Val,
820 DAG.getVectorIdxConstant(i * IntermediateNumElts, DL));
821 } else {
822 Ops[i] = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, IntermediateVT, Val,
823 DAG.getVectorIdxConstant(i, DL));
824 }
825 }
826
827 // Split the intermediate operands into legal parts.
828 if (NumParts == NumIntermediates) {
829 // If the register was not expanded, promote or copy the value,
830 // as appropriate.
831 for (unsigned i = 0; i != NumParts; ++i)
832 getCopyToParts(DAG, DL, Ops[i], &Parts[i], 1, PartVT, V, CallConv);
833 } else if (NumParts > 0) {
834 // If the intermediate type was expanded, split each the value into
835 // legal parts.
836 assert(NumIntermediates != 0 && "division by zero");
837 assert(NumParts % NumIntermediates == 0 &&
838 "Must expand into a divisible number of parts!");
839 unsigned Factor = NumParts / NumIntermediates;
840 for (unsigned i = 0; i != NumIntermediates; ++i)
841 getCopyToParts(DAG, DL, Ops[i], &Parts[i * Factor], Factor, PartVT, V,
842 CallConv);
843 }
844}
845
846static void failForInvalidBundles(const CallBase &I, StringRef Name,
847 ArrayRef<uint32_t> AllowedBundles) {
848 if (I.hasOperandBundlesOtherThan(AllowedBundles)) {
849 ListSeparator LS;
850 std::string Error;
852 for (unsigned i = 0, e = I.getNumOperandBundles(); i != e; ++i) {
853 OperandBundleUse U = I.getOperandBundleAt(i);
854 if (!is_contained(AllowedBundles, U.getTagID()))
855 OS << LS << U.getTagName();
856 }
858 Twine("cannot lower ", Name)
859 .concat(Twine(" with arbitrary operand bundles: ", Error)));
860 }
861}
862
864 EVT valuevt, std::optional<CallingConv::ID> CC)
865 : ValueVTs(1, valuevt), RegVTs(1, regvt), Regs(regs),
866 RegCount(1, regs.size()), CallConv(CC) {}
867
869 const DataLayout &DL, Register Reg, Type *Ty,
870 std::optional<CallingConv::ID> CC) {
871 ComputeValueVTs(TLI, DL, Ty, ValueVTs);
872
873 CallConv = CC;
874
875 for (EVT ValueVT : ValueVTs) {
876 unsigned NumRegs =
878 ? TLI.getNumRegistersForCallingConv(Context, *CC, ValueVT)
879 : TLI.getNumRegisters(Context, ValueVT);
880 MVT RegisterVT =
882 ? TLI.getRegisterTypeForCallingConv(Context, *CC, ValueVT)
883 : TLI.getRegisterType(Context, ValueVT);
884 for (unsigned i = 0; i != NumRegs; ++i)
885 Regs.push_back(Reg + i);
886 RegVTs.push_back(RegisterVT);
887 RegCount.push_back(NumRegs);
888 Reg = Reg.id() + NumRegs;
889 }
890}
891
893 FunctionLoweringInfo &FuncInfo,
894 const SDLoc &dl, SDValue &Chain,
895 SDValue *Glue, const Value *V) const {
896 // A Value with type {} or [0 x %t] needs no registers.
897 if (ValueVTs.empty())
898 return SDValue();
899
900 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
901
902 // Assemble the legal parts into the final values.
903 SmallVector<SDValue, 4> Values(ValueVTs.size());
905 for (unsigned Value = 0, Part = 0, e = ValueVTs.size(); Value != e; ++Value) {
906 // Copy the legal parts from the registers.
907 EVT ValueVT = ValueVTs[Value];
908 unsigned NumRegs = RegCount[Value];
909 MVT RegisterVT = isABIMangled()
911 *DAG.getContext(), *CallConv, RegVTs[Value])
912 : RegVTs[Value];
913
914 Parts.resize(NumRegs);
915 for (unsigned i = 0; i != NumRegs; ++i) {
916 SDValue P;
917 if (!Glue) {
918 P = DAG.getCopyFromReg(Chain, dl, Regs[Part+i], RegisterVT);
919 } else {
920 P = DAG.getCopyFromReg(Chain, dl, Regs[Part+i], RegisterVT, *Glue);
921 *Glue = P.getValue(2);
922 }
923
924 Chain = P.getValue(1);
925 Parts[i] = P;
926
927 // If the source register was virtual and if we know something about it,
928 // add an assert node.
929 if (!Regs[Part + i].isVirtual() || !RegisterVT.isInteger())
930 continue;
931
933 FuncInfo.GetLiveOutRegInfo(Regs[Part+i]);
934 if (!LOI)
935 continue;
936
937 unsigned RegSize = RegisterVT.getScalarSizeInBits();
938 unsigned NumSignBits = LOI->NumSignBits;
939 unsigned NumZeroBits = LOI->Known.countMinLeadingZeros();
940
941 if (NumZeroBits == RegSize) {
942 // The current value is a zero.
943 // Explicitly express that as it would be easier for
944 // optimizations to kick in.
945 Parts[i] = DAG.getConstant(0, dl, RegisterVT);
946 continue;
947 }
948
949 // FIXME: We capture more information than the dag can represent. For
950 // now, just use the tightest assertzext/assertsext possible.
951 bool isSExt;
952 EVT FromVT(MVT::Other);
953 if (NumZeroBits) {
954 FromVT = EVT::getIntegerVT(*DAG.getContext(), RegSize - NumZeroBits);
955 isSExt = false;
956 } else if (NumSignBits > 1) {
957 FromVT =
958 EVT::getIntegerVT(*DAG.getContext(), RegSize - NumSignBits + 1);
959 isSExt = true;
960 } else {
961 continue;
962 }
963 // Add an assertion node.
964 assert(FromVT != MVT::Other);
965 Parts[i] = DAG.getNode(isSExt ? ISD::AssertSext : ISD::AssertZext, dl,
966 RegisterVT, P, DAG.getValueType(FromVT));
967 }
968
969 Values[Value] = getCopyFromParts(DAG, dl, Parts.begin(), NumRegs,
970 RegisterVT, ValueVT, V, Chain, CallConv);
971 Part += NumRegs;
972 Parts.clear();
973 }
974
975 return DAG.getNode(ISD::MERGE_VALUES, dl, DAG.getVTList(ValueVTs), Values);
976}
977
979 const SDLoc &dl, SDValue &Chain, SDValue *Glue,
980 const Value *V,
981 ISD::NodeType PreferredExtendType) const {
982 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
983 ISD::NodeType ExtendKind = PreferredExtendType;
984
985 // Get the list of the values's legal parts.
986 unsigned NumRegs = Regs.size();
987 SmallVector<SDValue, 8> Parts(NumRegs);
988 for (unsigned Value = 0, Part = 0, e = ValueVTs.size(); Value != e; ++Value) {
989 unsigned NumParts = RegCount[Value];
990
991 MVT RegisterVT = isABIMangled()
993 *DAG.getContext(), *CallConv, RegVTs[Value])
994 : RegVTs[Value];
995
996 if (ExtendKind == ISD::ANY_EXTEND && TLI.isZExtFree(Val, RegisterVT))
997 ExtendKind = ISD::ZERO_EXTEND;
998
999 getCopyToParts(DAG, dl, Val.getValue(Val.getResNo() + Value), &Parts[Part],
1000 NumParts, RegisterVT, V, CallConv, ExtendKind);
1001 Part += NumParts;
1002 }
1003
1004 // Copy the parts into the registers.
1005 SmallVector<SDValue, 8> Chains(NumRegs);
1006 for (unsigned i = 0; i != NumRegs; ++i) {
1007 SDValue Part;
1008 if (!Glue) {
1009 Part = DAG.getCopyToReg(Chain, dl, Regs[i], Parts[i]);
1010 } else {
1011 Part = DAG.getCopyToReg(Chain, dl, Regs[i], Parts[i], *Glue);
1012 *Glue = Part.getValue(1);
1013 }
1014
1015 Chains[i] = Part.getValue(0);
1016 }
1017
1018 if (NumRegs == 1 || Glue)
1019 // If NumRegs > 1 && Glue is used then the use of the last CopyToReg is
1020 // flagged to it. That is the CopyToReg nodes and the user are considered
1021 // a single scheduling unit. If we create a TokenFactor and return it as
1022 // chain, then the TokenFactor is both a predecessor (operand) of the
1023 // user as well as a successor (the TF operands are flagged to the user).
1024 // c1, f1 = CopyToReg
1025 // c2, f2 = CopyToReg
1026 // c3 = TokenFactor c1, c2
1027 // ...
1028 // = op c3, ..., f2
1029 Chain = Chains[NumRegs-1];
1030 else
1031 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chains);
1032}
1033
1035 unsigned MatchingIdx, const SDLoc &dl,
1036 SelectionDAG &DAG,
1037 std::vector<SDValue> &Ops) const {
1038 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1039
1040 InlineAsm::Flag Flag(Code, Regs.size());
1041 if (HasMatching)
1042 Flag.setMatchingOp(MatchingIdx);
1043 else if (!Regs.empty() && Regs.front().isVirtual()) {
1044 // Put the register class of the virtual registers in the flag word. That
1045 // way, later passes can recompute register class constraints for inline
1046 // assembly as well as normal instructions.
1047 // Don't do this for tied operands that can use the regclass information
1048 // from the def.
1050 const TargetRegisterClass *RC = MRI.getRegClass(Regs.front());
1051 Flag.setRegClass(RC->getID());
1052 }
1053
1054 SDValue Res = DAG.getTargetConstant(Flag, dl, MVT::i32);
1055 Ops.push_back(Res);
1056
1057 if (Code == InlineAsm::Kind::Clobber) {
1058 // Clobbers should always have a 1:1 mapping with registers, and may
1059 // reference registers that have illegal (e.g. vector) types. Hence, we
1060 // shouldn't try to apply any sort of splitting logic to them.
1061 assert(Regs.size() == RegVTs.size() && Regs.size() == ValueVTs.size() &&
1062 "No 1:1 mapping from clobbers to regs?");
1064 (void)SP;
1065 for (unsigned I = 0, E = ValueVTs.size(); I != E; ++I) {
1066 Ops.push_back(DAG.getRegister(Regs[I], RegVTs[I]));
1067 assert(
1068 (Regs[I] != SP ||
1070 "If we clobbered the stack pointer, MFI should know about it.");
1071 }
1072 return;
1073 }
1074
1075 for (unsigned Value = 0, Reg = 0, e = ValueVTs.size(); Value != e; ++Value) {
1076 MVT RegisterVT = RegVTs[Value];
1077 unsigned NumRegs = TLI.getNumRegisters(*DAG.getContext(), ValueVTs[Value],
1078 RegisterVT);
1079 for (unsigned i = 0; i != NumRegs; ++i) {
1080 assert(Reg < Regs.size() && "Mismatch in # registers expected");
1081 Register TheReg = Regs[Reg++];
1082 Ops.push_back(DAG.getRegister(TheReg, RegisterVT));
1083 }
1084 }
1085}
1086
1090 unsigned I = 0;
1091 for (auto CountAndVT : zip_first(RegCount, RegVTs)) {
1092 unsigned RegCount = std::get<0>(CountAndVT);
1093 MVT RegisterVT = std::get<1>(CountAndVT);
1094 TypeSize RegisterSize = RegisterVT.getSizeInBits();
1095 for (unsigned E = I + RegCount; I != E; ++I)
1096 OutVec.push_back(std::make_pair(Regs[I], RegisterSize));
1097 }
1098 return OutVec;
1099}
1100
1102 AssumptionCache *ac, const TargetLibraryInfo *li,
1103 const TargetTransformInfo &TTI) {
1104 BatchAA = aa;
1105 AC = ac;
1106 GFI = gfi;
1107 LibInfo = li;
1108 Context = DAG.getContext();
1109 LPadToCallSiteMap.clear();
1110 this->TTI = &TTI;
1111 SL->init(DAG.getTargetLoweringInfo(), TM, DAG.getDataLayout());
1112 AssignmentTrackingEnabled = isAssignmentTrackingEnabled(
1113 *DAG.getMachineFunction().getFunction().getParent());
1114}
1115
1117 NodeMap.clear();
1118 UnusedArgNodeMap.clear();
1119 PendingLoads.clear();
1120 PendingExports.clear();
1121 PendingConstrainedFP.clear();
1122 PendingConstrainedFPStrict.clear();
1123 CurInst = nullptr;
1124 HasTailCall = false;
1125 SDNodeOrder = LowestSDNodeOrder;
1126 StatepointLowering.clear();
1127}
1128
1130 DanglingDebugInfoMap.clear();
1131}
1132
1133// Update DAG root to include dependencies on Pending chains.
1134SDValue SelectionDAGBuilder::updateRoot(SmallVectorImpl<SDValue> &Pending) {
1135 SDValue Root = DAG.getRoot();
1136
1137 if (Pending.empty())
1138 return Root;
1139
1140 // Add current root to PendingChains, unless we already indirectly
1141 // depend on it.
1142 if (Root.getOpcode() != ISD::EntryToken) {
1143 unsigned i = 0, e = Pending.size();
1144 for (; i != e; ++i) {
1145 assert(Pending[i].getNode()->getNumOperands() > 1);
1146 if (Pending[i].getNode()->getOperand(0) == Root)
1147 break; // Don't add the root if we already indirectly depend on it.
1148 }
1149
1150 if (i == e)
1151 Pending.push_back(Root);
1152 }
1153
1154 if (Pending.size() == 1)
1155 Root = Pending[0];
1156 else
1157 Root = DAG.getTokenFactor(getCurSDLoc(), Pending);
1158
1159 DAG.setRoot(Root);
1160 Pending.clear();
1161 return Root;
1162}
1163
1167
1169 // If the new exception behavior differs from that of the pending
1170 // ones, chain up them and update the root.
1171 switch (EB) {
1174 // Floating-point exceptions produced by such operations are not intended
1175 // to be observed, so the sequence of these operations does not need to be
1176 // preserved.
1177 //
1178 // They however must not be mixed with the instructions that have strict
1179 // exception behavior. Placing an operation with 'ebIgnore' behavior between
1180 // 'ebStrict' operations could distort the observed exception behavior.
1181 if (!PendingConstrainedFPStrict.empty()) {
1182 assert(PendingConstrainedFP.empty());
1183 updateRoot(PendingConstrainedFPStrict);
1184 }
1185 break;
1187 // Floating-point exception produced by these operations may be observed, so
1188 // they must be correctly chained. If trapping on FP exceptions is
1189 // disabled, the exceptions can be observed only by functions that read
1190 // exception flags, like 'llvm.get_fpenv' or 'fetestexcept'. It means that
1191 // the order of operations is not significant between barriers.
1192 //
1193 // If trapping is enabled, each operation becomes an implicit observation
1194 // point, so the operations must be sequenced according their original
1195 // source order.
1196 if (!PendingConstrainedFP.empty()) {
1197 assert(PendingConstrainedFPStrict.empty());
1198 updateRoot(PendingConstrainedFP);
1199 }
1200 // TODO: Add support for trapping-enabled scenarios.
1201 }
1202 return DAG.getRoot();
1203}
1204
1206 // Chain up all pending constrained intrinsics together with all
1207 // pending loads, by simply appending them to PendingLoads and
1208 // then calling getMemoryRoot().
1209 PendingLoads.reserve(PendingLoads.size() +
1210 PendingConstrainedFP.size() +
1211 PendingConstrainedFPStrict.size());
1212 PendingLoads.append(PendingConstrainedFP.begin(),
1213 PendingConstrainedFP.end());
1214 PendingLoads.append(PendingConstrainedFPStrict.begin(),
1215 PendingConstrainedFPStrict.end());
1216 PendingConstrainedFP.clear();
1217 PendingConstrainedFPStrict.clear();
1218 return getMemoryRoot();
1219}
1220
1222 // We need to emit pending fpexcept.strict constrained intrinsics,
1223 // so append them to the PendingExports list.
1224 PendingExports.append(PendingConstrainedFPStrict.begin(),
1225 PendingConstrainedFPStrict.end());
1226 PendingConstrainedFPStrict.clear();
1227 return updateRoot(PendingExports);
1228}
1229
1231 DILocalVariable *Variable,
1233 DebugLoc DL) {
1234 assert(Variable && "Missing variable");
1235
1236 // Check if address has undef value.
1237 if (!Address || isa<UndefValue>(Address) ||
1238 (Address->use_empty() && !isa<Argument>(Address))) {
1239 LLVM_DEBUG(
1240 dbgs()
1241 << "dbg_declare: Dropping debug info (bad/undef/unused-arg address)\n");
1242 return;
1243 }
1244
1245 bool IsParameter = Variable->isParameter() || isa<Argument>(Address);
1246
1247 SDValue &N = NodeMap[Address];
1248 if (!N.getNode() && isa<Argument>(Address))
1249 // Check unused arguments map.
1250 N = UnusedArgNodeMap[Address];
1251 SDDbgValue *SDV;
1252 if (N.getNode()) {
1253 if (const BitCastInst *BCI = dyn_cast<BitCastInst>(Address))
1254 Address = BCI->getOperand(0);
1255 // Parameters are handled specially.
1256 auto *FINode = dyn_cast<FrameIndexSDNode>(N.getNode());
1257 if (IsParameter && FINode) {
1258 // Byval parameter. We have a frame index at this point.
1259 SDV = DAG.getFrameIndexDbgValue(Variable, Expression, FINode->getIndex(),
1260 /*IsIndirect*/ true, DL, SDNodeOrder);
1261 } else if (isa<Argument>(Address)) {
1262 // Address is an argument, so try to emit its dbg value using
1263 // virtual register info from the FuncInfo.ValueMap.
1264 EmitFuncArgumentDbgValue(Address, Variable, Expression, DL,
1265 FuncArgumentDbgValueKind::Declare, N);
1266 return;
1267 } else {
1268 SDV = DAG.getDbgValue(Variable, Expression, N.getNode(), N.getResNo(),
1269 true, DL, SDNodeOrder);
1270 }
1271 DAG.AddDbgValue(SDV, IsParameter);
1272 } else {
1273 // If Address is an argument then try to emit its dbg value using
1274 // virtual register info from the FuncInfo.ValueMap.
1275 if (!EmitFuncArgumentDbgValue(Address, Variable, Expression, DL,
1276 FuncArgumentDbgValueKind::Declare, N)) {
1277 LLVM_DEBUG(dbgs() << "dbg_declare: Dropping debug info"
1278 << " (could not emit func-arg dbg_value)\n");
1279 }
1280 }
1281}
1282
1284 // Add SDDbgValue nodes for any var locs here. Do so before updating
1285 // SDNodeOrder, as this mapping is {Inst -> Locs BEFORE Inst}.
1286 if (FunctionVarLocs const *FnVarLocs = DAG.getFunctionVarLocs()) {
1287 // Add SDDbgValue nodes for any var locs here. Do so before updating
1288 // SDNodeOrder, as this mapping is {Inst -> Locs BEFORE Inst}.
1289 for (auto It = FnVarLocs->locs_begin(&I), End = FnVarLocs->locs_end(&I);
1290 It != End; ++It) {
1291 auto *Var = FnVarLocs->getDILocalVariable(It->VariableID);
1292 dropDanglingDebugInfo(Var, It->Expr);
1293 if (It->Values.isKillLocation(It->Expr)) {
1294 handleKillDebugValue(Var, It->Expr, It->DL, SDNodeOrder);
1295 continue;
1296 }
1297 SmallVector<Value *> Values(It->Values.location_ops());
1298 if (!handleDebugValue(Values, Var, It->Expr, It->DL, SDNodeOrder,
1299 It->Values.hasArgList())) {
1300 SmallVector<Value *, 4> Vals(It->Values.location_ops());
1302 FnVarLocs->getDILocalVariable(It->VariableID),
1303 It->Expr, Vals.size() > 1, It->DL, SDNodeOrder);
1304 }
1305 }
1306 }
1307
1308 // We must skip DbgVariableRecords if they've already been processed above as
1309 // we have just emitted the debug values resulting from assignment tracking
1310 // analysis, making any existing DbgVariableRecords redundant (and probably
1311 // less correct). We still need to process DbgLabelRecords. This does sink
1312 // DbgLabelRecords to the bottom of the group of debug records. That sholdn't
1313 // be important as it does so deterministcally and ordering between
1314 // DbgLabelRecords and DbgVariableRecords is immaterial (other than for MIR/IR
1315 // printing).
1316 bool SkipDbgVariableRecords = DAG.getFunctionVarLocs();
1317 // Is there is any debug-info attached to this instruction, in the form of
1318 // DbgRecord non-instruction debug-info records.
1319 for (DbgRecord &DR : I.getDbgRecordRange()) {
1320 if (DbgLabelRecord *DLR = dyn_cast<DbgLabelRecord>(&DR)) {
1321 assert(DLR->getLabel() && "Missing label");
1322 SDDbgLabel *SDV =
1323 DAG.getDbgLabel(DLR->getLabel(), DLR->getDebugLoc(), SDNodeOrder);
1324 DAG.AddDbgLabel(SDV);
1325 continue;
1326 }
1327
1328 if (SkipDbgVariableRecords)
1329 continue;
1331 DILocalVariable *Variable = DVR.getVariable();
1334
1336 if (FuncInfo.PreprocessedDVRDeclares.contains(&DVR))
1337 continue;
1338 LLVM_DEBUG(dbgs() << "SelectionDAG visiting dbg_declare: " << DVR
1339 << "\n");
1341 DVR.getDebugLoc());
1342 continue;
1343 }
1344
1345 // A DbgVariableRecord with no locations is a kill location.
1347 if (Values.empty()) {
1349 SDNodeOrder);
1350 continue;
1351 }
1352
1353 // A DbgVariableRecord with an undef or absent location is also a kill
1354 // location.
1355 if (llvm::any_of(Values,
1356 [](Value *V) { return !V || isa<UndefValue>(V); })) {
1358 SDNodeOrder);
1359 continue;
1360 }
1361
1362 bool IsVariadic = DVR.hasArgList();
1363 if (!handleDebugValue(Values, Variable, Expression, DVR.getDebugLoc(),
1364 SDNodeOrder, IsVariadic)) {
1365 addDanglingDebugInfo(Values, Variable, Expression, IsVariadic,
1366 DVR.getDebugLoc(), SDNodeOrder);
1367 }
1368 }
1369}
1370
1372 visitDbgInfo(I);
1373
1374 // Set up outgoing PHI node register values before emitting the terminator.
1375 if (I.isTerminator()) {
1376 HandlePHINodesInSuccessorBlocks(I.getParent());
1377 }
1378
1379 ++SDNodeOrder;
1380 CurInst = &I;
1381
1382 // Set inserted listener only if required.
1383 bool NodeInserted = false;
1384 std::unique_ptr<SelectionDAG::DAGNodeInsertedListener> InsertedListener;
1385 MDNode *PCSectionsMD = I.getMetadata(LLVMContext::MD_pcsections);
1386 MDNode *MMRA = I.getMetadata(LLVMContext::MD_mmra);
1387 if (PCSectionsMD || MMRA) {
1388 InsertedListener = std::make_unique<SelectionDAG::DAGNodeInsertedListener>(
1389 DAG, [&](SDNode *) { NodeInserted = true; });
1390 }
1391
1392 visit(I.getOpcode(), I);
1393
1394 if (!I.isTerminator() && !HasTailCall &&
1395 !isa<GCStatepointInst>(I)) // statepoints handle their exports internally
1397
1398 // Handle metadata.
1399 if (PCSectionsMD || MMRA) {
1400 auto It = NodeMap.find(&I);
1401 if (It != NodeMap.end()) {
1402 if (PCSectionsMD)
1403 DAG.addPCSections(It->second.getNode(), PCSectionsMD);
1404 if (MMRA)
1405 DAG.addMMRAMetadata(It->second.getNode(), MMRA);
1406 } else if (NodeInserted) {
1407 // This should not happen; if it does, don't let it go unnoticed so we can
1408 // fix it. Relevant visit*() function is probably missing a setValue().
1409 errs() << "warning: loosing !pcsections and/or !mmra metadata ["
1410 << I.getModule()->getName() << "]\n";
1411 LLVM_DEBUG(I.dump());
1412 assert(false);
1413 }
1414 }
1415
1416 CurInst = nullptr;
1417}
1418
1419void SelectionDAGBuilder::visitPHI(const PHINode &) {
1420 llvm_unreachable("SelectionDAGBuilder shouldn't visit PHI nodes!");
1421}
1422
1423void SelectionDAGBuilder::visit(unsigned Opcode, const User &I) {
1424 // Note: this doesn't use InstVisitor, because it has to work with
1425 // ConstantExpr's in addition to instructions.
1426 switch (Opcode) {
1427 default: llvm_unreachable("Unknown instruction type encountered!");
1428 // Build the switch statement using the Instruction.def file.
1429#define HANDLE_INST(NUM, OPCODE, CLASS) \
1430 case Instruction::OPCODE: visit##OPCODE((const CLASS&)I); break;
1431#include "llvm/IR/Instruction.def"
1432 }
1433}
1434
1436 DILocalVariable *Variable,
1437 DebugLoc DL, unsigned Order,
1440 // For variadic dbg_values we will now insert poison.
1441 // FIXME: We can potentially recover these!
1443 for (const Value *V : Values) {
1444 auto *Poison = PoisonValue::get(V->getType());
1446 }
1447 SDDbgValue *SDV = DAG.getDbgValueList(Variable, Expression, Locs, {},
1448 /*IsIndirect=*/false, DL, Order,
1449 /*IsVariadic=*/true);
1450 DAG.AddDbgValue(SDV, /*isParameter=*/false);
1451 return true;
1452}
1453
1455 DILocalVariable *Var,
1456 DIExpression *Expr,
1457 bool IsVariadic, DebugLoc DL,
1458 unsigned Order) {
1459 if (IsVariadic) {
1460 handleDanglingVariadicDebugInfo(DAG, Var, DL, Order, Values, Expr);
1461 return;
1462 }
1463 // TODO: Dangling debug info will eventually either be resolved or produce
1464 // a poison DBG_VALUE. However in the resolution case, a gap may appear
1465 // between the original dbg.value location and its resolved DBG_VALUE,
1466 // which we should ideally fill with an extra poison DBG_VALUE.
1467 assert(Values.size() == 1);
1468 DanglingDebugInfoMap[Values[0]].emplace_back(Var, Expr, DL, Order);
1469}
1470
1472 const DIExpression *Expr) {
1473 auto isMatchingDbgValue = [&](DanglingDebugInfo &DDI) {
1474 DIVariable *DanglingVariable = DDI.getVariable();
1475 DIExpression *DanglingExpr = DDI.getExpression();
1476 if (DanglingVariable == Variable && Expr->fragmentsOverlap(DanglingExpr)) {
1477 LLVM_DEBUG(dbgs() << "Dropping dangling debug info for "
1478 << printDDI(nullptr, DDI) << "\n");
1479 return true;
1480 }
1481 return false;
1482 };
1483
1484 for (auto &DDIMI : DanglingDebugInfoMap) {
1485 DanglingDebugInfoVector &DDIV = DDIMI.second;
1486
1487 // If debug info is to be dropped, run it through final checks to see
1488 // whether it can be salvaged.
1489 for (auto &DDI : DDIV)
1490 if (isMatchingDbgValue(DDI))
1491 salvageUnresolvedDbgValue(DDIMI.first, DDI);
1492
1493 erase_if(DDIV, isMatchingDbgValue);
1494 }
1495}
1496
1497// resolveDanglingDebugInfo - if we saw an earlier dbg_value referring to V,
1498// generate the debug data structures now that we've seen its definition.
1500 SDValue Val) {
1501 auto DanglingDbgInfoIt = DanglingDebugInfoMap.find(V);
1502 if (DanglingDbgInfoIt == DanglingDebugInfoMap.end())
1503 return;
1504
1505 DanglingDebugInfoVector &DDIV = DanglingDbgInfoIt->second;
1506 for (auto &DDI : DDIV) {
1507 DebugLoc DL = DDI.getDebugLoc();
1508 unsigned DbgSDNodeOrder = DDI.getSDNodeOrder();
1509 DILocalVariable *Variable = DDI.getVariable();
1510 DIExpression *Expr = DDI.getExpression();
1511 assert(Variable->isValidLocationForIntrinsic(DL) &&
1512 "Expected inlined-at fields to agree");
1513 SDDbgValue *SDV;
1514 if (Val.getNode()) {
1515 // FIXME: I doubt that it is correct to resolve a dangling DbgValue as a
1516 // FuncArgumentDbgValue (it would be hoisted to the function entry, and if
1517 // we couldn't resolve it directly when examining the DbgValue intrinsic
1518 // in the first place we should not be more successful here). Unless we
1519 // have some test case that prove this to be correct we should avoid
1520 // calling EmitFuncArgumentDbgValue here.
1521 unsigned ValSDNodeOrder = Val.getNode()->getIROrder();
1522 if (!EmitFuncArgumentDbgValue(V, Variable, Expr, DL,
1523 FuncArgumentDbgValueKind::Value, Val)) {
1524 LLVM_DEBUG(dbgs() << "Resolve dangling debug info for "
1525 << printDDI(V, DDI) << "\n");
1526 LLVM_DEBUG(dbgs() << " By mapping to:\n "; Val.dump());
1527 // Increase the SDNodeOrder for the DbgValue here to make sure it is
1528 // inserted after the definition of Val when emitting the instructions
1529 // after ISel. An alternative could be to teach
1530 // ScheduleDAGSDNodes::EmitSchedule to delay the insertion properly.
1531 LLVM_DEBUG(if (ValSDNodeOrder > DbgSDNodeOrder) dbgs()
1532 << "changing SDNodeOrder from " << DbgSDNodeOrder << " to "
1533 << ValSDNodeOrder << "\n");
1534 SDV = getDbgValue(Val, Variable, Expr, DL,
1535 std::max(DbgSDNodeOrder, ValSDNodeOrder));
1536 DAG.AddDbgValue(SDV, false);
1537 } else
1538 LLVM_DEBUG(dbgs() << "Resolved dangling debug info for "
1539 << printDDI(V, DDI)
1540 << " in EmitFuncArgumentDbgValue\n");
1541 } else {
1542 LLVM_DEBUG(dbgs() << "Dropping debug info for " << printDDI(V, DDI)
1543 << "\n");
1544 auto Poison = PoisonValue::get(V->getType());
1545 auto SDV =
1546 DAG.getConstantDbgValue(Variable, Expr, Poison, DL, DbgSDNodeOrder);
1547 DAG.AddDbgValue(SDV, false);
1548 }
1549 }
1550 DDIV.clear();
1551}
1552
1554 DanglingDebugInfo &DDI) {
1555 // TODO: For the variadic implementation, instead of only checking the fail
1556 // state of `handleDebugValue`, we need know specifically which values were
1557 // invalid, so that we attempt to salvage only those values when processing
1558 // a DIArgList.
1559 const Value *OrigV = V;
1560 DILocalVariable *Var = DDI.getVariable();
1561 DIExpression *Expr = DDI.getExpression();
1562 DebugLoc DL = DDI.getDebugLoc();
1563 unsigned SDOrder = DDI.getSDNodeOrder();
1564
1565 // Currently we consider only dbg.value intrinsics -- we tell the salvager
1566 // that DW_OP_stack_value is desired.
1567 bool StackValue = true;
1568
1569 // Can this Value can be encoded without any further work?
1570 if (handleDebugValue(V, Var, Expr, DL, SDOrder, /*IsVariadic=*/false))
1571 return;
1572
1573 // Attempt to salvage back through as many instructions as possible. Bail if
1574 // a non-instruction is seen, such as a constant expression or global
1575 // variable. FIXME: Further work could recover those too.
1576 while (isa<Instruction>(V)) {
1577 const Instruction &VAsInst = *cast<const Instruction>(V);
1578 // Temporary "0", awaiting real implementation.
1580 SmallVector<Value *, 4> AdditionalValues;
1581 V = salvageDebugInfoImpl(const_cast<Instruction &>(VAsInst),
1582 Expr->getNumLocationOperands(), Ops,
1583 AdditionalValues);
1584 // If we cannot salvage any further, and haven't yet found a suitable debug
1585 // expression, bail out.
1586 if (!V)
1587 break;
1588
1589 // TODO: If AdditionalValues isn't empty, then the salvage can only be
1590 // represented with a DBG_VALUE_LIST, so we give up. When we have support
1591 // here for variadic dbg_values, remove that condition.
1592 if (!AdditionalValues.empty())
1593 break;
1594
1595 // New value and expr now represent this debuginfo.
1596 Expr = DIExpression::appendOpsToArg(Expr, Ops, 0, StackValue);
1597
1598 // Some kind of simplification occurred: check whether the operand of the
1599 // salvaged debug expression can be encoded in this DAG.
1600 if (handleDebugValue(V, Var, Expr, DL, SDOrder, /*IsVariadic=*/false)) {
1601 LLVM_DEBUG(
1602 dbgs() << "Salvaged debug location info for:\n " << *Var << "\n"
1603 << *OrigV << "\nBy stripping back to:\n " << *V << "\n");
1604 return;
1605 }
1606 }
1607
1608 // This was the final opportunity to salvage this debug information, and it
1609 // couldn't be done. Place a poison DBG_VALUE at this location to terminate
1610 // any earlier variable location.
1611 assert(OrigV && "V shouldn't be null");
1612 auto *Poison = PoisonValue::get(OrigV->getType());
1613 auto *SDV = DAG.getConstantDbgValue(Var, Expr, Poison, DL, SDNodeOrder);
1614 DAG.AddDbgValue(SDV, false);
1615 LLVM_DEBUG(dbgs() << "Dropping debug value info for:\n "
1616 << printDDI(OrigV, DDI) << "\n");
1617}
1618
1620 DIExpression *Expr,
1621 DebugLoc DbgLoc,
1622 unsigned Order) {
1626 handleDebugValue(Poison, Var, NewExpr, DbgLoc, Order,
1627 /*IsVariadic*/ false);
1628}
1629
1631 DILocalVariable *Var,
1632 DIExpression *Expr, DebugLoc DbgLoc,
1633 unsigned Order, bool IsVariadic) {
1634 if (Values.empty())
1635 return true;
1636
1637 // Filter EntryValue locations out early.
1638 if (visitEntryValueDbgValue(Values, Var, Expr, DbgLoc))
1639 return true;
1640
1641 SmallVector<SDDbgOperand> LocationOps;
1642 SmallVector<SDNode *> Dependencies;
1643 for (const Value *V : Values) {
1644 // Constant value.
1647 LocationOps.emplace_back(SDDbgOperand::fromConst(V));
1648 continue;
1649 }
1650
1651 // Look through IntToPtr constants.
1652 if (auto *CE = dyn_cast<ConstantExpr>(V))
1653 if (CE->getOpcode() == Instruction::IntToPtr) {
1654 LocationOps.emplace_back(SDDbgOperand::fromConst(CE->getOperand(0)));
1655 continue;
1656 }
1657
1658 // If the Value is a frame index, we can create a FrameIndex debug value
1659 // without relying on the DAG at all.
1660 if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
1661 auto SI = FuncInfo.StaticAllocaMap.find(AI);
1662 if (SI != FuncInfo.StaticAllocaMap.end()) {
1663 LocationOps.emplace_back(SDDbgOperand::fromFrameIdx(SI->second));
1664 continue;
1665 }
1666 }
1667
1668 // Do not use getValue() in here; we don't want to generate code at
1669 // this point if it hasn't been done yet.
1670 SDValue N = NodeMap[V];
1671 if (!N.getNode() && isa<Argument>(V)) // Check unused arguments map.
1672 N = UnusedArgNodeMap[V];
1673
1674 if (N.getNode()) {
1675 // Only emit func arg dbg value for non-variadic dbg.values for now.
1676 if (!IsVariadic &&
1677 EmitFuncArgumentDbgValue(V, Var, Expr, DbgLoc,
1678 FuncArgumentDbgValueKind::Value, N))
1679 return true;
1680 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(N.getNode())) {
1681 // Construct a FrameIndexDbgValue for FrameIndexSDNodes so we can
1682 // describe stack slot locations.
1683 //
1684 // Consider "int x = 0; int *px = &x;". There are two kinds of
1685 // interesting debug values here after optimization:
1686 //
1687 // dbg.value(i32* %px, !"int *px", !DIExpression()), and
1688 // dbg.value(i32* %px, !"int x", !DIExpression(DW_OP_deref))
1689 //
1690 // Both describe the direct values of their associated variables.
1691 Dependencies.push_back(N.getNode());
1692 LocationOps.emplace_back(SDDbgOperand::fromFrameIdx(FISDN->getIndex()));
1693 continue;
1694 }
1695 LocationOps.emplace_back(
1696 SDDbgOperand::fromNode(N.getNode(), N.getResNo()));
1697 continue;
1698 }
1699
1700 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1701 // Special rules apply for the first dbg.values of parameter variables in a
1702 // function. Identify them by the fact they reference Argument Values, that
1703 // they're parameters, and they are parameters of the current function. We
1704 // need to let them dangle until they get an SDNode.
1705 bool IsParamOfFunc =
1706 isa<Argument>(V) && Var->isParameter() && !DbgLoc.getInlinedAt();
1707 if (IsParamOfFunc)
1708 return false;
1709
1710 // The value is not used in this block yet (or it would have an SDNode).
1711 // We still want the value to appear for the user if possible -- if it has
1712 // an associated VReg, we can refer to that instead.
1713 auto VMI = FuncInfo.ValueMap.find(V);
1714 if (VMI != FuncInfo.ValueMap.end()) {
1715 Register Reg = VMI->second;
1716 // If this is a PHI node, it may be split up into several MI PHI nodes
1717 // (in FunctionLoweringInfo::set).
1718 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), Reg,
1719 V->getType(), std::nullopt);
1720 if (RFV.occupiesMultipleRegs()) {
1721 // FIXME: We could potentially support variadic dbg_values here.
1722 if (IsVariadic)
1723 return false;
1724 unsigned Offset = 0;
1725 unsigned BitsToDescribe = 0;
1726 if (auto VarSize = Var->getSizeInBits())
1727 BitsToDescribe = *VarSize;
1728 if (auto Fragment = Expr->getFragmentInfo())
1729 BitsToDescribe = Fragment->SizeInBits;
1730 for (const auto &RegAndSize : RFV.getRegsAndSizes()) {
1731 // Bail out if all bits are described already.
1732 if (Offset >= BitsToDescribe)
1733 break;
1734 // TODO: handle scalable vectors.
1735 unsigned RegisterSize = RegAndSize.second;
1736 unsigned FragmentSize = (Offset + RegisterSize > BitsToDescribe)
1737 ? BitsToDescribe - Offset
1738 : RegisterSize;
1739 auto FragmentExpr = DIExpression::createFragmentExpression(
1740 Expr, Offset, FragmentSize);
1741 if (!FragmentExpr)
1742 continue;
1743 SDDbgValue *SDV = DAG.getVRegDbgValue(
1744 Var, *FragmentExpr, RegAndSize.first, false, DbgLoc, Order);
1745 DAG.AddDbgValue(SDV, false);
1746 Offset += RegisterSize;
1747 }
1748 return true;
1749 }
1750 // We can use simple vreg locations for variadic dbg_values as well.
1751 LocationOps.emplace_back(SDDbgOperand::fromVReg(Reg));
1752 continue;
1753 }
1754 // We failed to create a SDDbgOperand for V.
1755 return false;
1756 }
1757
1758 // We have created a SDDbgOperand for each Value in Values.
1759 assert(!LocationOps.empty());
1760 SDDbgValue *SDV =
1761 DAG.getDbgValueList(Var, Expr, LocationOps, Dependencies,
1762 /*IsIndirect=*/false, DbgLoc, Order, IsVariadic);
1763 DAG.AddDbgValue(SDV, /*isParameter=*/false);
1764 return true;
1765}
1766
1768 // Try to fixup any remaining dangling debug info -- and drop it if we can't.
1769 for (auto &Pair : DanglingDebugInfoMap)
1770 for (auto &DDI : Pair.second)
1771 salvageUnresolvedDbgValue(const_cast<Value *>(Pair.first), DDI);
1773}
1774
1775/// getCopyFromRegs - If there was virtual register allocated for the value V
1776/// emit CopyFromReg of the specified type Ty. Return empty SDValue() otherwise.
1779 SDValue Result;
1780
1781 if (It != FuncInfo.ValueMap.end()) {
1782 Register InReg = It->second;
1783
1784 RegsForValue RFV(*DAG.getContext(), DAG.getTargetLoweringInfo(),
1785 DAG.getDataLayout(), InReg, Ty,
1786 std::nullopt); // This is not an ABI copy.
1787 SDValue Chain = DAG.getEntryNode();
1788 Result = RFV.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(), Chain, nullptr,
1789 V);
1790 resolveDanglingDebugInfo(V, Result);
1791 }
1792
1793 return Result;
1794}
1795
1796/// getValue - Return an SDValue for the given Value.
1798 // If we already have an SDValue for this value, use it. It's important
1799 // to do this first, so that we don't create a CopyFromReg if we already
1800 // have a regular SDValue.
1801 SDValue &N = NodeMap[V];
1802 if (N.getNode()) return N;
1803
1804 // If there's a virtual register allocated and initialized for this
1805 // value, use it.
1806 if (SDValue copyFromReg = getCopyFromRegs(V, V->getType()))
1807 return copyFromReg;
1808
1809 // Otherwise create a new SDValue and remember it.
1810 SDValue Val = getValueImpl(V);
1811 NodeMap[V] = Val;
1813 return Val;
1814}
1815
1816/// getNonRegisterValue - Return an SDValue for the given Value, but
1817/// don't look in FuncInfo.ValueMap for a virtual register.
1819 // If we already have an SDValue for this value, use it.
1820 SDValue &N = NodeMap[V];
1821 if (N.getNode()) {
1822 if (isIntOrFPConstant(N)) {
1823 // Remove the debug location from the node as the node is about to be used
1824 // in a location which may differ from the original debug location. This
1825 // is relevant to Constant and ConstantFP nodes because they can appear
1826 // as constant expressions inside PHI nodes.
1827 N->setDebugLoc(DebugLoc());
1828 }
1829 return N;
1830 }
1831
1832 // Otherwise create a new SDValue and remember it.
1833 SDValue Val = getValueImpl(V);
1834 NodeMap[V] = Val;
1836 return Val;
1837}
1838
1839/// getValueImpl - Helper function for getValue and getNonRegisterValue.
1840/// Create an SDValue for the given value.
1842 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1843
1844 if (const Constant *C = dyn_cast<Constant>(V)) {
1845 EVT VT = TLI.getValueType(DAG.getDataLayout(), V->getType(), true);
1846
1847 if (const ConstantInt *CI = dyn_cast<ConstantInt>(C)) {
1848 SDLoc DL = getCurSDLoc();
1849
1850 // DAG.getConstant() may attempt to legalise the vector constant which can
1851 // significantly change the combines applied to the DAG. To reduce the
1852 // divergence when enabling ConstantInt based vectors we try to construct
1853 // the DAG in the same way as shufflevector based splats. TODO: The
1854 // divergence sometimes leads to better optimisations. Ideally we should
1855 // prevent DAG.getConstant() from legalising too early but there are some
1856 // degradations preventing this.
1857 if (VT.isScalableVector())
1858 return DAG.getNode(
1859 ISD::SPLAT_VECTOR, DL, VT,
1860 DAG.getConstant(CI->getValue(), DL, VT.getVectorElementType()));
1861 if (VT.isFixedLengthVector())
1862 return DAG.getSplatBuildVector(
1863 VT, DL,
1864 DAG.getConstant(CI->getValue(), DL, VT.getVectorElementType()));
1865 return DAG.getConstant(*CI, DL, VT);
1866 }
1867
1868 if (const GlobalValue *GV = dyn_cast<GlobalValue>(C))
1869 return DAG.getGlobalAddress(GV, getCurSDLoc(), VT);
1870
1871 if (const ConstantPtrAuth *CPA = dyn_cast<ConstantPtrAuth>(C)) {
1872 return DAG.getNode(ISD::PtrAuthGlobalAddress, getCurSDLoc(), VT,
1873 getValue(CPA->getPointer()), getValue(CPA->getKey()),
1874 getValue(CPA->getAddrDiscriminator()),
1875 getValue(CPA->getDiscriminator()));
1876 }
1877
1879 return DAG.getConstant(0, getCurSDLoc(), VT);
1880
1881 if (match(C, m_VScale()))
1882 return DAG.getVScale(getCurSDLoc(), VT, APInt(VT.getSizeInBits(), 1));
1883
1884 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C))
1885 return DAG.getConstantFP(*CFP, getCurSDLoc(), VT);
1886
1887 if (isa<UndefValue>(C) && !V->getType()->isAggregateType())
1888 return isa<PoisonValue>(C) ? DAG.getPOISON(VT) : DAG.getUNDEF(VT);
1889
1890 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
1891 visit(CE->getOpcode(), *CE);
1892 SDValue N1 = NodeMap[V];
1893 assert(N1.getNode() && "visit didn't populate the NodeMap!");
1894 return N1;
1895 }
1896
1898 SmallVector<SDValue, 4> Constants;
1899 for (const Use &U : C->operands()) {
1900 SDNode *Val = getValue(U).getNode();
1901 // If the operand is an empty aggregate, there are no values.
1902 if (!Val) continue;
1903 // Add each leaf value from the operand to the Constants list
1904 // to form a flattened list of all the values.
1905 for (unsigned i = 0, e = Val->getNumValues(); i != e; ++i)
1906 Constants.push_back(SDValue(Val, i));
1907 }
1908
1909 return DAG.getMergeValues(Constants, getCurSDLoc());
1910 }
1911
1912 if (const ConstantDataSequential *CDS =
1915 for (uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i) {
1916 SDNode *Val = getValue(CDS->getElementAsConstant(i)).getNode();
1917 // Add each leaf value from the operand to the Constants list
1918 // to form a flattened list of all the values.
1919 for (unsigned i = 0, e = Val->getNumValues(); i != e; ++i)
1920 Ops.push_back(SDValue(Val, i));
1921 }
1922
1923 if (isa<ArrayType>(CDS->getType()))
1924 return DAG.getMergeValues(Ops, getCurSDLoc());
1925 return DAG.getBuildVector(VT, getCurSDLoc(), Ops);
1926 }
1927
1928 if (C->getType()->isStructTy() || C->getType()->isArrayTy()) {
1930 "Unknown struct or array constant!");
1931
1932 SmallVector<EVT, 4> ValueVTs;
1933 ComputeValueVTs(TLI, DAG.getDataLayout(), C->getType(), ValueVTs);
1934 unsigned NumElts = ValueVTs.size();
1935 if (NumElts == 0)
1936 return SDValue(); // empty struct
1937 SmallVector<SDValue, 4> Constants(NumElts);
1938 for (unsigned i = 0; i != NumElts; ++i) {
1939 EVT EltVT = ValueVTs[i];
1940 if (isa<UndefValue>(C))
1941 Constants[i] = DAG.getUNDEF(EltVT);
1942 else if (EltVT.isFloatingPoint())
1943 Constants[i] = DAG.getConstantFP(0, getCurSDLoc(), EltVT);
1944 else
1945 Constants[i] = DAG.getConstant(0, getCurSDLoc(), EltVT);
1946 }
1947
1948 return DAG.getMergeValues(Constants, getCurSDLoc());
1949 }
1950
1951 if (const BlockAddress *BA = dyn_cast<BlockAddress>(C))
1952 return DAG.getBlockAddress(BA, VT);
1953
1954 if (const auto *Equiv = dyn_cast<DSOLocalEquivalent>(C))
1955 return getValue(Equiv->getGlobalValue());
1956
1957 if (const auto *NC = dyn_cast<NoCFIValue>(C))
1958 return getValue(NC->getGlobalValue());
1959
1960 if (VT == MVT::aarch64svcount) {
1961 assert(C->isNullValue() && "Can only zero this target type!");
1962 return DAG.getNode(ISD::BITCAST, getCurSDLoc(), VT,
1963 DAG.getConstant(0, getCurSDLoc(), MVT::nxv16i1));
1964 }
1965
1966 if (VT.isRISCVVectorTuple()) {
1967 assert(C->isNullValue() && "Can only zero this target type!");
1968 return DAG.getNode(
1970 DAG.getNode(
1972 EVT::getVectorVT(*DAG.getContext(), MVT::i8,
1973 VT.getSizeInBits().getKnownMinValue() / 8, true),
1974 DAG.getConstant(0, getCurSDLoc(), MVT::getIntegerVT(8))));
1975 }
1976
1977 VectorType *VecTy = cast<VectorType>(V->getType());
1978
1979 // Now that we know the number and type of the elements, get that number of
1980 // elements into the Ops array based on what kind of constant it is.
1981 if (const ConstantVector *CV = dyn_cast<ConstantVector>(C)) {
1983 unsigned NumElements = cast<FixedVectorType>(VecTy)->getNumElements();
1984 for (unsigned i = 0; i != NumElements; ++i)
1985 Ops.push_back(getValue(CV->getOperand(i)));
1986
1987 return DAG.getBuildVector(VT, getCurSDLoc(), Ops);
1988 }
1989
1991 EVT EltVT =
1992 TLI.getValueType(DAG.getDataLayout(), VecTy->getElementType());
1993
1994 SDValue Op;
1995 if (EltVT.isFloatingPoint())
1996 Op = DAG.getConstantFP(0, getCurSDLoc(), EltVT);
1997 else
1998 Op = DAG.getConstant(0, getCurSDLoc(), EltVT);
1999
2000 return DAG.getSplat(VT, getCurSDLoc(), Op);
2001 }
2002
2003 llvm_unreachable("Unknown vector constant");
2004 }
2005
2006 // If this is a static alloca, generate it as the frameindex instead of
2007 // computation.
2008 if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
2010 FuncInfo.StaticAllocaMap.find(AI);
2011 if (SI != FuncInfo.StaticAllocaMap.end())
2012 return DAG.getFrameIndex(
2013 SI->second, TLI.getValueType(DAG.getDataLayout(), AI->getType()));
2014 }
2015
2016 // If this is an instruction which fast-isel has deferred, select it now.
2017 if (const Instruction *Inst = dyn_cast<Instruction>(V)) {
2018 Register InReg = FuncInfo.InitializeRegForValue(Inst);
2019
2020 std::optional<CallingConv::ID> CallConv;
2021 auto *CB = dyn_cast<CallBase>(Inst);
2022 if (CB && !CB->isInlineAsm())
2023 CallConv = CB->getCallingConv();
2024
2025 RegsForValue RFV(*DAG.getContext(), TLI, DAG.getDataLayout(), InReg,
2026 Inst->getType(), CallConv);
2027 SDValue Chain = DAG.getEntryNode();
2028 return RFV.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(), Chain, nullptr, V);
2029 }
2030
2031 if (const MetadataAsValue *MD = dyn_cast<MetadataAsValue>(V))
2032 return DAG.getMDNode(cast<MDNode>(MD->getMetadata()));
2033
2034 if (const auto *BB = dyn_cast<BasicBlock>(V))
2035 return DAG.getBasicBlock(FuncInfo.getMBB(BB));
2036
2037 llvm_unreachable("Can't get register for value!");
2038}
2039
2040void SelectionDAGBuilder::visitCatchPad(const CatchPadInst &I) {
2042 bool IsMSVCCXX = Pers == EHPersonality::MSVC_CXX;
2043 bool IsCoreCLR = Pers == EHPersonality::CoreCLR;
2044 bool IsSEH = isAsynchronousEHPersonality(Pers);
2045 MachineBasicBlock *CatchPadMBB = FuncInfo.MBB;
2046 if (IsSEH) {
2047 // For SEH, EHCont Guard needs to know that this catchpad is a target.
2048 CatchPadMBB->setIsEHContTarget(true);
2050 } else
2051 CatchPadMBB->setIsEHScopeEntry();
2052 // In MSVC C++ and CoreCLR, catchblocks are funclets and need prologues.
2053 if (IsMSVCCXX || IsCoreCLR)
2054 CatchPadMBB->setIsEHFuncletEntry();
2055}
2056
2057void SelectionDAGBuilder::visitCatchRet(const CatchReturnInst &I) {
2058 // Update machine-CFG edge.
2059 MachineBasicBlock *TargetMBB = FuncInfo.getMBB(I.getSuccessor());
2060 FuncInfo.MBB->addSuccessor(TargetMBB);
2061
2062 auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn());
2063 bool IsSEH = isAsynchronousEHPersonality(Pers);
2064 if (IsSEH) {
2065 // If this is not a fall-through branch or optimizations are switched off,
2066 // emit the branch.
2067 if (TargetMBB != NextBlock(FuncInfo.MBB) ||
2068 TM.getOptLevel() == CodeGenOptLevel::None)
2069 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
2070 getControlRoot(), DAG.getBasicBlock(TargetMBB)));
2071 return;
2072 }
2073
2074 // For non-SEH, EHCont Guard needs to know that this catchret is a target.
2075 TargetMBB->setIsEHContTarget(true);
2076 DAG.getMachineFunction().setHasEHContTarget(true);
2077
2078 // Figure out the funclet membership for the catchret's successor.
2079 // This will be used by the FuncletLayout pass to determine how to order the
2080 // BB's.
2081 // A 'catchret' returns to the outer scope's color.
2082 Value *ParentPad = I.getCatchSwitchParentPad();
2083 const BasicBlock *SuccessorColor;
2084 if (isa<ConstantTokenNone>(ParentPad))
2085 SuccessorColor = &FuncInfo.Fn->getEntryBlock();
2086 else
2087 SuccessorColor = cast<Instruction>(ParentPad)->getParent();
2088 assert(SuccessorColor && "No parent funclet for catchret!");
2089 MachineBasicBlock *SuccessorColorMBB = FuncInfo.getMBB(SuccessorColor);
2090 assert(SuccessorColorMBB && "No MBB for SuccessorColor!");
2091
2092 // Create the terminator node.
2093 SDValue Ret = DAG.getNode(ISD::CATCHRET, getCurSDLoc(), MVT::Other,
2094 getControlRoot(), DAG.getBasicBlock(TargetMBB),
2095 DAG.getBasicBlock(SuccessorColorMBB));
2096 DAG.setRoot(Ret);
2097}
2098
2099void SelectionDAGBuilder::visitCleanupPad(const CleanupPadInst &CPI) {
2100 // Don't emit any special code for the cleanuppad instruction. It just marks
2101 // the start of an EH scope/funclet.
2102 FuncInfo.MBB->setIsEHScopeEntry();
2103 auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn());
2104 if (Pers != EHPersonality::Wasm_CXX) {
2105 FuncInfo.MBB->setIsEHFuncletEntry();
2106 FuncInfo.MBB->setIsCleanupFuncletEntry();
2107 }
2108}
2109
2110/// When an invoke or a cleanupret unwinds to the next EH pad, there are
2111/// many places it could ultimately go. In the IR, we have a single unwind
2112/// destination, but in the machine CFG, we enumerate all the possible blocks.
2113/// This function skips over imaginary basic blocks that hold catchswitch
2114/// instructions, and finds all the "real" machine
2115/// basic block destinations. As those destinations may not be successors of
2116/// EHPadBB, here we also calculate the edge probability to those destinations.
2117/// The passed-in Prob is the edge probability to EHPadBB.
2119 FunctionLoweringInfo &FuncInfo, const BasicBlock *EHPadBB,
2120 BranchProbability Prob,
2121 SmallVectorImpl<std::pair<MachineBasicBlock *, BranchProbability>>
2122 &UnwindDests) {
2123 EHPersonality Personality =
2125 bool IsMSVCCXX = Personality == EHPersonality::MSVC_CXX;
2126 bool IsCoreCLR = Personality == EHPersonality::CoreCLR;
2127 bool IsWasmCXX = Personality == EHPersonality::Wasm_CXX;
2128 bool IsSEH = isAsynchronousEHPersonality(Personality);
2129
2130 while (EHPadBB) {
2132 BasicBlock *NewEHPadBB = nullptr;
2133 if (isa<LandingPadInst>(Pad)) {
2134 // Stop on landingpads. They are not funclets.
2135 UnwindDests.emplace_back(FuncInfo.getMBB(EHPadBB), Prob);
2136 break;
2137 } else if (isa<CleanupPadInst>(Pad)) {
2138 // Stop on cleanup pads. Cleanups are always funclet entries for all known
2139 // personalities except Wasm. And in Wasm this becomes a catch_all(_ref),
2140 // which always catches an exception.
2141 UnwindDests.emplace_back(FuncInfo.getMBB(EHPadBB), Prob);
2142 UnwindDests.back().first->setIsEHScopeEntry();
2143 // In Wasm, EH scopes are not funclets
2144 if (!IsWasmCXX)
2145 UnwindDests.back().first->setIsEHFuncletEntry();
2146 break;
2147 } else if (const auto *CatchSwitch = dyn_cast<CatchSwitchInst>(Pad)) {
2148 // Add the catchpad handlers to the possible destinations.
2149 for (const BasicBlock *CatchPadBB : CatchSwitch->handlers()) {
2150 UnwindDests.emplace_back(FuncInfo.getMBB(CatchPadBB), Prob);
2151 // For MSVC++ and the CLR, catchblocks are funclets and need prologues.
2152 if (IsMSVCCXX || IsCoreCLR)
2153 UnwindDests.back().first->setIsEHFuncletEntry();
2154 if (!IsSEH)
2155 UnwindDests.back().first->setIsEHScopeEntry();
2156 }
2157 NewEHPadBB = CatchSwitch->getUnwindDest();
2158 } else {
2159 continue;
2160 }
2161
2162 BranchProbabilityInfo *BPI = FuncInfo.BPI;
2163 if (BPI && NewEHPadBB)
2164 Prob *= BPI->getEdgeProbability(EHPadBB, NewEHPadBB);
2165 EHPadBB = NewEHPadBB;
2166 }
2167}
2168
2169void SelectionDAGBuilder::visitCleanupRet(const CleanupReturnInst &I) {
2170 // Update successor info.
2172 auto UnwindDest = I.getUnwindDest();
2173 BranchProbabilityInfo *BPI = FuncInfo.BPI;
2174 BranchProbability UnwindDestProb =
2175 (BPI && UnwindDest)
2176 ? BPI->getEdgeProbability(FuncInfo.MBB->getBasicBlock(), UnwindDest)
2178 findUnwindDestinations(FuncInfo, UnwindDest, UnwindDestProb, UnwindDests);
2179 for (auto &UnwindDest : UnwindDests) {
2180 UnwindDest.first->setIsEHPad();
2181 addSuccessorWithProb(FuncInfo.MBB, UnwindDest.first, UnwindDest.second);
2182 }
2183 FuncInfo.MBB->normalizeSuccProbs();
2184
2185 // Create the terminator node.
2186 MachineBasicBlock *CleanupPadMBB =
2187 FuncInfo.getMBB(I.getCleanupPad()->getParent());
2188 SDValue Ret = DAG.getNode(ISD::CLEANUPRET, getCurSDLoc(), MVT::Other,
2189 getControlRoot(), DAG.getBasicBlock(CleanupPadMBB));
2190 DAG.setRoot(Ret);
2191}
2192
2193void SelectionDAGBuilder::visitCatchSwitch(const CatchSwitchInst &CSI) {
2194 report_fatal_error("visitCatchSwitch not yet implemented!");
2195}
2196
2197void SelectionDAGBuilder::visitRet(const ReturnInst &I) {
2198 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
2199 auto &DL = DAG.getDataLayout();
2200 SDValue Chain = getControlRoot();
2203
2204 // Calls to @llvm.experimental.deoptimize don't generate a return value, so
2205 // lower
2206 //
2207 // %val = call <ty> @llvm.experimental.deoptimize()
2208 // ret <ty> %val
2209 //
2210 // differently.
2211 if (I.getParent()->getTerminatingDeoptimizeCall()) {
2213 return;
2214 }
2215
2216 if (!FuncInfo.CanLowerReturn) {
2217 Register DemoteReg = FuncInfo.DemoteRegister;
2218
2219 // Emit a store of the return value through the virtual register.
2220 // Leave Outs empty so that LowerReturn won't try to load return
2221 // registers the usual way.
2222 MVT PtrValueVT = TLI.getPointerTy(DL, DL.getAllocaAddrSpace());
2223 SDValue RetPtr =
2224 DAG.getCopyFromReg(Chain, getCurSDLoc(), DemoteReg, PtrValueVT);
2225 SDValue RetOp = getValue(I.getOperand(0));
2226
2227 SmallVector<EVT, 4> ValueVTs, MemVTs;
2228 SmallVector<uint64_t, 4> Offsets;
2229 ComputeValueVTs(TLI, DL, I.getOperand(0)->getType(), ValueVTs, &MemVTs,
2230 &Offsets, 0);
2231 unsigned NumValues = ValueVTs.size();
2232
2233 SmallVector<SDValue, 4> Chains(NumValues);
2234 Align BaseAlign = DL.getPrefTypeAlign(I.getOperand(0)->getType());
2235 for (unsigned i = 0; i != NumValues; ++i) {
2236 // An aggregate return value cannot wrap around the address space, so
2237 // offsets to its parts don't wrap either.
2238 SDValue Ptr = DAG.getObjectPtrOffset(getCurSDLoc(), RetPtr,
2239 TypeSize::getFixed(Offsets[i]));
2240
2241 SDValue Val = RetOp.getValue(RetOp.getResNo() + i);
2242 if (MemVTs[i] != ValueVTs[i])
2243 Val = DAG.getPtrExtOrTrunc(Val, getCurSDLoc(), MemVTs[i]);
2244 Chains[i] = DAG.getStore(
2245 Chain, getCurSDLoc(), Val,
2246 // FIXME: better loc info would be nice.
2247 Ptr, MachinePointerInfo::getUnknownStack(DAG.getMachineFunction()),
2248 commonAlignment(BaseAlign, Offsets[i]));
2249 }
2250
2251 Chain = DAG.getNode(ISD::TokenFactor, getCurSDLoc(),
2252 MVT::Other, Chains);
2253 } else if (I.getNumOperands() != 0) {
2255 ComputeValueTypes(DL, I.getOperand(0)->getType(), Types);
2256 unsigned NumValues = Types.size();
2257 if (NumValues) {
2258 SDValue RetOp = getValue(I.getOperand(0));
2259
2260 const Function *F = I.getParent()->getParent();
2261
2262 bool NeedsRegBlock = TLI.functionArgumentNeedsConsecutiveRegisters(
2263 I.getOperand(0)->getType(), F->getCallingConv(),
2264 /*IsVarArg*/ false, DL);
2265
2266 ISD::NodeType ExtendKind = ISD::ANY_EXTEND;
2267 if (F->getAttributes().hasRetAttr(Attribute::SExt))
2268 ExtendKind = ISD::SIGN_EXTEND;
2269 else if (F->getAttributes().hasRetAttr(Attribute::ZExt))
2270 ExtendKind = ISD::ZERO_EXTEND;
2271
2272 LLVMContext &Context = F->getContext();
2273 bool RetInReg = F->getAttributes().hasRetAttr(Attribute::InReg);
2274
2275 for (unsigned j = 0; j != NumValues; ++j) {
2276 EVT VT = TLI.getValueType(DL, Types[j]);
2277
2278 if (ExtendKind != ISD::ANY_EXTEND && VT.isInteger())
2279 VT = TLI.getTypeForExtReturn(Context, VT, ExtendKind);
2280
2281 CallingConv::ID CC = F->getCallingConv();
2282
2283 unsigned NumParts = TLI.getNumRegistersForCallingConv(Context, CC, VT);
2284 MVT PartVT = TLI.getRegisterTypeForCallingConv(Context, CC, VT);
2285 SmallVector<SDValue, 4> Parts(NumParts);
2287 SDValue(RetOp.getNode(), RetOp.getResNo() + j),
2288 &Parts[0], NumParts, PartVT, &I, CC, ExtendKind);
2289
2290 // 'inreg' on function refers to return value
2291 ISD::ArgFlagsTy Flags = ISD::ArgFlagsTy();
2292 if (RetInReg)
2293 Flags.setInReg();
2294
2295 if (I.getOperand(0)->getType()->isPointerTy()) {
2296 Flags.setPointer();
2297 Flags.setPointerAddrSpace(
2298 cast<PointerType>(I.getOperand(0)->getType())->getAddressSpace());
2299 }
2300
2301 if (NeedsRegBlock) {
2302 Flags.setInConsecutiveRegs();
2303 if (j == NumValues - 1)
2304 Flags.setInConsecutiveRegsLast();
2305 }
2306
2307 // Propagate extension type if any
2308 if (ExtendKind == ISD::SIGN_EXTEND)
2309 Flags.setSExt();
2310 else if (ExtendKind == ISD::ZERO_EXTEND)
2311 Flags.setZExt();
2312 else if (F->getAttributes().hasRetAttr(Attribute::NoExt))
2313 Flags.setNoExt();
2314
2315 for (unsigned i = 0; i < NumParts; ++i) {
2316 Outs.push_back(ISD::OutputArg(Flags,
2317 Parts[i].getValueType().getSimpleVT(),
2318 VT, Types[j], 0, 0));
2319 OutVals.push_back(Parts[i]);
2320 }
2321 }
2322 }
2323 }
2324
2325 // Push in swifterror virtual register as the last element of Outs. This makes
2326 // sure swifterror virtual register will be returned in the swifterror
2327 // physical register.
2328 const Function *F = I.getParent()->getParent();
2329 if (TLI.supportSwiftError() &&
2330 F->getAttributes().hasAttrSomewhere(Attribute::SwiftError)) {
2331 assert(SwiftError.getFunctionArg() && "Need a swift error argument");
2332 ISD::ArgFlagsTy Flags = ISD::ArgFlagsTy();
2333 Flags.setSwiftError();
2334 Outs.push_back(ISD::OutputArg(Flags, /*vt=*/TLI.getPointerTy(DL),
2335 /*argvt=*/EVT(TLI.getPointerTy(DL)),
2336 PointerType::getUnqual(*DAG.getContext()),
2337 /*origidx=*/1, /*partOffs=*/0));
2338 // Create SDNode for the swifterror virtual register.
2339 OutVals.push_back(
2340 DAG.getRegister(SwiftError.getOrCreateVRegUseAt(
2341 &I, FuncInfo.MBB, SwiftError.getFunctionArg()),
2342 EVT(TLI.getPointerTy(DL))));
2343 }
2344
2345 bool isVarArg = DAG.getMachineFunction().getFunction().isVarArg();
2346 CallingConv::ID CallConv =
2347 DAG.getMachineFunction().getFunction().getCallingConv();
2348 Chain = DAG.getTargetLoweringInfo().LowerReturn(
2349 Chain, CallConv, isVarArg, Outs, OutVals, getCurSDLoc(), DAG);
2350
2351 // Verify that the target's LowerReturn behaved as expected.
2352 assert(Chain.getNode() && Chain.getValueType() == MVT::Other &&
2353 "LowerReturn didn't return a valid chain!");
2354
2355 // Update the DAG with the new chain value resulting from return lowering.
2356 DAG.setRoot(Chain);
2357}
2358
2359/// CopyToExportRegsIfNeeded - If the given value has virtual registers
2360/// created for it, emit nodes to copy the value into the virtual
2361/// registers.
2363 // Skip empty types
2364 if (V->getType()->isEmptyTy())
2365 return;
2366
2368 if (VMI != FuncInfo.ValueMap.end()) {
2369 assert((!V->use_empty() || isa<CallBrInst>(V)) &&
2370 "Unused value assigned virtual registers!");
2371 CopyValueToVirtualRegister(V, VMI->second);
2372 }
2373}
2374
2375/// ExportFromCurrentBlock - If this condition isn't known to be exported from
2376/// the current basic block, add it to ValueMap now so that we'll get a
2377/// CopyTo/FromReg.
2379 // No need to export constants.
2380 if (!isa<Instruction>(V) && !isa<Argument>(V)) return;
2381
2382 // Already exported?
2383 if (FuncInfo.isExportedInst(V)) return;
2384
2385 Register Reg = FuncInfo.InitializeRegForValue(V);
2387}
2388
2390 const BasicBlock *FromBB) {
2391 // The operands of the setcc have to be in this block. We don't know
2392 // how to export them from some other block.
2393 if (const Instruction *VI = dyn_cast<Instruction>(V)) {
2394 // Can export from current BB.
2395 if (VI->getParent() == FromBB)
2396 return true;
2397
2398 // Is already exported, noop.
2399 return FuncInfo.isExportedInst(V);
2400 }
2401
2402 // If this is an argument, we can export it if the BB is the entry block or
2403 // if it is already exported.
2404 if (isa<Argument>(V)) {
2405 if (FromBB->isEntryBlock())
2406 return true;
2407
2408 // Otherwise, can only export this if it is already exported.
2409 return FuncInfo.isExportedInst(V);
2410 }
2411
2412 // Otherwise, constants can always be exported.
2413 return true;
2414}
2415
2416/// Return branch probability calculated by BranchProbabilityInfo for IR blocks.
2418SelectionDAGBuilder::getEdgeProbability(const MachineBasicBlock *Src,
2419 const MachineBasicBlock *Dst) const {
2421 const BasicBlock *SrcBB = Src->getBasicBlock();
2422 const BasicBlock *DstBB = Dst->getBasicBlock();
2423 if (!BPI) {
2424 // If BPI is not available, set the default probability as 1 / N, where N is
2425 // the number of successors.
2426 auto SuccSize = std::max<uint32_t>(succ_size(SrcBB), 1);
2427 return BranchProbability(1, SuccSize);
2428 }
2429 return BPI->getEdgeProbability(SrcBB, DstBB);
2430}
2431
2432void SelectionDAGBuilder::addSuccessorWithProb(MachineBasicBlock *Src,
2433 MachineBasicBlock *Dst,
2434 BranchProbability Prob) {
2435 if (!FuncInfo.BPI)
2436 Src->addSuccessorWithoutProb(Dst);
2437 else {
2438 if (Prob.isUnknown())
2439 Prob = getEdgeProbability(Src, Dst);
2440 Src->addSuccessor(Dst, Prob);
2441 }
2442}
2443
2444static bool InBlock(const Value *V, const BasicBlock *BB) {
2445 if (const Instruction *I = dyn_cast<Instruction>(V))
2446 return I->getParent() == BB;
2447 return true;
2448}
2449
2450/// EmitBranchForMergedCondition - Helper method for FindMergedConditions.
2451/// This function emits a branch and is used at the leaves of an OR or an
2452/// AND operator tree.
2453void
2456 MachineBasicBlock *FBB,
2457 MachineBasicBlock *CurBB,
2458 MachineBasicBlock *SwitchBB,
2459 BranchProbability TProb,
2460 BranchProbability FProb,
2461 bool InvertCond) {
2462 const BasicBlock *BB = CurBB->getBasicBlock();
2463
2464 // If the leaf of the tree is a comparison, merge the condition into
2465 // the caseblock.
2466 if (const CmpInst *BOp = dyn_cast<CmpInst>(Cond)) {
2467 // The operands of the cmp have to be in this block. We don't know
2468 // how to export them from some other block. If this is the first block
2469 // of the sequence, no exporting is needed.
2470 if (CurBB == SwitchBB ||
2471 (isExportableFromCurrentBlock(BOp->getOperand(0), BB) &&
2472 isExportableFromCurrentBlock(BOp->getOperand(1), BB))) {
2473 ISD::CondCode Condition;
2474 if (const ICmpInst *IC = dyn_cast<ICmpInst>(Cond)) {
2475 ICmpInst::Predicate Pred =
2476 InvertCond ? IC->getInversePredicate() : IC->getPredicate();
2477 Condition = getICmpCondCode(Pred);
2478 } else {
2479 const FCmpInst *FC = cast<FCmpInst>(Cond);
2480 FCmpInst::Predicate Pred =
2481 InvertCond ? FC->getInversePredicate() : FC->getPredicate();
2482 Condition = getFCmpCondCode(Pred);
2483 if (FC->hasNoNaNs() ||
2484 (isKnownNeverNaN(FC->getOperand(0),
2485 SimplifyQuery(DAG.getDataLayout(), FC)) &&
2486 isKnownNeverNaN(FC->getOperand(1),
2487 SimplifyQuery(DAG.getDataLayout(), FC))))
2488 Condition = getFCmpCodeWithoutNaN(Condition);
2489 }
2490
2491 CaseBlock CB(Condition, BOp->getOperand(0), BOp->getOperand(1), nullptr,
2492 TBB, FBB, CurBB, getCurSDLoc(), TProb, FProb);
2493 SL->SwitchCases.push_back(CB);
2494 return;
2495 }
2496 }
2497
2498 // Create a CaseBlock record representing this branch.
2499 ISD::CondCode Opc = InvertCond ? ISD::SETNE : ISD::SETEQ;
2500 CaseBlock CB(Opc, Cond, ConstantInt::getTrue(*DAG.getContext()),
2501 nullptr, TBB, FBB, CurBB, getCurSDLoc(), TProb, FProb);
2502 SL->SwitchCases.push_back(CB);
2503}
2504
2505// Collect dependencies on V recursively. This is used for the cost analysis in
2506// `shouldKeepJumpConditionsTogether`.
2510 unsigned Depth = 0) {
2511 // Return false if we have an incomplete count.
2513 return false;
2514
2515 auto *I = dyn_cast<Instruction>(V);
2516 if (I == nullptr)
2517 return true;
2518
2519 if (Necessary != nullptr) {
2520 // This instruction is necessary for the other side of the condition so
2521 // don't count it.
2522 if (Necessary->contains(I))
2523 return true;
2524 }
2525
2526 // Already added this dep.
2527 if (!Deps->try_emplace(I, false).second)
2528 return true;
2529
2530 for (unsigned OpIdx = 0, E = I->getNumOperands(); OpIdx < E; ++OpIdx)
2531 if (!collectInstructionDeps(Deps, I->getOperand(OpIdx), Necessary,
2532 Depth + 1))
2533 return false;
2534 return true;
2535}
2536
2539 Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs,
2541 if (I.getNumSuccessors() != 2)
2542 return false;
2543
2544 if (!I.isConditional())
2545 return false;
2546
2547 if (Params.BaseCost < 0)
2548 return false;
2549
2550 // Baseline cost.
2551 InstructionCost CostThresh = Params.BaseCost;
2552
2553 BranchProbabilityInfo *BPI = nullptr;
2554 if (Params.LikelyBias || Params.UnlikelyBias)
2555 BPI = FuncInfo.BPI;
2556 if (BPI != nullptr) {
2557 // See if we are either likely to get an early out or compute both lhs/rhs
2558 // of the condition.
2559 BasicBlock *IfFalse = I.getSuccessor(0);
2560 BasicBlock *IfTrue = I.getSuccessor(1);
2561
2562 std::optional<bool> Likely;
2563 if (BPI->isEdgeHot(I.getParent(), IfTrue))
2564 Likely = true;
2565 else if (BPI->isEdgeHot(I.getParent(), IfFalse))
2566 Likely = false;
2567
2568 if (Likely) {
2569 if (Opc == (*Likely ? Instruction::And : Instruction::Or))
2570 // Its likely we will have to compute both lhs and rhs of condition
2571 CostThresh += Params.LikelyBias;
2572 else {
2573 if (Params.UnlikelyBias < 0)
2574 return false;
2575 // Its likely we will get an early out.
2576 CostThresh -= Params.UnlikelyBias;
2577 }
2578 }
2579 }
2580
2581 if (CostThresh <= 0)
2582 return false;
2583
2584 // Collect "all" instructions that lhs condition is dependent on.
2585 // Use map for stable iteration (to avoid non-determanism of iteration of
2586 // SmallPtrSet). The `bool` value is just a dummy.
2588 collectInstructionDeps(&LhsDeps, Lhs);
2589 // Collect "all" instructions that rhs condition is dependent on AND are
2590 // dependencies of lhs. This gives us an estimate on which instructions we
2591 // stand to save by splitting the condition.
2592 if (!collectInstructionDeps(&RhsDeps, Rhs, &LhsDeps))
2593 return false;
2594 // Add the compare instruction itself unless its a dependency on the LHS.
2595 if (const auto *RhsI = dyn_cast<Instruction>(Rhs))
2596 if (!LhsDeps.contains(RhsI))
2597 RhsDeps.try_emplace(RhsI, false);
2598
2599 InstructionCost CostOfIncluding = 0;
2600 // See if this instruction will need to computed independently of whether RHS
2601 // is.
2602 Value *BrCond = I.getCondition();
2603 auto ShouldCountInsn = [&RhsDeps, &BrCond](const Instruction *Ins) {
2604 for (const auto *U : Ins->users()) {
2605 // If user is independent of RHS calculation we don't need to count it.
2606 if (auto *UIns = dyn_cast<Instruction>(U))
2607 if (UIns != BrCond && !RhsDeps.contains(UIns))
2608 return false;
2609 }
2610 return true;
2611 };
2612
2613 // Prune instructions from RHS Deps that are dependencies of unrelated
2614 // instructions. The value (SelectionDAG::MaxRecursionDepth) is fairly
2615 // arbitrary and just meant to cap the how much time we spend in the pruning
2616 // loop. Its highly unlikely to come into affect.
2617 const unsigned MaxPruneIters = SelectionDAG::MaxRecursionDepth;
2618 // Stop after a certain point. No incorrectness from including too many
2619 // instructions.
2620 for (unsigned PruneIters = 0; PruneIters < MaxPruneIters; ++PruneIters) {
2621 const Instruction *ToDrop = nullptr;
2622 for (const auto &InsPair : RhsDeps) {
2623 if (!ShouldCountInsn(InsPair.first)) {
2624 ToDrop = InsPair.first;
2625 break;
2626 }
2627 }
2628 if (ToDrop == nullptr)
2629 break;
2630 RhsDeps.erase(ToDrop);
2631 }
2632
2633 for (const auto &InsPair : RhsDeps) {
2634 // Finally accumulate latency that we can only attribute to computing the
2635 // RHS condition. Use latency because we are essentially trying to calculate
2636 // the cost of the dependency chain.
2637 // Possible TODO: We could try to estimate ILP and make this more precise.
2638 CostOfIncluding += TTI->getInstructionCost(
2639 InsPair.first, TargetTransformInfo::TCK_Latency);
2640
2641 if (CostOfIncluding > CostThresh)
2642 return false;
2643 }
2644 return true;
2645}
2646
2649 MachineBasicBlock *FBB,
2650 MachineBasicBlock *CurBB,
2651 MachineBasicBlock *SwitchBB,
2653 BranchProbability TProb,
2654 BranchProbability FProb,
2655 bool InvertCond) {
2656 // Skip over not part of the tree and remember to invert op and operands at
2657 // next level.
2658 Value *NotCond;
2659 if (match(Cond, m_OneUse(m_Not(m_Value(NotCond)))) &&
2660 InBlock(NotCond, CurBB->getBasicBlock())) {
2661 FindMergedConditions(NotCond, TBB, FBB, CurBB, SwitchBB, Opc, TProb, FProb,
2662 !InvertCond);
2663 return;
2664 }
2665
2667 const Value *BOpOp0, *BOpOp1;
2668 // Compute the effective opcode for Cond, taking into account whether it needs
2669 // to be inverted, e.g.
2670 // and (not (or A, B)), C
2671 // gets lowered as
2672 // and (and (not A, not B), C)
2674 if (BOp) {
2675 BOpc = match(BOp, m_LogicalAnd(m_Value(BOpOp0), m_Value(BOpOp1)))
2676 ? Instruction::And
2677 : (match(BOp, m_LogicalOr(m_Value(BOpOp0), m_Value(BOpOp1)))
2678 ? Instruction::Or
2680 if (InvertCond) {
2681 if (BOpc == Instruction::And)
2682 BOpc = Instruction::Or;
2683 else if (BOpc == Instruction::Or)
2684 BOpc = Instruction::And;
2685 }
2686 }
2687
2688 // If this node is not part of the or/and tree, emit it as a branch.
2689 // Note that all nodes in the tree should have same opcode.
2690 bool BOpIsInOrAndTree = BOpc && BOpc == Opc && BOp->hasOneUse();
2691 if (!BOpIsInOrAndTree || BOp->getParent() != CurBB->getBasicBlock() ||
2692 !InBlock(BOpOp0, CurBB->getBasicBlock()) ||
2693 !InBlock(BOpOp1, CurBB->getBasicBlock())) {
2694 EmitBranchForMergedCondition(Cond, TBB, FBB, CurBB, SwitchBB,
2695 TProb, FProb, InvertCond);
2696 return;
2697 }
2698
2699 // Create TmpBB after CurBB.
2700 MachineFunction::iterator BBI(CurBB);
2701 MachineFunction &MF = DAG.getMachineFunction();
2703 CurBB->getParent()->insert(++BBI, TmpBB);
2704
2705 if (Opc == Instruction::Or) {
2706 // Codegen X | Y as:
2707 // BB1:
2708 // jmp_if_X TBB
2709 // jmp TmpBB
2710 // TmpBB:
2711 // jmp_if_Y TBB
2712 // jmp FBB
2713 //
2714
2715 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
2716 // The requirement is that
2717 // TrueProb for BB1 + (FalseProb for BB1 * TrueProb for TmpBB)
2718 // = TrueProb for original BB.
2719 // Assuming the original probabilities are A and B, one choice is to set
2720 // BB1's probabilities to A/2 and A/2+B, and set TmpBB's probabilities to
2721 // A/(1+B) and 2B/(1+B). This choice assumes that
2722 // TrueProb for BB1 == FalseProb for BB1 * TrueProb for TmpBB.
2723 // Another choice is to assume TrueProb for BB1 equals to TrueProb for
2724 // TmpBB, but the math is more complicated.
2725
2726 auto NewTrueProb = TProb / 2;
2727 auto NewFalseProb = TProb / 2 + FProb;
2728 // Emit the LHS condition.
2729 FindMergedConditions(BOpOp0, TBB, TmpBB, CurBB, SwitchBB, Opc, NewTrueProb,
2730 NewFalseProb, InvertCond);
2731
2732 // Normalize A/2 and B to get A/(1+B) and 2B/(1+B).
2733 SmallVector<BranchProbability, 2> Probs{TProb / 2, FProb};
2735 // Emit the RHS condition into TmpBB.
2736 FindMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
2737 Probs[1], InvertCond);
2738 } else {
2739 assert(Opc == Instruction::And && "Unknown merge op!");
2740 // Codegen X & Y as:
2741 // BB1:
2742 // jmp_if_X TmpBB
2743 // jmp FBB
2744 // TmpBB:
2745 // jmp_if_Y TBB
2746 // jmp FBB
2747 //
2748 // This requires creation of TmpBB after CurBB.
2749
2750 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
2751 // The requirement is that
2752 // FalseProb for BB1 + (TrueProb for BB1 * FalseProb for TmpBB)
2753 // = FalseProb for original BB.
2754 // Assuming the original probabilities are A and B, one choice is to set
2755 // BB1's probabilities to A+B/2 and B/2, and set TmpBB's probabilities to
2756 // 2A/(1+A) and B/(1+A). This choice assumes that FalseProb for BB1 ==
2757 // TrueProb for BB1 * FalseProb for TmpBB.
2758
2759 auto NewTrueProb = TProb + FProb / 2;
2760 auto NewFalseProb = FProb / 2;
2761 // Emit the LHS condition.
2762 FindMergedConditions(BOpOp0, TmpBB, FBB, CurBB, SwitchBB, Opc, NewTrueProb,
2763 NewFalseProb, InvertCond);
2764
2765 // Normalize A and B/2 to get 2A/(1+A) and B/(1+A).
2766 SmallVector<BranchProbability, 2> Probs{TProb, FProb / 2};
2768 // Emit the RHS condition into TmpBB.
2769 FindMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
2770 Probs[1], InvertCond);
2771 }
2772}
2773
2774/// If the set of cases should be emitted as a series of branches, return true.
2775/// If we should emit this as a bunch of and/or'd together conditions, return
2776/// false.
2777bool
2778SelectionDAGBuilder::ShouldEmitAsBranches(const std::vector<CaseBlock> &Cases) {
2779 if (Cases.size() != 2) return true;
2780
2781 // If this is two comparisons of the same values or'd or and'd together, they
2782 // will get folded into a single comparison, so don't emit two blocks.
2783 if ((Cases[0].CmpLHS == Cases[1].CmpLHS &&
2784 Cases[0].CmpRHS == Cases[1].CmpRHS) ||
2785 (Cases[0].CmpRHS == Cases[1].CmpLHS &&
2786 Cases[0].CmpLHS == Cases[1].CmpRHS)) {
2787 return false;
2788 }
2789
2790 // Handle: (X != null) | (Y != null) --> (X|Y) != 0
2791 // Handle: (X == null) & (Y == null) --> (X|Y) == 0
2792 if (Cases[0].CmpRHS == Cases[1].CmpRHS &&
2793 Cases[0].CC == Cases[1].CC &&
2794 isa<Constant>(Cases[0].CmpRHS) &&
2795 cast<Constant>(Cases[0].CmpRHS)->isNullValue()) {
2796 if (Cases[0].CC == ISD::SETEQ && Cases[0].TrueBB == Cases[1].ThisBB)
2797 return false;
2798 if (Cases[0].CC == ISD::SETNE && Cases[0].FalseBB == Cases[1].ThisBB)
2799 return false;
2800 }
2801
2802 return true;
2803}
2804
2805void SelectionDAGBuilder::visitBr(const BranchInst &I) {
2807
2808 // Update machine-CFG edges.
2809 MachineBasicBlock *Succ0MBB = FuncInfo.getMBB(I.getSuccessor(0));
2810
2811 if (I.isUnconditional()) {
2812 // Update machine-CFG edges.
2813 BrMBB->addSuccessor(Succ0MBB);
2814
2815 // If this is not a fall-through branch or optimizations are switched off,
2816 // emit the branch.
2817 if (Succ0MBB != NextBlock(BrMBB) ||
2819 auto Br = DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
2820 getControlRoot(), DAG.getBasicBlock(Succ0MBB));
2821 setValue(&I, Br);
2822 DAG.setRoot(Br);
2823 }
2824
2825 return;
2826 }
2827
2828 // If this condition is one of the special cases we handle, do special stuff
2829 // now.
2830 const Value *CondVal = I.getCondition();
2831 MachineBasicBlock *Succ1MBB = FuncInfo.getMBB(I.getSuccessor(1));
2832
2833 // If this is a series of conditions that are or'd or and'd together, emit
2834 // this as a sequence of branches instead of setcc's with and/or operations.
2835 // As long as jumps are not expensive (exceptions for multi-use logic ops,
2836 // unpredictable branches, and vector extracts because those jumps are likely
2837 // expensive for any target), this should improve performance.
2838 // For example, instead of something like:
2839 // cmp A, B
2840 // C = seteq
2841 // cmp D, E
2842 // F = setle
2843 // or C, F
2844 // jnz foo
2845 // Emit:
2846 // cmp A, B
2847 // je foo
2848 // cmp D, E
2849 // jle foo
2850 bool IsUnpredictable = I.hasMetadata(LLVMContext::MD_unpredictable);
2851 const Instruction *BOp = dyn_cast<Instruction>(CondVal);
2852 if (!DAG.getTargetLoweringInfo().isJumpExpensive() && BOp &&
2853 BOp->hasOneUse() && !IsUnpredictable) {
2854 Value *Vec;
2855 const Value *BOp0, *BOp1;
2857 if (match(BOp, m_LogicalAnd(m_Value(BOp0), m_Value(BOp1))))
2858 Opcode = Instruction::And;
2859 else if (match(BOp, m_LogicalOr(m_Value(BOp0), m_Value(BOp1))))
2860 Opcode = Instruction::Or;
2861
2862 if (Opcode &&
2863 !(match(BOp0, m_ExtractElt(m_Value(Vec), m_Value())) &&
2864 match(BOp1, m_ExtractElt(m_Specific(Vec), m_Value()))) &&
2866 FuncInfo, I, Opcode, BOp0, BOp1,
2867 DAG.getTargetLoweringInfo().getJumpConditionMergingParams(
2868 Opcode, BOp0, BOp1))) {
2869 FindMergedConditions(BOp, Succ0MBB, Succ1MBB, BrMBB, BrMBB, Opcode,
2870 getEdgeProbability(BrMBB, Succ0MBB),
2871 getEdgeProbability(BrMBB, Succ1MBB),
2872 /*InvertCond=*/false);
2873 // If the compares in later blocks need to use values not currently
2874 // exported from this block, export them now. This block should always
2875 // be the first entry.
2876 assert(SL->SwitchCases[0].ThisBB == BrMBB && "Unexpected lowering!");
2877
2878 // Allow some cases to be rejected.
2879 if (ShouldEmitAsBranches(SL->SwitchCases)) {
2880 for (unsigned i = 1, e = SL->SwitchCases.size(); i != e; ++i) {
2881 ExportFromCurrentBlock(SL->SwitchCases[i].CmpLHS);
2882 ExportFromCurrentBlock(SL->SwitchCases[i].CmpRHS);
2883 }
2884
2885 // Emit the branch for this block.
2886 visitSwitchCase(SL->SwitchCases[0], BrMBB);
2887 SL->SwitchCases.erase(SL->SwitchCases.begin());
2888 return;
2889 }
2890
2891 // Okay, we decided not to do this, remove any inserted MBB's and clear
2892 // SwitchCases.
2893 for (unsigned i = 1, e = SL->SwitchCases.size(); i != e; ++i)
2894 FuncInfo.MF->erase(SL->SwitchCases[i].ThisBB);
2895
2896 SL->SwitchCases.clear();
2897 }
2898 }
2899
2900 // Create a CaseBlock record representing this branch.
2901 CaseBlock CB(ISD::SETEQ, CondVal, ConstantInt::getTrue(*DAG.getContext()),
2902 nullptr, Succ0MBB, Succ1MBB, BrMBB, getCurSDLoc(),
2904 IsUnpredictable);
2905
2906 // Use visitSwitchCase to actually insert the fast branch sequence for this
2907 // cond branch.
2908 visitSwitchCase(CB, BrMBB);
2909}
2910
2911/// visitSwitchCase - Emits the necessary code to represent a single node in
2912/// the binary search tree resulting from lowering a switch instruction.
2914 MachineBasicBlock *SwitchBB) {
2915 SDValue Cond;
2916 SDValue CondLHS = getValue(CB.CmpLHS);
2917 SDLoc dl = CB.DL;
2918
2919 if (CB.CC == ISD::SETTRUE) {
2920 // Branch or fall through to TrueBB.
2921 addSuccessorWithProb(SwitchBB, CB.TrueBB, CB.TrueProb);
2922 SwitchBB->normalizeSuccProbs();
2923 if (CB.TrueBB != NextBlock(SwitchBB)) {
2924 DAG.setRoot(DAG.getNode(ISD::BR, dl, MVT::Other, getControlRoot(),
2925 DAG.getBasicBlock(CB.TrueBB)));
2926 }
2927 return;
2928 }
2929
2930 auto &TLI = DAG.getTargetLoweringInfo();
2931 EVT MemVT = TLI.getMemValueType(DAG.getDataLayout(), CB.CmpLHS->getType());
2932
2933 // Build the setcc now.
2934 if (!CB.CmpMHS) {
2935 // Fold "(X == true)" to X and "(X == false)" to !X to
2936 // handle common cases produced by branch lowering.
2937 if (CB.CmpRHS == ConstantInt::getTrue(*DAG.getContext()) &&
2938 CB.CC == ISD::SETEQ)
2939 Cond = CondLHS;
2940 else if (CB.CmpRHS == ConstantInt::getFalse(*DAG.getContext()) &&
2941 CB.CC == ISD::SETEQ) {
2942 SDValue True = DAG.getConstant(1, dl, CondLHS.getValueType());
2943 Cond = DAG.getNode(ISD::XOR, dl, CondLHS.getValueType(), CondLHS, True);
2944 } else {
2945 SDValue CondRHS = getValue(CB.CmpRHS);
2946
2947 // If a pointer's DAG type is larger than its memory type then the DAG
2948 // values are zero-extended. This breaks signed comparisons so truncate
2949 // back to the underlying type before doing the compare.
2950 if (CondLHS.getValueType() != MemVT) {
2951 CondLHS = DAG.getPtrExtOrTrunc(CondLHS, getCurSDLoc(), MemVT);
2952 CondRHS = DAG.getPtrExtOrTrunc(CondRHS, getCurSDLoc(), MemVT);
2953 }
2954 Cond = DAG.getSetCC(dl, MVT::i1, CondLHS, CondRHS, CB.CC);
2955 }
2956 } else {
2957 assert(CB.CC == ISD::SETLE && "Can handle only LE ranges now");
2958
2959 const APInt& Low = cast<ConstantInt>(CB.CmpLHS)->getValue();
2960 const APInt& High = cast<ConstantInt>(CB.CmpRHS)->getValue();
2961
2962 SDValue CmpOp = getValue(CB.CmpMHS);
2963 EVT VT = CmpOp.getValueType();
2964
2965 if (cast<ConstantInt>(CB.CmpLHS)->isMinValue(true)) {
2966 Cond = DAG.getSetCC(dl, MVT::i1, CmpOp, DAG.getConstant(High, dl, VT),
2967 ISD::SETLE);
2968 } else {
2969 SDValue SUB = DAG.getNode(ISD::SUB, dl,
2970 VT, CmpOp, DAG.getConstant(Low, dl, VT));
2971 Cond = DAG.getSetCC(dl, MVT::i1, SUB,
2972 DAG.getConstant(High-Low, dl, VT), ISD::SETULE);
2973 }
2974 }
2975
2976 // Update successor info
2977 addSuccessorWithProb(SwitchBB, CB.TrueBB, CB.TrueProb);
2978 // TrueBB and FalseBB are always different unless the incoming IR is
2979 // degenerate. This only happens when running llc on weird IR.
2980 if (CB.TrueBB != CB.FalseBB)
2981 addSuccessorWithProb(SwitchBB, CB.FalseBB, CB.FalseProb);
2982 SwitchBB->normalizeSuccProbs();
2983
2984 // If the lhs block is the next block, invert the condition so that we can
2985 // fall through to the lhs instead of the rhs block.
2986 if (CB.TrueBB == NextBlock(SwitchBB)) {
2987 std::swap(CB.TrueBB, CB.FalseBB);
2988 SDValue True = DAG.getConstant(1, dl, Cond.getValueType());
2989 Cond = DAG.getNode(ISD::XOR, dl, Cond.getValueType(), Cond, True);
2990 }
2991
2992 SDNodeFlags Flags;
2994 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl, MVT::Other, getControlRoot(),
2995 Cond, DAG.getBasicBlock(CB.TrueBB), Flags);
2996
2997 setValue(CurInst, BrCond);
2998
2999 // Insert the false branch. Do this even if it's a fall through branch,
3000 // this makes it easier to do DAG optimizations which require inverting
3001 // the branch condition.
3002 BrCond = DAG.getNode(ISD::BR, dl, MVT::Other, BrCond,
3003 DAG.getBasicBlock(CB.FalseBB));
3004
3005 DAG.setRoot(BrCond);
3006}
3007
3008/// visitJumpTable - Emit JumpTable node in the current MBB
3010 // Emit the code for the jump table
3011 assert(JT.SL && "Should set SDLoc for SelectionDAG!");
3012 assert(JT.Reg && "Should lower JT Header first!");
3013 EVT PTy = DAG.getTargetLoweringInfo().getJumpTableRegTy(DAG.getDataLayout());
3014 SDValue Index = DAG.getCopyFromReg(getControlRoot(), *JT.SL, JT.Reg, PTy);
3015 SDValue Table = DAG.getJumpTable(JT.JTI, PTy);
3016 SDValue BrJumpTable = DAG.getNode(ISD::BR_JT, *JT.SL, MVT::Other,
3017 Index.getValue(1), Table, Index);
3018 DAG.setRoot(BrJumpTable);
3019}
3020
3021/// visitJumpTableHeader - This function emits necessary code to produce index
3022/// in the JumpTable from switch case.
3024 JumpTableHeader &JTH,
3025 MachineBasicBlock *SwitchBB) {
3026 assert(JT.SL && "Should set SDLoc for SelectionDAG!");
3027 const SDLoc &dl = *JT.SL;
3028
3029 // Subtract the lowest switch case value from the value being switched on.
3030 SDValue SwitchOp = getValue(JTH.SValue);
3031 EVT VT = SwitchOp.getValueType();
3032 SDValue Sub = DAG.getNode(ISD::SUB, dl, VT, SwitchOp,
3033 DAG.getConstant(JTH.First, dl, VT));
3034
3035 // The SDNode we just created, which holds the value being switched on minus
3036 // the smallest case value, needs to be copied to a virtual register so it
3037 // can be used as an index into the jump table in a subsequent basic block.
3038 // This value may be smaller or larger than the target's pointer type, and
3039 // therefore require extension or truncating.
3040 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3041 SwitchOp =
3042 DAG.getZExtOrTrunc(Sub, dl, TLI.getJumpTableRegTy(DAG.getDataLayout()));
3043
3044 Register JumpTableReg =
3045 FuncInfo.CreateReg(TLI.getJumpTableRegTy(DAG.getDataLayout()));
3046 SDValue CopyTo =
3047 DAG.getCopyToReg(getControlRoot(), dl, JumpTableReg, SwitchOp);
3048 JT.Reg = JumpTableReg;
3049
3050 if (!JTH.FallthroughUnreachable) {
3051 // Emit the range check for the jump table, and branch to the default block
3052 // for the switch statement if the value being switched on exceeds the
3053 // largest case in the switch.
3054 SDValue CMP = DAG.getSetCC(
3055 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
3056 Sub.getValueType()),
3057 Sub, DAG.getConstant(JTH.Last - JTH.First, dl, VT), ISD::SETUGT);
3058
3059 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl,
3060 MVT::Other, CopyTo, CMP,
3061 DAG.getBasicBlock(JT.Default));
3062
3063 // Avoid emitting unnecessary branches to the next block.
3064 if (JT.MBB != NextBlock(SwitchBB))
3065 BrCond = DAG.getNode(ISD::BR, dl, MVT::Other, BrCond,
3066 DAG.getBasicBlock(JT.MBB));
3067
3068 DAG.setRoot(BrCond);
3069 } else {
3070 // Avoid emitting unnecessary branches to the next block.
3071 if (JT.MBB != NextBlock(SwitchBB))
3072 DAG.setRoot(DAG.getNode(ISD::BR, dl, MVT::Other, CopyTo,
3073 DAG.getBasicBlock(JT.MBB)));
3074 else
3075 DAG.setRoot(CopyTo);
3076 }
3077}
3078
3079/// Create a LOAD_STACK_GUARD node, and let it carry the target specific global
3080/// variable if there exists one.
3082 SDValue &Chain) {
3083 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3084 EVT PtrTy = TLI.getPointerTy(DAG.getDataLayout());
3085 EVT PtrMemTy = TLI.getPointerMemTy(DAG.getDataLayout());
3087 Value *Global =
3090 DAG.getMachineNode(TargetOpcode::LOAD_STACK_GUARD, DL, PtrTy, Chain);
3091 if (Global) {
3092 MachinePointerInfo MPInfo(Global);
3096 MPInfo, Flags, PtrTy.getSizeInBits() / 8, DAG.getEVTAlign(PtrTy));
3097 DAG.setNodeMemRefs(Node, {MemRef});
3098 }
3099 if (PtrTy != PtrMemTy)
3100 return DAG.getPtrExtOrTrunc(SDValue(Node, 0), DL, PtrMemTy);
3101 return SDValue(Node, 0);
3102}
3103
3104/// Codegen a new tail for a stack protector check ParentMBB which has had its
3105/// tail spliced into a stack protector check success bb.
3106///
3107/// For a high level explanation of how this fits into the stack protector
3108/// generation see the comment on the declaration of class
3109/// StackProtectorDescriptor.
3111 MachineBasicBlock *ParentBB) {
3112
3113 // First create the loads to the guard/stack slot for the comparison.
3114 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3115 auto &DL = DAG.getDataLayout();
3116 EVT PtrTy = TLI.getFrameIndexTy(DL);
3117 EVT PtrMemTy = TLI.getPointerMemTy(DL, DL.getAllocaAddrSpace());
3118
3119 MachineFrameInfo &MFI = ParentBB->getParent()->getFrameInfo();
3120 int FI = MFI.getStackProtectorIndex();
3121
3122 SDValue Guard;
3123 SDLoc dl = getCurSDLoc();
3124 SDValue StackSlotPtr = DAG.getFrameIndex(FI, PtrTy);
3125 const Module &M = *ParentBB->getParent()->getFunction().getParent();
3126 Align Align = DL.getPrefTypeAlign(
3127 PointerType::get(M.getContext(), DL.getAllocaAddrSpace()));
3128
3129 // Generate code to load the content of the guard slot.
3130 SDValue GuardVal = DAG.getLoad(
3131 PtrMemTy, dl, DAG.getEntryNode(), StackSlotPtr,
3132 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI), Align,
3134
3135 if (TLI.useStackGuardXorFP())
3136 GuardVal = TLI.emitStackGuardXorFP(DAG, GuardVal, dl);
3137
3138 // If we're using function-based instrumentation, call the guard check
3139 // function
3141 // Get the guard check function from the target and verify it exists since
3142 // we're using function-based instrumentation
3143 const Function *GuardCheckFn =
3144 TLI.getSSPStackGuardCheck(M, DAG.getLibcalls());
3145 assert(GuardCheckFn && "Guard check function is null");
3146
3147 // The target provides a guard check function to validate the guard value.
3148 // Generate a call to that function with the content of the guard slot as
3149 // argument.
3150 FunctionType *FnTy = GuardCheckFn->getFunctionType();
3151 assert(FnTy->getNumParams() == 1 && "Invalid function signature");
3152
3154 TargetLowering::ArgListEntry Entry(GuardVal, FnTy->getParamType(0));
3155 if (GuardCheckFn->hasParamAttribute(0, Attribute::AttrKind::InReg))
3156 Entry.IsInReg = true;
3157 Args.push_back(Entry);
3158
3161 .setChain(DAG.getEntryNode())
3162 .setCallee(GuardCheckFn->getCallingConv(), FnTy->getReturnType(),
3163 getValue(GuardCheckFn), std::move(Args));
3164
3165 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
3166 DAG.setRoot(Result.second);
3167 return;
3168 }
3169
3170 // If useLoadStackGuardNode returns true, generate LOAD_STACK_GUARD.
3171 // Otherwise, emit a volatile load to retrieve the stack guard value.
3172 SDValue Chain = DAG.getEntryNode();
3173 if (TLI.useLoadStackGuardNode(M)) {
3174 Guard = getLoadStackGuard(DAG, dl, Chain);
3175 } else {
3176 if (const Value *IRGuard = TLI.getSDagStackGuard(M, DAG.getLibcalls())) {
3177 SDValue GuardPtr = getValue(IRGuard);
3178 Guard = DAG.getLoad(PtrMemTy, dl, Chain, GuardPtr,
3179 MachinePointerInfo(IRGuard, 0), Align,
3181 } else {
3182 LLVMContext &Ctx = *DAG.getContext();
3183 Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
3184 Guard = DAG.getPOISON(PtrMemTy);
3185 }
3186 }
3187
3188 // Perform the comparison via a getsetcc.
3189 SDValue Cmp = DAG.getSetCC(
3190 dl, TLI.getSetCCResultType(DL, *DAG.getContext(), Guard.getValueType()),
3191 Guard, GuardVal, ISD::SETNE);
3192
3193 // If the guard/stackslot do not equal, branch to failure MBB.
3194 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl, MVT::Other, getControlRoot(),
3195 Cmp, DAG.getBasicBlock(SPD.getFailureMBB()));
3196 // Otherwise branch to success MBB.
3197 SDValue Br = DAG.getNode(ISD::BR, dl,
3198 MVT::Other, BrCond,
3199 DAG.getBasicBlock(SPD.getSuccessMBB()));
3200
3201 DAG.setRoot(Br);
3202}
3203
3204/// Codegen the failure basic block for a stack protector check.
3205///
3206/// A failure stack protector machine basic block consists simply of a call to
3207/// __stack_chk_fail().
3208///
3209/// For a high level explanation of how this fits into the stack protector
3210/// generation see the comment on the declaration of class
3211/// StackProtectorDescriptor.
3214
3215 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3216 MachineBasicBlock *ParentBB = SPD.getParentMBB();
3217 const Module &M = *ParentBB->getParent()->getFunction().getParent();
3218 SDValue Chain;
3219
3220 // For -Oz builds with a guard check function, we use function-based
3221 // instrumentation. Otherwise, if we have a guard check function, we call it
3222 // in the failure block.
3223 auto *GuardCheckFn = TLI.getSSPStackGuardCheck(M, DAG.getLibcalls());
3224 if (GuardCheckFn && !SPD.shouldEmitFunctionBasedCheckStackProtector()) {
3225 // First create the loads to the guard/stack slot for the comparison.
3226 auto &DL = DAG.getDataLayout();
3227 EVT PtrTy = TLI.getFrameIndexTy(DL);
3228 EVT PtrMemTy = TLI.getPointerMemTy(DL, DL.getAllocaAddrSpace());
3229
3230 MachineFrameInfo &MFI = ParentBB->getParent()->getFrameInfo();
3231 int FI = MFI.getStackProtectorIndex();
3232
3233 SDLoc dl = getCurSDLoc();
3234 SDValue StackSlotPtr = DAG.getFrameIndex(FI, PtrTy);
3235 Align Align = DL.getPrefTypeAlign(
3236 PointerType::get(M.getContext(), DL.getAllocaAddrSpace()));
3237
3238 // Generate code to load the content of the guard slot.
3239 SDValue GuardVal = DAG.getLoad(
3240 PtrMemTy, dl, DAG.getEntryNode(), StackSlotPtr,
3241 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI), Align,
3243
3244 if (TLI.useStackGuardXorFP())
3245 GuardVal = TLI.emitStackGuardXorFP(DAG, GuardVal, dl);
3246
3247 // The target provides a guard check function to validate the guard value.
3248 // Generate a call to that function with the content of the guard slot as
3249 // argument.
3250 FunctionType *FnTy = GuardCheckFn->getFunctionType();
3251 assert(FnTy->getNumParams() == 1 && "Invalid function signature");
3252
3254 TargetLowering::ArgListEntry Entry(GuardVal, FnTy->getParamType(0));
3255 if (GuardCheckFn->hasParamAttribute(0, Attribute::AttrKind::InReg))
3256 Entry.IsInReg = true;
3257 Args.push_back(Entry);
3258
3261 .setChain(DAG.getEntryNode())
3262 .setCallee(GuardCheckFn->getCallingConv(), FnTy->getReturnType(),
3263 getValue(GuardCheckFn), std::move(Args));
3264
3265 Chain = TLI.LowerCallTo(CLI).second;
3266 } else {
3268 CallOptions.setDiscardResult(true);
3269 Chain = TLI.makeLibCall(DAG, RTLIB::STACKPROTECTOR_CHECK_FAIL, MVT::isVoid,
3270 {}, CallOptions, getCurSDLoc())
3271 .second;
3272 }
3273
3274 // Emit a trap instruction if we are required to do so.
3275 const TargetOptions &TargetOpts = DAG.getTarget().Options;
3276 if (TargetOpts.TrapUnreachable && !TargetOpts.NoTrapAfterNoreturn)
3277 Chain = DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, Chain);
3278
3279 DAG.setRoot(Chain);
3280}
3281
3282/// visitBitTestHeader - This function emits necessary code to produce value
3283/// suitable for "bit tests"
3285 MachineBasicBlock *SwitchBB) {
3286 SDLoc dl = getCurSDLoc();
3287
3288 // Subtract the minimum value.
3289 SDValue SwitchOp = getValue(B.SValue);
3290 EVT VT = SwitchOp.getValueType();
3291 SDValue RangeSub =
3292 DAG.getNode(ISD::SUB, dl, VT, SwitchOp, DAG.getConstant(B.First, dl, VT));
3293
3294 // Determine the type of the test operands.
3295 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3296 bool UsePtrType = false;
3297 if (!TLI.isTypeLegal(VT)) {
3298 UsePtrType = true;
3299 } else {
3300 for (const BitTestCase &Case : B.Cases)
3301 if (!isUIntN(VT.getSizeInBits(), Case.Mask)) {
3302 // Switch table case range are encoded into series of masks.
3303 // Just use pointer type, it's guaranteed to fit.
3304 UsePtrType = true;
3305 break;
3306 }
3307 }
3308 SDValue Sub = RangeSub;
3309 if (UsePtrType) {
3310 VT = TLI.getPointerTy(DAG.getDataLayout());
3311 Sub = DAG.getZExtOrTrunc(Sub, dl, VT);
3312 }
3313
3314 B.RegVT = VT.getSimpleVT();
3315 B.Reg = FuncInfo.CreateReg(B.RegVT);
3316 SDValue CopyTo = DAG.getCopyToReg(getControlRoot(), dl, B.Reg, Sub);
3317
3318 MachineBasicBlock* MBB = B.Cases[0].ThisBB;
3319
3320 if (!B.FallthroughUnreachable)
3321 addSuccessorWithProb(SwitchBB, B.Default, B.DefaultProb);
3322 addSuccessorWithProb(SwitchBB, MBB, B.Prob);
3323 SwitchBB->normalizeSuccProbs();
3324
3325 SDValue Root = CopyTo;
3326 if (!B.FallthroughUnreachable) {
3327 // Conditional branch to the default block.
3328 SDValue RangeCmp = DAG.getSetCC(dl,
3329 TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
3330 RangeSub.getValueType()),
3331 RangeSub, DAG.getConstant(B.Range, dl, RangeSub.getValueType()),
3332 ISD::SETUGT);
3333
3334 Root = DAG.getNode(ISD::BRCOND, dl, MVT::Other, Root, RangeCmp,
3335 DAG.getBasicBlock(B.Default));
3336 }
3337
3338 // Avoid emitting unnecessary branches to the next block.
3339 if (MBB != NextBlock(SwitchBB))
3340 Root = DAG.getNode(ISD::BR, dl, MVT::Other, Root, DAG.getBasicBlock(MBB));
3341
3342 DAG.setRoot(Root);
3343}
3344
3345/// visitBitTestCase - this function produces one "bit test"
3347 MachineBasicBlock *NextMBB,
3348 BranchProbability BranchProbToNext,
3349 Register Reg, BitTestCase &B,
3350 MachineBasicBlock *SwitchBB) {
3351 SDLoc dl = getCurSDLoc();
3352 MVT VT = BB.RegVT;
3353 SDValue ShiftOp = DAG.getCopyFromReg(getControlRoot(), dl, Reg, VT);
3354 SDValue Cmp;
3355 unsigned PopCount = llvm::popcount(B.Mask);
3356 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3357 if (PopCount == 1) {
3358 // Testing for a single bit; just compare the shift count with what it
3359 // would need to be to shift a 1 bit in that position.
3360 Cmp = DAG.getSetCC(
3361 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3362 ShiftOp, DAG.getConstant(llvm::countr_zero(B.Mask), dl, VT),
3363 ISD::SETEQ);
3364 } else if (PopCount == BB.Range) {
3365 // There is only one zero bit in the range, test for it directly.
3366 Cmp = DAG.getSetCC(
3367 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3368 ShiftOp, DAG.getConstant(llvm::countr_one(B.Mask), dl, VT), ISD::SETNE);
3369 } else {
3370 // Make desired shift
3371 SDValue SwitchVal = DAG.getNode(ISD::SHL, dl, VT,
3372 DAG.getConstant(1, dl, VT), ShiftOp);
3373
3374 // Emit bit tests and jumps
3375 SDValue AndOp = DAG.getNode(ISD::AND, dl,
3376 VT, SwitchVal, DAG.getConstant(B.Mask, dl, VT));
3377 Cmp = DAG.getSetCC(
3378 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3379 AndOp, DAG.getConstant(0, dl, VT), ISD::SETNE);
3380 }
3381
3382 // The branch probability from SwitchBB to B.TargetBB is B.ExtraProb.
3383 addSuccessorWithProb(SwitchBB, B.TargetBB, B.ExtraProb);
3384 // The branch probability from SwitchBB to NextMBB is BranchProbToNext.
3385 addSuccessorWithProb(SwitchBB, NextMBB, BranchProbToNext);
3386 // It is not guaranteed that the sum of B.ExtraProb and BranchProbToNext is
3387 // one as they are relative probabilities (and thus work more like weights),
3388 // and hence we need to normalize them to let the sum of them become one.
3389 SwitchBB->normalizeSuccProbs();
3390
3391 SDValue BrAnd = DAG.getNode(ISD::BRCOND, dl,
3392 MVT::Other, getControlRoot(),
3393 Cmp, DAG.getBasicBlock(B.TargetBB));
3394
3395 // Avoid emitting unnecessary branches to the next block.
3396 if (NextMBB != NextBlock(SwitchBB))
3397 BrAnd = DAG.getNode(ISD::BR, dl, MVT::Other, BrAnd,
3398 DAG.getBasicBlock(NextMBB));
3399
3400 DAG.setRoot(BrAnd);
3401}
3402
3403void SelectionDAGBuilder::visitInvoke(const InvokeInst &I) {
3404 MachineBasicBlock *InvokeMBB = FuncInfo.MBB;
3405
3406 // Retrieve successors. Look through artificial IR level blocks like
3407 // catchswitch for successors.
3408 MachineBasicBlock *Return = FuncInfo.getMBB(I.getSuccessor(0));
3409 const BasicBlock *EHPadBB = I.getSuccessor(1);
3410 MachineBasicBlock *EHPadMBB = FuncInfo.getMBB(EHPadBB);
3411
3412 // Deopt and ptrauth bundles are lowered in helper functions, and we don't
3413 // have to do anything here to lower funclet bundles.
3414 failForInvalidBundles(I, "invokes",
3420
3421 const Value *Callee(I.getCalledOperand());
3422 const Function *Fn = dyn_cast<Function>(Callee);
3423 if (isa<InlineAsm>(Callee))
3424 visitInlineAsm(I, EHPadBB);
3425 else if (Fn && Fn->isIntrinsic()) {
3426 switch (Fn->getIntrinsicID()) {
3427 default:
3428 llvm_unreachable("Cannot invoke this intrinsic");
3429 case Intrinsic::donothing:
3430 // Ignore invokes to @llvm.donothing: jump directly to the next BB.
3431 case Intrinsic::seh_try_begin:
3432 case Intrinsic::seh_scope_begin:
3433 case Intrinsic::seh_try_end:
3434 case Intrinsic::seh_scope_end:
3435 if (EHPadMBB)
3436 // a block referenced by EH table
3437 // so dtor-funclet not removed by opts
3438 EHPadMBB->setMachineBlockAddressTaken();
3439 break;
3440 case Intrinsic::experimental_patchpoint_void:
3441 case Intrinsic::experimental_patchpoint:
3442 visitPatchpoint(I, EHPadBB);
3443 break;
3444 case Intrinsic::experimental_gc_statepoint:
3446 break;
3447 // wasm_throw, wasm_rethrow: This is usually done in visitTargetIntrinsic,
3448 // but these intrinsics are special because they can be invoked, so we
3449 // manually lower it to a DAG node here.
3450 case Intrinsic::wasm_throw: {
3452 std::array<SDValue, 4> Ops = {
3453 getControlRoot(), // inchain for the terminator node
3454 DAG.getTargetConstant(Intrinsic::wasm_throw, getCurSDLoc(),
3456 getValue(I.getArgOperand(0)), // tag
3457 getValue(I.getArgOperand(1)) // thrown value
3458 };
3459 SDVTList VTs = DAG.getVTList(ArrayRef<EVT>({MVT::Other})); // outchain
3460 DAG.setRoot(DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops));
3461 break;
3462 }
3463 case Intrinsic::wasm_rethrow: {
3464 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3465 std::array<SDValue, 2> Ops = {
3466 getControlRoot(), // inchain for the terminator node
3467 DAG.getTargetConstant(Intrinsic::wasm_rethrow, getCurSDLoc(),
3468 TLI.getPointerTy(DAG.getDataLayout()))};
3469 SDVTList VTs = DAG.getVTList(ArrayRef<EVT>({MVT::Other})); // outchain
3470 DAG.setRoot(DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops));
3471 break;
3472 }
3473 }
3474 } else if (I.hasDeoptState()) {
3475 // Currently we do not lower any intrinsic calls with deopt operand bundles.
3476 // Eventually we will support lowering the @llvm.experimental.deoptimize
3477 // intrinsic, and right now there are no plans to support other intrinsics
3478 // with deopt state.
3479 LowerCallSiteWithDeoptBundle(&I, getValue(Callee), EHPadBB);
3480 } else if (I.countOperandBundlesOfType(LLVMContext::OB_ptrauth)) {
3482 } else {
3483 LowerCallTo(I, getValue(Callee), false, false, EHPadBB);
3484 }
3485
3486 // If the value of the invoke is used outside of its defining block, make it
3487 // available as a virtual register.
3488 // We already took care of the exported value for the statepoint instruction
3489 // during call to the LowerStatepoint.
3490 if (!isa<GCStatepointInst>(I)) {
3492 }
3493
3495 BranchProbabilityInfo *BPI = FuncInfo.BPI;
3496 BranchProbability EHPadBBProb =
3497 BPI ? BPI->getEdgeProbability(InvokeMBB->getBasicBlock(), EHPadBB)
3499 findUnwindDestinations(FuncInfo, EHPadBB, EHPadBBProb, UnwindDests);
3500
3501 // Update successor info.
3502 addSuccessorWithProb(InvokeMBB, Return);
3503 for (auto &UnwindDest : UnwindDests) {
3504 UnwindDest.first->setIsEHPad();
3505 addSuccessorWithProb(InvokeMBB, UnwindDest.first, UnwindDest.second);
3506 }
3507 InvokeMBB->normalizeSuccProbs();
3508
3509 // Drop into normal successor.
3510 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other, getControlRoot(),
3511 DAG.getBasicBlock(Return)));
3512}
3513
3514/// The intrinsics currently supported by callbr are implicit control flow
3515/// intrinsics such as amdgcn.kill.
3516/// - they should be called (no "dontcall-" attributes)
3517/// - they do not touch memory on the target (= !TLI.getTgtMemIntrinsic())
3518/// - they do not need custom argument handling (no
3519/// TLI.CollectTargetIntrinsicOperands())
3520void SelectionDAGBuilder::visitCallBrIntrinsic(const CallBrInst &I) {
3521#ifndef NDEBUG
3523 DAG.getTargetLoweringInfo().getTgtMemIntrinsic(
3524 Infos, I, DAG.getMachineFunction(), I.getIntrinsicID());
3525 assert(Infos.empty() && "Intrinsic touches memory");
3526#endif
3527
3528 auto [HasChain, OnlyLoad] = getTargetIntrinsicCallProperties(I);
3529
3531 getTargetIntrinsicOperands(I, HasChain, OnlyLoad);
3532 SDVTList VTs = getTargetIntrinsicVTList(I, HasChain);
3533
3534 // Create the node.
3535 SDValue Result =
3536 getTargetNonMemIntrinsicNode(*I.getType(), HasChain, Ops, VTs);
3537 Result = handleTargetIntrinsicRet(I, HasChain, OnlyLoad, Result);
3538
3539 setValue(&I, Result);
3540}
3541
3542void SelectionDAGBuilder::visitCallBr(const CallBrInst &I) {
3543 MachineBasicBlock *CallBrMBB = FuncInfo.MBB;
3544
3545 if (I.isInlineAsm()) {
3546 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
3547 // have to do anything here to lower funclet bundles.
3548 failForInvalidBundles(I, "callbrs",
3550 visitInlineAsm(I);
3551 } else {
3552 assert(!I.hasOperandBundles() &&
3553 "Can't have operand bundles for intrinsics");
3554 visitCallBrIntrinsic(I);
3555 }
3557
3558 // Retrieve successors.
3559 SmallPtrSet<BasicBlock *, 8> Dests;
3560 Dests.insert(I.getDefaultDest());
3561 MachineBasicBlock *Return = FuncInfo.getMBB(I.getDefaultDest());
3562
3563 // Update successor info.
3564 addSuccessorWithProb(CallBrMBB, Return, BranchProbability::getOne());
3565 // TODO: For most of the cases where there is an intrinsic callbr, we're
3566 // having exactly one indirect target, which will be unreachable. As soon as
3567 // this changes, we might need to enhance
3568 // Target->setIsInlineAsmBrIndirectTarget or add something similar for
3569 // intrinsic indirect branches.
3570 if (I.isInlineAsm()) {
3571 for (BasicBlock *Dest : I.getIndirectDests()) {
3572 MachineBasicBlock *Target = FuncInfo.getMBB(Dest);
3573 Target->setIsInlineAsmBrIndirectTarget();
3574 // If we introduce a type of asm goto statement that is permitted to use
3575 // an indirect call instruction to jump to its labels, then we should add
3576 // a call to Target->setMachineBlockAddressTaken() here, to mark the
3577 // target block as requiring a BTI.
3578
3579 Target->setLabelMustBeEmitted();
3580 // Don't add duplicate machine successors.
3581 if (Dests.insert(Dest).second)
3582 addSuccessorWithProb(CallBrMBB, Target, BranchProbability::getZero());
3583 }
3584 }
3585 CallBrMBB->normalizeSuccProbs();
3586
3587 // Drop into default successor.
3588 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(),
3589 MVT::Other, getControlRoot(),
3590 DAG.getBasicBlock(Return)));
3591}
3592
3593void SelectionDAGBuilder::visitResume(const ResumeInst &RI) {
3594 llvm_unreachable("SelectionDAGBuilder shouldn't visit resume instructions!");
3595}
3596
3597void SelectionDAGBuilder::visitLandingPad(const LandingPadInst &LP) {
3598 assert(FuncInfo.MBB->isEHPad() &&
3599 "Call to landingpad not in landing pad!");
3600
3601 // If there aren't registers to copy the values into (e.g., during SjLj
3602 // exceptions), then don't bother to create these DAG nodes.
3603 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3604 const Constant *PersonalityFn = FuncInfo.Fn->getPersonalityFn();
3605 if (TLI.getExceptionPointerRegister(PersonalityFn) == 0 &&
3606 TLI.getExceptionSelectorRegister(PersonalityFn) == 0)
3607 return;
3608
3609 // If landingpad's return type is token type, we don't create DAG nodes
3610 // for its exception pointer and selector value. The extraction of exception
3611 // pointer or selector value from token type landingpads is not currently
3612 // supported.
3613 if (LP.getType()->isTokenTy())
3614 return;
3615
3616 SmallVector<EVT, 2> ValueVTs;
3617 SDLoc dl = getCurSDLoc();
3618 ComputeValueVTs(TLI, DAG.getDataLayout(), LP.getType(), ValueVTs);
3619 assert(ValueVTs.size() == 2 && "Only two-valued landingpads are supported");
3620
3621 // Get the two live-in registers as SDValues. The physregs have already been
3622 // copied into virtual registers.
3623 SDValue Ops[2];
3624 if (FuncInfo.ExceptionPointerVirtReg) {
3625 Ops[0] = DAG.getZExtOrTrunc(
3626 DAG.getCopyFromReg(DAG.getEntryNode(), dl,
3627 FuncInfo.ExceptionPointerVirtReg,
3628 TLI.getPointerTy(DAG.getDataLayout())),
3629 dl, ValueVTs[0]);
3630 } else {
3631 Ops[0] = DAG.getConstant(0, dl, TLI.getPointerTy(DAG.getDataLayout()));
3632 }
3633 Ops[1] = DAG.getZExtOrTrunc(
3634 DAG.getCopyFromReg(DAG.getEntryNode(), dl,
3635 FuncInfo.ExceptionSelectorVirtReg,
3636 TLI.getPointerTy(DAG.getDataLayout())),
3637 dl, ValueVTs[1]);
3638
3639 // Merge into one.
3640 SDValue Res = DAG.getNode(ISD::MERGE_VALUES, dl,
3641 DAG.getVTList(ValueVTs), Ops);
3642 setValue(&LP, Res);
3643}
3644
3647 // Update JTCases.
3648 for (JumpTableBlock &JTB : SL->JTCases)
3649 if (JTB.first.HeaderBB == First)
3650 JTB.first.HeaderBB = Last;
3651
3652 // Update BitTestCases.
3653 for (BitTestBlock &BTB : SL->BitTestCases)
3654 if (BTB.Parent == First)
3655 BTB.Parent = Last;
3656}
3657
3658void SelectionDAGBuilder::visitIndirectBr(const IndirectBrInst &I) {
3659 MachineBasicBlock *IndirectBrMBB = FuncInfo.MBB;
3660
3661 // Update machine-CFG edges with unique successors.
3663 for (unsigned i = 0, e = I.getNumSuccessors(); i != e; ++i) {
3664 BasicBlock *BB = I.getSuccessor(i);
3665 bool Inserted = Done.insert(BB).second;
3666 if (!Inserted)
3667 continue;
3668
3669 MachineBasicBlock *Succ = FuncInfo.getMBB(BB);
3670 addSuccessorWithProb(IndirectBrMBB, Succ);
3671 }
3672 IndirectBrMBB->normalizeSuccProbs();
3673
3675 MVT::Other, getControlRoot(),
3676 getValue(I.getAddress())));
3677}
3678
3679void SelectionDAGBuilder::visitUnreachable(const UnreachableInst &I) {
3680 if (!I.shouldLowerToTrap(DAG.getTarget().Options.TrapUnreachable,
3681 DAG.getTarget().Options.NoTrapAfterNoreturn))
3682 return;
3683
3684 DAG.setRoot(DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, DAG.getRoot()));
3685}
3686
3687void SelectionDAGBuilder::visitUnary(const User &I, unsigned Opcode) {
3688 SDNodeFlags Flags;
3689 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3690 Flags.copyFMF(*FPOp);
3691
3692 SDValue Op = getValue(I.getOperand(0));
3693 SDValue UnNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op.getValueType(),
3694 Op, Flags);
3695 setValue(&I, UnNodeValue);
3696}
3697
3698void SelectionDAGBuilder::visitBinary(const User &I, unsigned Opcode) {
3699 SDNodeFlags Flags;
3700 if (auto *OFBinOp = dyn_cast<OverflowingBinaryOperator>(&I)) {
3701 Flags.setNoSignedWrap(OFBinOp->hasNoSignedWrap());
3702 Flags.setNoUnsignedWrap(OFBinOp->hasNoUnsignedWrap());
3703 }
3704 if (auto *ExactOp = dyn_cast<PossiblyExactOperator>(&I))
3705 Flags.setExact(ExactOp->isExact());
3706 if (auto *DisjointOp = dyn_cast<PossiblyDisjointInst>(&I))
3707 Flags.setDisjoint(DisjointOp->isDisjoint());
3708 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3709 Flags.copyFMF(*FPOp);
3710
3711 SDValue Op1 = getValue(I.getOperand(0));
3712 SDValue Op2 = getValue(I.getOperand(1));
3713 SDValue BinNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(),
3714 Op1, Op2, Flags);
3715 setValue(&I, BinNodeValue);
3716}
3717
3718void SelectionDAGBuilder::visitShift(const User &I, unsigned Opcode) {
3719 SDValue Op1 = getValue(I.getOperand(0));
3720 SDValue Op2 = getValue(I.getOperand(1));
3721
3722 EVT ShiftTy = DAG.getTargetLoweringInfo().getShiftAmountTy(
3723 Op1.getValueType(), DAG.getDataLayout());
3724
3725 // Coerce the shift amount to the right type if we can. This exposes the
3726 // truncate or zext to optimization early.
3727 if (!I.getType()->isVectorTy() && Op2.getValueType() != ShiftTy) {
3729 "Unexpected shift type");
3730 Op2 = DAG.getZExtOrTrunc(Op2, getCurSDLoc(), ShiftTy);
3731 }
3732
3733 bool nuw = false;
3734 bool nsw = false;
3735 bool exact = false;
3736
3737 if (Opcode == ISD::SRL || Opcode == ISD::SRA || Opcode == ISD::SHL) {
3738
3739 if (const OverflowingBinaryOperator *OFBinOp =
3741 nuw = OFBinOp->hasNoUnsignedWrap();
3742 nsw = OFBinOp->hasNoSignedWrap();
3743 }
3744 if (const PossiblyExactOperator *ExactOp =
3746 exact = ExactOp->isExact();
3747 }
3748 SDNodeFlags Flags;
3749 Flags.setExact(exact);
3750 Flags.setNoSignedWrap(nsw);
3751 Flags.setNoUnsignedWrap(nuw);
3752 SDValue Res = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(), Op1, Op2,
3753 Flags);
3754 setValue(&I, Res);
3755}
3756
3757void SelectionDAGBuilder::visitSDiv(const User &I) {
3758 SDValue Op1 = getValue(I.getOperand(0));
3759 SDValue Op2 = getValue(I.getOperand(1));
3760
3761 SDNodeFlags Flags;
3762 Flags.setExact(isa<PossiblyExactOperator>(&I) &&
3763 cast<PossiblyExactOperator>(&I)->isExact());
3764 setValue(&I, DAG.getNode(ISD::SDIV, getCurSDLoc(), Op1.getValueType(), Op1,
3765 Op2, Flags));
3766}
3767
3768void SelectionDAGBuilder::visitICmp(const ICmpInst &I) {
3769 ICmpInst::Predicate predicate = I.getPredicate();
3770 SDValue Op1 = getValue(I.getOperand(0));
3771 SDValue Op2 = getValue(I.getOperand(1));
3772 ISD::CondCode Opcode = getICmpCondCode(predicate);
3773
3774 auto &TLI = DAG.getTargetLoweringInfo();
3775 EVT MemVT =
3776 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
3777
3778 // If a pointer's DAG type is larger than its memory type then the DAG values
3779 // are zero-extended. This breaks signed comparisons so truncate back to the
3780 // underlying type before doing the compare.
3781 if (Op1.getValueType() != MemVT) {
3782 Op1 = DAG.getPtrExtOrTrunc(Op1, getCurSDLoc(), MemVT);
3783 Op2 = DAG.getPtrExtOrTrunc(Op2, getCurSDLoc(), MemVT);
3784 }
3785
3786 SDNodeFlags Flags;
3787 Flags.setSameSign(I.hasSameSign());
3788 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
3789
3790 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3791 I.getType());
3792 setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Opcode));
3793}
3794
3795void SelectionDAGBuilder::visitFCmp(const FCmpInst &I) {
3796 FCmpInst::Predicate predicate = I.getPredicate();
3797 SDValue Op1 = getValue(I.getOperand(0));
3798 SDValue Op2 = getValue(I.getOperand(1));
3799
3800 ISD::CondCode Condition = getFCmpCondCode(predicate);
3801 auto *FPMO = cast<FPMathOperator>(&I);
3802 if (FPMO->hasNoNaNs() ||
3803 (DAG.isKnownNeverNaN(Op1) && DAG.isKnownNeverNaN(Op2)))
3804 Condition = getFCmpCodeWithoutNaN(Condition);
3805
3806 SDNodeFlags Flags;
3807 Flags.copyFMF(*FPMO);
3808 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
3809
3810 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3811 I.getType());
3812 setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Condition,
3813 /*Chian=*/{}, /*IsSignaling=*/false, Flags));
3814}
3815
3816// Check if the condition of the select has one use or two users that are both
3817// selects with the same condition.
3818static bool hasOnlySelectUsers(const Value *Cond) {
3819 return llvm::all_of(Cond->users(), [](const Value *V) {
3820 return isa<SelectInst>(V);
3821 });
3822}
3823
3824void SelectionDAGBuilder::visitSelect(const User &I) {
3825 SmallVector<EVT, 4> ValueVTs;
3826 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
3827 ValueVTs);
3828 unsigned NumValues = ValueVTs.size();
3829 if (NumValues == 0) return;
3830
3831 SmallVector<SDValue, 4> Values(NumValues);
3832 SDValue Cond = getValue(I.getOperand(0));
3833 SDValue LHSVal = getValue(I.getOperand(1));
3834 SDValue RHSVal = getValue(I.getOperand(2));
3835 SmallVector<SDValue, 1> BaseOps(1, Cond);
3837 Cond.getValueType().isVector() ? ISD::VSELECT : ISD::SELECT;
3838
3839 bool IsUnaryAbs = false;
3840 bool Negate = false;
3841
3842 SDNodeFlags Flags;
3843 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3844 Flags.copyFMF(*FPOp);
3845
3846 Flags.setUnpredictable(
3847 cast<SelectInst>(I).getMetadata(LLVMContext::MD_unpredictable));
3848
3849 // Min/max matching is only viable if all output VTs are the same.
3850 if (all_equal(ValueVTs)) {
3851 EVT VT = ValueVTs[0];
3852 LLVMContext &Ctx = *DAG.getContext();
3853 auto &TLI = DAG.getTargetLoweringInfo();
3854
3855 // We care about the legality of the operation after it has been type
3856 // legalized.
3857 while (TLI.getTypeAction(Ctx, VT) != TargetLoweringBase::TypeLegal)
3858 VT = TLI.getTypeToTransformTo(Ctx, VT);
3859
3860 // If the vselect is legal, assume we want to leave this as a vector setcc +
3861 // vselect. Otherwise, if this is going to be scalarized, we want to see if
3862 // min/max is legal on the scalar type.
3863 bool UseScalarMinMax = VT.isVector() &&
3865
3866 // ValueTracking's select pattern matching does not account for -0.0,
3867 // so we can't lower to FMINIMUM/FMAXIMUM because those nodes specify that
3868 // -0.0 is less than +0.0.
3869 const Value *LHS, *RHS;
3870 auto SPR = matchSelectPattern(&I, LHS, RHS);
3872 switch (SPR.Flavor) {
3873 case SPF_UMAX: Opc = ISD::UMAX; break;
3874 case SPF_UMIN: Opc = ISD::UMIN; break;
3875 case SPF_SMAX: Opc = ISD::SMAX; break;
3876 case SPF_SMIN: Opc = ISD::SMIN; break;
3877 case SPF_FMINNUM:
3878 switch (SPR.NaNBehavior) {
3879 case SPNB_NA: llvm_unreachable("No NaN behavior for FP op?");
3880 case SPNB_RETURNS_NAN: break;
3881 case SPNB_RETURNS_OTHER: Opc = ISD::FMINNUM; break;
3882 case SPNB_RETURNS_ANY:
3884 (UseScalarMinMax &&
3886 Opc = ISD::FMINNUM;
3887 break;
3888 }
3889 break;
3890 case SPF_FMAXNUM:
3891 switch (SPR.NaNBehavior) {
3892 case SPNB_NA: llvm_unreachable("No NaN behavior for FP op?");
3893 case SPNB_RETURNS_NAN: break;
3894 case SPNB_RETURNS_OTHER: Opc = ISD::FMAXNUM; break;
3895 case SPNB_RETURNS_ANY:
3897 (UseScalarMinMax &&
3899 Opc = ISD::FMAXNUM;
3900 break;
3901 }
3902 break;
3903 case SPF_NABS:
3904 Negate = true;
3905 [[fallthrough]];
3906 case SPF_ABS:
3907 IsUnaryAbs = true;
3908 Opc = ISD::ABS;
3909 break;
3910 default: break;
3911 }
3912
3913 if (!IsUnaryAbs && Opc != ISD::DELETED_NODE &&
3914 (TLI.isOperationLegalOrCustom(Opc, VT) ||
3915 (UseScalarMinMax &&
3917 // If the underlying comparison instruction is used by any other
3918 // instruction, the consumed instructions won't be destroyed, so it is
3919 // not profitable to convert to a min/max.
3921 OpCode = Opc;
3922 LHSVal = getValue(LHS);
3923 RHSVal = getValue(RHS);
3924 BaseOps.clear();
3925 }
3926
3927 if (IsUnaryAbs) {
3928 OpCode = Opc;
3929 LHSVal = getValue(LHS);
3930 BaseOps.clear();
3931 }
3932 }
3933
3934 if (IsUnaryAbs) {
3935 for (unsigned i = 0; i != NumValues; ++i) {
3936 SDLoc dl = getCurSDLoc();
3937 EVT VT = LHSVal.getNode()->getValueType(LHSVal.getResNo() + i);
3938 Values[i] =
3939 DAG.getNode(OpCode, dl, VT, LHSVal.getValue(LHSVal.getResNo() + i));
3940 if (Negate)
3941 Values[i] = DAG.getNegative(Values[i], dl, VT);
3942 }
3943 } else {
3944 for (unsigned i = 0; i != NumValues; ++i) {
3945 SmallVector<SDValue, 3> Ops(BaseOps.begin(), BaseOps.end());
3946 Ops.push_back(SDValue(LHSVal.getNode(), LHSVal.getResNo() + i));
3947 Ops.push_back(SDValue(RHSVal.getNode(), RHSVal.getResNo() + i));
3948 Values[i] = DAG.getNode(
3949 OpCode, getCurSDLoc(),
3950 LHSVal.getNode()->getValueType(LHSVal.getResNo() + i), Ops, Flags);
3951 }
3952 }
3953
3955 DAG.getVTList(ValueVTs), Values));
3956}
3957
3958void SelectionDAGBuilder::visitTrunc(const User &I) {
3959 // TruncInst cannot be a no-op cast because sizeof(src) > sizeof(dest).
3960 SDValue N = getValue(I.getOperand(0));
3961 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3962 I.getType());
3963 SDNodeFlags Flags;
3964 if (auto *Trunc = dyn_cast<TruncInst>(&I)) {
3965 Flags.setNoSignedWrap(Trunc->hasNoSignedWrap());
3966 Flags.setNoUnsignedWrap(Trunc->hasNoUnsignedWrap());
3967 }
3968
3969 setValue(&I, DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), DestVT, N, Flags));
3970}
3971
3972void SelectionDAGBuilder::visitZExt(const User &I) {
3973 // ZExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
3974 // ZExt also can't be a cast to bool for same reason. So, nothing much to do
3975 SDValue N = getValue(I.getOperand(0));
3976 auto &TLI = DAG.getTargetLoweringInfo();
3977 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
3978
3979 SDNodeFlags Flags;
3980 if (auto *PNI = dyn_cast<PossiblyNonNegInst>(&I))
3981 Flags.setNonNeg(PNI->hasNonNeg());
3982
3983 // Eagerly use nonneg information to canonicalize towards sign_extend if
3984 // that is the target's preference.
3985 // TODO: Let the target do this later.
3986 if (Flags.hasNonNeg() &&
3987 TLI.isSExtCheaperThanZExt(N.getValueType(), DestVT)) {
3988 setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));
3989 return;
3990 }
3991
3992 setValue(&I, DAG.getNode(ISD::ZERO_EXTEND, getCurSDLoc(), DestVT, N, Flags));
3993}
3994
3995void SelectionDAGBuilder::visitSExt(const User &I) {
3996 // SExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
3997 // SExt also can't be a cast to bool for same reason. So, nothing much to do
3998 SDValue N = getValue(I.getOperand(0));
3999 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4000 I.getType());
4001 setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));
4002}
4003
4004void SelectionDAGBuilder::visitFPTrunc(const User &I) {
4005 // FPTrunc is never a no-op cast, no need to check
4006 SDValue N = getValue(I.getOperand(0));
4007 SDLoc dl = getCurSDLoc();
4008 SDNodeFlags Flags;
4009 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
4010 Flags.copyFMF(*FPOp);
4011 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4012 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4013 setValue(&I, DAG.getNode(ISD::FP_ROUND, dl, DestVT, N,
4014 DAG.getTargetConstant(
4015 0, dl, TLI.getPointerTy(DAG.getDataLayout())),
4016 Flags));
4017}
4018
4019void SelectionDAGBuilder::visitFPExt(const User &I) {
4020 // FPExt is never a no-op cast, no need to check
4021 SDValue N = getValue(I.getOperand(0));
4022 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4023 I.getType());
4024 SDNodeFlags Flags;
4025 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
4026 Flags.copyFMF(*FPOp);
4027 setValue(&I, DAG.getNode(ISD::FP_EXTEND, getCurSDLoc(), DestVT, N, Flags));
4028}
4029
4030void SelectionDAGBuilder::visitFPToUI(const User &I) {
4031 // FPToUI is never a no-op cast, no need to check
4032 SDValue N = getValue(I.getOperand(0));
4033 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4034 I.getType());
4035 setValue(&I, DAG.getNode(ISD::FP_TO_UINT, getCurSDLoc(), DestVT, N));
4036}
4037
4038void SelectionDAGBuilder::visitFPToSI(const User &I) {
4039 // FPToSI is never a no-op cast, no need to check
4040 SDValue N = getValue(I.getOperand(0));
4041 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4042 I.getType());
4043 setValue(&I, DAG.getNode(ISD::FP_TO_SINT, getCurSDLoc(), DestVT, N));
4044}
4045
4046void SelectionDAGBuilder::visitUIToFP(const User &I) {
4047 // UIToFP is never a no-op cast, no need to check
4048 SDValue N = getValue(I.getOperand(0));
4049 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4050 I.getType());
4051 SDNodeFlags Flags;
4052 if (auto *PNI = dyn_cast<PossiblyNonNegInst>(&I))
4053 Flags.setNonNeg(PNI->hasNonNeg());
4054
4055 setValue(&I, DAG.getNode(ISD::UINT_TO_FP, getCurSDLoc(), DestVT, N, Flags));
4056}
4057
4058void SelectionDAGBuilder::visitSIToFP(const User &I) {
4059 // SIToFP is never a no-op cast, no need to check
4060 SDValue N = getValue(I.getOperand(0));
4061 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4062 I.getType());
4063 setValue(&I, DAG.getNode(ISD::SINT_TO_FP, getCurSDLoc(), DestVT, N));
4064}
4065
4066void SelectionDAGBuilder::visitPtrToAddr(const User &I) {
4067 SDValue N = getValue(I.getOperand(0));
4068 // By definition the type of the ptrtoaddr must be equal to the address type.
4069 const auto &TLI = DAG.getTargetLoweringInfo();
4070 EVT AddrVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4071 // The address width must be smaller or equal to the pointer representation
4072 // width, so we lower ptrtoaddr as a truncate (possibly folded to a no-op).
4073 N = DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), AddrVT, N);
4074 setValue(&I, N);
4075}
4076
4077void SelectionDAGBuilder::visitPtrToInt(const User &I) {
4078 // What to do depends on the size of the integer and the size of the pointer.
4079 // We can either truncate, zero extend, or no-op, accordingly.
4080 SDValue N = getValue(I.getOperand(0));
4081 auto &TLI = DAG.getTargetLoweringInfo();
4082 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4083 I.getType());
4084 EVT PtrMemVT =
4085 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
4086 N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), PtrMemVT);
4087 N = DAG.getZExtOrTrunc(N, getCurSDLoc(), DestVT);
4088 setValue(&I, N);
4089}
4090
4091void SelectionDAGBuilder::visitIntToPtr(const User &I) {
4092 // What to do depends on the size of the integer and the size of the pointer.
4093 // We can either truncate, zero extend, or no-op, accordingly.
4094 SDValue N = getValue(I.getOperand(0));
4095 auto &TLI = DAG.getTargetLoweringInfo();
4096 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4097 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(), I.getType());
4098 N = DAG.getZExtOrTrunc(N, getCurSDLoc(), PtrMemVT);
4099 N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), DestVT);
4100 setValue(&I, N);
4101}
4102
4103void SelectionDAGBuilder::visitBitCast(const User &I) {
4104 SDValue N = getValue(I.getOperand(0));
4105 SDLoc dl = getCurSDLoc();
4106 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4107 I.getType());
4108
4109 // BitCast assures us that source and destination are the same size so this is
4110 // either a BITCAST or a no-op.
4111 if (DestVT != N.getValueType())
4112 setValue(&I, DAG.getNode(ISD::BITCAST, dl,
4113 DestVT, N)); // convert types.
4114 // Check if the original LLVM IR Operand was a ConstantInt, because getValue()
4115 // might fold any kind of constant expression to an integer constant and that
4116 // is not what we are looking for. Only recognize a bitcast of a genuine
4117 // constant integer as an opaque constant.
4118 else if(ConstantInt *C = dyn_cast<ConstantInt>(I.getOperand(0)))
4119 setValue(&I, DAG.getConstant(C->getValue(), dl, DestVT, /*isTarget=*/false,
4120 /*isOpaque*/true));
4121 else
4122 setValue(&I, N); // noop cast.
4123}
4124
4125void SelectionDAGBuilder::visitAddrSpaceCast(const User &I) {
4126 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4127 const Value *SV = I.getOperand(0);
4128 SDValue N = getValue(SV);
4129 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4130
4131 unsigned SrcAS = SV->getType()->getPointerAddressSpace();
4132 unsigned DestAS = I.getType()->getPointerAddressSpace();
4133
4134 if (!TM.isNoopAddrSpaceCast(SrcAS, DestAS))
4135 N = DAG.getAddrSpaceCast(getCurSDLoc(), DestVT, N, SrcAS, DestAS);
4136
4137 setValue(&I, N);
4138}
4139
4140void SelectionDAGBuilder::visitInsertElement(const User &I) {
4141 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4142 SDValue InVec = getValue(I.getOperand(0));
4143 SDValue InVal = getValue(I.getOperand(1));
4144 SDValue InIdx = DAG.getZExtOrTrunc(getValue(I.getOperand(2)), getCurSDLoc(),
4145 TLI.getVectorIdxTy(DAG.getDataLayout()));
4147 TLI.getValueType(DAG.getDataLayout(), I.getType()),
4148 InVec, InVal, InIdx));
4149}
4150
4151void SelectionDAGBuilder::visitExtractElement(const User &I) {
4152 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4153 SDValue InVec = getValue(I.getOperand(0));
4154 SDValue InIdx = DAG.getZExtOrTrunc(getValue(I.getOperand(1)), getCurSDLoc(),
4155 TLI.getVectorIdxTy(DAG.getDataLayout()));
4157 TLI.getValueType(DAG.getDataLayout(), I.getType()),
4158 InVec, InIdx));
4159}
4160
4161void SelectionDAGBuilder::visitShuffleVector(const User &I) {
4162 SDValue Src1 = getValue(I.getOperand(0));
4163 SDValue Src2 = getValue(I.getOperand(1));
4164 ArrayRef<int> Mask;
4165 if (auto *SVI = dyn_cast<ShuffleVectorInst>(&I))
4166 Mask = SVI->getShuffleMask();
4167 else
4168 Mask = cast<ConstantExpr>(I).getShuffleMask();
4169 SDLoc DL = getCurSDLoc();
4170 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4171 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4172 EVT SrcVT = Src1.getValueType();
4173
4174 if (all_of(Mask, equal_to(0)) && VT.isScalableVector()) {
4175 // Canonical splat form of first element of first input vector.
4176 SDValue FirstElt =
4177 DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, SrcVT.getScalarType(), Src1,
4178 DAG.getVectorIdxConstant(0, DL));
4179 setValue(&I, DAG.getNode(ISD::SPLAT_VECTOR, DL, VT, FirstElt));
4180 return;
4181 }
4182
4183 // For now, we only handle splats for scalable vectors.
4184 // The DAGCombiner will perform a BUILD_VECTOR -> SPLAT_VECTOR transformation
4185 // for targets that support a SPLAT_VECTOR for non-scalable vector types.
4186 assert(!VT.isScalableVector() && "Unsupported scalable vector shuffle");
4187
4188 unsigned SrcNumElts = SrcVT.getVectorNumElements();
4189 unsigned MaskNumElts = Mask.size();
4190
4191 if (SrcNumElts == MaskNumElts) {
4192 setValue(&I, DAG.getVectorShuffle(VT, DL, Src1, Src2, Mask));
4193 return;
4194 }
4195
4196 // Normalize the shuffle vector since mask and vector length don't match.
4197 if (SrcNumElts < MaskNumElts) {
4198 // Mask is longer than the source vectors. We can use concatenate vector to
4199 // make the mask and vectors lengths match.
4200
4201 if (MaskNumElts % SrcNumElts == 0) {
4202 // Mask length is a multiple of the source vector length.
4203 // Check if the shuffle is some kind of concatenation of the input
4204 // vectors.
4205 unsigned NumConcat = MaskNumElts / SrcNumElts;
4206 bool IsConcat = true;
4207 SmallVector<int, 8> ConcatSrcs(NumConcat, -1);
4208 for (unsigned i = 0; i != MaskNumElts; ++i) {
4209 int Idx = Mask[i];
4210 if (Idx < 0)
4211 continue;
4212 // Ensure the indices in each SrcVT sized piece are sequential and that
4213 // the same source is used for the whole piece.
4214 if ((Idx % SrcNumElts != (i % SrcNumElts)) ||
4215 (ConcatSrcs[i / SrcNumElts] >= 0 &&
4216 ConcatSrcs[i / SrcNumElts] != (int)(Idx / SrcNumElts))) {
4217 IsConcat = false;
4218 break;
4219 }
4220 // Remember which source this index came from.
4221 ConcatSrcs[i / SrcNumElts] = Idx / SrcNumElts;
4222 }
4223
4224 // The shuffle is concatenating multiple vectors together. Just emit
4225 // a CONCAT_VECTORS operation.
4226 if (IsConcat) {
4227 SmallVector<SDValue, 8> ConcatOps;
4228 for (auto Src : ConcatSrcs) {
4229 if (Src < 0)
4230 ConcatOps.push_back(DAG.getUNDEF(SrcVT));
4231 else if (Src == 0)
4232 ConcatOps.push_back(Src1);
4233 else
4234 ConcatOps.push_back(Src2);
4235 }
4236 setValue(&I, DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, ConcatOps));
4237 return;
4238 }
4239 }
4240
4241 unsigned PaddedMaskNumElts = alignTo(MaskNumElts, SrcNumElts);
4242 unsigned NumConcat = PaddedMaskNumElts / SrcNumElts;
4243 EVT PaddedVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(),
4244 PaddedMaskNumElts);
4245
4246 // Pad both vectors with undefs to make them the same length as the mask.
4247 SDValue UndefVal = DAG.getUNDEF(SrcVT);
4248
4249 SmallVector<SDValue, 8> MOps1(NumConcat, UndefVal);
4250 SmallVector<SDValue, 8> MOps2(NumConcat, UndefVal);
4251 MOps1[0] = Src1;
4252 MOps2[0] = Src2;
4253
4254 Src1 = DAG.getNode(ISD::CONCAT_VECTORS, DL, PaddedVT, MOps1);
4255 Src2 = DAG.getNode(ISD::CONCAT_VECTORS, DL, PaddedVT, MOps2);
4256
4257 // Readjust mask for new input vector length.
4258 SmallVector<int, 8> MappedOps(PaddedMaskNumElts, -1);
4259 for (unsigned i = 0; i != MaskNumElts; ++i) {
4260 int Idx = Mask[i];
4261 if (Idx >= (int)SrcNumElts)
4262 Idx -= SrcNumElts - PaddedMaskNumElts;
4263 MappedOps[i] = Idx;
4264 }
4265
4266 SDValue Result = DAG.getVectorShuffle(PaddedVT, DL, Src1, Src2, MappedOps);
4267
4268 // If the concatenated vector was padded, extract a subvector with the
4269 // correct number of elements.
4270 if (MaskNumElts != PaddedMaskNumElts)
4271 Result = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Result,
4272 DAG.getVectorIdxConstant(0, DL));
4273
4274 setValue(&I, Result);
4275 return;
4276 }
4277
4278 assert(SrcNumElts > MaskNumElts);
4279
4280 // Analyze the access pattern of the vector to see if we can extract
4281 // two subvectors and do the shuffle.
4282 int StartIdx[2] = {-1, -1}; // StartIdx to extract from
4283 bool CanExtract = true;
4284 for (int Idx : Mask) {
4285 unsigned Input = 0;
4286 if (Idx < 0)
4287 continue;
4288
4289 if (Idx >= (int)SrcNumElts) {
4290 Input = 1;
4291 Idx -= SrcNumElts;
4292 }
4293
4294 // If all the indices come from the same MaskNumElts sized portion of
4295 // the sources we can use extract. Also make sure the extract wouldn't
4296 // extract past the end of the source.
4297 int NewStartIdx = alignDown(Idx, MaskNumElts);
4298 if (NewStartIdx + MaskNumElts > SrcNumElts ||
4299 (StartIdx[Input] >= 0 && StartIdx[Input] != NewStartIdx))
4300 CanExtract = false;
4301 // Make sure we always update StartIdx as we use it to track if all
4302 // elements are undef.
4303 StartIdx[Input] = NewStartIdx;
4304 }
4305
4306 if (StartIdx[0] < 0 && StartIdx[1] < 0) {
4307 setValue(&I, DAG.getUNDEF(VT)); // Vectors are not used.
4308 return;
4309 }
4310 if (CanExtract) {
4311 // Extract appropriate subvector and generate a vector shuffle
4312 for (unsigned Input = 0; Input < 2; ++Input) {
4313 SDValue &Src = Input == 0 ? Src1 : Src2;
4314 if (StartIdx[Input] < 0)
4315 Src = DAG.getUNDEF(VT);
4316 else {
4317 Src = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Src,
4318 DAG.getVectorIdxConstant(StartIdx[Input], DL));
4319 }
4320 }
4321
4322 // Calculate new mask.
4323 SmallVector<int, 8> MappedOps(Mask);
4324 for (int &Idx : MappedOps) {
4325 if (Idx >= (int)SrcNumElts)
4326 Idx -= SrcNumElts + StartIdx[1] - MaskNumElts;
4327 else if (Idx >= 0)
4328 Idx -= StartIdx[0];
4329 }
4330
4331 setValue(&I, DAG.getVectorShuffle(VT, DL, Src1, Src2, MappedOps));
4332 return;
4333 }
4334
4335 // We can't use either concat vectors or extract subvectors so fall back to
4336 // replacing the shuffle with extract and build vector.
4337 // to insert and build vector.
4338 EVT EltVT = VT.getVectorElementType();
4340 for (int Idx : Mask) {
4341 SDValue Res;
4342
4343 if (Idx < 0) {
4344 Res = DAG.getUNDEF(EltVT);
4345 } else {
4346 SDValue &Src = Idx < (int)SrcNumElts ? Src1 : Src2;
4347 if (Idx >= (int)SrcNumElts) Idx -= SrcNumElts;
4348
4349 Res = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Src,
4350 DAG.getVectorIdxConstant(Idx, DL));
4351 }
4352
4353 Ops.push_back(Res);
4354 }
4355
4356 setValue(&I, DAG.getBuildVector(VT, DL, Ops));
4357}
4358
4359void SelectionDAGBuilder::visitInsertValue(const InsertValueInst &I) {
4360 ArrayRef<unsigned> Indices = I.getIndices();
4361 const Value *Op0 = I.getOperand(0);
4362 const Value *Op1 = I.getOperand(1);
4363 Type *AggTy = I.getType();
4364 Type *ValTy = Op1->getType();
4365 bool IntoUndef = isa<UndefValue>(Op0);
4366 bool FromUndef = isa<UndefValue>(Op1);
4367
4368 unsigned LinearIndex = ComputeLinearIndex(AggTy, Indices);
4369
4370 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4371 SmallVector<EVT, 4> AggValueVTs;
4372 ComputeValueVTs(TLI, DAG.getDataLayout(), AggTy, AggValueVTs);
4373 SmallVector<EVT, 4> ValValueVTs;
4374 ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);
4375
4376 unsigned NumAggValues = AggValueVTs.size();
4377 unsigned NumValValues = ValValueVTs.size();
4378 SmallVector<SDValue, 4> Values(NumAggValues);
4379
4380 // Ignore an insertvalue that produces an empty object
4381 if (!NumAggValues) {
4382 setValue(&I, DAG.getUNDEF(MVT(MVT::Other)));
4383 return;
4384 }
4385
4386 SDValue Agg = getValue(Op0);
4387 unsigned i = 0;
4388 // Copy the beginning value(s) from the original aggregate.
4389 for (; i != LinearIndex; ++i)
4390 Values[i] = IntoUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4391 SDValue(Agg.getNode(), Agg.getResNo() + i);
4392 // Copy values from the inserted value(s).
4393 if (NumValValues) {
4394 SDValue Val = getValue(Op1);
4395 for (; i != LinearIndex + NumValValues; ++i)
4396 Values[i] = FromUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4397 SDValue(Val.getNode(), Val.getResNo() + i - LinearIndex);
4398 }
4399 // Copy remaining value(s) from the original aggregate.
4400 for (; i != NumAggValues; ++i)
4401 Values[i] = IntoUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4402 SDValue(Agg.getNode(), Agg.getResNo() + i);
4403
4405 DAG.getVTList(AggValueVTs), Values));
4406}
4407
4408void SelectionDAGBuilder::visitExtractValue(const ExtractValueInst &I) {
4409 ArrayRef<unsigned> Indices = I.getIndices();
4410 const Value *Op0 = I.getOperand(0);
4411 Type *AggTy = Op0->getType();
4412 Type *ValTy = I.getType();
4413 bool OutOfUndef = isa<UndefValue>(Op0);
4414
4415 unsigned LinearIndex = ComputeLinearIndex(AggTy, Indices);
4416
4417 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4418 SmallVector<EVT, 4> ValValueVTs;
4419 ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);
4420
4421 unsigned NumValValues = ValValueVTs.size();
4422
4423 // Ignore a extractvalue that produces an empty object
4424 if (!NumValValues) {
4425 setValue(&I, DAG.getUNDEF(MVT(MVT::Other)));
4426 return;
4427 }
4428
4429 SmallVector<SDValue, 4> Values(NumValValues);
4430
4431 SDValue Agg = getValue(Op0);
4432 // Copy out the selected value(s).
4433 for (unsigned i = LinearIndex; i != LinearIndex + NumValValues; ++i)
4434 Values[i - LinearIndex] =
4435 OutOfUndef ?
4436 DAG.getUNDEF(Agg.getNode()->getValueType(Agg.getResNo() + i)) :
4437 SDValue(Agg.getNode(), Agg.getResNo() + i);
4438
4440 DAG.getVTList(ValValueVTs), Values));
4441}
4442
4443void SelectionDAGBuilder::visitGetElementPtr(const User &I) {
4444 Value *Op0 = I.getOperand(0);
4445 // Note that the pointer operand may be a vector of pointers. Take the scalar
4446 // element which holds a pointer.
4447 unsigned AS = Op0->getType()->getScalarType()->getPointerAddressSpace();
4448 SDValue N = getValue(Op0);
4449 SDLoc dl = getCurSDLoc();
4450 auto &TLI = DAG.getTargetLoweringInfo();
4451 GEPNoWrapFlags NW = cast<GEPOperator>(I).getNoWrapFlags();
4452
4453 // For a vector GEP, keep the prefix scalar as long as possible, then
4454 // convert any scalars encountered after the first vector operand to vectors.
4455 bool IsVectorGEP = I.getType()->isVectorTy();
4456 ElementCount VectorElementCount =
4457 IsVectorGEP ? cast<VectorType>(I.getType())->getElementCount()
4459
4461 GTI != E; ++GTI) {
4462 const Value *Idx = GTI.getOperand();
4463 if (StructType *StTy = GTI.getStructTypeOrNull()) {
4464 unsigned Field = cast<Constant>(Idx)->getUniqueInteger().getZExtValue();
4465 if (Field) {
4466 // N = N + Offset
4467 uint64_t Offset =
4468 DAG.getDataLayout().getStructLayout(StTy)->getElementOffset(Field);
4469
4470 // In an inbounds GEP with an offset that is nonnegative even when
4471 // interpreted as signed, assume there is no unsigned overflow.
4472 SDNodeFlags Flags;
4473 if (NW.hasNoUnsignedWrap() ||
4474 (int64_t(Offset) >= 0 && NW.hasNoUnsignedSignedWrap()))
4476 Flags.setInBounds(NW.isInBounds());
4477
4478 N = DAG.getMemBasePlusOffset(
4479 N, DAG.getConstant(Offset, dl, N.getValueType()), dl, Flags);
4480 }
4481 } else {
4482 // IdxSize is the width of the arithmetic according to IR semantics.
4483 // In SelectionDAG, we may prefer to do arithmetic in a wider bitwidth
4484 // (and fix up the result later).
4485 unsigned IdxSize = DAG.getDataLayout().getIndexSizeInBits(AS);
4486 MVT IdxTy = MVT::getIntegerVT(IdxSize);
4487 TypeSize ElementSize =
4488 GTI.getSequentialElementStride(DAG.getDataLayout());
4489 // We intentionally mask away the high bits here; ElementSize may not
4490 // fit in IdxTy.
4491 APInt ElementMul(IdxSize, ElementSize.getKnownMinValue(),
4492 /*isSigned=*/false, /*implicitTrunc=*/true);
4493 bool ElementScalable = ElementSize.isScalable();
4494
4495 // If this is a scalar constant or a splat vector of constants,
4496 // handle it quickly.
4497 const auto *C = dyn_cast<Constant>(Idx);
4498 if (C && isa<VectorType>(C->getType()))
4499 C = C->getSplatValue();
4500
4501 const auto *CI = dyn_cast_or_null<ConstantInt>(C);
4502 if (CI && CI->isZero())
4503 continue;
4504 if (CI && !ElementScalable) {
4505 APInt Offs = ElementMul * CI->getValue().sextOrTrunc(IdxSize);
4506 LLVMContext &Context = *DAG.getContext();
4507 SDValue OffsVal;
4508 if (N.getValueType().isVector())
4509 OffsVal = DAG.getConstant(
4510 Offs, dl, EVT::getVectorVT(Context, IdxTy, VectorElementCount));
4511 else
4512 OffsVal = DAG.getConstant(Offs, dl, IdxTy);
4513
4514 // In an inbounds GEP with an offset that is nonnegative even when
4515 // interpreted as signed, assume there is no unsigned overflow.
4516 SDNodeFlags Flags;
4517 if (NW.hasNoUnsignedWrap() ||
4518 (Offs.isNonNegative() && NW.hasNoUnsignedSignedWrap()))
4519 Flags.setNoUnsignedWrap(true);
4520 Flags.setInBounds(NW.isInBounds());
4521
4522 OffsVal = DAG.getSExtOrTrunc(OffsVal, dl, N.getValueType());
4523
4524 N = DAG.getMemBasePlusOffset(N, OffsVal, dl, Flags);
4525 continue;
4526 }
4527
4528 // N = N + Idx * ElementMul;
4529 SDValue IdxN = getValue(Idx);
4530
4531 if (IdxN.getValueType().isVector() != N.getValueType().isVector()) {
4532 if (N.getValueType().isVector()) {
4533 EVT VT = EVT::getVectorVT(*Context, IdxN.getValueType(),
4534 VectorElementCount);
4535 IdxN = DAG.getSplat(VT, dl, IdxN);
4536 } else {
4537 EVT VT =
4538 EVT::getVectorVT(*Context, N.getValueType(), VectorElementCount);
4539 N = DAG.getSplat(VT, dl, N);
4540 }
4541 }
4542
4543 // If the index is smaller or larger than intptr_t, truncate or extend
4544 // it.
4545 IdxN = DAG.getSExtOrTrunc(IdxN, dl, N.getValueType());
4546
4547 SDNodeFlags ScaleFlags;
4548 // The multiplication of an index by the type size does not wrap the
4549 // pointer index type in a signed sense (mul nsw).
4551
4552 // The multiplication of an index by the type size does not wrap the
4553 // pointer index type in an unsigned sense (mul nuw).
4554 ScaleFlags.setNoUnsignedWrap(NW.hasNoUnsignedWrap());
4555
4556 if (ElementScalable) {
4557 EVT VScaleTy = N.getValueType().getScalarType();
4558 SDValue VScale = DAG.getNode(
4559 ISD::VSCALE, dl, VScaleTy,
4560 DAG.getConstant(ElementMul.getZExtValue(), dl, VScaleTy));
4561 if (N.getValueType().isVector())
4562 VScale = DAG.getSplatVector(N.getValueType(), dl, VScale);
4563 IdxN = DAG.getNode(ISD::MUL, dl, N.getValueType(), IdxN, VScale,
4564 ScaleFlags);
4565 } else {
4566 // If this is a multiply by a power of two, turn it into a shl
4567 // immediately. This is a very common case.
4568 if (ElementMul != 1) {
4569 if (ElementMul.isPowerOf2()) {
4570 unsigned Amt = ElementMul.logBase2();
4571 IdxN = DAG.getNode(
4572 ISD::SHL, dl, N.getValueType(), IdxN,
4573 DAG.getShiftAmountConstant(Amt, N.getValueType(), dl),
4574 ScaleFlags);
4575 } else {
4576 SDValue Scale = DAG.getConstant(ElementMul.getZExtValue(), dl,
4577 IdxN.getValueType());
4578 IdxN = DAG.getNode(ISD::MUL, dl, N.getValueType(), IdxN, Scale,
4579 ScaleFlags);
4580 }
4581 }
4582 }
4583
4584 // The successive addition of the current address, truncated to the
4585 // pointer index type and interpreted as an unsigned number, and each
4586 // offset, also interpreted as an unsigned number, does not wrap the
4587 // pointer index type (add nuw).
4588 SDNodeFlags AddFlags;
4589 AddFlags.setNoUnsignedWrap(NW.hasNoUnsignedWrap());
4590 AddFlags.setInBounds(NW.isInBounds());
4591
4592 N = DAG.getMemBasePlusOffset(N, IdxN, dl, AddFlags);
4593 }
4594 }
4595
4596 if (IsVectorGEP && !N.getValueType().isVector()) {
4597 EVT VT = EVT::getVectorVT(*Context, N.getValueType(), VectorElementCount);
4598 N = DAG.getSplat(VT, dl, N);
4599 }
4600
4601 MVT PtrTy = TLI.getPointerTy(DAG.getDataLayout(), AS);
4602 MVT PtrMemTy = TLI.getPointerMemTy(DAG.getDataLayout(), AS);
4603 if (IsVectorGEP) {
4604 PtrTy = MVT::getVectorVT(PtrTy, VectorElementCount);
4605 PtrMemTy = MVT::getVectorVT(PtrMemTy, VectorElementCount);
4606 }
4607
4608 if (PtrMemTy != PtrTy && !cast<GEPOperator>(I).isInBounds())
4609 N = DAG.getPtrExtendInReg(N, dl, PtrMemTy);
4610
4611 setValue(&I, N);
4612}
4613
4614void SelectionDAGBuilder::visitAlloca(const AllocaInst &I) {
4615 // If this is a fixed sized alloca in the entry block of the function,
4616 // allocate it statically on the stack.
4617 if (FuncInfo.StaticAllocaMap.count(&I))
4618 return; // getValue will auto-populate this.
4619
4620 SDLoc dl = getCurSDLoc();
4621 Type *Ty = I.getAllocatedType();
4622 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4623 auto &DL = DAG.getDataLayout();
4624 TypeSize TySize = DL.getTypeAllocSize(Ty);
4625 MaybeAlign Alignment = I.getAlign();
4626
4627 SDValue AllocSize = getValue(I.getArraySize());
4628
4629 EVT IntPtr = TLI.getPointerTy(DL, I.getAddressSpace());
4630 if (AllocSize.getValueType() != IntPtr)
4631 AllocSize = DAG.getZExtOrTrunc(AllocSize, dl, IntPtr);
4632
4633 AllocSize = DAG.getNode(
4634 ISD::MUL, dl, IntPtr, AllocSize,
4635 DAG.getZExtOrTrunc(DAG.getTypeSize(dl, MVT::i64, TySize), dl, IntPtr));
4636
4637 // Handle alignment. If the requested alignment is less than or equal to
4638 // the stack alignment, ignore it. If the size is greater than or equal to
4639 // the stack alignment, we note this in the DYNAMIC_STACKALLOC node.
4640 Align StackAlign = DAG.getSubtarget().getFrameLowering()->getStackAlign();
4641 if (*Alignment <= StackAlign)
4642 Alignment = std::nullopt;
4643
4644 const uint64_t StackAlignMask = StackAlign.value() - 1U;
4645 // Round the size of the allocation up to the stack alignment size
4646 // by add SA-1 to the size. This doesn't overflow because we're computing
4647 // an address inside an alloca.
4648 AllocSize = DAG.getNode(ISD::ADD, dl, AllocSize.getValueType(), AllocSize,
4649 DAG.getConstant(StackAlignMask, dl, IntPtr),
4651
4652 // Mask out the low bits for alignment purposes.
4653 AllocSize = DAG.getNode(ISD::AND, dl, AllocSize.getValueType(), AllocSize,
4654 DAG.getSignedConstant(~StackAlignMask, dl, IntPtr));
4655
4656 SDValue Ops[] = {
4657 getRoot(), AllocSize,
4658 DAG.getConstant(Alignment ? Alignment->value() : 0, dl, IntPtr)};
4659 SDVTList VTs = DAG.getVTList(AllocSize.getValueType(), MVT::Other);
4660 SDValue DSA = DAG.getNode(ISD::DYNAMIC_STACKALLOC, dl, VTs, Ops);
4661 setValue(&I, DSA);
4662 DAG.setRoot(DSA.getValue(1));
4663
4664 assert(FuncInfo.MF->getFrameInfo().hasVarSizedObjects());
4665}
4666
4667static const MDNode *getRangeMetadata(const Instruction &I) {
4668 return I.getMetadata(LLVMContext::MD_range);
4669}
4670
4671static std::optional<ConstantRange> getRange(const Instruction &I) {
4672 if (const auto *CB = dyn_cast<CallBase>(&I))
4673 if (std::optional<ConstantRange> CR = CB->getRange())
4674 return CR;
4675 if (const MDNode *Range = getRangeMetadata(I))
4677 return std::nullopt;
4678}
4679
4681 if (const auto *CB = dyn_cast<CallBase>(&I))
4682 return CB->getRetNoFPClass();
4683 return fcNone;
4684}
4685
4686void SelectionDAGBuilder::visitLoad(const LoadInst &I) {
4687 if (I.isAtomic())
4688 return visitAtomicLoad(I);
4689
4690 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4691 const Value *SV = I.getOperand(0);
4692 if (TLI.supportSwiftError()) {
4693 // Swifterror values can come from either a function parameter with
4694 // swifterror attribute or an alloca with swifterror attribute.
4695 if (const Argument *Arg = dyn_cast<Argument>(SV)) {
4696 if (Arg->hasSwiftErrorAttr())
4697 return visitLoadFromSwiftError(I);
4698 }
4699
4700 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(SV)) {
4701 if (Alloca->isSwiftError())
4702 return visitLoadFromSwiftError(I);
4703 }
4704 }
4705
4706 SDValue Ptr = getValue(SV);
4707
4708 Type *Ty = I.getType();
4709 SmallVector<EVT, 4> ValueVTs, MemVTs;
4711 ComputeValueVTs(TLI, DAG.getDataLayout(), Ty, ValueVTs, &MemVTs, &Offsets);
4712 unsigned NumValues = ValueVTs.size();
4713 if (NumValues == 0)
4714 return;
4715
4716 Align Alignment = I.getAlign();
4717 AAMDNodes AAInfo = I.getAAMetadata();
4718 const MDNode *Ranges = getRangeMetadata(I);
4719 bool isVolatile = I.isVolatile();
4720 MachineMemOperand::Flags MMOFlags =
4721 TLI.getLoadMemOperandFlags(I, DAG.getDataLayout(), AC, LibInfo);
4722
4723 SDValue Root;
4724 bool ConstantMemory = false;
4725 if (isVolatile)
4726 // Serialize volatile loads with other side effects.
4727 Root = getRoot();
4728 else if (NumValues > MaxParallelChains)
4729 Root = getMemoryRoot();
4730 else if (BatchAA &&
4731 BatchAA->pointsToConstantMemory(MemoryLocation(
4732 SV,
4733 LocationSize::precise(DAG.getDataLayout().getTypeStoreSize(Ty)),
4734 AAInfo))) {
4735 // Do not serialize (non-volatile) loads of constant memory with anything.
4736 Root = DAG.getEntryNode();
4737 ConstantMemory = true;
4739 } else {
4740 // Do not serialize non-volatile loads against each other.
4741 Root = DAG.getRoot();
4742 }
4743
4744 SDLoc dl = getCurSDLoc();
4745
4746 if (isVolatile)
4747 Root = TLI.prepareVolatileOrAtomicLoad(Root, dl, DAG);
4748
4749 SmallVector<SDValue, 4> Values(NumValues);
4750 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4751
4752 unsigned ChainI = 0;
4753 for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
4754 // Serializing loads here may result in excessive register pressure, and
4755 // TokenFactor places arbitrary choke points on the scheduler. SD scheduling
4756 // could recover a bit by hoisting nodes upward in the chain by recognizing
4757 // they are side-effect free or do not alias. The optimizer should really
4758 // avoid this case by converting large object/array copies to llvm.memcpy
4759 // (MaxParallelChains should always remain as failsafe).
4760 if (ChainI == MaxParallelChains) {
4761 assert(PendingLoads.empty() && "PendingLoads must be serialized first");
4762 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4763 ArrayRef(Chains.data(), ChainI));
4764 Root = Chain;
4765 ChainI = 0;
4766 }
4767
4768 // TODO: MachinePointerInfo only supports a fixed length offset.
4769 MachinePointerInfo PtrInfo =
4770 !Offsets[i].isScalable() || Offsets[i].isZero()
4771 ? MachinePointerInfo(SV, Offsets[i].getKnownMinValue())
4772 : MachinePointerInfo();
4773
4774 SDValue A = DAG.getObjectPtrOffset(dl, Ptr, Offsets[i]);
4775 SDValue L = DAG.getLoad(MemVTs[i], dl, Root, A, PtrInfo, Alignment,
4776 MMOFlags, AAInfo, Ranges);
4777 Chains[ChainI] = L.getValue(1);
4778
4779 if (MemVTs[i] != ValueVTs[i])
4780 L = DAG.getPtrExtOrTrunc(L, dl, ValueVTs[i]);
4781
4782 Values[i] = L;
4783 }
4784
4785 if (!ConstantMemory) {
4786 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4787 ArrayRef(Chains.data(), ChainI));
4788 if (isVolatile)
4789 DAG.setRoot(Chain);
4790 else
4791 PendingLoads.push_back(Chain);
4792 }
4793
4794 setValue(&I, DAG.getNode(ISD::MERGE_VALUES, dl,
4795 DAG.getVTList(ValueVTs), Values));
4796}
4797
4798void SelectionDAGBuilder::visitStoreToSwiftError(const StoreInst &I) {
4799 assert(DAG.getTargetLoweringInfo().supportSwiftError() &&
4800 "call visitStoreToSwiftError when backend supports swifterror");
4801
4802 SmallVector<EVT, 4> ValueVTs;
4803 SmallVector<uint64_t, 4> Offsets;
4804 const Value *SrcV = I.getOperand(0);
4805 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(),
4806 SrcV->getType(), ValueVTs, /*MemVTs=*/nullptr, &Offsets, 0);
4807 assert(ValueVTs.size() == 1 && Offsets[0] == 0 &&
4808 "expect a single EVT for swifterror");
4809
4810 SDValue Src = getValue(SrcV);
4811 // Create a virtual register, then update the virtual register.
4812 Register VReg =
4813 SwiftError.getOrCreateVRegDefAt(&I, FuncInfo.MBB, I.getPointerOperand());
4814 // Chain, DL, Reg, N or Chain, DL, Reg, N, Glue
4815 // Chain can be getRoot or getControlRoot.
4816 SDValue CopyNode = DAG.getCopyToReg(getRoot(), getCurSDLoc(), VReg,
4817 SDValue(Src.getNode(), Src.getResNo()));
4818 DAG.setRoot(CopyNode);
4819}
4820
4821void SelectionDAGBuilder::visitLoadFromSwiftError(const LoadInst &I) {
4822 assert(DAG.getTargetLoweringInfo().supportSwiftError() &&
4823 "call visitLoadFromSwiftError when backend supports swifterror");
4824
4825 assert(!I.isVolatile() &&
4826 !I.hasMetadata(LLVMContext::MD_nontemporal) &&
4827 !I.hasMetadata(LLVMContext::MD_invariant_load) &&
4828 "Support volatile, non temporal, invariant for load_from_swift_error");
4829
4830 const Value *SV = I.getOperand(0);
4831 Type *Ty = I.getType();
4832 assert(
4833 (!BatchAA ||
4834 !BatchAA->pointsToConstantMemory(MemoryLocation(
4835 SV, LocationSize::precise(DAG.getDataLayout().getTypeStoreSize(Ty)),
4836 I.getAAMetadata()))) &&
4837 "load_from_swift_error should not be constant memory");
4838
4839 SmallVector<EVT, 4> ValueVTs;
4840 SmallVector<uint64_t, 4> Offsets;
4841 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), Ty,
4842 ValueVTs, /*MemVTs=*/nullptr, &Offsets, 0);
4843 assert(ValueVTs.size() == 1 && Offsets[0] == 0 &&
4844 "expect a single EVT for swifterror");
4845
4846 // Chain, DL, Reg, VT, Glue or Chain, DL, Reg, VT
4847 SDValue L = DAG.getCopyFromReg(
4848 getRoot(), getCurSDLoc(),
4849 SwiftError.getOrCreateVRegUseAt(&I, FuncInfo.MBB, SV), ValueVTs[0]);
4850
4851 setValue(&I, L);
4852}
4853
4854void SelectionDAGBuilder::visitStore(const StoreInst &I) {
4855 if (I.isAtomic())
4856 return visitAtomicStore(I);
4857
4858 const Value *SrcV = I.getOperand(0);
4859 const Value *PtrV = I.getOperand(1);
4860
4861 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4862 if (TLI.supportSwiftError()) {
4863 // Swifterror values can come from either a function parameter with
4864 // swifterror attribute or an alloca with swifterror attribute.
4865 if (const Argument *Arg = dyn_cast<Argument>(PtrV)) {
4866 if (Arg->hasSwiftErrorAttr())
4867 return visitStoreToSwiftError(I);
4868 }
4869
4870 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(PtrV)) {
4871 if (Alloca->isSwiftError())
4872 return visitStoreToSwiftError(I);
4873 }
4874 }
4875
4876 SmallVector<EVT, 4> ValueVTs, MemVTs;
4878 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(),
4879 SrcV->getType(), ValueVTs, &MemVTs, &Offsets);
4880 unsigned NumValues = ValueVTs.size();
4881 if (NumValues == 0)
4882 return;
4883
4884 // Get the lowered operands. Note that we do this after
4885 // checking if NumResults is zero, because with zero results
4886 // the operands won't have values in the map.
4887 SDValue Src = getValue(SrcV);
4888 SDValue Ptr = getValue(PtrV);
4889
4890 SDValue Root = I.isVolatile() ? getRoot() : getMemoryRoot();
4891 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4892 SDLoc dl = getCurSDLoc();
4893 Align Alignment = I.getAlign();
4894 AAMDNodes AAInfo = I.getAAMetadata();
4895
4896 auto MMOFlags = TLI.getStoreMemOperandFlags(I, DAG.getDataLayout());
4897
4898 unsigned ChainI = 0;
4899 for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
4900 // See visitLoad comments.
4901 if (ChainI == MaxParallelChains) {
4902 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4903 ArrayRef(Chains.data(), ChainI));
4904 Root = Chain;
4905 ChainI = 0;
4906 }
4907
4908 // TODO: MachinePointerInfo only supports a fixed length offset.
4909 MachinePointerInfo PtrInfo =
4910 !Offsets[i].isScalable() || Offsets[i].isZero()
4911 ? MachinePointerInfo(PtrV, Offsets[i].getKnownMinValue())
4912 : MachinePointerInfo();
4913
4914 SDValue Add = DAG.getObjectPtrOffset(dl, Ptr, Offsets[i]);
4915 SDValue Val = SDValue(Src.getNode(), Src.getResNo() + i);
4916 if (MemVTs[i] != ValueVTs[i])
4917 Val = DAG.getPtrExtOrTrunc(Val, dl, MemVTs[i]);
4918 SDValue St =
4919 DAG.getStore(Root, dl, Val, Add, PtrInfo, Alignment, MMOFlags, AAInfo);
4920 Chains[ChainI] = St;
4921 }
4922
4923 SDValue StoreNode = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4924 ArrayRef(Chains.data(), ChainI));
4925 setValue(&I, StoreNode);
4926 DAG.setRoot(StoreNode);
4927}
4928
4929void SelectionDAGBuilder::visitMaskedStore(const CallInst &I,
4930 bool IsCompressing) {
4931 SDLoc sdl = getCurSDLoc();
4932
4933 Value *Src0Operand = I.getArgOperand(0);
4934 Value *PtrOperand = I.getArgOperand(1);
4935 Value *MaskOperand = I.getArgOperand(2);
4936 Align Alignment = I.getParamAlign(1).valueOrOne();
4937
4938 SDValue Ptr = getValue(PtrOperand);
4939 SDValue Src0 = getValue(Src0Operand);
4940 SDValue Mask = getValue(MaskOperand);
4941 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
4942
4943 EVT VT = Src0.getValueType();
4944
4945 auto MMOFlags = MachineMemOperand::MOStore;
4946 if (I.hasMetadata(LLVMContext::MD_nontemporal))
4948
4949 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
4950 MachinePointerInfo(PtrOperand), MMOFlags,
4951 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata());
4952
4953 const auto &TLI = DAG.getTargetLoweringInfo();
4954
4955 SDValue StoreNode =
4956 !IsCompressing && TTI->hasConditionalLoadStoreForType(
4957 I.getArgOperand(0)->getType(), /*IsStore=*/true)
4958 ? TLI.visitMaskedStore(DAG, sdl, getMemoryRoot(), MMO, Ptr, Src0,
4959 Mask)
4960 : DAG.getMaskedStore(getMemoryRoot(), sdl, Src0, Ptr, Offset, Mask,
4961 VT, MMO, ISD::UNINDEXED, /*Truncating=*/false,
4962 IsCompressing);
4963 DAG.setRoot(StoreNode);
4964 setValue(&I, StoreNode);
4965}
4966
4967// Get a uniform base for the Gather/Scatter intrinsic.
4968// The first argument of the Gather/Scatter intrinsic is a vector of pointers.
4969// We try to represent it as a base pointer + vector of indices.
4970// Usually, the vector of pointers comes from a 'getelementptr' instruction.
4971// The first operand of the GEP may be a single pointer or a vector of pointers
4972// Example:
4973// %gep.ptr = getelementptr i32, <8 x i32*> %vptr, <8 x i32> %ind
4974// or
4975// %gep.ptr = getelementptr i32, i32* %ptr, <8 x i32> %ind
4976// %res = call <8 x i32> @llvm.masked.gather.v8i32(<8 x i32*> %gep.ptr, ..
4977//
4978// When the first GEP operand is a single pointer - it is the uniform base we
4979// are looking for. If first operand of the GEP is a splat vector - we
4980// extract the splat value and use it as a uniform base.
4981// In all other cases the function returns 'false'.
4982static bool getUniformBase(const Value *Ptr, SDValue &Base, SDValue &Index,
4983 SDValue &Scale, SelectionDAGBuilder *SDB,
4984 const BasicBlock *CurBB, uint64_t ElemSize) {
4985 SelectionDAG& DAG = SDB->DAG;
4986 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4987 const DataLayout &DL = DAG.getDataLayout();
4988
4989 assert(Ptr->getType()->isVectorTy() && "Unexpected pointer type");
4990
4991 // Handle splat constant pointer.
4992 if (auto *C = dyn_cast<Constant>(Ptr)) {
4993 C = C->getSplatValue();
4994 if (!C)
4995 return false;
4996
4997 Base = SDB->getValue(C);
4998
4999 ElementCount NumElts = cast<VectorType>(Ptr->getType())->getElementCount();
5000 EVT VT = EVT::getVectorVT(*DAG.getContext(), TLI.getPointerTy(DL), NumElts);
5001 Index = DAG.getConstant(0, SDB->getCurSDLoc(), VT);
5002 Scale = DAG.getTargetConstant(1, SDB->getCurSDLoc(), TLI.getPointerTy(DL));
5003 return true;
5004 }
5005
5007 if (!GEP || GEP->getParent() != CurBB)
5008 return false;
5009
5010 if (GEP->getNumOperands() != 2)
5011 return false;
5012
5013 const Value *BasePtr = GEP->getPointerOperand();
5014 const Value *IndexVal = GEP->getOperand(GEP->getNumOperands() - 1);
5015
5016 // Make sure the base is scalar and the index is a vector.
5017 if (BasePtr->getType()->isVectorTy() || !IndexVal->getType()->isVectorTy())
5018 return false;
5019
5020 TypeSize ScaleVal = DL.getTypeAllocSize(GEP->getResultElementType());
5021 if (ScaleVal.isScalable())
5022 return false;
5023
5024 // Target may not support the required addressing mode.
5025 if (ScaleVal != 1 &&
5026 !TLI.isLegalScaleForGatherScatter(ScaleVal.getFixedValue(), ElemSize))
5027 return false;
5028
5029 Base = SDB->getValue(BasePtr);
5030 Index = SDB->getValue(IndexVal);
5031
5032 Scale =
5033 DAG.getTargetConstant(ScaleVal, SDB->getCurSDLoc(), TLI.getPointerTy(DL));
5034 return true;
5035}
5036
5037void SelectionDAGBuilder::visitMaskedScatter(const CallInst &I) {
5038 SDLoc sdl = getCurSDLoc();
5039
5040 // llvm.masked.scatter.*(Src0, Ptrs, Mask)
5041 const Value *Ptr = I.getArgOperand(1);
5042 SDValue Src0 = getValue(I.getArgOperand(0));
5043 SDValue Mask = getValue(I.getArgOperand(2));
5044 EVT VT = Src0.getValueType();
5045 Align Alignment = I.getParamAlign(1).valueOrOne();
5046 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5047
5048 SDValue Base;
5049 SDValue Index;
5050 SDValue Scale;
5051 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
5052 I.getParent(), VT.getScalarStoreSize());
5053
5054 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
5055 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5056 MachinePointerInfo(AS), MachineMemOperand::MOStore,
5057 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata());
5058 if (!UniformBase) {
5059 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5060 Index = getValue(Ptr);
5061 Scale =
5062 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5063 }
5064
5065 EVT IdxVT = Index.getValueType();
5066 EVT EltTy = IdxVT.getVectorElementType();
5067 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
5068 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
5069 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
5070 }
5071
5072 SDValue Ops[] = { getMemoryRoot(), Src0, Mask, Base, Index, Scale };
5073 SDValue Scatter = DAG.getMaskedScatter(DAG.getVTList(MVT::Other), VT, sdl,
5074 Ops, MMO, ISD::SIGNED_SCALED, false);
5075 DAG.setRoot(Scatter);
5076 setValue(&I, Scatter);
5077}
5078
5079void SelectionDAGBuilder::visitMaskedLoad(const CallInst &I, bool IsExpanding) {
5080 SDLoc sdl = getCurSDLoc();
5081
5082 Value *PtrOperand = I.getArgOperand(0);
5083 Value *MaskOperand = I.getArgOperand(1);
5084 Value *Src0Operand = I.getArgOperand(2);
5085 Align Alignment = I.getParamAlign(0).valueOrOne();
5086
5087 SDValue Ptr = getValue(PtrOperand);
5088 SDValue Src0 = getValue(Src0Operand);
5089 SDValue Mask = getValue(MaskOperand);
5090 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
5091
5092 EVT VT = Src0.getValueType();
5093 AAMDNodes AAInfo = I.getAAMetadata();
5094 const MDNode *Ranges = getRangeMetadata(I);
5095
5096 // Do not serialize masked loads of constant memory with anything.
5097 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
5098 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
5099
5100 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
5101
5102 auto MMOFlags = MachineMemOperand::MOLoad;
5103 if (I.hasMetadata(LLVMContext::MD_nontemporal))
5105 if (I.hasMetadata(LLVMContext::MD_invariant_load))
5107
5108 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5109 MachinePointerInfo(PtrOperand), MMOFlags,
5110 VT.getStoreSize(), Alignment, AAInfo, Ranges);
5111
5112 const auto &TLI = DAG.getTargetLoweringInfo();
5113
5114 // The Load/Res may point to different values and both of them are output
5115 // variables.
5116 SDValue Load;
5117 SDValue Res;
5118 if (!IsExpanding &&
5119 TTI->hasConditionalLoadStoreForType(Src0Operand->getType(),
5120 /*IsStore=*/false))
5121 Res = TLI.visitMaskedLoad(DAG, sdl, InChain, MMO, Load, Ptr, Src0, Mask);
5122 else
5123 Res = Load =
5124 DAG.getMaskedLoad(VT, sdl, InChain, Ptr, Offset, Mask, Src0, VT, MMO,
5125 ISD::UNINDEXED, ISD::NON_EXTLOAD, IsExpanding);
5126 if (AddToChain)
5127 PendingLoads.push_back(Load.getValue(1));
5128 setValue(&I, Res);
5129}
5130
5131void SelectionDAGBuilder::visitMaskedGather(const CallInst &I) {
5132 SDLoc sdl = getCurSDLoc();
5133
5134 // @llvm.masked.gather.*(Ptrs, Mask, Src0)
5135 const Value *Ptr = I.getArgOperand(0);
5136 SDValue Src0 = getValue(I.getArgOperand(2));
5137 SDValue Mask = getValue(I.getArgOperand(1));
5138
5139 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5140 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
5141 Align Alignment = I.getParamAlign(0).valueOrOne();
5142
5143 const MDNode *Ranges = getRangeMetadata(I);
5144
5145 SDValue Root = DAG.getRoot();
5146 SDValue Base;
5147 SDValue Index;
5148 SDValue Scale;
5149 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
5150 I.getParent(), VT.getScalarStoreSize());
5151 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
5152 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5153 MachinePointerInfo(AS), MachineMemOperand::MOLoad,
5154 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata(),
5155 Ranges);
5156
5157 if (!UniformBase) {
5158 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5159 Index = getValue(Ptr);
5160 Scale =
5161 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5162 }
5163
5164 EVT IdxVT = Index.getValueType();
5165 EVT EltTy = IdxVT.getVectorElementType();
5166 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
5167 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
5168 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
5169 }
5170
5171 SDValue Ops[] = { Root, Src0, Mask, Base, Index, Scale };
5172 SDValue Gather =
5173 DAG.getMaskedGather(DAG.getVTList(VT, MVT::Other), VT, sdl, Ops, MMO,
5175
5176 PendingLoads.push_back(Gather.getValue(1));
5177 setValue(&I, Gather);
5178}
5179
5180void SelectionDAGBuilder::visitAtomicCmpXchg(const AtomicCmpXchgInst &I) {
5181 SDLoc dl = getCurSDLoc();
5182 AtomicOrdering SuccessOrdering = I.getSuccessOrdering();
5183 AtomicOrdering FailureOrdering = I.getFailureOrdering();
5184 SyncScope::ID SSID = I.getSyncScopeID();
5185
5186 SDValue InChain = getRoot();
5187
5188 MVT MemVT = getValue(I.getCompareOperand()).getSimpleValueType();
5189 SDVTList VTs = DAG.getVTList(MemVT, MVT::i1, MVT::Other);
5190
5191 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5192 auto Flags = TLI.getAtomicMemOperandFlags(I, DAG.getDataLayout());
5193
5194 MachineFunction &MF = DAG.getMachineFunction();
5195 MachineMemOperand *MMO = MF.getMachineMemOperand(
5196 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5197 DAG.getEVTAlign(MemVT), AAMDNodes(), nullptr, SSID, SuccessOrdering,
5198 FailureOrdering);
5199
5201 dl, MemVT, VTs, InChain,
5202 getValue(I.getPointerOperand()),
5203 getValue(I.getCompareOperand()),
5204 getValue(I.getNewValOperand()), MMO);
5205
5206 SDValue OutChain = L.getValue(2);
5207
5208 setValue(&I, L);
5209 DAG.setRoot(OutChain);
5210}
5211
5212void SelectionDAGBuilder::visitAtomicRMW(const AtomicRMWInst &I) {
5213 SDLoc dl = getCurSDLoc();
5215 switch (I.getOperation()) {
5216 default: llvm_unreachable("Unknown atomicrmw operation");
5234 break;
5237 break;
5240 break;
5243 break;
5246 break;
5249 break;
5250 }
5251 AtomicOrdering Ordering = I.getOrdering();
5252 SyncScope::ID SSID = I.getSyncScopeID();
5253
5254 SDValue InChain = getRoot();
5255
5256 auto MemVT = getValue(I.getValOperand()).getSimpleValueType();
5257 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5258 auto Flags = TLI.getAtomicMemOperandFlags(I, DAG.getDataLayout());
5259
5260 MachineFunction &MF = DAG.getMachineFunction();
5261 MachineMemOperand *MMO = MF.getMachineMemOperand(
5262 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5263 DAG.getEVTAlign(MemVT), AAMDNodes(), nullptr, SSID, Ordering);
5264
5265 SDValue L =
5266 DAG.getAtomic(NT, dl, MemVT, InChain,
5267 getValue(I.getPointerOperand()), getValue(I.getValOperand()),
5268 MMO);
5269
5270 SDValue OutChain = L.getValue(1);
5271
5272 setValue(&I, L);
5273 DAG.setRoot(OutChain);
5274}
5275
5276void SelectionDAGBuilder::visitFence(const FenceInst &I) {
5277 SDLoc dl = getCurSDLoc();
5278 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5279 SDValue Ops[3];
5280 Ops[0] = getRoot();
5281 Ops[1] = DAG.getTargetConstant((unsigned)I.getOrdering(), dl,
5282 TLI.getFenceOperandTy(DAG.getDataLayout()));
5283 Ops[2] = DAG.getTargetConstant(I.getSyncScopeID(), dl,
5284 TLI.getFenceOperandTy(DAG.getDataLayout()));
5285 SDValue N = DAG.getNode(ISD::ATOMIC_FENCE, dl, MVT::Other, Ops);
5286 setValue(&I, N);
5287 DAG.setRoot(N);
5288}
5289
5290void SelectionDAGBuilder::visitAtomicLoad(const LoadInst &I) {
5291 SDLoc dl = getCurSDLoc();
5292 AtomicOrdering Order = I.getOrdering();
5293 SyncScope::ID SSID = I.getSyncScopeID();
5294
5295 SDValue InChain = getRoot();
5296
5297 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5298 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
5299 EVT MemVT = TLI.getMemValueType(DAG.getDataLayout(), I.getType());
5300
5301 if (!TLI.supportsUnalignedAtomics() &&
5302 I.getAlign().value() < MemVT.getSizeInBits() / 8)
5303 report_fatal_error("Cannot generate unaligned atomic load");
5304
5305 auto Flags = TLI.getLoadMemOperandFlags(I, DAG.getDataLayout(), AC, LibInfo);
5306
5307 const MDNode *Ranges = getRangeMetadata(I);
5308 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5309 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5310 I.getAlign(), AAMDNodes(), Ranges, SSID, Order);
5311
5312 InChain = TLI.prepareVolatileOrAtomicLoad(InChain, dl, DAG);
5313
5314 SDValue Ptr = getValue(I.getPointerOperand());
5315 SDValue L =
5316 DAG.getAtomicLoad(ISD::NON_EXTLOAD, dl, MemVT, MemVT, InChain, Ptr, MMO);
5317
5318 SDValue OutChain = L.getValue(1);
5319 if (MemVT != VT)
5320 L = DAG.getPtrExtOrTrunc(L, dl, VT);
5321
5322 setValue(&I, L);
5323 DAG.setRoot(OutChain);
5324}
5325
5326void SelectionDAGBuilder::visitAtomicStore(const StoreInst &I) {
5327 SDLoc dl = getCurSDLoc();
5328
5329 AtomicOrdering Ordering = I.getOrdering();
5330 SyncScope::ID SSID = I.getSyncScopeID();
5331
5332 SDValue InChain = getRoot();
5333
5334 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5335 EVT MemVT =
5336 TLI.getMemValueType(DAG.getDataLayout(), I.getValueOperand()->getType());
5337
5338 if (!TLI.supportsUnalignedAtomics() &&
5339 I.getAlign().value() < MemVT.getSizeInBits() / 8)
5340 report_fatal_error("Cannot generate unaligned atomic store");
5341
5342 auto Flags = TLI.getStoreMemOperandFlags(I, DAG.getDataLayout());
5343
5344 MachineFunction &MF = DAG.getMachineFunction();
5345 MachineMemOperand *MMO = MF.getMachineMemOperand(
5346 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5347 I.getAlign(), AAMDNodes(), nullptr, SSID, Ordering);
5348
5349 SDValue Val = getValue(I.getValueOperand());
5350 if (Val.getValueType() != MemVT)
5351 Val = DAG.getPtrExtOrTrunc(Val, dl, MemVT);
5352 SDValue Ptr = getValue(I.getPointerOperand());
5353
5354 SDValue OutChain =
5355 DAG.getAtomic(ISD::ATOMIC_STORE, dl, MemVT, InChain, Val, Ptr, MMO);
5356
5357 setValue(&I, OutChain);
5358 DAG.setRoot(OutChain);
5359}
5360
5361/// Check if this intrinsic call depends on the chain (1st return value)
5362/// and if it only *loads* memory.
5363/// Ignore the callsite's attributes. A specific call site may be marked with
5364/// readnone, but the lowering code will expect the chain based on the
5365/// definition.
5366std::pair<bool, bool>
5367SelectionDAGBuilder::getTargetIntrinsicCallProperties(const CallBase &I) {
5368 const Function *F = I.getCalledFunction();
5369 bool HasChain = !F->doesNotAccessMemory();
5370 bool OnlyLoad =
5371 HasChain && F->onlyReadsMemory() && F->willReturn() && F->doesNotThrow();
5372
5373 return {HasChain, OnlyLoad};
5374}
5375
5376SmallVector<SDValue, 8> SelectionDAGBuilder::getTargetIntrinsicOperands(
5377 const CallBase &I, bool HasChain, bool OnlyLoad,
5378 TargetLowering::IntrinsicInfo *TgtMemIntrinsicInfo) {
5379 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5380
5381 // Build the operand list.
5383 if (HasChain) { // If this intrinsic has side-effects, chainify it.
5384 if (OnlyLoad) {
5385 // We don't need to serialize loads against other loads.
5386 Ops.push_back(DAG.getRoot());
5387 } else {
5388 Ops.push_back(getRoot());
5389 }
5390 }
5391
5392 // Add the intrinsic ID as an integer operand if it's not a target intrinsic.
5393 if (!TgtMemIntrinsicInfo || TgtMemIntrinsicInfo->opc == ISD::INTRINSIC_VOID ||
5394 TgtMemIntrinsicInfo->opc == ISD::INTRINSIC_W_CHAIN)
5395 Ops.push_back(DAG.getTargetConstant(I.getIntrinsicID(), getCurSDLoc(),
5396 TLI.getPointerTy(DAG.getDataLayout())));
5397
5398 // Add all operands of the call to the operand list.
5399 for (unsigned i = 0, e = I.arg_size(); i != e; ++i) {
5400 const Value *Arg = I.getArgOperand(i);
5401 if (!I.paramHasAttr(i, Attribute::ImmArg)) {
5402 Ops.push_back(getValue(Arg));
5403 continue;
5404 }
5405
5406 // Use TargetConstant instead of a regular constant for immarg.
5407 EVT VT = TLI.getValueType(DAG.getDataLayout(), Arg->getType(), true);
5408 if (const ConstantInt *CI = dyn_cast<ConstantInt>(Arg)) {
5409 assert(CI->getBitWidth() <= 64 &&
5410 "large intrinsic immediates not handled");
5411 Ops.push_back(DAG.getTargetConstant(*CI, SDLoc(), VT));
5412 } else {
5413 Ops.push_back(
5414 DAG.getTargetConstantFP(*cast<ConstantFP>(Arg), SDLoc(), VT));
5415 }
5416 }
5417
5418 if (std::optional<OperandBundleUse> Bundle =
5419 I.getOperandBundle(LLVMContext::OB_deactivation_symbol)) {
5420 auto *Sym = Bundle->Inputs[0].get();
5421 SDValue SDSym = getValue(Sym);
5422 SDSym = DAG.getDeactivationSymbol(cast<GlobalValue>(Sym));
5423 Ops.push_back(SDSym);
5424 }
5425
5426 if (std::optional<OperandBundleUse> Bundle =
5427 I.getOperandBundle(LLVMContext::OB_convergencectrl)) {
5428 Value *Token = Bundle->Inputs[0].get();
5429 SDValue ConvControlToken = getValue(Token);
5430 assert(Ops.back().getValueType() != MVT::Glue &&
5431 "Did not expect another glue node here.");
5432 ConvControlToken =
5433 DAG.getNode(ISD::CONVERGENCECTRL_GLUE, {}, MVT::Glue, ConvControlToken);
5434 Ops.push_back(ConvControlToken);
5435 }
5436
5437 return Ops;
5438}
5439
5440SDVTList SelectionDAGBuilder::getTargetIntrinsicVTList(const CallBase &I,
5441 bool HasChain) {
5442 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5443
5444 SmallVector<EVT, 4> ValueVTs;
5445 ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);
5446
5447 if (HasChain)
5448 ValueVTs.push_back(MVT::Other);
5449
5450 return DAG.getVTList(ValueVTs);
5451}
5452
5453/// Get an INTRINSIC node for a target intrinsic which does not touch memory.
5454SDValue SelectionDAGBuilder::getTargetNonMemIntrinsicNode(
5455 const Type &IntrinsicVT, bool HasChain, ArrayRef<SDValue> Ops,
5456 const SDVTList &VTs) {
5457 if (!HasChain)
5458 return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, getCurSDLoc(), VTs, Ops);
5459 if (!IntrinsicVT.isVoidTy())
5460 return DAG.getNode(ISD::INTRINSIC_W_CHAIN, getCurSDLoc(), VTs, Ops);
5461 return DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops);
5462}
5463
5464/// Set root, convert return type if necessary and check alignment.
5465SDValue SelectionDAGBuilder::handleTargetIntrinsicRet(const CallBase &I,
5466 bool HasChain,
5467 bool OnlyLoad,
5468 SDValue Result) {
5469 if (HasChain) {
5470 SDValue Chain = Result.getValue(Result.getNode()->getNumValues() - 1);
5471 if (OnlyLoad)
5472 PendingLoads.push_back(Chain);
5473 else
5474 DAG.setRoot(Chain);
5475 }
5476
5477 if (I.getType()->isVoidTy())
5478 return Result;
5479
5480 if (MaybeAlign Alignment = I.getRetAlign(); InsertAssertAlign && Alignment) {
5481 // Insert `assertalign` node if there's an alignment.
5482 Result = DAG.getAssertAlign(getCurSDLoc(), Result, Alignment.valueOrOne());
5483 } else if (!isa<VectorType>(I.getType())) {
5484 Result = lowerRangeToAssertZExt(DAG, I, Result);
5485 }
5486
5487 return Result;
5488}
5489
5490/// visitTargetIntrinsic - Lower a call of a target intrinsic to an INTRINSIC
5491/// node.
5492void SelectionDAGBuilder::visitTargetIntrinsic(const CallInst &I,
5493 unsigned Intrinsic) {
5494 auto [HasChain, OnlyLoad] = getTargetIntrinsicCallProperties(I);
5495
5496 // Infos is set by getTgtMemIntrinsic.
5498 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5499 TLI.getTgtMemIntrinsic(Infos, I, DAG.getMachineFunction(), Intrinsic);
5500 // Use the first (primary) info determines the node opcode.
5501 TargetLowering::IntrinsicInfo *Info = !Infos.empty() ? &Infos[0] : nullptr;
5502
5504 getTargetIntrinsicOperands(I, HasChain, OnlyLoad, Info);
5505 SDVTList VTs = getTargetIntrinsicVTList(I, HasChain);
5506
5507 // Propagate fast-math-flags from IR to node(s).
5508 SDNodeFlags Flags;
5509 if (auto *FPMO = dyn_cast<FPMathOperator>(&I))
5510 Flags.copyFMF(*FPMO);
5511 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
5512
5513 // Create the node.
5515
5516 // In some cases, custom collection of operands from CallInst I may be needed.
5518 if (!Infos.empty()) {
5519 // This is target intrinsic that touches memory
5520 // Create MachineMemOperands for each memory access described by the target.
5521 MachineFunction &MF = DAG.getMachineFunction();
5523 for (const auto &Info : Infos) {
5524 // TODO: We currently just fallback to address space 0 if
5525 // getTgtMemIntrinsic didn't yield anything useful.
5526 MachinePointerInfo MPI;
5527 if (Info.ptrVal)
5528 MPI = MachinePointerInfo(Info.ptrVal, Info.offset);
5529 else if (Info.fallbackAddressSpace)
5530 MPI = MachinePointerInfo(*Info.fallbackAddressSpace);
5531 EVT MemVT = Info.memVT;
5532 LocationSize Size = LocationSize::precise(Info.size);
5533 if (Size.hasValue() && !Size.getValue())
5535 Align Alignment = Info.align.value_or(DAG.getEVTAlign(MemVT));
5536 MachineMemOperand *MMO = MF.getMachineMemOperand(
5537 MPI, Info.flags, Size, Alignment, I.getAAMetadata(),
5538 /*Ranges=*/nullptr, Info.ssid, Info.order, Info.failureOrder);
5539 MMOs.push_back(MMO);
5540 }
5541
5542 Result = DAG.getMemIntrinsicNode(Info->opc, getCurSDLoc(), VTs, Ops,
5543 Info->memVT, MMOs);
5544 } else {
5545 Result = getTargetNonMemIntrinsicNode(*I.getType(), HasChain, Ops, VTs);
5546 }
5547
5548 Result = handleTargetIntrinsicRet(I, HasChain, OnlyLoad, Result);
5549
5550 setValue(&I, Result);
5551}
5552
5553/// GetSignificand - Get the significand and build it into a floating-point
5554/// number with exponent of 1:
5555///
5556/// Op = (Op & 0x007fffff) | 0x3f800000;
5557///
5558/// where Op is the hexadecimal representation of floating point value.
5560 SDValue t1 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
5561 DAG.getConstant(0x007fffff, dl, MVT::i32));
5562 SDValue t2 = DAG.getNode(ISD::OR, dl, MVT::i32, t1,
5563 DAG.getConstant(0x3f800000, dl, MVT::i32));
5564 return DAG.getNode(ISD::BITCAST, dl, MVT::f32, t2);
5565}
5566
5567/// GetExponent - Get the exponent:
5568///
5569/// (float)(int)(((Op & 0x7f800000) >> 23) - 127);
5570///
5571/// where Op is the hexadecimal representation of floating point value.
5573 const TargetLowering &TLI, const SDLoc &dl) {
5574 SDValue t0 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
5575 DAG.getConstant(0x7f800000, dl, MVT::i32));
5576 SDValue t1 = DAG.getNode(ISD::SRL, dl, MVT::i32, t0,
5577 DAG.getShiftAmountConstant(23, MVT::i32, dl));
5578 SDValue t2 = DAG.getNode(ISD::SUB, dl, MVT::i32, t1,
5579 DAG.getConstant(127, dl, MVT::i32));
5580 return DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, t2);
5581}
5582
5583/// getF32Constant - Get 32-bit floating point constant.
5584static SDValue getF32Constant(SelectionDAG &DAG, unsigned Flt,
5585 const SDLoc &dl) {
5586 return DAG.getConstantFP(APFloat(APFloat::IEEEsingle(), APInt(32, Flt)), dl,
5587 MVT::f32);
5588}
5589
5591 SelectionDAG &DAG) {
5592 // TODO: What fast-math-flags should be set on the floating-point nodes?
5593
5594 // IntegerPartOfX = ((int32_t)(t0);
5595 SDValue IntegerPartOfX = DAG.getNode(ISD::FP_TO_SINT, dl, MVT::i32, t0);
5596
5597 // FractionalPartOfX = t0 - (float)IntegerPartOfX;
5598 SDValue t1 = DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, IntegerPartOfX);
5599 SDValue X = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0, t1);
5600
5601 // IntegerPartOfX <<= 23;
5602 IntegerPartOfX = DAG.getNode(ISD::SHL, dl, MVT::i32, IntegerPartOfX,
5603 DAG.getShiftAmountConstant(23, MVT::i32, dl));
5604
5605 SDValue TwoToFractionalPartOfX;
5606 if (LimitFloatPrecision <= 6) {
5607 // For floating-point precision of 6:
5608 //
5609 // TwoToFractionalPartOfX =
5610 // 0.997535578f +
5611 // (0.735607626f + 0.252464424f * x) * x;
5612 //
5613 // error 0.0144103317, which is 6 bits
5614 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5615 getF32Constant(DAG, 0x3e814304, dl));
5616 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5617 getF32Constant(DAG, 0x3f3c50c8, dl));
5618 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5619 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5620 getF32Constant(DAG, 0x3f7f5e7e, dl));
5621 } else if (LimitFloatPrecision <= 12) {
5622 // For floating-point precision of 12:
5623 //
5624 // TwoToFractionalPartOfX =
5625 // 0.999892986f +
5626 // (0.696457318f +
5627 // (0.224338339f + 0.792043434e-1f * x) * x) * x;
5628 //
5629 // error 0.000107046256, which is 13 to 14 bits
5630 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5631 getF32Constant(DAG, 0x3da235e3, dl));
5632 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5633 getF32Constant(DAG, 0x3e65b8f3, dl));
5634 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5635 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5636 getF32Constant(DAG, 0x3f324b07, dl));
5637 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5638 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5639 getF32Constant(DAG, 0x3f7ff8fd, dl));
5640 } else { // LimitFloatPrecision <= 18
5641 // For floating-point precision of 18:
5642 //
5643 // TwoToFractionalPartOfX =
5644 // 0.999999982f +
5645 // (0.693148872f +
5646 // (0.240227044f +
5647 // (0.554906021e-1f +
5648 // (0.961591928e-2f +
5649 // (0.136028312e-2f + 0.157059148e-3f *x)*x)*x)*x)*x)*x;
5650 // error 2.47208000*10^(-7), which is better than 18 bits
5651 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5652 getF32Constant(DAG, 0x3924b03e, dl));
5653 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5654 getF32Constant(DAG, 0x3ab24b87, dl));
5655 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5656 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5657 getF32Constant(DAG, 0x3c1d8c17, dl));
5658 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5659 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5660 getF32Constant(DAG, 0x3d634a1d, dl));
5661 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5662 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5663 getF32Constant(DAG, 0x3e75fe14, dl));
5664 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5665 SDValue t11 = DAG.getNode(ISD::FADD, dl, MVT::f32, t10,
5666 getF32Constant(DAG, 0x3f317234, dl));
5667 SDValue t12 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t11, X);
5668 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t12,
5669 getF32Constant(DAG, 0x3f800000, dl));
5670 }
5671
5672 // Add the exponent into the result in integer domain.
5673 SDValue t13 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, TwoToFractionalPartOfX);
5674 return DAG.getNode(ISD::BITCAST, dl, MVT::f32,
5675 DAG.getNode(ISD::ADD, dl, MVT::i32, t13, IntegerPartOfX));
5676}
5677
5678/// expandExp - Lower an exp intrinsic. Handles the special sequences for
5679/// limited-precision mode.
5681 const TargetLowering &TLI, SDNodeFlags Flags) {
5682 if (Op.getValueType() == MVT::f32 &&
5684
5685 // Put the exponent in the right bit position for later addition to the
5686 // final result:
5687 //
5688 // t0 = Op * log2(e)
5689
5690 // TODO: What fast-math-flags should be set here?
5691 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, Op,
5692 DAG.getConstantFP(numbers::log2ef, dl, MVT::f32));
5693 return getLimitedPrecisionExp2(t0, dl, DAG);
5694 }
5695
5696 // No special expansion.
5697 return DAG.getNode(ISD::FEXP, dl, Op.getValueType(), Op, Flags);
5698}
5699
5700/// expandLog - Lower a log intrinsic. Handles the special sequences for
5701/// limited-precision mode.
5703 const TargetLowering &TLI, SDNodeFlags Flags) {
5704 // TODO: What fast-math-flags should be set on the floating-point nodes?
5705
5706 if (Op.getValueType() == MVT::f32 &&
5708 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5709
5710 // Scale the exponent by log(2).
5711 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5712 SDValue LogOfExponent =
5713 DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5714 DAG.getConstantFP(numbers::ln2f, dl, MVT::f32));
5715
5716 // Get the significand and build it into a floating-point number with
5717 // exponent of 1.
5718 SDValue X = GetSignificand(DAG, Op1, dl);
5719
5720 SDValue LogOfMantissa;
5721 if (LimitFloatPrecision <= 6) {
5722 // For floating-point precision of 6:
5723 //
5724 // LogofMantissa =
5725 // -1.1609546f +
5726 // (1.4034025f - 0.23903021f * x) * x;
5727 //
5728 // error 0.0034276066, which is better than 8 bits
5729 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5730 getF32Constant(DAG, 0xbe74c456, dl));
5731 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5732 getF32Constant(DAG, 0x3fb3a2b1, dl));
5733 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5734 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5735 getF32Constant(DAG, 0x3f949a29, dl));
5736 } else if (LimitFloatPrecision <= 12) {
5737 // For floating-point precision of 12:
5738 //
5739 // LogOfMantissa =
5740 // -1.7417939f +
5741 // (2.8212026f +
5742 // (-1.4699568f +
5743 // (0.44717955f - 0.56570851e-1f * x) * x) * x) * x;
5744 //
5745 // error 0.000061011436, which is 14 bits
5746 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5747 getF32Constant(DAG, 0xbd67b6d6, dl));
5748 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5749 getF32Constant(DAG, 0x3ee4f4b8, dl));
5750 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5751 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5752 getF32Constant(DAG, 0x3fbc278b, dl));
5753 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5754 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5755 getF32Constant(DAG, 0x40348e95, dl));
5756 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5757 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5758 getF32Constant(DAG, 0x3fdef31a, dl));
5759 } else { // LimitFloatPrecision <= 18
5760 // For floating-point precision of 18:
5761 //
5762 // LogOfMantissa =
5763 // -2.1072184f +
5764 // (4.2372794f +
5765 // (-3.7029485f +
5766 // (2.2781945f +
5767 // (-0.87823314f +
5768 // (0.19073739f - 0.17809712e-1f * x) * x) * x) * x) * x)*x;
5769 //
5770 // error 0.0000023660568, which is better than 18 bits
5771 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5772 getF32Constant(DAG, 0xbc91e5ac, dl));
5773 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5774 getF32Constant(DAG, 0x3e4350aa, dl));
5775 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5776 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5777 getF32Constant(DAG, 0x3f60d3e3, dl));
5778 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5779 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5780 getF32Constant(DAG, 0x4011cdf0, dl));
5781 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5782 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5783 getF32Constant(DAG, 0x406cfd1c, dl));
5784 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5785 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5786 getF32Constant(DAG, 0x408797cb, dl));
5787 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5788 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t10,
5789 getF32Constant(DAG, 0x4006dcab, dl));
5790 }
5791
5792 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, LogOfMantissa);
5793 }
5794
5795 // No special expansion.
5796 return DAG.getNode(ISD::FLOG, dl, Op.getValueType(), Op, Flags);
5797}
5798
5799/// expandLog2 - Lower a log2 intrinsic. Handles the special sequences for
5800/// limited-precision mode.
5802 const TargetLowering &TLI, SDNodeFlags Flags) {
5803 // TODO: What fast-math-flags should be set on the floating-point nodes?
5804
5805 if (Op.getValueType() == MVT::f32 &&
5807 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5808
5809 // Get the exponent.
5810 SDValue LogOfExponent = GetExponent(DAG, Op1, TLI, dl);
5811
5812 // Get the significand and build it into a floating-point number with
5813 // exponent of 1.
5814 SDValue X = GetSignificand(DAG, Op1, dl);
5815
5816 // Different possible minimax approximations of significand in
5817 // floating-point for various degrees of accuracy over [1,2].
5818 SDValue Log2ofMantissa;
5819 if (LimitFloatPrecision <= 6) {
5820 // For floating-point precision of 6:
5821 //
5822 // Log2ofMantissa = -1.6749035f + (2.0246817f - .34484768f * x) * x;
5823 //
5824 // error 0.0049451742, which is more than 7 bits
5825 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5826 getF32Constant(DAG, 0xbeb08fe0, dl));
5827 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5828 getF32Constant(DAG, 0x40019463, dl));
5829 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5830 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5831 getF32Constant(DAG, 0x3fd6633d, dl));
5832 } else if (LimitFloatPrecision <= 12) {
5833 // For floating-point precision of 12:
5834 //
5835 // Log2ofMantissa =
5836 // -2.51285454f +
5837 // (4.07009056f +
5838 // (-2.12067489f +
5839 // (.645142248f - 0.816157886e-1f * x) * x) * x) * x;
5840 //
5841 // error 0.0000876136000, which is better than 13 bits
5842 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5843 getF32Constant(DAG, 0xbda7262e, dl));
5844 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5845 getF32Constant(DAG, 0x3f25280b, dl));
5846 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5847 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5848 getF32Constant(DAG, 0x4007b923, dl));
5849 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5850 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5851 getF32Constant(DAG, 0x40823e2f, dl));
5852 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5853 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5854 getF32Constant(DAG, 0x4020d29c, dl));
5855 } else { // LimitFloatPrecision <= 18
5856 // For floating-point precision of 18:
5857 //
5858 // Log2ofMantissa =
5859 // -3.0400495f +
5860 // (6.1129976f +
5861 // (-5.3420409f +
5862 // (3.2865683f +
5863 // (-1.2669343f +
5864 // (0.27515199f -
5865 // 0.25691327e-1f * x) * x) * x) * x) * x) * x;
5866 //
5867 // error 0.0000018516, which is better than 18 bits
5868 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5869 getF32Constant(DAG, 0xbcd2769e, dl));
5870 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5871 getF32Constant(DAG, 0x3e8ce0b9, dl));
5872 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5873 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5874 getF32Constant(DAG, 0x3fa22ae7, dl));
5875 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5876 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5877 getF32Constant(DAG, 0x40525723, dl));
5878 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5879 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5880 getF32Constant(DAG, 0x40aaf200, dl));
5881 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5882 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5883 getF32Constant(DAG, 0x40c39dad, dl));
5884 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5885 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t10,
5886 getF32Constant(DAG, 0x4042902c, dl));
5887 }
5888
5889 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, Log2ofMantissa);
5890 }
5891
5892 // No special expansion.
5893 return DAG.getNode(ISD::FLOG2, dl, Op.getValueType(), Op, Flags);
5894}
5895
5896/// expandLog10 - Lower a log10 intrinsic. Handles the special sequences for
5897/// limited-precision mode.
5899 const TargetLowering &TLI, SDNodeFlags Flags) {
5900 // TODO: What fast-math-flags should be set on the floating-point nodes?
5901
5902 if (Op.getValueType() == MVT::f32 &&
5904 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5905
5906 // Scale the exponent by log10(2) [0.30102999f].
5907 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5908 SDValue LogOfExponent = DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5909 getF32Constant(DAG, 0x3e9a209a, dl));
5910
5911 // Get the significand and build it into a floating-point number with
5912 // exponent of 1.
5913 SDValue X = GetSignificand(DAG, Op1, dl);
5914
5915 SDValue Log10ofMantissa;
5916 if (LimitFloatPrecision <= 6) {
5917 // For floating-point precision of 6:
5918 //
5919 // Log10ofMantissa =
5920 // -0.50419619f +
5921 // (0.60948995f - 0.10380950f * x) * x;
5922 //
5923 // error 0.0014886165, which is 6 bits
5924 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5925 getF32Constant(DAG, 0xbdd49a13, dl));
5926 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5927 getF32Constant(DAG, 0x3f1c0789, dl));
5928 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5929 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5930 getF32Constant(DAG, 0x3f011300, dl));
5931 } else if (LimitFloatPrecision <= 12) {
5932 // For floating-point precision of 12:
5933 //
5934 // Log10ofMantissa =
5935 // -0.64831180f +
5936 // (0.91751397f +
5937 // (-0.31664806f + 0.47637168e-1f * x) * x) * x;
5938 //
5939 // error 0.00019228036, which is better than 12 bits
5940 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5941 getF32Constant(DAG, 0x3d431f31, dl));
5942 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
5943 getF32Constant(DAG, 0x3ea21fb2, dl));
5944 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5945 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5946 getF32Constant(DAG, 0x3f6ae232, dl));
5947 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5948 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
5949 getF32Constant(DAG, 0x3f25f7c3, dl));
5950 } else { // LimitFloatPrecision <= 18
5951 // For floating-point precision of 18:
5952 //
5953 // Log10ofMantissa =
5954 // -0.84299375f +
5955 // (1.5327582f +
5956 // (-1.0688956f +
5957 // (0.49102474f +
5958 // (-0.12539807f + 0.13508273e-1f * x) * x) * x) * x) * x;
5959 //
5960 // error 0.0000037995730, which is better than 18 bits
5961 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5962 getF32Constant(DAG, 0x3c5d51ce, dl));
5963 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
5964 getF32Constant(DAG, 0x3e00685a, dl));
5965 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5966 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5967 getF32Constant(DAG, 0x3efb6798, dl));
5968 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5969 SDValue t5 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
5970 getF32Constant(DAG, 0x3f88d192, dl));
5971 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5972 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5973 getF32Constant(DAG, 0x3fc4316c, dl));
5974 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5975 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t8,
5976 getF32Constant(DAG, 0x3f57ce70, dl));
5977 }
5978
5979 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, Log10ofMantissa);
5980 }
5981
5982 // No special expansion.
5983 return DAG.getNode(ISD::FLOG10, dl, Op.getValueType(), Op, Flags);
5984}
5985
5986/// expandExp2 - Lower an exp2 intrinsic. Handles the special sequences for
5987/// limited-precision mode.
5989 const TargetLowering &TLI, SDNodeFlags Flags) {
5990 if (Op.getValueType() == MVT::f32 &&
5992 return getLimitedPrecisionExp2(Op, dl, DAG);
5993
5994 // No special expansion.
5995 return DAG.getNode(ISD::FEXP2, dl, Op.getValueType(), Op, Flags);
5996}
5997
5998/// visitPow - Lower a pow intrinsic. Handles the special sequences for
5999/// limited-precision mode with x == 10.0f.
6001 SelectionDAG &DAG, const TargetLowering &TLI,
6002 SDNodeFlags Flags) {
6003 bool IsExp10 = false;
6004 if (LHS.getValueType() == MVT::f32 && RHS.getValueType() == MVT::f32 &&
6007 APFloat Ten(10.0f);
6008 IsExp10 = LHSC->isExactlyValue(Ten);
6009 }
6010 }
6011
6012 // TODO: What fast-math-flags should be set on the FMUL node?
6013 if (IsExp10) {
6014 // Put the exponent in the right bit position for later addition to the
6015 // final result:
6016 //
6017 // #define LOG2OF10 3.3219281f
6018 // t0 = Op * LOG2OF10;
6019 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, RHS,
6020 getF32Constant(DAG, 0x40549a78, dl));
6021 return getLimitedPrecisionExp2(t0, dl, DAG);
6022 }
6023
6024 // No special expansion.
6025 return DAG.getNode(ISD::FPOW, dl, LHS.getValueType(), LHS, RHS, Flags);
6026}
6027
6028/// ExpandPowI - Expand a llvm.powi intrinsic.
6030 SelectionDAG &DAG) {
6031 // If RHS is a constant, we can expand this out to a multiplication tree if
6032 // it's beneficial on the target, otherwise we end up lowering to a call to
6033 // __powidf2 (for example).
6035 unsigned Val = RHSC->getSExtValue();
6036
6037 // powi(x, 0) -> 1.0
6038 if (Val == 0)
6039 return DAG.getConstantFP(1.0, DL, LHS.getValueType());
6040
6042 Val, DAG.shouldOptForSize())) {
6043 // Get the exponent as a positive value.
6044 if ((int)Val < 0)
6045 Val = -Val;
6046 // We use the simple binary decomposition method to generate the multiply
6047 // sequence. There are more optimal ways to do this (for example,
6048 // powi(x,15) generates one more multiply than it should), but this has
6049 // the benefit of being both really simple and much better than a libcall.
6050 SDValue Res; // Logically starts equal to 1.0
6051 SDValue CurSquare = LHS;
6052 // TODO: Intrinsics should have fast-math-flags that propagate to these
6053 // nodes.
6054 while (Val) {
6055 if (Val & 1) {
6056 if (Res.getNode())
6057 Res =
6058 DAG.getNode(ISD::FMUL, DL, Res.getValueType(), Res, CurSquare);
6059 else
6060 Res = CurSquare; // 1.0*CurSquare.
6061 }
6062
6063 CurSquare = DAG.getNode(ISD::FMUL, DL, CurSquare.getValueType(),
6064 CurSquare, CurSquare);
6065 Val >>= 1;
6066 }
6067
6068 // If the original was negative, invert the result, producing 1/(x*x*x).
6069 if (RHSC->getSExtValue() < 0)
6070 Res = DAG.getNode(ISD::FDIV, DL, LHS.getValueType(),
6071 DAG.getConstantFP(1.0, DL, LHS.getValueType()), Res);
6072 return Res;
6073 }
6074 }
6075
6076 // Otherwise, expand to a libcall.
6077 return DAG.getNode(ISD::FPOWI, DL, LHS.getValueType(), LHS, RHS);
6078}
6079
6080static SDValue expandDivFix(unsigned Opcode, const SDLoc &DL,
6081 SDValue LHS, SDValue RHS, SDValue Scale,
6082 SelectionDAG &DAG, const TargetLowering &TLI) {
6083 EVT VT = LHS.getValueType();
6084 bool Signed = Opcode == ISD::SDIVFIX || Opcode == ISD::SDIVFIXSAT;
6085 bool Saturating = Opcode == ISD::SDIVFIXSAT || Opcode == ISD::UDIVFIXSAT;
6086 LLVMContext &Ctx = *DAG.getContext();
6087
6088 // If the type is legal but the operation isn't, this node might survive all
6089 // the way to operation legalization. If we end up there and we do not have
6090 // the ability to widen the type (if VT*2 is not legal), we cannot expand the
6091 // node.
6092
6093 // Coax the legalizer into expanding the node during type legalization instead
6094 // by bumping the size by one bit. This will force it to Promote, enabling the
6095 // early expansion and avoiding the need to expand later.
6096
6097 // We don't have to do this if Scale is 0; that can always be expanded, unless
6098 // it's a saturating signed operation. Those can experience true integer
6099 // division overflow, a case which we must avoid.
6100
6101 // FIXME: We wouldn't have to do this (or any of the early
6102 // expansion/promotion) if it was possible to expand a libcall of an
6103 // illegal type during operation legalization. But it's not, so things
6104 // get a bit hacky.
6105 unsigned ScaleInt = Scale->getAsZExtVal();
6106 if ((ScaleInt > 0 || (Saturating && Signed)) &&
6107 (TLI.isTypeLegal(VT) ||
6108 (VT.isVector() && TLI.isTypeLegal(VT.getVectorElementType())))) {
6110 Opcode, VT, ScaleInt);
6111 if (Action != TargetLowering::Legal && Action != TargetLowering::Custom) {
6112 EVT PromVT;
6113 if (VT.isScalarInteger())
6114 PromVT = EVT::getIntegerVT(Ctx, VT.getSizeInBits() + 1);
6115 else if (VT.isVector()) {
6116 PromVT = VT.getVectorElementType();
6117 PromVT = EVT::getIntegerVT(Ctx, PromVT.getSizeInBits() + 1);
6118 PromVT = EVT::getVectorVT(Ctx, PromVT, VT.getVectorElementCount());
6119 } else
6120 llvm_unreachable("Wrong VT for DIVFIX?");
6121 LHS = DAG.getExtOrTrunc(Signed, LHS, DL, PromVT);
6122 RHS = DAG.getExtOrTrunc(Signed, RHS, DL, PromVT);
6123 EVT ShiftTy = TLI.getShiftAmountTy(PromVT, DAG.getDataLayout());
6124 // For saturating operations, we need to shift up the LHS to get the
6125 // proper saturation width, and then shift down again afterwards.
6126 if (Saturating)
6127 LHS = DAG.getNode(ISD::SHL, DL, PromVT, LHS,
6128 DAG.getConstant(1, DL, ShiftTy));
6129 SDValue Res = DAG.getNode(Opcode, DL, PromVT, LHS, RHS, Scale);
6130 if (Saturating)
6131 Res = DAG.getNode(Signed ? ISD::SRA : ISD::SRL, DL, PromVT, Res,
6132 DAG.getConstant(1, DL, ShiftTy));
6133 return DAG.getZExtOrTrunc(Res, DL, VT);
6134 }
6135 }
6136
6137 return DAG.getNode(Opcode, DL, VT, LHS, RHS, Scale);
6138}
6139
6140// getUnderlyingArgRegs - Find underlying registers used for a truncated,
6141// bitcasted, or split argument. Returns a list of <Register, size in bits>
6142static void
6143getUnderlyingArgRegs(SmallVectorImpl<std::pair<Register, TypeSize>> &Regs,
6144 const SDValue &N) {
6145 switch (N.getOpcode()) {
6146 case ISD::CopyFromReg: {
6147 SDValue Op = N.getOperand(1);
6148 Regs.emplace_back(cast<RegisterSDNode>(Op)->getReg(),
6149 Op.getValueType().getSizeInBits());
6150 return;
6151 }
6152 case ISD::BITCAST:
6153 case ISD::AssertZext:
6154 case ISD::AssertSext:
6155 case ISD::TRUNCATE:
6156 getUnderlyingArgRegs(Regs, N.getOperand(0));
6157 return;
6158 case ISD::BUILD_PAIR:
6159 case ISD::BUILD_VECTOR:
6161 for (SDValue Op : N->op_values())
6162 getUnderlyingArgRegs(Regs, Op);
6163 return;
6164 default:
6165 return;
6166 }
6167}
6168
6169/// If the DbgValueInst is a dbg_value of a function argument, create the
6170/// corresponding DBG_VALUE machine instruction for it now. At the end of
6171/// instruction selection, they will be inserted to the entry BB.
6172/// We don't currently support this for variadic dbg_values, as they shouldn't
6173/// appear for function arguments or in the prologue.
6174bool SelectionDAGBuilder::EmitFuncArgumentDbgValue(
6175 const Value *V, DILocalVariable *Variable, DIExpression *Expr,
6176 DILocation *DL, FuncArgumentDbgValueKind Kind, const SDValue &N) {
6177 const Argument *Arg = dyn_cast<Argument>(V);
6178 if (!Arg)
6179 return false;
6180
6181 MachineFunction &MF = DAG.getMachineFunction();
6182 const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo();
6183
6184 // Helper to create DBG_INSTR_REFs or DBG_VALUEs, depending on what kind
6185 // we've been asked to pursue.
6186 auto MakeVRegDbgValue = [&](Register Reg, DIExpression *FragExpr,
6187 bool Indirect) {
6188 if (Reg.isVirtual() && MF.useDebugInstrRef()) {
6189 // For VRegs, in instruction referencing mode, create a DBG_INSTR_REF
6190 // pointing at the VReg, which will be patched up later.
6191 auto &Inst = TII->get(TargetOpcode::DBG_INSTR_REF);
6193 /* Reg */ Reg, /* isDef */ false, /* isImp */ false,
6194 /* isKill */ false, /* isDead */ false,
6195 /* isUndef */ false, /* isEarlyClobber */ false,
6196 /* SubReg */ 0, /* isDebug */ true)});
6197
6198 auto *NewDIExpr = FragExpr;
6199 // We don't have an "Indirect" field in DBG_INSTR_REF, fold that into
6200 // the DIExpression.
6201 if (Indirect)
6202 NewDIExpr = DIExpression::prepend(FragExpr, DIExpression::DerefBefore);
6204 NewDIExpr = DIExpression::prependOpcodes(NewDIExpr, Ops);
6205 return BuildMI(MF, DL, Inst, false, MOs, Variable, NewDIExpr);
6206 } else {
6207 // Create a completely standard DBG_VALUE.
6208 auto &Inst = TII->get(TargetOpcode::DBG_VALUE);
6209 return BuildMI(MF, DL, Inst, Indirect, Reg, Variable, FragExpr);
6210 }
6211 };
6212
6213 if (Kind == FuncArgumentDbgValueKind::Value) {
6214 // ArgDbgValues are hoisted to the beginning of the entry block. So we
6215 // should only emit as ArgDbgValue if the dbg.value intrinsic is found in
6216 // the entry block.
6217 bool IsInEntryBlock = FuncInfo.MBB == &FuncInfo.MF->front();
6218 if (!IsInEntryBlock)
6219 return false;
6220
6221 // ArgDbgValues are hoisted to the beginning of the entry block. So we
6222 // should only emit as ArgDbgValue if the dbg.value intrinsic describes a
6223 // variable that also is a param.
6224 //
6225 // Although, if we are at the top of the entry block already, we can still
6226 // emit using ArgDbgValue. This might catch some situations when the
6227 // dbg.value refers to an argument that isn't used in the entry block, so
6228 // any CopyToReg node would be optimized out and the only way to express
6229 // this DBG_VALUE is by using the physical reg (or FI) as done in this
6230 // method. ArgDbgValues are hoisted to the beginning of the entry block. So
6231 // we should only emit as ArgDbgValue if the Variable is an argument to the
6232 // current function, and the dbg.value intrinsic is found in the entry
6233 // block.
6234 bool VariableIsFunctionInputArg = Variable->isParameter() &&
6235 !DL->getInlinedAt();
6236 bool IsInPrologue = SDNodeOrder == LowestSDNodeOrder;
6237 if (!IsInPrologue && !VariableIsFunctionInputArg)
6238 return false;
6239
6240 // Here we assume that a function argument on IR level only can be used to
6241 // describe one input parameter on source level. If we for example have
6242 // source code like this
6243 //
6244 // struct A { long x, y; };
6245 // void foo(struct A a, long b) {
6246 // ...
6247 // b = a.x;
6248 // ...
6249 // }
6250 //
6251 // and IR like this
6252 //
6253 // define void @foo(i32 %a1, i32 %a2, i32 %b) {
6254 // entry:
6255 // call void @llvm.dbg.value(metadata i32 %a1, "a", DW_OP_LLVM_fragment
6256 // call void @llvm.dbg.value(metadata i32 %a2, "a", DW_OP_LLVM_fragment
6257 // call void @llvm.dbg.value(metadata i32 %b, "b",
6258 // ...
6259 // call void @llvm.dbg.value(metadata i32 %a1, "b"
6260 // ...
6261 //
6262 // then the last dbg.value is describing a parameter "b" using a value that
6263 // is an argument. But since we already has used %a1 to describe a parameter
6264 // we should not handle that last dbg.value here (that would result in an
6265 // incorrect hoisting of the DBG_VALUE to the function entry).
6266 // Notice that we allow one dbg.value per IR level argument, to accommodate
6267 // for the situation with fragments above.
6268 // If there is no node for the value being handled, we return true to skip
6269 // the normal generation of debug info, as it would kill existing debug
6270 // info for the parameter in case of duplicates.
6271 if (VariableIsFunctionInputArg) {
6272 unsigned ArgNo = Arg->getArgNo();
6273 if (ArgNo >= FuncInfo.DescribedArgs.size())
6274 FuncInfo.DescribedArgs.resize(ArgNo + 1, false);
6275 else if (!IsInPrologue && FuncInfo.DescribedArgs.test(ArgNo))
6276 return !NodeMap[V].getNode();
6277 FuncInfo.DescribedArgs.set(ArgNo);
6278 }
6279 }
6280
6281 bool IsIndirect = false;
6282 std::optional<MachineOperand> Op;
6283 // Some arguments' frame index is recorded during argument lowering.
6284 int FI = FuncInfo.getArgumentFrameIndex(Arg);
6285 if (FI != std::numeric_limits<int>::max())
6287
6289 if (!Op && N.getNode()) {
6290 getUnderlyingArgRegs(ArgRegsAndSizes, N);
6291 Register Reg;
6292 if (ArgRegsAndSizes.size() == 1)
6293 Reg = ArgRegsAndSizes.front().first;
6294
6295 if (Reg && Reg.isVirtual()) {
6296 MachineRegisterInfo &RegInfo = MF.getRegInfo();
6297 Register PR = RegInfo.getLiveInPhysReg(Reg);
6298 if (PR)
6299 Reg = PR;
6300 }
6301 if (Reg) {
6303 IsIndirect = Kind != FuncArgumentDbgValueKind::Value;
6304 }
6305 }
6306
6307 if (!Op && N.getNode()) {
6308 // Check if frame index is available.
6309 SDValue LCandidate = peekThroughBitcasts(N);
6310 if (LoadSDNode *LNode = dyn_cast<LoadSDNode>(LCandidate.getNode()))
6311 if (FrameIndexSDNode *FINode =
6312 dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
6313 Op = MachineOperand::CreateFI(FINode->getIndex());
6314 }
6315
6316 if (!Op) {
6317 // Create a DBG_VALUE for each decomposed value in ArgRegs to cover Reg
6318 auto splitMultiRegDbgValue =
6319 [&](ArrayRef<std::pair<Register, TypeSize>> SplitRegs) -> bool {
6320 unsigned Offset = 0;
6321 for (const auto &[Reg, RegSizeInBits] : SplitRegs) {
6322 // FIXME: Scalable sizes are not supported in fragment expressions.
6323 if (RegSizeInBits.isScalable())
6324 return false;
6325
6326 // If the expression is already a fragment, the current register
6327 // offset+size might extend beyond the fragment. In this case, only
6328 // the register bits that are inside the fragment are relevant.
6329 int RegFragmentSizeInBits = RegSizeInBits.getFixedValue();
6330 if (auto ExprFragmentInfo = Expr->getFragmentInfo()) {
6331 uint64_t ExprFragmentSizeInBits = ExprFragmentInfo->SizeInBits;
6332 // The register is entirely outside the expression fragment,
6333 // so is irrelevant for debug info.
6334 if (Offset >= ExprFragmentSizeInBits)
6335 break;
6336 // The register is partially outside the expression fragment, only
6337 // the low bits within the fragment are relevant for debug info.
6338 if (Offset + RegFragmentSizeInBits > ExprFragmentSizeInBits) {
6339 RegFragmentSizeInBits = ExprFragmentSizeInBits - Offset;
6340 }
6341 }
6342
6343 auto FragmentExpr = DIExpression::createFragmentExpression(
6344 Expr, Offset, RegFragmentSizeInBits);
6345 Offset += RegSizeInBits.getFixedValue();
6346 // If a valid fragment expression cannot be created, the variable's
6347 // correct value cannot be determined and so it is set as poison.
6348 if (!FragmentExpr) {
6349 SDDbgValue *SDV = DAG.getConstantDbgValue(
6350 Variable, Expr, PoisonValue::get(V->getType()), DL, SDNodeOrder);
6351 DAG.AddDbgValue(SDV, false);
6352 continue;
6353 }
6354 MachineInstr *NewMI = MakeVRegDbgValue(
6355 Reg, *FragmentExpr, Kind != FuncArgumentDbgValueKind::Value);
6356 FuncInfo.ArgDbgValues.push_back(NewMI);
6357 }
6358
6359 return true;
6360 };
6361
6362 // Check if ValueMap has reg number.
6364 VMI = FuncInfo.ValueMap.find(V);
6365 if (VMI != FuncInfo.ValueMap.end()) {
6366 const auto &TLI = DAG.getTargetLoweringInfo();
6367 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), VMI->second,
6368 V->getType(), std::nullopt);
6369 if (RFV.occupiesMultipleRegs())
6370 return splitMultiRegDbgValue(RFV.getRegsAndSizes());
6371
6372 Op = MachineOperand::CreateReg(VMI->second, false);
6373 IsIndirect = Kind != FuncArgumentDbgValueKind::Value;
6374 } else if (ArgRegsAndSizes.size() > 1) {
6375 // This was split due to the calling convention, and no virtual register
6376 // mapping exists for the value.
6377 return splitMultiRegDbgValue(ArgRegsAndSizes);
6378 }
6379 }
6380
6381 if (!Op)
6382 return false;
6383
6384 assert(Variable->isValidLocationForIntrinsic(DL) &&
6385 "Expected inlined-at fields to agree");
6386 MachineInstr *NewMI = nullptr;
6387
6388 if (Op->isReg())
6389 NewMI = MakeVRegDbgValue(Op->getReg(), Expr, IsIndirect);
6390 else
6391 NewMI = BuildMI(MF, DL, TII->get(TargetOpcode::DBG_VALUE), true, *Op,
6392 Variable, Expr);
6393
6394 // Otherwise, use ArgDbgValues.
6395 FuncInfo.ArgDbgValues.push_back(NewMI);
6396 return true;
6397}
6398
6399/// Return the appropriate SDDbgValue based on N.
6400SDDbgValue *SelectionDAGBuilder::getDbgValue(SDValue N,
6401 DILocalVariable *Variable,
6402 DIExpression *Expr,
6403 const DebugLoc &dl,
6404 unsigned DbgSDNodeOrder) {
6405 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(N.getNode())) {
6406 // Construct a FrameIndexDbgValue for FrameIndexSDNodes so we can describe
6407 // stack slot locations.
6408 //
6409 // Consider "int x = 0; int *px = &x;". There are two kinds of interesting
6410 // debug values here after optimization:
6411 //
6412 // dbg.value(i32* %px, !"int *px", !DIExpression()), and
6413 // dbg.value(i32* %px, !"int x", !DIExpression(DW_OP_deref))
6414 //
6415 // Both describe the direct values of their associated variables.
6416 return DAG.getFrameIndexDbgValue(Variable, Expr, FISDN->getIndex(),
6417 /*IsIndirect*/ false, dl, DbgSDNodeOrder);
6418 }
6419 return DAG.getDbgValue(Variable, Expr, N.getNode(), N.getResNo(),
6420 /*IsIndirect*/ false, dl, DbgSDNodeOrder);
6421}
6422
6423static unsigned FixedPointIntrinsicToOpcode(unsigned Intrinsic) {
6424 switch (Intrinsic) {
6425 case Intrinsic::smul_fix:
6426 return ISD::SMULFIX;
6427 case Intrinsic::umul_fix:
6428 return ISD::UMULFIX;
6429 case Intrinsic::smul_fix_sat:
6430 return ISD::SMULFIXSAT;
6431 case Intrinsic::umul_fix_sat:
6432 return ISD::UMULFIXSAT;
6433 case Intrinsic::sdiv_fix:
6434 return ISD::SDIVFIX;
6435 case Intrinsic::udiv_fix:
6436 return ISD::UDIVFIX;
6437 case Intrinsic::sdiv_fix_sat:
6438 return ISD::SDIVFIXSAT;
6439 case Intrinsic::udiv_fix_sat:
6440 return ISD::UDIVFIXSAT;
6441 default:
6442 llvm_unreachable("Unhandled fixed point intrinsic");
6443 }
6444}
6445
6446/// Given a @llvm.call.preallocated.setup, return the corresponding
6447/// preallocated call.
6448static const CallBase *FindPreallocatedCall(const Value *PreallocatedSetup) {
6449 assert(cast<CallBase>(PreallocatedSetup)
6451 ->getIntrinsicID() == Intrinsic::call_preallocated_setup &&
6452 "expected call_preallocated_setup Value");
6453 for (const auto *U : PreallocatedSetup->users()) {
6454 auto *UseCall = cast<CallBase>(U);
6455 const Function *Fn = UseCall->getCalledFunction();
6456 if (!Fn || Fn->getIntrinsicID() != Intrinsic::call_preallocated_arg) {
6457 return UseCall;
6458 }
6459 }
6460 llvm_unreachable("expected corresponding call to preallocated setup/arg");
6461}
6462
6463/// If DI is a debug value with an EntryValue expression, lower it using the
6464/// corresponding physical register of the associated Argument value
6465/// (guaranteed to exist by the verifier).
6466bool SelectionDAGBuilder::visitEntryValueDbgValue(
6467 ArrayRef<const Value *> Values, DILocalVariable *Variable,
6468 DIExpression *Expr, DebugLoc DbgLoc) {
6469 if (!Expr->isEntryValue() || !hasSingleElement(Values))
6470 return false;
6471
6472 // These properties are guaranteed by the verifier.
6473 const Argument *Arg = cast<Argument>(Values[0]);
6474 assert(Arg->hasAttribute(Attribute::AttrKind::SwiftAsync));
6475
6476 auto ArgIt = FuncInfo.ValueMap.find(Arg);
6477 if (ArgIt == FuncInfo.ValueMap.end()) {
6478 LLVM_DEBUG(
6479 dbgs() << "Dropping dbg.value: expression is entry_value but "
6480 "couldn't find an associated register for the Argument\n");
6481 return true;
6482 }
6483 Register ArgVReg = ArgIt->getSecond();
6484
6485 for (auto [PhysReg, VirtReg] : FuncInfo.RegInfo->liveins())
6486 if (ArgVReg == VirtReg || ArgVReg == PhysReg) {
6487 SDDbgValue *SDV = DAG.getVRegDbgValue(
6488 Variable, Expr, PhysReg, false /*IsIndidrect*/, DbgLoc, SDNodeOrder);
6489 DAG.AddDbgValue(SDV, false /*treat as dbg.declare byval parameter*/);
6490 return true;
6491 }
6492 LLVM_DEBUG(dbgs() << "Dropping dbg.value: expression is entry_value but "
6493 "couldn't find a physical register\n");
6494 return true;
6495}
6496
6497/// Lower the call to the specified intrinsic function.
6498void SelectionDAGBuilder::visitConvergenceControl(const CallInst &I,
6499 unsigned Intrinsic) {
6500 SDLoc sdl = getCurSDLoc();
6501 switch (Intrinsic) {
6502 case Intrinsic::experimental_convergence_anchor:
6503 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_ANCHOR, sdl, MVT::Untyped));
6504 break;
6505 case Intrinsic::experimental_convergence_entry:
6506 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_ENTRY, sdl, MVT::Untyped));
6507 break;
6508 case Intrinsic::experimental_convergence_loop: {
6509 auto Bundle = I.getOperandBundle(LLVMContext::OB_convergencectrl);
6510 auto *Token = Bundle->Inputs[0].get();
6511 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_LOOP, sdl, MVT::Untyped,
6512 getValue(Token)));
6513 break;
6514 }
6515 }
6516}
6517
6518void SelectionDAGBuilder::visitVectorHistogram(const CallInst &I,
6519 unsigned IntrinsicID) {
6520 // For now, we're only lowering an 'add' histogram.
6521 // We can add others later, e.g. saturating adds, min/max.
6522 assert(IntrinsicID == Intrinsic::experimental_vector_histogram_add &&
6523 "Tried to lower unsupported histogram type");
6524 SDLoc sdl = getCurSDLoc();
6525 Value *Ptr = I.getOperand(0);
6526 SDValue Inc = getValue(I.getOperand(1));
6527 SDValue Mask = getValue(I.getOperand(2));
6528
6529 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6530 DataLayout TargetDL = DAG.getDataLayout();
6531 EVT VT = Inc.getValueType();
6532 Align Alignment = DAG.getEVTAlign(VT);
6533
6534 const MDNode *Ranges = getRangeMetadata(I);
6535
6536 SDValue Root = DAG.getRoot();
6537 SDValue Base;
6538 SDValue Index;
6539 SDValue Scale;
6540 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
6541 I.getParent(), VT.getScalarStoreSize());
6542
6543 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
6544
6545 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
6546 MachinePointerInfo(AS),
6548 MemoryLocation::UnknownSize, Alignment, I.getAAMetadata(), Ranges);
6549
6550 if (!UniformBase) {
6551 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
6552 Index = getValue(Ptr);
6553 Scale =
6554 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
6555 }
6556
6557 EVT IdxVT = Index.getValueType();
6558
6559 // Avoid using e.g. i32 as index type when the increment must be performed
6560 // on i64's.
6561 bool MustExtendIndex = VT.getScalarSizeInBits() > IdxVT.getScalarSizeInBits();
6562 EVT EltTy = MustExtendIndex ? VT : IdxVT.getVectorElementType();
6563 if (MustExtendIndex || TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
6564 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
6565 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
6566 }
6567
6568 SDValue ID = DAG.getTargetConstant(IntrinsicID, sdl, MVT::i32);
6569
6570 SDValue Ops[] = {Root, Inc, Mask, Base, Index, Scale, ID};
6571 SDValue Histogram = DAG.getMaskedHistogram(DAG.getVTList(MVT::Other), VT, sdl,
6572 Ops, MMO, ISD::SIGNED_SCALED);
6573
6574 setValue(&I, Histogram);
6575 DAG.setRoot(Histogram);
6576}
6577
6578void SelectionDAGBuilder::visitVectorExtractLastActive(const CallInst &I,
6579 unsigned Intrinsic) {
6580 assert(Intrinsic == Intrinsic::experimental_vector_extract_last_active &&
6581 "Tried lowering invalid vector extract last");
6582 SDLoc sdl = getCurSDLoc();
6583 const DataLayout &Layout = DAG.getDataLayout();
6584 SDValue Data = getValue(I.getOperand(0));
6585 SDValue Mask = getValue(I.getOperand(1));
6586
6587 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6588 EVT ResVT = TLI.getValueType(Layout, I.getType());
6589
6590 EVT ExtVT = TLI.getVectorIdxTy(Layout);
6591 SDValue Idx = DAG.getNode(ISD::VECTOR_FIND_LAST_ACTIVE, sdl, ExtVT, Mask);
6592 SDValue Result = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, sdl, ResVT, Data, Idx);
6593
6594 Value *Default = I.getOperand(2);
6596 SDValue PassThru = getValue(Default);
6597 EVT BoolVT = Mask.getValueType().getScalarType();
6598 SDValue AnyActive = DAG.getNode(ISD::VECREDUCE_OR, sdl, BoolVT, Mask);
6599 Result = DAG.getSelect(sdl, ResVT, AnyActive, Result, PassThru);
6600 }
6601
6602 setValue(&I, Result);
6603}
6604
6605/// Lower the call to the specified intrinsic function.
6606void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
6607 unsigned Intrinsic) {
6608 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6609 SDLoc sdl = getCurSDLoc();
6610 DebugLoc dl = getCurDebugLoc();
6611 SDValue Res;
6612
6613 SDNodeFlags Flags;
6614 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
6615 Flags.copyFMF(*FPOp);
6616
6617 switch (Intrinsic) {
6618 default:
6619 // By default, turn this into a target intrinsic node.
6620 visitTargetIntrinsic(I, Intrinsic);
6621 return;
6622 case Intrinsic::vscale: {
6623 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6624 setValue(&I, DAG.getVScale(sdl, VT, APInt(VT.getSizeInBits(), 1)));
6625 return;
6626 }
6627 case Intrinsic::vastart: visitVAStart(I); return;
6628 case Intrinsic::vaend: visitVAEnd(I); return;
6629 case Intrinsic::vacopy: visitVACopy(I); return;
6630 case Intrinsic::returnaddress:
6631 setValue(&I, DAG.getNode(ISD::RETURNADDR, sdl,
6632 TLI.getValueType(DAG.getDataLayout(), I.getType()),
6633 getValue(I.getArgOperand(0))));
6634 return;
6635 case Intrinsic::addressofreturnaddress:
6636 setValue(&I,
6637 DAG.getNode(ISD::ADDROFRETURNADDR, sdl,
6638 TLI.getValueType(DAG.getDataLayout(), I.getType())));
6639 return;
6640 case Intrinsic::sponentry:
6641 setValue(&I,
6642 DAG.getNode(ISD::SPONENTRY, sdl,
6643 TLI.getValueType(DAG.getDataLayout(), I.getType())));
6644 return;
6645 case Intrinsic::frameaddress:
6646 setValue(&I, DAG.getNode(ISD::FRAMEADDR, sdl,
6647 TLI.getFrameIndexTy(DAG.getDataLayout()),
6648 getValue(I.getArgOperand(0))));
6649 return;
6650 case Intrinsic::read_volatile_register:
6651 case Intrinsic::read_register: {
6652 Value *Reg = I.getArgOperand(0);
6653 SDValue Chain = getRoot();
6655 DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
6656 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6657 Res = DAG.getNode(ISD::READ_REGISTER, sdl,
6658 DAG.getVTList(VT, MVT::Other), Chain, RegName);
6659 setValue(&I, Res);
6660 DAG.setRoot(Res.getValue(1));
6661 return;
6662 }
6663 case Intrinsic::write_register: {
6664 Value *Reg = I.getArgOperand(0);
6665 Value *RegValue = I.getArgOperand(1);
6666 SDValue Chain = getRoot();
6668 DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
6669 DAG.setRoot(DAG.getNode(ISD::WRITE_REGISTER, sdl, MVT::Other, Chain,
6670 RegName, getValue(RegValue)));
6671 return;
6672 }
6673 case Intrinsic::memcpy:
6674 case Intrinsic::memcpy_inline: {
6675 const auto &MCI = cast<MemCpyInst>(I);
6676 SDValue Dst = getValue(I.getArgOperand(0));
6677 SDValue Src = getValue(I.getArgOperand(1));
6678 SDValue Size = getValue(I.getArgOperand(2));
6679 assert((!MCI.isForceInlined() || isa<ConstantSDNode>(Size)) &&
6680 "memcpy_inline needs constant size");
6681 // @llvm.memcpy.inline defines 0 and 1 to both mean no alignment.
6682 Align DstAlign = MCI.getDestAlign().valueOrOne();
6683 Align SrcAlign = MCI.getSourceAlign().valueOrOne();
6684 Align Alignment = std::min(DstAlign, SrcAlign);
6685 bool isVol = MCI.isVolatile();
6686 // FIXME: Support passing different dest/src alignments to the memcpy DAG
6687 // node.
6688 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6689 SDValue MC = DAG.getMemcpy(Root, sdl, Dst, Src, Size, Alignment, isVol,
6690 MCI.isForceInlined(), &I, std::nullopt,
6691 MachinePointerInfo(I.getArgOperand(0)),
6692 MachinePointerInfo(I.getArgOperand(1)),
6693 I.getAAMetadata(), BatchAA);
6694 updateDAGForMaybeTailCall(MC);
6695 return;
6696 }
6697 case Intrinsic::memset:
6698 case Intrinsic::memset_inline: {
6699 const auto &MSII = cast<MemSetInst>(I);
6700 SDValue Dst = getValue(I.getArgOperand(0));
6701 SDValue Value = getValue(I.getArgOperand(1));
6702 SDValue Size = getValue(I.getArgOperand(2));
6703 assert((!MSII.isForceInlined() || isa<ConstantSDNode>(Size)) &&
6704 "memset_inline needs constant size");
6705 // @llvm.memset defines 0 and 1 to both mean no alignment.
6706 Align DstAlign = MSII.getDestAlign().valueOrOne();
6707 bool isVol = MSII.isVolatile();
6708 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6709 SDValue MC = DAG.getMemset(
6710 Root, sdl, Dst, Value, Size, DstAlign, isVol, MSII.isForceInlined(),
6711 &I, MachinePointerInfo(I.getArgOperand(0)), I.getAAMetadata());
6712 updateDAGForMaybeTailCall(MC);
6713 return;
6714 }
6715 case Intrinsic::memmove: {
6716 const auto &MMI = cast<MemMoveInst>(I);
6717 SDValue Op1 = getValue(I.getArgOperand(0));
6718 SDValue Op2 = getValue(I.getArgOperand(1));
6719 SDValue Op3 = getValue(I.getArgOperand(2));
6720 // @llvm.memmove defines 0 and 1 to both mean no alignment.
6721 Align DstAlign = MMI.getDestAlign().valueOrOne();
6722 Align SrcAlign = MMI.getSourceAlign().valueOrOne();
6723 Align Alignment = std::min(DstAlign, SrcAlign);
6724 bool isVol = MMI.isVolatile();
6725 // FIXME: Support passing different dest/src alignments to the memmove DAG
6726 // node.
6727 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6728 SDValue MM = DAG.getMemmove(Root, sdl, Op1, Op2, Op3, Alignment, isVol, &I,
6729 /* OverrideTailCall */ std::nullopt,
6730 MachinePointerInfo(I.getArgOperand(0)),
6731 MachinePointerInfo(I.getArgOperand(1)),
6732 I.getAAMetadata(), BatchAA);
6733 updateDAGForMaybeTailCall(MM);
6734 return;
6735 }
6736 case Intrinsic::memcpy_element_unordered_atomic: {
6737 auto &MI = cast<AnyMemCpyInst>(I);
6738 SDValue Dst = getValue(MI.getRawDest());
6739 SDValue Src = getValue(MI.getRawSource());
6740 SDValue Length = getValue(MI.getLength());
6741
6742 Type *LengthTy = MI.getLength()->getType();
6743 unsigned ElemSz = MI.getElementSizeInBytes();
6744 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6745 SDValue MC =
6746 DAG.getAtomicMemcpy(getRoot(), sdl, Dst, Src, Length, LengthTy, ElemSz,
6747 isTC, MachinePointerInfo(MI.getRawDest()),
6748 MachinePointerInfo(MI.getRawSource()));
6749 updateDAGForMaybeTailCall(MC);
6750 return;
6751 }
6752 case Intrinsic::memmove_element_unordered_atomic: {
6753 auto &MI = cast<AnyMemMoveInst>(I);
6754 SDValue Dst = getValue(MI.getRawDest());
6755 SDValue Src = getValue(MI.getRawSource());
6756 SDValue Length = getValue(MI.getLength());
6757
6758 Type *LengthTy = MI.getLength()->getType();
6759 unsigned ElemSz = MI.getElementSizeInBytes();
6760 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6761 SDValue MC =
6762 DAG.getAtomicMemmove(getRoot(), sdl, Dst, Src, Length, LengthTy, ElemSz,
6763 isTC, MachinePointerInfo(MI.getRawDest()),
6764 MachinePointerInfo(MI.getRawSource()));
6765 updateDAGForMaybeTailCall(MC);
6766 return;
6767 }
6768 case Intrinsic::memset_element_unordered_atomic: {
6769 auto &MI = cast<AnyMemSetInst>(I);
6770 SDValue Dst = getValue(MI.getRawDest());
6771 SDValue Val = getValue(MI.getValue());
6772 SDValue Length = getValue(MI.getLength());
6773
6774 Type *LengthTy = MI.getLength()->getType();
6775 unsigned ElemSz = MI.getElementSizeInBytes();
6776 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6777 SDValue MC =
6778 DAG.getAtomicMemset(getRoot(), sdl, Dst, Val, Length, LengthTy, ElemSz,
6779 isTC, MachinePointerInfo(MI.getRawDest()));
6780 updateDAGForMaybeTailCall(MC);
6781 return;
6782 }
6783 case Intrinsic::call_preallocated_setup: {
6784 const CallBase *PreallocatedCall = FindPreallocatedCall(&I);
6785 SDValue SrcValue = DAG.getSrcValue(PreallocatedCall);
6786 SDValue Res = DAG.getNode(ISD::PREALLOCATED_SETUP, sdl, MVT::Other,
6787 getRoot(), SrcValue);
6788 setValue(&I, Res);
6789 DAG.setRoot(Res);
6790 return;
6791 }
6792 case Intrinsic::call_preallocated_arg: {
6793 const CallBase *PreallocatedCall = FindPreallocatedCall(I.getOperand(0));
6794 SDValue SrcValue = DAG.getSrcValue(PreallocatedCall);
6795 SDValue Ops[3];
6796 Ops[0] = getRoot();
6797 Ops[1] = SrcValue;
6798 Ops[2] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(1)), sdl,
6799 MVT::i32); // arg index
6800 SDValue Res = DAG.getNode(
6802 DAG.getVTList(TLI.getPointerTy(DAG.getDataLayout()), MVT::Other), Ops);
6803 setValue(&I, Res);
6804 DAG.setRoot(Res.getValue(1));
6805 return;
6806 }
6807
6808 case Intrinsic::eh_typeid_for: {
6809 // Find the type id for the given typeinfo.
6810 GlobalValue *GV = ExtractTypeInfo(I.getArgOperand(0));
6811 unsigned TypeID = DAG.getMachineFunction().getTypeIDFor(GV);
6812 Res = DAG.getConstant(TypeID, sdl, MVT::i32);
6813 setValue(&I, Res);
6814 return;
6815 }
6816
6817 case Intrinsic::eh_return_i32:
6818 case Intrinsic::eh_return_i64:
6819 DAG.getMachineFunction().setCallsEHReturn(true);
6820 DAG.setRoot(DAG.getNode(ISD::EH_RETURN, sdl,
6821 MVT::Other,
6823 getValue(I.getArgOperand(0)),
6824 getValue(I.getArgOperand(1))));
6825 return;
6826 case Intrinsic::eh_unwind_init:
6827 DAG.getMachineFunction().setCallsUnwindInit(true);
6828 return;
6829 case Intrinsic::eh_dwarf_cfa:
6830 setValue(&I, DAG.getNode(ISD::EH_DWARF_CFA, sdl,
6831 TLI.getPointerTy(DAG.getDataLayout()),
6832 getValue(I.getArgOperand(0))));
6833 return;
6834 case Intrinsic::eh_sjlj_callsite: {
6835 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(0));
6836 assert(FuncInfo.getCurrentCallSite() == 0 && "Overlapping call sites!");
6837
6838 FuncInfo.setCurrentCallSite(CI->getZExtValue());
6839 return;
6840 }
6841 case Intrinsic::eh_sjlj_functioncontext: {
6842 // Get and store the index of the function context.
6843 MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo();
6844 AllocaInst *FnCtx =
6845 cast<AllocaInst>(I.getArgOperand(0)->stripPointerCasts());
6846 int FI = FuncInfo.StaticAllocaMap[FnCtx];
6848 return;
6849 }
6850 case Intrinsic::eh_sjlj_setjmp: {
6851 SDValue Ops[2];
6852 Ops[0] = getRoot();
6853 Ops[1] = getValue(I.getArgOperand(0));
6854 SDValue Op = DAG.getNode(ISD::EH_SJLJ_SETJMP, sdl,
6855 DAG.getVTList(MVT::i32, MVT::Other), Ops);
6856 setValue(&I, Op.getValue(0));
6857 DAG.setRoot(Op.getValue(1));
6858 return;
6859 }
6860 case Intrinsic::eh_sjlj_longjmp:
6861 DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_LONGJMP, sdl, MVT::Other,
6862 getRoot(), getValue(I.getArgOperand(0))));
6863 return;
6864 case Intrinsic::eh_sjlj_setup_dispatch:
6865 DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_SETUP_DISPATCH, sdl, MVT::Other,
6866 getRoot()));
6867 return;
6868 case Intrinsic::masked_gather:
6869 visitMaskedGather(I);
6870 return;
6871 case Intrinsic::masked_load:
6872 visitMaskedLoad(I);
6873 return;
6874 case Intrinsic::masked_scatter:
6875 visitMaskedScatter(I);
6876 return;
6877 case Intrinsic::masked_store:
6878 visitMaskedStore(I);
6879 return;
6880 case Intrinsic::masked_expandload:
6881 visitMaskedLoad(I, true /* IsExpanding */);
6882 return;
6883 case Intrinsic::masked_compressstore:
6884 visitMaskedStore(I, true /* IsCompressing */);
6885 return;
6886 case Intrinsic::powi:
6887 setValue(&I, ExpandPowI(sdl, getValue(I.getArgOperand(0)),
6888 getValue(I.getArgOperand(1)), DAG));
6889 return;
6890 case Intrinsic::log:
6891 setValue(&I, expandLog(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6892 return;
6893 case Intrinsic::log2:
6894 setValue(&I,
6895 expandLog2(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6896 return;
6897 case Intrinsic::log10:
6898 setValue(&I,
6899 expandLog10(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6900 return;
6901 case Intrinsic::exp:
6902 setValue(&I, expandExp(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6903 return;
6904 case Intrinsic::exp2:
6905 setValue(&I,
6906 expandExp2(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6907 return;
6908 case Intrinsic::pow:
6909 setValue(&I, expandPow(sdl, getValue(I.getArgOperand(0)),
6910 getValue(I.getArgOperand(1)), DAG, TLI, Flags));
6911 return;
6912 case Intrinsic::sqrt:
6913 case Intrinsic::fabs:
6914 case Intrinsic::sin:
6915 case Intrinsic::cos:
6916 case Intrinsic::tan:
6917 case Intrinsic::asin:
6918 case Intrinsic::acos:
6919 case Intrinsic::atan:
6920 case Intrinsic::sinh:
6921 case Intrinsic::cosh:
6922 case Intrinsic::tanh:
6923 case Intrinsic::exp10:
6924 case Intrinsic::floor:
6925 case Intrinsic::ceil:
6926 case Intrinsic::trunc:
6927 case Intrinsic::rint:
6928 case Intrinsic::nearbyint:
6929 case Intrinsic::round:
6930 case Intrinsic::roundeven:
6931 case Intrinsic::canonicalize: {
6932 unsigned Opcode;
6933 // clang-format off
6934 switch (Intrinsic) {
6935 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
6936 case Intrinsic::sqrt: Opcode = ISD::FSQRT; break;
6937 case Intrinsic::fabs: Opcode = ISD::FABS; break;
6938 case Intrinsic::sin: Opcode = ISD::FSIN; break;
6939 case Intrinsic::cos: Opcode = ISD::FCOS; break;
6940 case Intrinsic::tan: Opcode = ISD::FTAN; break;
6941 case Intrinsic::asin: Opcode = ISD::FASIN; break;
6942 case Intrinsic::acos: Opcode = ISD::FACOS; break;
6943 case Intrinsic::atan: Opcode = ISD::FATAN; break;
6944 case Intrinsic::sinh: Opcode = ISD::FSINH; break;
6945 case Intrinsic::cosh: Opcode = ISD::FCOSH; break;
6946 case Intrinsic::tanh: Opcode = ISD::FTANH; break;
6947 case Intrinsic::exp10: Opcode = ISD::FEXP10; break;
6948 case Intrinsic::floor: Opcode = ISD::FFLOOR; break;
6949 case Intrinsic::ceil: Opcode = ISD::FCEIL; break;
6950 case Intrinsic::trunc: Opcode = ISD::FTRUNC; break;
6951 case Intrinsic::rint: Opcode = ISD::FRINT; break;
6952 case Intrinsic::nearbyint: Opcode = ISD::FNEARBYINT; break;
6953 case Intrinsic::round: Opcode = ISD::FROUND; break;
6954 case Intrinsic::roundeven: Opcode = ISD::FROUNDEVEN; break;
6955 case Intrinsic::canonicalize: Opcode = ISD::FCANONICALIZE; break;
6956 }
6957 // clang-format on
6958
6959 setValue(&I, DAG.getNode(Opcode, sdl,
6960 getValue(I.getArgOperand(0)).getValueType(),
6961 getValue(I.getArgOperand(0)), Flags));
6962 return;
6963 }
6964 case Intrinsic::atan2:
6965 setValue(&I, DAG.getNode(ISD::FATAN2, sdl,
6966 getValue(I.getArgOperand(0)).getValueType(),
6967 getValue(I.getArgOperand(0)),
6968 getValue(I.getArgOperand(1)), Flags));
6969 return;
6970 case Intrinsic::lround:
6971 case Intrinsic::llround:
6972 case Intrinsic::lrint:
6973 case Intrinsic::llrint: {
6974 unsigned Opcode;
6975 // clang-format off
6976 switch (Intrinsic) {
6977 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
6978 case Intrinsic::lround: Opcode = ISD::LROUND; break;
6979 case Intrinsic::llround: Opcode = ISD::LLROUND; break;
6980 case Intrinsic::lrint: Opcode = ISD::LRINT; break;
6981 case Intrinsic::llrint: Opcode = ISD::LLRINT; break;
6982 }
6983 // clang-format on
6984
6985 EVT RetVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6986 setValue(&I, DAG.getNode(Opcode, sdl, RetVT,
6987 getValue(I.getArgOperand(0))));
6988 return;
6989 }
6990 case Intrinsic::minnum:
6991 setValue(&I, DAG.getNode(ISD::FMINNUM, sdl,
6992 getValue(I.getArgOperand(0)).getValueType(),
6993 getValue(I.getArgOperand(0)),
6994 getValue(I.getArgOperand(1)), Flags));
6995 return;
6996 case Intrinsic::maxnum:
6997 setValue(&I, DAG.getNode(ISD::FMAXNUM, sdl,
6998 getValue(I.getArgOperand(0)).getValueType(),
6999 getValue(I.getArgOperand(0)),
7000 getValue(I.getArgOperand(1)), Flags));
7001 return;
7002 case Intrinsic::minimum:
7003 setValue(&I, DAG.getNode(ISD::FMINIMUM, sdl,
7004 getValue(I.getArgOperand(0)).getValueType(),
7005 getValue(I.getArgOperand(0)),
7006 getValue(I.getArgOperand(1)), Flags));
7007 return;
7008 case Intrinsic::maximum:
7009 setValue(&I, DAG.getNode(ISD::FMAXIMUM, sdl,
7010 getValue(I.getArgOperand(0)).getValueType(),
7011 getValue(I.getArgOperand(0)),
7012 getValue(I.getArgOperand(1)), Flags));
7013 return;
7014 case Intrinsic::minimumnum:
7015 setValue(&I, DAG.getNode(ISD::FMINIMUMNUM, sdl,
7016 getValue(I.getArgOperand(0)).getValueType(),
7017 getValue(I.getArgOperand(0)),
7018 getValue(I.getArgOperand(1)), Flags));
7019 return;
7020 case Intrinsic::maximumnum:
7021 setValue(&I, DAG.getNode(ISD::FMAXIMUMNUM, sdl,
7022 getValue(I.getArgOperand(0)).getValueType(),
7023 getValue(I.getArgOperand(0)),
7024 getValue(I.getArgOperand(1)), Flags));
7025 return;
7026 case Intrinsic::copysign:
7027 setValue(&I, DAG.getNode(ISD::FCOPYSIGN, sdl,
7028 getValue(I.getArgOperand(0)).getValueType(),
7029 getValue(I.getArgOperand(0)),
7030 getValue(I.getArgOperand(1)), Flags));
7031 return;
7032 case Intrinsic::ldexp:
7033 setValue(&I, DAG.getNode(ISD::FLDEXP, sdl,
7034 getValue(I.getArgOperand(0)).getValueType(),
7035 getValue(I.getArgOperand(0)),
7036 getValue(I.getArgOperand(1)), Flags));
7037 return;
7038 case Intrinsic::modf:
7039 case Intrinsic::sincos:
7040 case Intrinsic::sincospi:
7041 case Intrinsic::frexp: {
7042 unsigned Opcode;
7043 switch (Intrinsic) {
7044 default:
7045 llvm_unreachable("unexpected intrinsic");
7046 case Intrinsic::sincos:
7047 Opcode = ISD::FSINCOS;
7048 break;
7049 case Intrinsic::sincospi:
7050 Opcode = ISD::FSINCOSPI;
7051 break;
7052 case Intrinsic::modf:
7053 Opcode = ISD::FMODF;
7054 break;
7055 case Intrinsic::frexp:
7056 Opcode = ISD::FFREXP;
7057 break;
7058 }
7059 SmallVector<EVT, 2> ValueVTs;
7060 ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);
7061 SDVTList VTs = DAG.getVTList(ValueVTs);
7062 setValue(
7063 &I, DAG.getNode(Opcode, sdl, VTs, getValue(I.getArgOperand(0)), Flags));
7064 return;
7065 }
7066 case Intrinsic::arithmetic_fence: {
7067 setValue(&I, DAG.getNode(ISD::ARITH_FENCE, sdl,
7068 getValue(I.getArgOperand(0)).getValueType(),
7069 getValue(I.getArgOperand(0)), Flags));
7070 return;
7071 }
7072 case Intrinsic::fma:
7073 setValue(&I, DAG.getNode(
7074 ISD::FMA, sdl, getValue(I.getArgOperand(0)).getValueType(),
7075 getValue(I.getArgOperand(0)), getValue(I.getArgOperand(1)),
7076 getValue(I.getArgOperand(2)), Flags));
7077 return;
7078#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
7079 case Intrinsic::INTRINSIC:
7080#include "llvm/IR/ConstrainedOps.def"
7081 visitConstrainedFPIntrinsic(cast<ConstrainedFPIntrinsic>(I));
7082 return;
7083#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID:
7084#include "llvm/IR/VPIntrinsics.def"
7085 visitVectorPredicationIntrinsic(cast<VPIntrinsic>(I));
7086 return;
7087 case Intrinsic::fptrunc_round: {
7088 // Get the last argument, the metadata and convert it to an integer in the
7089 // call
7090 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(1))->getMetadata();
7091 std::optional<RoundingMode> RoundMode =
7092 convertStrToRoundingMode(cast<MDString>(MD)->getString());
7093
7094 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7095
7096 // Propagate fast-math-flags from IR to node(s).
7097 SDNodeFlags Flags;
7098 Flags.copyFMF(*cast<FPMathOperator>(&I));
7099 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
7100
7102 Result = DAG.getNode(
7103 ISD::FPTRUNC_ROUND, sdl, VT, getValue(I.getArgOperand(0)),
7104 DAG.getTargetConstant((int)*RoundMode, sdl, MVT::i32));
7105 setValue(&I, Result);
7106
7107 return;
7108 }
7109 case Intrinsic::fmuladd: {
7110 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7111 if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
7112 TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), VT)) {
7113 setValue(&I, DAG.getNode(ISD::FMA, sdl,
7114 getValue(I.getArgOperand(0)).getValueType(),
7115 getValue(I.getArgOperand(0)),
7116 getValue(I.getArgOperand(1)),
7117 getValue(I.getArgOperand(2)), Flags));
7118 } else if (TLI.isOperationLegalOrCustom(ISD::FMULADD, VT)) {
7119 // TODO: Support splitting the vector.
7120 setValue(&I, DAG.getNode(ISD::FMULADD, sdl,
7121 getValue(I.getArgOperand(0)).getValueType(),
7122 getValue(I.getArgOperand(0)),
7123 getValue(I.getArgOperand(1)),
7124 getValue(I.getArgOperand(2)), Flags));
7125 } else {
7126 // TODO: Intrinsic calls should have fast-math-flags.
7127 SDValue Mul = DAG.getNode(
7128 ISD::FMUL, sdl, getValue(I.getArgOperand(0)).getValueType(),
7129 getValue(I.getArgOperand(0)), getValue(I.getArgOperand(1)), Flags);
7130 SDValue Add = DAG.getNode(ISD::FADD, sdl,
7131 getValue(I.getArgOperand(0)).getValueType(),
7132 Mul, getValue(I.getArgOperand(2)), Flags);
7133 setValue(&I, Add);
7134 }
7135 return;
7136 }
7137 case Intrinsic::fptosi_sat: {
7138 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7139 setValue(&I, DAG.getNode(ISD::FP_TO_SINT_SAT, sdl, VT,
7140 getValue(I.getArgOperand(0)),
7141 DAG.getValueType(VT.getScalarType())));
7142 return;
7143 }
7144 case Intrinsic::fptoui_sat: {
7145 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7146 setValue(&I, DAG.getNode(ISD::FP_TO_UINT_SAT, sdl, VT,
7147 getValue(I.getArgOperand(0)),
7148 DAG.getValueType(VT.getScalarType())));
7149 return;
7150 }
7151 case Intrinsic::set_rounding:
7152 Res = DAG.getNode(ISD::SET_ROUNDING, sdl, MVT::Other,
7153 {getRoot(), getValue(I.getArgOperand(0))});
7154 setValue(&I, Res);
7155 DAG.setRoot(Res.getValue(0));
7156 return;
7157 case Intrinsic::is_fpclass: {
7158 const DataLayout DLayout = DAG.getDataLayout();
7159 EVT DestVT = TLI.getValueType(DLayout, I.getType());
7160 EVT ArgVT = TLI.getValueType(DLayout, I.getArgOperand(0)->getType());
7161 FPClassTest Test = static_cast<FPClassTest>(
7162 cast<ConstantInt>(I.getArgOperand(1))->getZExtValue());
7163 MachineFunction &MF = DAG.getMachineFunction();
7164 const Function &F = MF.getFunction();
7165 SDValue Op = getValue(I.getArgOperand(0));
7166 SDNodeFlags Flags;
7167 Flags.setNoFPExcept(
7168 !F.getAttributes().hasFnAttr(llvm::Attribute::StrictFP));
7169 // If ISD::IS_FPCLASS should be expanded, do it right now, because the
7170 // expansion can use illegal types. Making expansion early allows
7171 // legalizing these types prior to selection.
7172 if (!TLI.isOperationLegal(ISD::IS_FPCLASS, ArgVT) &&
7173 !TLI.isOperationCustom(ISD::IS_FPCLASS, ArgVT)) {
7174 SDValue Result = TLI.expandIS_FPCLASS(DestVT, Op, Test, Flags, sdl, DAG);
7175 setValue(&I, Result);
7176 return;
7177 }
7178
7179 SDValue Check = DAG.getTargetConstant(Test, sdl, MVT::i32);
7180 SDValue V = DAG.getNode(ISD::IS_FPCLASS, sdl, DestVT, {Op, Check}, Flags);
7181 setValue(&I, V);
7182 return;
7183 }
7184 case Intrinsic::get_fpenv: {
7185 const DataLayout DLayout = DAG.getDataLayout();
7186 EVT EnvVT = TLI.getValueType(DLayout, I.getType());
7187 Align TempAlign = DAG.getEVTAlign(EnvVT);
7188 SDValue Chain = getRoot();
7189 // Use GET_FPENV if it is legal or custom. Otherwise use memory-based node
7190 // and temporary storage in stack.
7191 if (TLI.isOperationLegalOrCustom(ISD::GET_FPENV, EnvVT)) {
7192 Res = DAG.getNode(
7193 ISD::GET_FPENV, sdl,
7194 DAG.getVTList(TLI.getValueType(DAG.getDataLayout(), I.getType()),
7195 MVT::Other),
7196 Chain);
7197 } else {
7198 SDValue Temp = DAG.CreateStackTemporary(EnvVT, TempAlign.value());
7199 int SPFI = cast<FrameIndexSDNode>(Temp.getNode())->getIndex();
7200 auto MPI =
7201 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI);
7202 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
7204 TempAlign);
7205 Chain = DAG.getGetFPEnv(Chain, sdl, Temp, EnvVT, MMO);
7206 Res = DAG.getLoad(EnvVT, sdl, Chain, Temp, MPI);
7207 }
7208 setValue(&I, Res);
7209 DAG.setRoot(Res.getValue(1));
7210 return;
7211 }
7212 case Intrinsic::set_fpenv: {
7213 const DataLayout DLayout = DAG.getDataLayout();
7214 SDValue Env = getValue(I.getArgOperand(0));
7215 EVT EnvVT = Env.getValueType();
7216 Align TempAlign = DAG.getEVTAlign(EnvVT);
7217 SDValue Chain = getRoot();
7218 // If SET_FPENV is custom or legal, use it. Otherwise use loading
7219 // environment from memory.
7220 if (TLI.isOperationLegalOrCustom(ISD::SET_FPENV, EnvVT)) {
7221 Chain = DAG.getNode(ISD::SET_FPENV, sdl, MVT::Other, Chain, Env);
7222 } else {
7223 // Allocate space in stack, copy environment bits into it and use this
7224 // memory in SET_FPENV_MEM.
7225 SDValue Temp = DAG.CreateStackTemporary(EnvVT, TempAlign.value());
7226 int SPFI = cast<FrameIndexSDNode>(Temp.getNode())->getIndex();
7227 auto MPI =
7228 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI);
7229 Chain = DAG.getStore(Chain, sdl, Env, Temp, MPI, TempAlign,
7231 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
7233 TempAlign);
7234 Chain = DAG.getSetFPEnv(Chain, sdl, Temp, EnvVT, MMO);
7235 }
7236 DAG.setRoot(Chain);
7237 return;
7238 }
7239 case Intrinsic::reset_fpenv:
7240 DAG.setRoot(DAG.getNode(ISD::RESET_FPENV, sdl, MVT::Other, getRoot()));
7241 return;
7242 case Intrinsic::get_fpmode:
7243 Res = DAG.getNode(
7244 ISD::GET_FPMODE, sdl,
7245 DAG.getVTList(TLI.getValueType(DAG.getDataLayout(), I.getType()),
7246 MVT::Other),
7247 DAG.getRoot());
7248 setValue(&I, Res);
7249 DAG.setRoot(Res.getValue(1));
7250 return;
7251 case Intrinsic::set_fpmode:
7252 Res = DAG.getNode(ISD::SET_FPMODE, sdl, MVT::Other, {DAG.getRoot()},
7253 getValue(I.getArgOperand(0)));
7254 DAG.setRoot(Res);
7255 return;
7256 case Intrinsic::reset_fpmode: {
7257 Res = DAG.getNode(ISD::RESET_FPMODE, sdl, MVT::Other, getRoot());
7258 DAG.setRoot(Res);
7259 return;
7260 }
7261 case Intrinsic::pcmarker: {
7262 SDValue Tmp = getValue(I.getArgOperand(0));
7263 DAG.setRoot(DAG.getNode(ISD::PCMARKER, sdl, MVT::Other, getRoot(), Tmp));
7264 return;
7265 }
7266 case Intrinsic::readcyclecounter: {
7267 SDValue Op = getRoot();
7268 Res = DAG.getNode(ISD::READCYCLECOUNTER, sdl,
7269 DAG.getVTList(MVT::i64, MVT::Other), Op);
7270 setValue(&I, Res);
7271 DAG.setRoot(Res.getValue(1));
7272 return;
7273 }
7274 case Intrinsic::readsteadycounter: {
7275 SDValue Op = getRoot();
7276 Res = DAG.getNode(ISD::READSTEADYCOUNTER, sdl,
7277 DAG.getVTList(MVT::i64, MVT::Other), Op);
7278 setValue(&I, Res);
7279 DAG.setRoot(Res.getValue(1));
7280 return;
7281 }
7282 case Intrinsic::bitreverse:
7283 setValue(&I, DAG.getNode(ISD::BITREVERSE, sdl,
7284 getValue(I.getArgOperand(0)).getValueType(),
7285 getValue(I.getArgOperand(0))));
7286 return;
7287 case Intrinsic::bswap:
7288 setValue(&I, DAG.getNode(ISD::BSWAP, sdl,
7289 getValue(I.getArgOperand(0)).getValueType(),
7290 getValue(I.getArgOperand(0))));
7291 return;
7292 case Intrinsic::cttz: {
7293 SDValue Arg = getValue(I.getArgOperand(0));
7294 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
7295 EVT Ty = Arg.getValueType();
7296 setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTTZ : ISD::CTTZ_ZERO_UNDEF,
7297 sdl, Ty, Arg));
7298 return;
7299 }
7300 case Intrinsic::ctlz: {
7301 SDValue Arg = getValue(I.getArgOperand(0));
7302 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
7303 EVT Ty = Arg.getValueType();
7304 setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTLZ : ISD::CTLZ_ZERO_UNDEF,
7305 sdl, Ty, Arg));
7306 return;
7307 }
7308 case Intrinsic::ctpop: {
7309 SDValue Arg = getValue(I.getArgOperand(0));
7310 EVT Ty = Arg.getValueType();
7311 setValue(&I, DAG.getNode(ISD::CTPOP, sdl, Ty, Arg));
7312 return;
7313 }
7314 case Intrinsic::fshl:
7315 case Intrinsic::fshr: {
7316 bool IsFSHL = Intrinsic == Intrinsic::fshl;
7317 SDValue X = getValue(I.getArgOperand(0));
7318 SDValue Y = getValue(I.getArgOperand(1));
7319 SDValue Z = getValue(I.getArgOperand(2));
7320 EVT VT = X.getValueType();
7321
7322 if (X == Y) {
7323 auto RotateOpcode = IsFSHL ? ISD::ROTL : ISD::ROTR;
7324 setValue(&I, DAG.getNode(RotateOpcode, sdl, VT, X, Z));
7325 } else {
7326 auto FunnelOpcode = IsFSHL ? ISD::FSHL : ISD::FSHR;
7327 setValue(&I, DAG.getNode(FunnelOpcode, sdl, VT, X, Y, Z));
7328 }
7329 return;
7330 }
7331 case Intrinsic::clmul: {
7332 SDValue X = getValue(I.getArgOperand(0));
7333 SDValue Y = getValue(I.getArgOperand(1));
7334 setValue(&I, DAG.getNode(ISD::CLMUL, sdl, X.getValueType(), X, Y));
7335 return;
7336 }
7337 case Intrinsic::sadd_sat: {
7338 SDValue Op1 = getValue(I.getArgOperand(0));
7339 SDValue Op2 = getValue(I.getArgOperand(1));
7340 setValue(&I, DAG.getNode(ISD::SADDSAT, sdl, Op1.getValueType(), Op1, Op2));
7341 return;
7342 }
7343 case Intrinsic::uadd_sat: {
7344 SDValue Op1 = getValue(I.getArgOperand(0));
7345 SDValue Op2 = getValue(I.getArgOperand(1));
7346 setValue(&I, DAG.getNode(ISD::UADDSAT, sdl, Op1.getValueType(), Op1, Op2));
7347 return;
7348 }
7349 case Intrinsic::ssub_sat: {
7350 SDValue Op1 = getValue(I.getArgOperand(0));
7351 SDValue Op2 = getValue(I.getArgOperand(1));
7352 setValue(&I, DAG.getNode(ISD::SSUBSAT, sdl, Op1.getValueType(), Op1, Op2));
7353 return;
7354 }
7355 case Intrinsic::usub_sat: {
7356 SDValue Op1 = getValue(I.getArgOperand(0));
7357 SDValue Op2 = getValue(I.getArgOperand(1));
7358 setValue(&I, DAG.getNode(ISD::USUBSAT, sdl, Op1.getValueType(), Op1, Op2));
7359 return;
7360 }
7361 case Intrinsic::sshl_sat:
7362 case Intrinsic::ushl_sat: {
7363 SDValue Op1 = getValue(I.getArgOperand(0));
7364 SDValue Op2 = getValue(I.getArgOperand(1));
7365
7366 EVT ShiftTy = DAG.getTargetLoweringInfo().getShiftAmountTy(
7367 Op1.getValueType(), DAG.getDataLayout());
7368
7369 // Coerce the shift amount to the right type if we can. This exposes the
7370 // truncate or zext to optimization early.
7371 if (!I.getType()->isVectorTy() && Op2.getValueType() != ShiftTy) {
7372 assert(ShiftTy.getSizeInBits() >=
7374 "Unexpected shift type");
7375 Op2 = DAG.getZExtOrTrunc(Op2, getCurSDLoc(), ShiftTy);
7376 }
7377
7378 unsigned Opc =
7379 Intrinsic == Intrinsic::sshl_sat ? ISD::SSHLSAT : ISD::USHLSAT;
7380 setValue(&I, DAG.getNode(Opc, sdl, Op1.getValueType(), Op1, Op2));
7381 return;
7382 }
7383 case Intrinsic::smul_fix:
7384 case Intrinsic::umul_fix:
7385 case Intrinsic::smul_fix_sat:
7386 case Intrinsic::umul_fix_sat: {
7387 SDValue Op1 = getValue(I.getArgOperand(0));
7388 SDValue Op2 = getValue(I.getArgOperand(1));
7389 SDValue Op3 = getValue(I.getArgOperand(2));
7390 setValue(&I, DAG.getNode(FixedPointIntrinsicToOpcode(Intrinsic), sdl,
7391 Op1.getValueType(), Op1, Op2, Op3));
7392 return;
7393 }
7394 case Intrinsic::sdiv_fix:
7395 case Intrinsic::udiv_fix:
7396 case Intrinsic::sdiv_fix_sat:
7397 case Intrinsic::udiv_fix_sat: {
7398 SDValue Op1 = getValue(I.getArgOperand(0));
7399 SDValue Op2 = getValue(I.getArgOperand(1));
7400 SDValue Op3 = getValue(I.getArgOperand(2));
7402 Op1, Op2, Op3, DAG, TLI));
7403 return;
7404 }
7405 case Intrinsic::smax: {
7406 SDValue Op1 = getValue(I.getArgOperand(0));
7407 SDValue Op2 = getValue(I.getArgOperand(1));
7408 setValue(&I, DAG.getNode(ISD::SMAX, sdl, Op1.getValueType(), Op1, Op2));
7409 return;
7410 }
7411 case Intrinsic::smin: {
7412 SDValue Op1 = getValue(I.getArgOperand(0));
7413 SDValue Op2 = getValue(I.getArgOperand(1));
7414 setValue(&I, DAG.getNode(ISD::SMIN, sdl, Op1.getValueType(), Op1, Op2));
7415 return;
7416 }
7417 case Intrinsic::umax: {
7418 SDValue Op1 = getValue(I.getArgOperand(0));
7419 SDValue Op2 = getValue(I.getArgOperand(1));
7420 setValue(&I, DAG.getNode(ISD::UMAX, sdl, Op1.getValueType(), Op1, Op2));
7421 return;
7422 }
7423 case Intrinsic::umin: {
7424 SDValue Op1 = getValue(I.getArgOperand(0));
7425 SDValue Op2 = getValue(I.getArgOperand(1));
7426 setValue(&I, DAG.getNode(ISD::UMIN, sdl, Op1.getValueType(), Op1, Op2));
7427 return;
7428 }
7429 case Intrinsic::abs: {
7430 // TODO: Preserve "int min is poison" arg in SDAG?
7431 SDValue Op1 = getValue(I.getArgOperand(0));
7432 setValue(&I, DAG.getNode(ISD::ABS, sdl, Op1.getValueType(), Op1));
7433 return;
7434 }
7435 case Intrinsic::scmp: {
7436 SDValue Op1 = getValue(I.getArgOperand(0));
7437 SDValue Op2 = getValue(I.getArgOperand(1));
7438 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7439 setValue(&I, DAG.getNode(ISD::SCMP, sdl, DestVT, Op1, Op2));
7440 break;
7441 }
7442 case Intrinsic::ucmp: {
7443 SDValue Op1 = getValue(I.getArgOperand(0));
7444 SDValue Op2 = getValue(I.getArgOperand(1));
7445 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7446 setValue(&I, DAG.getNode(ISD::UCMP, sdl, DestVT, Op1, Op2));
7447 break;
7448 }
7449 case Intrinsic::stackaddress:
7450 case Intrinsic::stacksave: {
7451 unsigned SDOpcode = Intrinsic == Intrinsic::stackaddress ? ISD::STACKADDRESS
7453 SDValue Op = getRoot();
7454 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7455 Res = DAG.getNode(SDOpcode, sdl, DAG.getVTList(VT, MVT::Other), Op);
7456 setValue(&I, Res);
7457 DAG.setRoot(Res.getValue(1));
7458 return;
7459 }
7460 case Intrinsic::stackrestore:
7461 Res = getValue(I.getArgOperand(0));
7462 DAG.setRoot(DAG.getNode(ISD::STACKRESTORE, sdl, MVT::Other, getRoot(), Res));
7463 return;
7464 case Intrinsic::get_dynamic_area_offset: {
7465 SDValue Op = getRoot();
7466 EVT ResTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
7467 Res = DAG.getNode(ISD::GET_DYNAMIC_AREA_OFFSET, sdl, DAG.getVTList(ResTy),
7468 Op);
7469 DAG.setRoot(Op);
7470 setValue(&I, Res);
7471 return;
7472 }
7473 case Intrinsic::stackguard: {
7474 MachineFunction &MF = DAG.getMachineFunction();
7475 const Module &M = *MF.getFunction().getParent();
7476 EVT PtrTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
7477 SDValue Chain = getRoot();
7478 if (TLI.useLoadStackGuardNode(M)) {
7479 Res = getLoadStackGuard(DAG, sdl, Chain);
7480 Res = DAG.getPtrExtOrTrunc(Res, sdl, PtrTy);
7481 } else {
7482 const Value *Global = TLI.getSDagStackGuard(M, DAG.getLibcalls());
7483 if (!Global) {
7484 LLVMContext &Ctx = *DAG.getContext();
7485 Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
7486 setValue(&I, DAG.getPOISON(PtrTy));
7487 return;
7488 }
7489
7490 Align Align = DAG.getDataLayout().getPrefTypeAlign(Global->getType());
7491 Res = DAG.getLoad(PtrTy, sdl, Chain, getValue(Global),
7492 MachinePointerInfo(Global, 0), Align,
7494 }
7495 if (TLI.useStackGuardXorFP())
7496 Res = TLI.emitStackGuardXorFP(DAG, Res, sdl);
7497 DAG.setRoot(Chain);
7498 setValue(&I, Res);
7499 return;
7500 }
7501 case Intrinsic::stackprotector: {
7502 // Emit code into the DAG to store the stack guard onto the stack.
7503 MachineFunction &MF = DAG.getMachineFunction();
7504 MachineFrameInfo &MFI = MF.getFrameInfo();
7505 const Module &M = *MF.getFunction().getParent();
7506 SDValue Src, Chain = getRoot();
7507
7508 if (TLI.useLoadStackGuardNode(M))
7509 Src = getLoadStackGuard(DAG, sdl, Chain);
7510 else
7511 Src = getValue(I.getArgOperand(0)); // The guard's value.
7512
7513 AllocaInst *Slot = cast<AllocaInst>(I.getArgOperand(1));
7514
7515 int FI = FuncInfo.StaticAllocaMap[Slot];
7516 MFI.setStackProtectorIndex(FI);
7517 EVT PtrTy = TLI.getFrameIndexTy(DAG.getDataLayout());
7518
7519 SDValue FIN = DAG.getFrameIndex(FI, PtrTy);
7520
7521 // Store the stack protector onto the stack.
7522 Res = DAG.getStore(
7523 Chain, sdl, Src, FIN,
7524 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI),
7525 MaybeAlign(), MachineMemOperand::MOVolatile);
7526 setValue(&I, Res);
7527 DAG.setRoot(Res);
7528 return;
7529 }
7530 case Intrinsic::objectsize:
7531 llvm_unreachable("llvm.objectsize.* should have been lowered already");
7532
7533 case Intrinsic::is_constant:
7534 llvm_unreachable("llvm.is.constant.* should have been lowered already");
7535
7536 case Intrinsic::annotation:
7537 case Intrinsic::ptr_annotation:
7538 case Intrinsic::launder_invariant_group:
7539 case Intrinsic::strip_invariant_group:
7540 // Drop the intrinsic, but forward the value
7541 setValue(&I, getValue(I.getOperand(0)));
7542 return;
7543
7544 case Intrinsic::type_test:
7545 case Intrinsic::public_type_test:
7546 reportFatalUsageError("llvm.type.test intrinsic must be lowered by the "
7547 "LowerTypeTests pass before code generation");
7548 return;
7549
7550 case Intrinsic::assume:
7551 case Intrinsic::experimental_noalias_scope_decl:
7552 case Intrinsic::var_annotation:
7553 case Intrinsic::sideeffect:
7554 // Discard annotate attributes, noalias scope declarations, assumptions, and
7555 // artificial side-effects.
7556 return;
7557
7558 case Intrinsic::codeview_annotation: {
7559 // Emit a label associated with this metadata.
7560 MachineFunction &MF = DAG.getMachineFunction();
7561 MCSymbol *Label = MF.getContext().createTempSymbol("annotation", true);
7562 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(0))->getMetadata();
7563 MF.addCodeViewAnnotation(Label, cast<MDNode>(MD));
7564 Res = DAG.getLabelNode(ISD::ANNOTATION_LABEL, sdl, getRoot(), Label);
7565 DAG.setRoot(Res);
7566 return;
7567 }
7568
7569 case Intrinsic::init_trampoline: {
7570 const Function *F = cast<Function>(I.getArgOperand(1)->stripPointerCasts());
7571
7572 SDValue Ops[6];
7573 Ops[0] = getRoot();
7574 Ops[1] = getValue(I.getArgOperand(0));
7575 Ops[2] = getValue(I.getArgOperand(1));
7576 Ops[3] = getValue(I.getArgOperand(2));
7577 Ops[4] = DAG.getSrcValue(I.getArgOperand(0));
7578 Ops[5] = DAG.getSrcValue(F);
7579
7580 Res = DAG.getNode(ISD::INIT_TRAMPOLINE, sdl, MVT::Other, Ops);
7581
7582 DAG.setRoot(Res);
7583 return;
7584 }
7585 case Intrinsic::adjust_trampoline:
7586 setValue(&I, DAG.getNode(ISD::ADJUST_TRAMPOLINE, sdl,
7587 TLI.getPointerTy(DAG.getDataLayout()),
7588 getValue(I.getArgOperand(0))));
7589 return;
7590 case Intrinsic::gcroot: {
7591 assert(DAG.getMachineFunction().getFunction().hasGC() &&
7592 "only valid in functions with gc specified, enforced by Verifier");
7593 assert(GFI && "implied by previous");
7594 const Value *Alloca = I.getArgOperand(0)->stripPointerCasts();
7595 const Constant *TypeMap = cast<Constant>(I.getArgOperand(1));
7596
7597 FrameIndexSDNode *FI = cast<FrameIndexSDNode>(getValue(Alloca).getNode());
7598 GFI->addStackRoot(FI->getIndex(), TypeMap);
7599 return;
7600 }
7601 case Intrinsic::gcread:
7602 case Intrinsic::gcwrite:
7603 llvm_unreachable("GC failed to lower gcread/gcwrite intrinsics!");
7604 case Intrinsic::get_rounding:
7605 Res = DAG.getNode(ISD::GET_ROUNDING, sdl, {MVT::i32, MVT::Other}, getRoot());
7606 setValue(&I, Res);
7607 DAG.setRoot(Res.getValue(1));
7608 return;
7609
7610 case Intrinsic::expect:
7611 case Intrinsic::expect_with_probability:
7612 // Just replace __builtin_expect(exp, c) and
7613 // __builtin_expect_with_probability(exp, c, p) with EXP.
7614 setValue(&I, getValue(I.getArgOperand(0)));
7615 return;
7616
7617 case Intrinsic::ubsantrap:
7618 case Intrinsic::debugtrap:
7619 case Intrinsic::trap: {
7620 StringRef TrapFuncName =
7621 I.getAttributes().getFnAttr("trap-func-name").getValueAsString();
7622 if (TrapFuncName.empty()) {
7623 switch (Intrinsic) {
7624 case Intrinsic::trap:
7625 DAG.setRoot(DAG.getNode(ISD::TRAP, sdl, MVT::Other, getRoot()));
7626 break;
7627 case Intrinsic::debugtrap:
7628 DAG.setRoot(DAG.getNode(ISD::DEBUGTRAP, sdl, MVT::Other, getRoot()));
7629 break;
7630 case Intrinsic::ubsantrap:
7631 DAG.setRoot(DAG.getNode(
7632 ISD::UBSANTRAP, sdl, MVT::Other, getRoot(),
7633 DAG.getTargetConstant(
7634 cast<ConstantInt>(I.getArgOperand(0))->getZExtValue(), sdl,
7635 MVT::i32)));
7636 break;
7637 default: llvm_unreachable("unknown trap intrinsic");
7638 }
7639 DAG.addNoMergeSiteInfo(DAG.getRoot().getNode(),
7640 I.hasFnAttr(Attribute::NoMerge));
7641 return;
7642 }
7644 if (Intrinsic == Intrinsic::ubsantrap) {
7645 Value *Arg = I.getArgOperand(0);
7646 Args.emplace_back(Arg, getValue(Arg));
7647 }
7648
7649 TargetLowering::CallLoweringInfo CLI(DAG);
7650 CLI.setDebugLoc(sdl).setChain(getRoot()).setLibCallee(
7651 CallingConv::C, I.getType(),
7652 DAG.getExternalSymbol(TrapFuncName.data(),
7653 TLI.getPointerTy(DAG.getDataLayout())),
7654 std::move(Args));
7655 CLI.NoMerge = I.hasFnAttr(Attribute::NoMerge);
7656 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
7657 DAG.setRoot(Result.second);
7658 return;
7659 }
7660
7661 case Intrinsic::allow_runtime_check:
7662 case Intrinsic::allow_ubsan_check:
7663 setValue(&I, getValue(ConstantInt::getTrue(I.getType())));
7664 return;
7665
7666 case Intrinsic::uadd_with_overflow:
7667 case Intrinsic::sadd_with_overflow:
7668 case Intrinsic::usub_with_overflow:
7669 case Intrinsic::ssub_with_overflow:
7670 case Intrinsic::umul_with_overflow:
7671 case Intrinsic::smul_with_overflow: {
7673 switch (Intrinsic) {
7674 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
7675 case Intrinsic::uadd_with_overflow: Op = ISD::UADDO; break;
7676 case Intrinsic::sadd_with_overflow: Op = ISD::SADDO; break;
7677 case Intrinsic::usub_with_overflow: Op = ISD::USUBO; break;
7678 case Intrinsic::ssub_with_overflow: Op = ISD::SSUBO; break;
7679 case Intrinsic::umul_with_overflow: Op = ISD::UMULO; break;
7680 case Intrinsic::smul_with_overflow: Op = ISD::SMULO; break;
7681 }
7682 SDValue Op1 = getValue(I.getArgOperand(0));
7683 SDValue Op2 = getValue(I.getArgOperand(1));
7684
7685 EVT ResultVT = Op1.getValueType();
7686 EVT OverflowVT = ResultVT.changeElementType(*Context, MVT::i1);
7687
7688 SDVTList VTs = DAG.getVTList(ResultVT, OverflowVT);
7689 setValue(&I, DAG.getNode(Op, sdl, VTs, Op1, Op2));
7690 return;
7691 }
7692 case Intrinsic::prefetch: {
7693 SDValue Ops[5];
7694 unsigned rw = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
7696 Ops[0] = DAG.getRoot();
7697 Ops[1] = getValue(I.getArgOperand(0));
7698 Ops[2] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(1)), sdl,
7699 MVT::i32);
7700 Ops[3] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(2)), sdl,
7701 MVT::i32);
7702 Ops[4] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(3)), sdl,
7703 MVT::i32);
7704 SDValue Result = DAG.getMemIntrinsicNode(
7705 ISD::PREFETCH, sdl, DAG.getVTList(MVT::Other), Ops,
7706 EVT::getIntegerVT(*Context, 8), MachinePointerInfo(I.getArgOperand(0)),
7707 /* align */ std::nullopt, Flags);
7708
7709 // Chain the prefetch in parallel with any pending loads, to stay out of
7710 // the way of later optimizations.
7711 PendingLoads.push_back(Result);
7712 Result = getRoot();
7713 DAG.setRoot(Result);
7714 return;
7715 }
7716 case Intrinsic::lifetime_start:
7717 case Intrinsic::lifetime_end: {
7718 bool IsStart = (Intrinsic == Intrinsic::lifetime_start);
7719 // Stack coloring is not enabled in O0, discard region information.
7720 if (TM.getOptLevel() == CodeGenOptLevel::None)
7721 return;
7722
7723 const AllocaInst *LifetimeObject = dyn_cast<AllocaInst>(I.getArgOperand(0));
7724 if (!LifetimeObject)
7725 return;
7726
7727 // First check that the Alloca is static, otherwise it won't have a
7728 // valid frame index.
7729 auto SI = FuncInfo.StaticAllocaMap.find(LifetimeObject);
7730 if (SI == FuncInfo.StaticAllocaMap.end())
7731 return;
7732
7733 const int FrameIndex = SI->second;
7734 Res = DAG.getLifetimeNode(IsStart, sdl, getRoot(), FrameIndex);
7735 DAG.setRoot(Res);
7736 return;
7737 }
7738 case Intrinsic::pseudoprobe: {
7739 auto Guid = cast<ConstantInt>(I.getArgOperand(0))->getZExtValue();
7740 auto Index = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
7741 auto Attr = cast<ConstantInt>(I.getArgOperand(2))->getZExtValue();
7742 Res = DAG.getPseudoProbeNode(sdl, getRoot(), Guid, Index, Attr);
7743 DAG.setRoot(Res);
7744 return;
7745 }
7746 case Intrinsic::invariant_start:
7747 // Discard region information.
7748 setValue(&I,
7749 DAG.getUNDEF(TLI.getValueType(DAG.getDataLayout(), I.getType())));
7750 return;
7751 case Intrinsic::invariant_end:
7752 // Discard region information.
7753 return;
7754 case Intrinsic::clear_cache: {
7755 SDValue InputChain = DAG.getRoot();
7756 SDValue StartVal = getValue(I.getArgOperand(0));
7757 SDValue EndVal = getValue(I.getArgOperand(1));
7758 Res = DAG.getNode(ISD::CLEAR_CACHE, sdl, DAG.getVTList(MVT::Other),
7759 {InputChain, StartVal, EndVal});
7760 setValue(&I, Res);
7761 DAG.setRoot(Res);
7762 return;
7763 }
7764 case Intrinsic::donothing:
7765 case Intrinsic::seh_try_begin:
7766 case Intrinsic::seh_scope_begin:
7767 case Intrinsic::seh_try_end:
7768 case Intrinsic::seh_scope_end:
7769 // ignore
7770 return;
7771 case Intrinsic::experimental_stackmap:
7772 visitStackmap(I);
7773 return;
7774 case Intrinsic::experimental_patchpoint_void:
7775 case Intrinsic::experimental_patchpoint:
7776 visitPatchpoint(I);
7777 return;
7778 case Intrinsic::experimental_gc_statepoint:
7780 return;
7781 case Intrinsic::experimental_gc_result:
7782 visitGCResult(cast<GCResultInst>(I));
7783 return;
7784 case Intrinsic::experimental_gc_relocate:
7785 visitGCRelocate(cast<GCRelocateInst>(I));
7786 return;
7787 case Intrinsic::instrprof_cover:
7788 llvm_unreachable("instrprof failed to lower a cover");
7789 case Intrinsic::instrprof_increment:
7790 llvm_unreachable("instrprof failed to lower an increment");
7791 case Intrinsic::instrprof_timestamp:
7792 llvm_unreachable("instrprof failed to lower a timestamp");
7793 case Intrinsic::instrprof_value_profile:
7794 llvm_unreachable("instrprof failed to lower a value profiling call");
7795 case Intrinsic::instrprof_mcdc_parameters:
7796 llvm_unreachable("instrprof failed to lower mcdc parameters");
7797 case Intrinsic::instrprof_mcdc_tvbitmap_update:
7798 llvm_unreachable("instrprof failed to lower an mcdc tvbitmap update");
7799 case Intrinsic::localescape: {
7800 MachineFunction &MF = DAG.getMachineFunction();
7801 const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo();
7802
7803 // Directly emit some LOCAL_ESCAPE machine instrs. Label assignment emission
7804 // is the same on all targets.
7805 for (unsigned Idx = 0, E = I.arg_size(); Idx < E; ++Idx) {
7806 Value *Arg = I.getArgOperand(Idx)->stripPointerCasts();
7807 if (isa<ConstantPointerNull>(Arg))
7808 continue; // Skip null pointers. They represent a hole in index space.
7809 AllocaInst *Slot = cast<AllocaInst>(Arg);
7810 assert(FuncInfo.StaticAllocaMap.count(Slot) &&
7811 "can only escape static allocas");
7812 int FI = FuncInfo.StaticAllocaMap[Slot];
7813 MCSymbol *FrameAllocSym = MF.getContext().getOrCreateFrameAllocSymbol(
7815 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, dl,
7816 TII->get(TargetOpcode::LOCAL_ESCAPE))
7817 .addSym(FrameAllocSym)
7818 .addFrameIndex(FI);
7819 }
7820
7821 return;
7822 }
7823
7824 case Intrinsic::localrecover: {
7825 // i8* @llvm.localrecover(i8* %fn, i8* %fp, i32 %idx)
7826 MachineFunction &MF = DAG.getMachineFunction();
7827
7828 // Get the symbol that defines the frame offset.
7829 auto *Fn = cast<Function>(I.getArgOperand(0)->stripPointerCasts());
7830 auto *Idx = cast<ConstantInt>(I.getArgOperand(2));
7831 unsigned IdxVal =
7832 unsigned(Idx->getLimitedValue(std::numeric_limits<int>::max()));
7833 MCSymbol *FrameAllocSym = MF.getContext().getOrCreateFrameAllocSymbol(
7835
7836 Value *FP = I.getArgOperand(1);
7837 SDValue FPVal = getValue(FP);
7838 EVT PtrVT = FPVal.getValueType();
7839
7840 // Create a MCSymbol for the label to avoid any target lowering
7841 // that would make this PC relative.
7842 SDValue OffsetSym = DAG.getMCSymbol(FrameAllocSym, PtrVT);
7843 SDValue OffsetVal =
7844 DAG.getNode(ISD::LOCAL_RECOVER, sdl, PtrVT, OffsetSym);
7845
7846 // Add the offset to the FP.
7847 SDValue Add = DAG.getMemBasePlusOffset(FPVal, OffsetVal, sdl);
7848 setValue(&I, Add);
7849
7850 return;
7851 }
7852
7853 case Intrinsic::fake_use: {
7854 Value *V = I.getArgOperand(0);
7855 SDValue Ops[2];
7856 // For Values not declared or previously used in this basic block, the
7857 // NodeMap will not have an entry, and `getValue` will assert if V has no
7858 // valid register value.
7859 auto FakeUseValue = [&]() -> SDValue {
7860 SDValue &N = NodeMap[V];
7861 if (N.getNode())
7862 return N;
7863
7864 // If there's a virtual register allocated and initialized for this
7865 // value, use it.
7866 if (SDValue copyFromReg = getCopyFromRegs(V, V->getType()))
7867 return copyFromReg;
7868 // FIXME: Do we want to preserve constants? It seems pointless.
7869 if (isa<Constant>(V))
7870 return getValue(V);
7871 return SDValue();
7872 }();
7873 if (!FakeUseValue || FakeUseValue.isUndef())
7874 return;
7875 Ops[0] = getRoot();
7876 Ops[1] = FakeUseValue;
7877 // Also, do not translate a fake use with an undef operand, or any other
7878 // empty SDValues.
7879 if (!Ops[1] || Ops[1].isUndef())
7880 return;
7881 DAG.setRoot(DAG.getNode(ISD::FAKE_USE, sdl, MVT::Other, Ops));
7882 return;
7883 }
7884
7885 case Intrinsic::reloc_none: {
7886 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(0))->getMetadata();
7887 StringRef SymbolName = cast<MDString>(MD)->getString();
7888 SDValue Ops[2] = {
7889 getRoot(),
7890 DAG.getTargetExternalSymbol(
7891 SymbolName.data(), TLI.getProgramPointerTy(DAG.getDataLayout()))};
7892 DAG.setRoot(DAG.getNode(ISD::RELOC_NONE, sdl, MVT::Other, Ops));
7893 return;
7894 }
7895
7896 case Intrinsic::cond_loop: {
7897 SDValue InputChain = DAG.getRoot();
7898 SDValue P = getValue(I.getArgOperand(0));
7899 Res = DAG.getNode(ISD::COND_LOOP, sdl, DAG.getVTList(MVT::Other),
7900 {InputChain, P});
7901 setValue(&I, Res);
7902 DAG.setRoot(Res);
7903 return;
7904 }
7905
7906 case Intrinsic::eh_exceptionpointer:
7907 case Intrinsic::eh_exceptioncode: {
7908 // Get the exception pointer vreg, copy from it, and resize it to fit.
7909 const auto *CPI = cast<CatchPadInst>(I.getArgOperand(0));
7910 MVT PtrVT = TLI.getPointerTy(DAG.getDataLayout());
7911 const TargetRegisterClass *PtrRC = TLI.getRegClassFor(PtrVT);
7912 Register VReg = FuncInfo.getCatchPadExceptionPointerVReg(CPI, PtrRC);
7913 SDValue N = DAG.getCopyFromReg(DAG.getEntryNode(), sdl, VReg, PtrVT);
7914 if (Intrinsic == Intrinsic::eh_exceptioncode)
7915 N = DAG.getZExtOrTrunc(N, sdl, MVT::i32);
7916 setValue(&I, N);
7917 return;
7918 }
7919 case Intrinsic::xray_customevent: {
7920 // Here we want to make sure that the intrinsic behaves as if it has a
7921 // specific calling convention.
7922 const auto &Triple = DAG.getTarget().getTargetTriple();
7923 if (!Triple.isAArch64(64) && Triple.getArch() != Triple::x86_64)
7924 return;
7925
7927
7928 // We want to say that we always want the arguments in registers.
7929 SDValue LogEntryVal = getValue(I.getArgOperand(0));
7930 SDValue StrSizeVal = getValue(I.getArgOperand(1));
7931 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
7932 SDValue Chain = getRoot();
7933 Ops.push_back(LogEntryVal);
7934 Ops.push_back(StrSizeVal);
7935 Ops.push_back(Chain);
7936
7937 // We need to enforce the calling convention for the callsite, so that
7938 // argument ordering is enforced correctly, and that register allocation can
7939 // see that some registers may be assumed clobbered and have to preserve
7940 // them across calls to the intrinsic.
7941 MachineSDNode *MN = DAG.getMachineNode(TargetOpcode::PATCHABLE_EVENT_CALL,
7942 sdl, NodeTys, Ops);
7943 SDValue patchableNode = SDValue(MN, 0);
7944 DAG.setRoot(patchableNode);
7945 setValue(&I, patchableNode);
7946 return;
7947 }
7948 case Intrinsic::xray_typedevent: {
7949 // Here we want to make sure that the intrinsic behaves as if it has a
7950 // specific calling convention.
7951 const auto &Triple = DAG.getTarget().getTargetTriple();
7952 if (!Triple.isAArch64(64) && Triple.getArch() != Triple::x86_64)
7953 return;
7954
7956
7957 // We want to say that we always want the arguments in registers.
7958 // It's unclear to me how manipulating the selection DAG here forces callers
7959 // to provide arguments in registers instead of on the stack.
7960 SDValue LogTypeId = getValue(I.getArgOperand(0));
7961 SDValue LogEntryVal = getValue(I.getArgOperand(1));
7962 SDValue StrSizeVal = getValue(I.getArgOperand(2));
7963 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
7964 SDValue Chain = getRoot();
7965 Ops.push_back(LogTypeId);
7966 Ops.push_back(LogEntryVal);
7967 Ops.push_back(StrSizeVal);
7968 Ops.push_back(Chain);
7969
7970 // We need to enforce the calling convention for the callsite, so that
7971 // argument ordering is enforced correctly, and that register allocation can
7972 // see that some registers may be assumed clobbered and have to preserve
7973 // them across calls to the intrinsic.
7974 MachineSDNode *MN = DAG.getMachineNode(
7975 TargetOpcode::PATCHABLE_TYPED_EVENT_CALL, sdl, NodeTys, Ops);
7976 SDValue patchableNode = SDValue(MN, 0);
7977 DAG.setRoot(patchableNode);
7978 setValue(&I, patchableNode);
7979 return;
7980 }
7981 case Intrinsic::experimental_deoptimize:
7983 return;
7984 case Intrinsic::stepvector:
7985 visitStepVector(I);
7986 return;
7987 case Intrinsic::vector_reduce_fadd:
7988 case Intrinsic::vector_reduce_fmul:
7989 case Intrinsic::vector_reduce_add:
7990 case Intrinsic::vector_reduce_mul:
7991 case Intrinsic::vector_reduce_and:
7992 case Intrinsic::vector_reduce_or:
7993 case Intrinsic::vector_reduce_xor:
7994 case Intrinsic::vector_reduce_smax:
7995 case Intrinsic::vector_reduce_smin:
7996 case Intrinsic::vector_reduce_umax:
7997 case Intrinsic::vector_reduce_umin:
7998 case Intrinsic::vector_reduce_fmax:
7999 case Intrinsic::vector_reduce_fmin:
8000 case Intrinsic::vector_reduce_fmaximum:
8001 case Intrinsic::vector_reduce_fminimum:
8002 visitVectorReduce(I, Intrinsic);
8003 return;
8004
8005 case Intrinsic::icall_branch_funnel: {
8007 Ops.push_back(getValue(I.getArgOperand(0)));
8008
8009 int64_t Offset;
8011 I.getArgOperand(1), Offset, DAG.getDataLayout()));
8012 if (!Base)
8014 "llvm.icall.branch.funnel operand must be a GlobalValue");
8015 Ops.push_back(DAG.getTargetGlobalAddress(Base, sdl, MVT::i64, 0));
8016
8017 struct BranchFunnelTarget {
8018 int64_t Offset;
8020 };
8022
8023 for (unsigned Op = 1, N = I.arg_size(); Op != N; Op += 2) {
8025 I.getArgOperand(Op), Offset, DAG.getDataLayout()));
8026 if (ElemBase != Base)
8027 report_fatal_error("all llvm.icall.branch.funnel operands must refer "
8028 "to the same GlobalValue");
8029
8030 SDValue Val = getValue(I.getArgOperand(Op + 1));
8031 auto *GA = dyn_cast<GlobalAddressSDNode>(Val);
8032 if (!GA)
8034 "llvm.icall.branch.funnel operand must be a GlobalValue");
8035 Targets.push_back({Offset, DAG.getTargetGlobalAddress(
8036 GA->getGlobal(), sdl, Val.getValueType(),
8037 GA->getOffset())});
8038 }
8039 llvm::sort(Targets,
8040 [](const BranchFunnelTarget &T1, const BranchFunnelTarget &T2) {
8041 return T1.Offset < T2.Offset;
8042 });
8043
8044 for (auto &T : Targets) {
8045 Ops.push_back(DAG.getTargetConstant(T.Offset, sdl, MVT::i32));
8046 Ops.push_back(T.Target);
8047 }
8048
8049 Ops.push_back(DAG.getRoot()); // Chain
8050 SDValue N(DAG.getMachineNode(TargetOpcode::ICALL_BRANCH_FUNNEL, sdl,
8051 MVT::Other, Ops),
8052 0);
8053 DAG.setRoot(N);
8054 setValue(&I, N);
8055 HasTailCall = true;
8056 return;
8057 }
8058
8059 case Intrinsic::wasm_landingpad_index:
8060 // Information this intrinsic contained has been transferred to
8061 // MachineFunction in SelectionDAGISel::PrepareEHLandingPad. We can safely
8062 // delete it now.
8063 return;
8064
8065 case Intrinsic::aarch64_settag:
8066 case Intrinsic::aarch64_settag_zero: {
8067 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
8068 bool ZeroMemory = Intrinsic == Intrinsic::aarch64_settag_zero;
8070 DAG, sdl, getRoot(), getValue(I.getArgOperand(0)),
8071 getValue(I.getArgOperand(1)), MachinePointerInfo(I.getArgOperand(0)),
8072 ZeroMemory);
8073 DAG.setRoot(Val);
8074 setValue(&I, Val);
8075 return;
8076 }
8077 case Intrinsic::amdgcn_cs_chain: {
8078 // At this point we don't care if it's amdgpu_cs_chain or
8079 // amdgpu_cs_chain_preserve.
8081
8082 Type *RetTy = I.getType();
8083 assert(RetTy->isVoidTy() && "Should not return");
8084
8085 SDValue Callee = getValue(I.getOperand(0));
8086
8087 // We only have 2 actual args: one for the SGPRs and one for the VGPRs.
8088 // We'll also tack the value of the EXEC mask at the end.
8090 Args.reserve(3);
8091
8092 for (unsigned Idx : {2, 3, 1}) {
8093 TargetLowering::ArgListEntry Arg(getValue(I.getOperand(Idx)),
8094 I.getOperand(Idx)->getType());
8095 Arg.setAttributes(&I, Idx);
8096 Args.push_back(Arg);
8097 }
8098
8099 assert(Args[0].IsInReg && "SGPR args should be marked inreg");
8100 assert(!Args[1].IsInReg && "VGPR args should not be marked inreg");
8101 Args[2].IsInReg = true; // EXEC should be inreg
8102
8103 // Forward the flags and any additional arguments.
8104 for (unsigned Idx = 4; Idx < I.arg_size(); ++Idx) {
8105 TargetLowering::ArgListEntry Arg(getValue(I.getOperand(Idx)),
8106 I.getOperand(Idx)->getType());
8107 Arg.setAttributes(&I, Idx);
8108 Args.push_back(Arg);
8109 }
8110
8111 TargetLowering::CallLoweringInfo CLI(DAG);
8112 CLI.setDebugLoc(getCurSDLoc())
8113 .setChain(getRoot())
8114 .setCallee(CC, RetTy, Callee, std::move(Args))
8115 .setNoReturn(true)
8116 .setTailCall(true)
8117 .setConvergent(I.isConvergent());
8118 CLI.CB = &I;
8119 std::pair<SDValue, SDValue> Result =
8120 lowerInvokable(CLI, /*EHPadBB*/ nullptr);
8121 (void)Result;
8122 assert(!Result.first.getNode() && !Result.second.getNode() &&
8123 "Should've lowered as tail call");
8124
8125 HasTailCall = true;
8126 return;
8127 }
8128 case Intrinsic::amdgcn_call_whole_wave: {
8130 bool isTailCall = I.isTailCall();
8131
8132 // The first argument is the callee. Skip it when assembling the call args.
8133 for (unsigned Idx = 1; Idx < I.arg_size(); ++Idx) {
8134 TargetLowering::ArgListEntry Arg(getValue(I.getArgOperand(Idx)),
8135 I.getArgOperand(Idx)->getType());
8136 Arg.setAttributes(&I, Idx);
8137
8138 // If we have an explicit sret argument that is an Instruction, (i.e., it
8139 // might point to function-local memory), we can't meaningfully tail-call.
8140 if (Arg.IsSRet && isa<Instruction>(I.getArgOperand(Idx)))
8141 isTailCall = false;
8142
8143 Args.push_back(Arg);
8144 }
8145
8146 SDValue ConvControlToken;
8147 if (auto Bundle = I.getOperandBundle(LLVMContext::OB_convergencectrl)) {
8148 auto *Token = Bundle->Inputs[0].get();
8149 ConvControlToken = getValue(Token);
8150 }
8151
8152 TargetLowering::CallLoweringInfo CLI(DAG);
8153 CLI.setDebugLoc(getCurSDLoc())
8154 .setChain(getRoot())
8155 .setCallee(CallingConv::AMDGPU_Gfx_WholeWave, I.getType(),
8156 getValue(I.getArgOperand(0)), std::move(Args))
8157 .setTailCall(isTailCall && canTailCall(I))
8158 .setIsPreallocated(
8159 I.countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0)
8160 .setConvergent(I.isConvergent())
8161 .setConvergenceControlToken(ConvControlToken);
8162 CLI.CB = &I;
8163
8164 std::pair<SDValue, SDValue> Result =
8165 lowerInvokable(CLI, /*EHPadBB=*/nullptr);
8166
8167 if (Result.first.getNode())
8168 setValue(&I, Result.first);
8169 return;
8170 }
8171 case Intrinsic::ptrmask: {
8172 SDValue Ptr = getValue(I.getOperand(0));
8173 SDValue Mask = getValue(I.getOperand(1));
8174
8175 // On arm64_32, pointers are 32 bits when stored in memory, but
8176 // zero-extended to 64 bits when in registers. Thus the mask is 32 bits to
8177 // match the index type, but the pointer is 64 bits, so the mask must be
8178 // zero-extended up to 64 bits to match the pointer.
8179 EVT PtrVT =
8180 TLI.getValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
8181 EVT MemVT =
8182 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
8183 assert(PtrVT == Ptr.getValueType());
8184 if (Mask.getValueType().getFixedSizeInBits() < MemVT.getFixedSizeInBits()) {
8185 // For AMDGPU buffer descriptors the mask is 48 bits, but the pointer is
8186 // 128-bit, so we have to pad the mask with ones for unused bits.
8187 auto HighOnes = DAG.getNode(
8188 ISD::SHL, sdl, PtrVT, DAG.getAllOnesConstant(sdl, PtrVT),
8189 DAG.getShiftAmountConstant(Mask.getValueType().getFixedSizeInBits(),
8190 PtrVT, sdl));
8191 Mask = DAG.getNode(ISD::OR, sdl, PtrVT,
8192 DAG.getZExtOrTrunc(Mask, sdl, PtrVT), HighOnes);
8193 } else if (Mask.getValueType() != PtrVT)
8194 Mask = DAG.getPtrExtOrTrunc(Mask, sdl, PtrVT);
8195
8196 assert(Mask.getValueType() == PtrVT);
8197 setValue(&I, DAG.getNode(ISD::AND, sdl, PtrVT, Ptr, Mask));
8198 return;
8199 }
8200 case Intrinsic::threadlocal_address: {
8201 setValue(&I, getValue(I.getOperand(0)));
8202 return;
8203 }
8204 case Intrinsic::get_active_lane_mask: {
8205 EVT CCVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8206 SDValue Index = getValue(I.getOperand(0));
8207 SDValue TripCount = getValue(I.getOperand(1));
8208 EVT ElementVT = Index.getValueType();
8209
8210 if (!TLI.shouldExpandGetActiveLaneMask(CCVT, ElementVT)) {
8211 setValue(&I, DAG.getNode(ISD::GET_ACTIVE_LANE_MASK, sdl, CCVT, Index,
8212 TripCount));
8213 return;
8214 }
8215
8216 EVT VecTy = EVT::getVectorVT(*DAG.getContext(), ElementVT,
8217 CCVT.getVectorElementCount());
8218
8219 SDValue VectorIndex = DAG.getSplat(VecTy, sdl, Index);
8220 SDValue VectorTripCount = DAG.getSplat(VecTy, sdl, TripCount);
8221 SDValue VectorStep = DAG.getStepVector(sdl, VecTy);
8222 SDValue VectorInduction = DAG.getNode(
8223 ISD::UADDSAT, sdl, VecTy, VectorIndex, VectorStep);
8224 SDValue SetCC = DAG.getSetCC(sdl, CCVT, VectorInduction,
8225 VectorTripCount, ISD::CondCode::SETULT);
8226 setValue(&I, SetCC);
8227 return;
8228 }
8229 case Intrinsic::experimental_get_vector_length: {
8230 assert(cast<ConstantInt>(I.getOperand(1))->getSExtValue() > 0 &&
8231 "Expected positive VF");
8232 unsigned VF = cast<ConstantInt>(I.getOperand(1))->getZExtValue();
8233 bool IsScalable = cast<ConstantInt>(I.getOperand(2))->isOne();
8234
8235 SDValue Count = getValue(I.getOperand(0));
8236 EVT CountVT = Count.getValueType();
8237
8238 if (!TLI.shouldExpandGetVectorLength(CountVT, VF, IsScalable)) {
8239 visitTargetIntrinsic(I, Intrinsic);
8240 return;
8241 }
8242
8243 // Expand to a umin between the trip count and the maximum elements the type
8244 // can hold.
8245 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8246
8247 // Extend the trip count to at least the result VT.
8248 if (CountVT.bitsLT(VT)) {
8249 Count = DAG.getNode(ISD::ZERO_EXTEND, sdl, VT, Count);
8250 CountVT = VT;
8251 }
8252
8253 SDValue MaxEVL = DAG.getElementCount(sdl, CountVT,
8254 ElementCount::get(VF, IsScalable));
8255
8256 SDValue UMin = DAG.getNode(ISD::UMIN, sdl, CountVT, Count, MaxEVL);
8257 // Clip to the result type if needed.
8258 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, sdl, VT, UMin);
8259
8260 setValue(&I, Trunc);
8261 return;
8262 }
8263 case Intrinsic::vector_partial_reduce_add: {
8264 SDValue Acc = getValue(I.getOperand(0));
8265 SDValue Input = getValue(I.getOperand(1));
8266 setValue(&I,
8267 DAG.getNode(ISD::PARTIAL_REDUCE_UMLA, sdl, Acc.getValueType(), Acc,
8268 Input, DAG.getConstant(1, sdl, Input.getValueType())));
8269 return;
8270 }
8271 case Intrinsic::vector_partial_reduce_fadd: {
8272 SDValue Acc = getValue(I.getOperand(0));
8273 SDValue Input = getValue(I.getOperand(1));
8274 setValue(&I, DAG.getNode(
8275 ISD::PARTIAL_REDUCE_FMLA, sdl, Acc.getValueType(), Acc,
8276 Input, DAG.getConstantFP(1.0, sdl, Input.getValueType())));
8277 return;
8278 }
8279 case Intrinsic::experimental_cttz_elts: {
8280 auto DL = getCurSDLoc();
8281 SDValue Op = getValue(I.getOperand(0));
8282 EVT OpVT = Op.getValueType();
8283
8284 if (!TLI.shouldExpandCttzElements(OpVT)) {
8285 visitTargetIntrinsic(I, Intrinsic);
8286 return;
8287 }
8288
8289 if (OpVT.getScalarType() != MVT::i1) {
8290 // Compare the input vector elements to zero & use to count trailing zeros
8291 SDValue AllZero = DAG.getConstant(0, DL, OpVT);
8292 OpVT = EVT::getVectorVT(*DAG.getContext(), MVT::i1,
8293 OpVT.getVectorElementCount());
8294 Op = DAG.getSetCC(DL, OpVT, Op, AllZero, ISD::SETNE);
8295 }
8296
8297 // If the zero-is-poison flag is set, we can assume the upper limit
8298 // of the result is VF-1.
8299 bool ZeroIsPoison =
8300 !cast<ConstantSDNode>(getValue(I.getOperand(1)))->isZero();
8301 ConstantRange VScaleRange(1, true); // Dummy value.
8302 if (isa<ScalableVectorType>(I.getOperand(0)->getType()))
8303 VScaleRange = getVScaleRange(I.getCaller(), 64);
8304 unsigned EltWidth = TLI.getBitWidthForCttzElements(
8305 I.getType(), OpVT.getVectorElementCount(), ZeroIsPoison, &VScaleRange);
8306
8307 MVT NewEltTy = MVT::getIntegerVT(EltWidth);
8308
8309 // Create the new vector type & get the vector length
8310 EVT NewVT = EVT::getVectorVT(*DAG.getContext(), NewEltTy,
8311 OpVT.getVectorElementCount());
8312
8313 SDValue VL =
8314 DAG.getElementCount(DL, NewEltTy, OpVT.getVectorElementCount());
8315
8316 SDValue StepVec = DAG.getStepVector(DL, NewVT);
8317 SDValue SplatVL = DAG.getSplat(NewVT, DL, VL);
8318 SDValue StepVL = DAG.getNode(ISD::SUB, DL, NewVT, SplatVL, StepVec);
8319 SDValue Ext = DAG.getNode(ISD::SIGN_EXTEND, DL, NewVT, Op);
8320 SDValue And = DAG.getNode(ISD::AND, DL, NewVT, StepVL, Ext);
8321 SDValue Max = DAG.getNode(ISD::VECREDUCE_UMAX, DL, NewEltTy, And);
8322 SDValue Sub = DAG.getNode(ISD::SUB, DL, NewEltTy, VL, Max);
8323
8324 EVT RetTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
8325 SDValue Ret = DAG.getZExtOrTrunc(Sub, DL, RetTy);
8326
8327 setValue(&I, Ret);
8328 return;
8329 }
8330 case Intrinsic::vector_insert: {
8331 SDValue Vec = getValue(I.getOperand(0));
8332 SDValue SubVec = getValue(I.getOperand(1));
8333 SDValue Index = getValue(I.getOperand(2));
8334
8335 // The intrinsic's index type is i64, but the SDNode requires an index type
8336 // suitable for the target. Convert the index as required.
8337 MVT VectorIdxTy = TLI.getVectorIdxTy(DAG.getDataLayout());
8338 if (Index.getValueType() != VectorIdxTy)
8339 Index = DAG.getVectorIdxConstant(Index->getAsZExtVal(), sdl);
8340
8341 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8342 setValue(&I, DAG.getNode(ISD::INSERT_SUBVECTOR, sdl, ResultVT, Vec, SubVec,
8343 Index));
8344 return;
8345 }
8346 case Intrinsic::vector_extract: {
8347 SDValue Vec = getValue(I.getOperand(0));
8348 SDValue Index = getValue(I.getOperand(1));
8349 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8350
8351 // The intrinsic's index type is i64, but the SDNode requires an index type
8352 // suitable for the target. Convert the index as required.
8353 MVT VectorIdxTy = TLI.getVectorIdxTy(DAG.getDataLayout());
8354 if (Index.getValueType() != VectorIdxTy)
8355 Index = DAG.getVectorIdxConstant(Index->getAsZExtVal(), sdl);
8356
8357 setValue(&I,
8358 DAG.getNode(ISD::EXTRACT_SUBVECTOR, sdl, ResultVT, Vec, Index));
8359 return;
8360 }
8361 case Intrinsic::experimental_vector_match: {
8362 SDValue Op1 = getValue(I.getOperand(0));
8363 SDValue Op2 = getValue(I.getOperand(1));
8364 SDValue Mask = getValue(I.getOperand(2));
8365 EVT Op1VT = Op1.getValueType();
8366 EVT Op2VT = Op2.getValueType();
8367 EVT ResVT = Mask.getValueType();
8368 unsigned SearchSize = Op2VT.getVectorNumElements();
8369
8370 // If the target has native support for this vector match operation, lower
8371 // the intrinsic untouched; otherwise, expand it below.
8372 if (!TLI.shouldExpandVectorMatch(Op1VT, SearchSize)) {
8373 visitTargetIntrinsic(I, Intrinsic);
8374 return;
8375 }
8376
8377 SDValue Ret = DAG.getConstant(0, sdl, ResVT);
8378
8379 for (unsigned i = 0; i < SearchSize; ++i) {
8380 SDValue Op2Elem = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, sdl,
8381 Op2VT.getVectorElementType(), Op2,
8382 DAG.getVectorIdxConstant(i, sdl));
8383 SDValue Splat = DAG.getNode(ISD::SPLAT_VECTOR, sdl, Op1VT, Op2Elem);
8384 SDValue Cmp = DAG.getSetCC(sdl, ResVT, Op1, Splat, ISD::SETEQ);
8385 Ret = DAG.getNode(ISD::OR, sdl, ResVT, Ret, Cmp);
8386 }
8387
8388 setValue(&I, DAG.getNode(ISD::AND, sdl, ResVT, Ret, Mask));
8389 return;
8390 }
8391 case Intrinsic::vector_reverse:
8392 visitVectorReverse(I);
8393 return;
8394 case Intrinsic::vector_splice_left:
8395 case Intrinsic::vector_splice_right:
8396 visitVectorSplice(I);
8397 return;
8398 case Intrinsic::callbr_landingpad:
8399 visitCallBrLandingPad(I);
8400 return;
8401 case Intrinsic::vector_interleave2:
8402 visitVectorInterleave(I, 2);
8403 return;
8404 case Intrinsic::vector_interleave3:
8405 visitVectorInterleave(I, 3);
8406 return;
8407 case Intrinsic::vector_interleave4:
8408 visitVectorInterleave(I, 4);
8409 return;
8410 case Intrinsic::vector_interleave5:
8411 visitVectorInterleave(I, 5);
8412 return;
8413 case Intrinsic::vector_interleave6:
8414 visitVectorInterleave(I, 6);
8415 return;
8416 case Intrinsic::vector_interleave7:
8417 visitVectorInterleave(I, 7);
8418 return;
8419 case Intrinsic::vector_interleave8:
8420 visitVectorInterleave(I, 8);
8421 return;
8422 case Intrinsic::vector_deinterleave2:
8423 visitVectorDeinterleave(I, 2);
8424 return;
8425 case Intrinsic::vector_deinterleave3:
8426 visitVectorDeinterleave(I, 3);
8427 return;
8428 case Intrinsic::vector_deinterleave4:
8429 visitVectorDeinterleave(I, 4);
8430 return;
8431 case Intrinsic::vector_deinterleave5:
8432 visitVectorDeinterleave(I, 5);
8433 return;
8434 case Intrinsic::vector_deinterleave6:
8435 visitVectorDeinterleave(I, 6);
8436 return;
8437 case Intrinsic::vector_deinterleave7:
8438 visitVectorDeinterleave(I, 7);
8439 return;
8440 case Intrinsic::vector_deinterleave8:
8441 visitVectorDeinterleave(I, 8);
8442 return;
8443 case Intrinsic::experimental_vector_compress:
8444 setValue(&I, DAG.getNode(ISD::VECTOR_COMPRESS, sdl,
8445 getValue(I.getArgOperand(0)).getValueType(),
8446 getValue(I.getArgOperand(0)),
8447 getValue(I.getArgOperand(1)),
8448 getValue(I.getArgOperand(2)), Flags));
8449 return;
8450 case Intrinsic::experimental_convergence_anchor:
8451 case Intrinsic::experimental_convergence_entry:
8452 case Intrinsic::experimental_convergence_loop:
8453 visitConvergenceControl(I, Intrinsic);
8454 return;
8455 case Intrinsic::experimental_vector_histogram_add: {
8456 visitVectorHistogram(I, Intrinsic);
8457 return;
8458 }
8459 case Intrinsic::experimental_vector_extract_last_active: {
8460 visitVectorExtractLastActive(I, Intrinsic);
8461 return;
8462 }
8463 case Intrinsic::loop_dependence_war_mask:
8464 setValue(&I,
8466 EVT::getEVT(I.getType()), getValue(I.getOperand(0)),
8467 getValue(I.getOperand(1)), getValue(I.getOperand(2)),
8468 DAG.getConstant(0, sdl, MVT::i64)));
8469 return;
8470 case Intrinsic::loop_dependence_raw_mask:
8471 setValue(&I,
8473 EVT::getEVT(I.getType()), getValue(I.getOperand(0)),
8474 getValue(I.getOperand(1)), getValue(I.getOperand(2)),
8475 DAG.getConstant(0, sdl, MVT::i64)));
8476 return;
8477 }
8478}
8479
8480void SelectionDAGBuilder::pushFPOpOutChain(SDValue Result,
8482 assert(Result.getNode()->getNumValues() == 2);
8483 SDValue OutChain = Result.getValue(1);
8484 assert(OutChain.getValueType() == MVT::Other);
8485
8486 // Instead of updating the root immediately, push the produced chain to the
8487 // appropriate list, deferring the update until the root is requested. In this
8488 // case, the nodes from the lists are chained using TokenFactor, indicating
8489 // that the operations are independent.
8490 //
8491 // In particular, the root is updated before any call that might access the
8492 // floating-point environment, except for constrained intrinsics.
8493 switch (EB) {
8496 PendingConstrainedFP.push_back(OutChain);
8497 break;
8499 PendingConstrainedFPStrict.push_back(OutChain);
8500 break;
8501 }
8502}
8503
8504void SelectionDAGBuilder::visitConstrainedFPIntrinsic(
8505 const ConstrainedFPIntrinsic &FPI) {
8506 SDLoc sdl = getCurSDLoc();
8507
8508 // We do not need to serialize constrained FP intrinsics against
8509 // each other or against (nonvolatile) loads, so they can be
8510 // chained like loads.
8512 SDValue Chain = getFPOperationRoot(EB);
8514 Opers.push_back(Chain);
8515 for (unsigned I = 0, E = FPI.getNonMetadataArgCount(); I != E; ++I)
8516 Opers.push_back(getValue(FPI.getArgOperand(I)));
8517
8518 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8519 EVT VT = TLI.getValueType(DAG.getDataLayout(), FPI.getType());
8520 SDVTList VTs = DAG.getVTList(VT, MVT::Other);
8521
8522 SDNodeFlags Flags;
8524 Flags.setNoFPExcept(true);
8525
8526 if (auto *FPOp = dyn_cast<FPMathOperator>(&FPI))
8527 Flags.copyFMF(*FPOp);
8528
8529 unsigned Opcode;
8530 switch (FPI.getIntrinsicID()) {
8531 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
8532#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
8533 case Intrinsic::INTRINSIC: \
8534 Opcode = ISD::STRICT_##DAGN; \
8535 break;
8536#include "llvm/IR/ConstrainedOps.def"
8537 case Intrinsic::experimental_constrained_fmuladd: {
8538 Opcode = ISD::STRICT_FMA;
8539 // Break fmuladd into fmul and fadd.
8540 if (TM.Options.AllowFPOpFusion == FPOpFusion::Strict ||
8541 !TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), VT)) {
8542 Opers.pop_back();
8543 SDValue Mul = DAG.getNode(ISD::STRICT_FMUL, sdl, VTs, Opers, Flags);
8544 pushFPOpOutChain(Mul, EB);
8545 Opcode = ISD::STRICT_FADD;
8546 Opers.clear();
8547 Opers.push_back(Mul.getValue(1));
8548 Opers.push_back(Mul.getValue(0));
8549 Opers.push_back(getValue(FPI.getArgOperand(2)));
8550 }
8551 break;
8552 }
8553 }
8554
8555 // A few strict DAG nodes carry additional operands that are not
8556 // set up by the default code above.
8557 switch (Opcode) {
8558 default: break;
8560 Opers.push_back(
8561 DAG.getTargetConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout())));
8562 break;
8563 case ISD::STRICT_FSETCC:
8564 case ISD::STRICT_FSETCCS: {
8565 auto *FPCmp = dyn_cast<ConstrainedFPCmpIntrinsic>(&FPI);
8566 ISD::CondCode Condition = getFCmpCondCode(FPCmp->getPredicate());
8567 if (DAG.isKnownNeverNaN(Opers[1]) && DAG.isKnownNeverNaN(Opers[2]))
8568 Condition = getFCmpCodeWithoutNaN(Condition);
8569 Opers.push_back(DAG.getCondCode(Condition));
8570 break;
8571 }
8572 }
8573
8574 SDValue Result = DAG.getNode(Opcode, sdl, VTs, Opers, Flags);
8575 pushFPOpOutChain(Result, EB);
8576
8577 SDValue FPResult = Result.getValue(0);
8578 setValue(&FPI, FPResult);
8579}
8580
8581static unsigned getISDForVPIntrinsic(const VPIntrinsic &VPIntrin) {
8582 std::optional<unsigned> ResOPC;
8583 switch (VPIntrin.getIntrinsicID()) {
8584 case Intrinsic::vp_ctlz: {
8585 bool IsZeroUndef = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8586 ResOPC = IsZeroUndef ? ISD::VP_CTLZ_ZERO_UNDEF : ISD::VP_CTLZ;
8587 break;
8588 }
8589 case Intrinsic::vp_cttz: {
8590 bool IsZeroUndef = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8591 ResOPC = IsZeroUndef ? ISD::VP_CTTZ_ZERO_UNDEF : ISD::VP_CTTZ;
8592 break;
8593 }
8594 case Intrinsic::vp_cttz_elts: {
8595 bool IsZeroPoison = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8596 ResOPC = IsZeroPoison ? ISD::VP_CTTZ_ELTS_ZERO_UNDEF : ISD::VP_CTTZ_ELTS;
8597 break;
8598 }
8599#define HELPER_MAP_VPID_TO_VPSD(VPID, VPSD) \
8600 case Intrinsic::VPID: \
8601 ResOPC = ISD::VPSD; \
8602 break;
8603#include "llvm/IR/VPIntrinsics.def"
8604 }
8605
8606 if (!ResOPC)
8608 "Inconsistency: no SDNode available for this VPIntrinsic!");
8609
8610 if (*ResOPC == ISD::VP_REDUCE_SEQ_FADD ||
8611 *ResOPC == ISD::VP_REDUCE_SEQ_FMUL) {
8612 if (VPIntrin.getFastMathFlags().allowReassoc())
8613 return *ResOPC == ISD::VP_REDUCE_SEQ_FADD ? ISD::VP_REDUCE_FADD
8614 : ISD::VP_REDUCE_FMUL;
8615 }
8616
8617 return *ResOPC;
8618}
8619
8620void SelectionDAGBuilder::visitVPLoad(
8621 const VPIntrinsic &VPIntrin, EVT VT,
8622 const SmallVectorImpl<SDValue> &OpValues) {
8623 SDLoc DL = getCurSDLoc();
8624 Value *PtrOperand = VPIntrin.getArgOperand(0);
8625 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8626 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8627 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8628 SDValue LD;
8629 // Do not serialize variable-length loads of constant memory with
8630 // anything.
8631 if (!Alignment)
8632 Alignment = DAG.getEVTAlign(VT);
8633 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8634 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8635 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8636 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8637 MachineMemOperand::Flags MMOFlags =
8638 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8639 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8640 MachinePointerInfo(PtrOperand), MMOFlags,
8641 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo, Ranges);
8642 LD = DAG.getLoadVP(VT, DL, InChain, OpValues[0], OpValues[1], OpValues[2],
8643 MMO, false /*IsExpanding */);
8644 if (AddToChain)
8645 PendingLoads.push_back(LD.getValue(1));
8646 setValue(&VPIntrin, LD);
8647}
8648
8649void SelectionDAGBuilder::visitVPLoadFF(
8650 const VPIntrinsic &VPIntrin, EVT VT, EVT EVLVT,
8651 const SmallVectorImpl<SDValue> &OpValues) {
8652 assert(OpValues.size() == 3 && "Unexpected number of operands");
8653 SDLoc DL = getCurSDLoc();
8654 Value *PtrOperand = VPIntrin.getArgOperand(0);
8655 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8656 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8657 const MDNode *Ranges = VPIntrin.getMetadata(LLVMContext::MD_range);
8658 SDValue LD;
8659 // Do not serialize variable-length loads of constant memory with
8660 // anything.
8661 if (!Alignment)
8662 Alignment = DAG.getEVTAlign(VT);
8663 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8664 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8665 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8666 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8667 MachinePointerInfo(PtrOperand), MachineMemOperand::MOLoad,
8668 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo, Ranges);
8669 LD = DAG.getLoadFFVP(VT, DL, InChain, OpValues[0], OpValues[1], OpValues[2],
8670 MMO);
8671 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, EVLVT, LD.getValue(1));
8672 if (AddToChain)
8673 PendingLoads.push_back(LD.getValue(2));
8674 setValue(&VPIntrin, DAG.getMergeValues({LD.getValue(0), Trunc}, DL));
8675}
8676
8677void SelectionDAGBuilder::visitVPGather(
8678 const VPIntrinsic &VPIntrin, EVT VT,
8679 const SmallVectorImpl<SDValue> &OpValues) {
8680 SDLoc DL = getCurSDLoc();
8681 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8682 Value *PtrOperand = VPIntrin.getArgOperand(0);
8683 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8684 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8685 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8686 SDValue LD;
8687 if (!Alignment)
8688 Alignment = DAG.getEVTAlign(VT.getScalarType());
8689 unsigned AS =
8690 PtrOperand->getType()->getScalarType()->getPointerAddressSpace();
8691 MachineMemOperand::Flags MMOFlags =
8692 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8693 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8694 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8695 *Alignment, AAInfo, Ranges);
8696 SDValue Base, Index, Scale;
8697 bool UniformBase =
8698 getUniformBase(PtrOperand, Base, Index, Scale, this, VPIntrin.getParent(),
8699 VT.getScalarStoreSize());
8700 if (!UniformBase) {
8701 Base = DAG.getConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout()));
8702 Index = getValue(PtrOperand);
8703 Scale = DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout()));
8704 }
8705 EVT IdxVT = Index.getValueType();
8706 EVT EltTy = IdxVT.getVectorElementType();
8707 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
8708 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
8709 Index = DAG.getNode(ISD::SIGN_EXTEND, DL, NewIdxVT, Index);
8710 }
8711 LD = DAG.getGatherVP(
8712 DAG.getVTList(VT, MVT::Other), VT, DL,
8713 {DAG.getRoot(), Base, Index, Scale, OpValues[1], OpValues[2]}, MMO,
8715 PendingLoads.push_back(LD.getValue(1));
8716 setValue(&VPIntrin, LD);
8717}
8718
8719void SelectionDAGBuilder::visitVPStore(
8720 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8721 SDLoc DL = getCurSDLoc();
8722 Value *PtrOperand = VPIntrin.getArgOperand(1);
8723 EVT VT = OpValues[0].getValueType();
8724 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8725 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8726 SDValue ST;
8727 if (!Alignment)
8728 Alignment = DAG.getEVTAlign(VT);
8729 SDValue Ptr = OpValues[1];
8730 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
8731 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8732 MachineMemOperand::Flags MMOFlags =
8733 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8734 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8735 MachinePointerInfo(PtrOperand), MMOFlags,
8736 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo);
8737 ST = DAG.getStoreVP(getMemoryRoot(), DL, OpValues[0], Ptr, Offset,
8738 OpValues[2], OpValues[3], VT, MMO, ISD::UNINDEXED,
8739 /* IsTruncating */ false, /*IsCompressing*/ false);
8740 DAG.setRoot(ST);
8741 setValue(&VPIntrin, ST);
8742}
8743
8744void SelectionDAGBuilder::visitVPScatter(
8745 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8746 SDLoc DL = getCurSDLoc();
8747 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8748 Value *PtrOperand = VPIntrin.getArgOperand(1);
8749 EVT VT = OpValues[0].getValueType();
8750 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8751 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8752 SDValue ST;
8753 if (!Alignment)
8754 Alignment = DAG.getEVTAlign(VT.getScalarType());
8755 unsigned AS =
8756 PtrOperand->getType()->getScalarType()->getPointerAddressSpace();
8757 MachineMemOperand::Flags MMOFlags =
8758 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8759 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8760 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8761 *Alignment, AAInfo);
8762 SDValue Base, Index, Scale;
8763 bool UniformBase =
8764 getUniformBase(PtrOperand, Base, Index, Scale, this, VPIntrin.getParent(),
8765 VT.getScalarStoreSize());
8766 if (!UniformBase) {
8767 Base = DAG.getConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout()));
8768 Index = getValue(PtrOperand);
8769 Scale = DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout()));
8770 }
8771 EVT IdxVT = Index.getValueType();
8772 EVT EltTy = IdxVT.getVectorElementType();
8773 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
8774 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
8775 Index = DAG.getNode(ISD::SIGN_EXTEND, DL, NewIdxVT, Index);
8776 }
8777 ST = DAG.getScatterVP(DAG.getVTList(MVT::Other), VT, DL,
8778 {getMemoryRoot(), OpValues[0], Base, Index, Scale,
8779 OpValues[2], OpValues[3]},
8780 MMO, ISD::SIGNED_SCALED);
8781 DAG.setRoot(ST);
8782 setValue(&VPIntrin, ST);
8783}
8784
8785void SelectionDAGBuilder::visitVPStridedLoad(
8786 const VPIntrinsic &VPIntrin, EVT VT,
8787 const SmallVectorImpl<SDValue> &OpValues) {
8788 SDLoc DL = getCurSDLoc();
8789 Value *PtrOperand = VPIntrin.getArgOperand(0);
8790 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8791 if (!Alignment)
8792 Alignment = DAG.getEVTAlign(VT.getScalarType());
8793 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8794 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8795 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8796 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8797 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8798 unsigned AS = PtrOperand->getType()->getPointerAddressSpace();
8799 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8800 MachineMemOperand::Flags MMOFlags =
8801 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8802 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8803 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8804 *Alignment, AAInfo, Ranges);
8805
8806 SDValue LD = DAG.getStridedLoadVP(VT, DL, InChain, OpValues[0], OpValues[1],
8807 OpValues[2], OpValues[3], MMO,
8808 false /*IsExpanding*/);
8809
8810 if (AddToChain)
8811 PendingLoads.push_back(LD.getValue(1));
8812 setValue(&VPIntrin, LD);
8813}
8814
8815void SelectionDAGBuilder::visitVPStridedStore(
8816 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8817 SDLoc DL = getCurSDLoc();
8818 Value *PtrOperand = VPIntrin.getArgOperand(1);
8819 EVT VT = OpValues[0].getValueType();
8820 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8821 if (!Alignment)
8822 Alignment = DAG.getEVTAlign(VT.getScalarType());
8823 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8824 unsigned AS = PtrOperand->getType()->getPointerAddressSpace();
8825 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8826 MachineMemOperand::Flags MMOFlags =
8827 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8828 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8829 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8830 *Alignment, AAInfo);
8831
8832 SDValue ST = DAG.getStridedStoreVP(
8833 getMemoryRoot(), DL, OpValues[0], OpValues[1],
8834 DAG.getUNDEF(OpValues[1].getValueType()), OpValues[2], OpValues[3],
8835 OpValues[4], VT, MMO, ISD::UNINDEXED, /*IsTruncating*/ false,
8836 /*IsCompressing*/ false);
8837
8838 DAG.setRoot(ST);
8839 setValue(&VPIntrin, ST);
8840}
8841
8842void SelectionDAGBuilder::visitVPCmp(const VPCmpIntrinsic &VPIntrin) {
8843 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8844 SDLoc DL = getCurSDLoc();
8845
8846 ISD::CondCode Condition;
8848 bool IsFP = VPIntrin.getOperand(0)->getType()->isFPOrFPVectorTy();
8849 Condition = IsFP ? getFCmpCondCode(CondCode) : getICmpCondCode(CondCode);
8850
8851 SDValue Op1 = getValue(VPIntrin.getOperand(0));
8852 SDValue Op2 = getValue(VPIntrin.getOperand(1));
8853 // #2 is the condition code
8854 SDValue MaskOp = getValue(VPIntrin.getOperand(3));
8855 SDValue EVL = getValue(VPIntrin.getOperand(4));
8856 MVT EVLParamVT = TLI.getVPExplicitVectorLengthTy();
8857 assert(EVLParamVT.isScalarInteger() && EVLParamVT.bitsGE(MVT::i32) &&
8858 "Unexpected target EVL type");
8859 EVL = DAG.getNode(ISD::ZERO_EXTEND, DL, EVLParamVT, EVL);
8860
8861 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
8862 VPIntrin.getType());
8863 if (DAG.isKnownNeverNaN(Op1) && DAG.isKnownNeverNaN(Op2))
8864 Condition = getFCmpCodeWithoutNaN(Condition);
8865 setValue(&VPIntrin,
8866 DAG.getSetCCVP(DL, DestVT, Op1, Op2, Condition, MaskOp, EVL));
8867}
8868
8869void SelectionDAGBuilder::visitVectorPredicationIntrinsic(
8870 const VPIntrinsic &VPIntrin) {
8871 SDLoc DL = getCurSDLoc();
8872 unsigned Opcode = getISDForVPIntrinsic(VPIntrin);
8873
8874 auto IID = VPIntrin.getIntrinsicID();
8875
8876 if (const auto *CmpI = dyn_cast<VPCmpIntrinsic>(&VPIntrin))
8877 return visitVPCmp(*CmpI);
8878
8879 SmallVector<EVT, 4> ValueVTs;
8880 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8881 ComputeValueVTs(TLI, DAG.getDataLayout(), VPIntrin.getType(), ValueVTs);
8882 SDVTList VTs = DAG.getVTList(ValueVTs);
8883
8884 auto EVLParamPos = VPIntrinsic::getVectorLengthParamPos(IID);
8885
8886 MVT EVLParamVT = TLI.getVPExplicitVectorLengthTy();
8887 assert(EVLParamVT.isScalarInteger() && EVLParamVT.bitsGE(MVT::i32) &&
8888 "Unexpected target EVL type");
8889
8890 // Request operands.
8891 SmallVector<SDValue, 7> OpValues;
8892 for (unsigned I = 0; I < VPIntrin.arg_size(); ++I) {
8893 auto Op = getValue(VPIntrin.getArgOperand(I));
8894 if (I == EVLParamPos)
8895 Op = DAG.getNode(ISD::ZERO_EXTEND, DL, EVLParamVT, Op);
8896 OpValues.push_back(Op);
8897 }
8898
8899 switch (Opcode) {
8900 default: {
8901 SDNodeFlags SDFlags;
8902 if (auto *FPMO = dyn_cast<FPMathOperator>(&VPIntrin))
8903 SDFlags.copyFMF(*FPMO);
8904 SDValue Result = DAG.getNode(Opcode, DL, VTs, OpValues, SDFlags);
8905 setValue(&VPIntrin, Result);
8906 break;
8907 }
8908 case ISD::VP_LOAD:
8909 visitVPLoad(VPIntrin, ValueVTs[0], OpValues);
8910 break;
8911 case ISD::VP_LOAD_FF:
8912 visitVPLoadFF(VPIntrin, ValueVTs[0], ValueVTs[1], OpValues);
8913 break;
8914 case ISD::VP_GATHER:
8915 visitVPGather(VPIntrin, ValueVTs[0], OpValues);
8916 break;
8917 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
8918 visitVPStridedLoad(VPIntrin, ValueVTs[0], OpValues);
8919 break;
8920 case ISD::VP_STORE:
8921 visitVPStore(VPIntrin, OpValues);
8922 break;
8923 case ISD::VP_SCATTER:
8924 visitVPScatter(VPIntrin, OpValues);
8925 break;
8926 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
8927 visitVPStridedStore(VPIntrin, OpValues);
8928 break;
8929 case ISD::VP_FMULADD: {
8930 assert(OpValues.size() == 5 && "Unexpected number of operands");
8931 SDNodeFlags SDFlags;
8932 if (auto *FPMO = dyn_cast<FPMathOperator>(&VPIntrin))
8933 SDFlags.copyFMF(*FPMO);
8934 if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
8935 TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), ValueVTs[0])) {
8936 setValue(&VPIntrin, DAG.getNode(ISD::VP_FMA, DL, VTs, OpValues, SDFlags));
8937 } else {
8938 SDValue Mul = DAG.getNode(
8939 ISD::VP_FMUL, DL, VTs,
8940 {OpValues[0], OpValues[1], OpValues[3], OpValues[4]}, SDFlags);
8941 SDValue Add =
8942 DAG.getNode(ISD::VP_FADD, DL, VTs,
8943 {Mul, OpValues[2], OpValues[3], OpValues[4]}, SDFlags);
8944 setValue(&VPIntrin, Add);
8945 }
8946 break;
8947 }
8948 case ISD::VP_IS_FPCLASS: {
8949 const DataLayout DLayout = DAG.getDataLayout();
8950 EVT DestVT = TLI.getValueType(DLayout, VPIntrin.getType());
8951 auto Constant = OpValues[1]->getAsZExtVal();
8952 SDValue Check = DAG.getTargetConstant(Constant, DL, MVT::i32);
8953 SDValue V = DAG.getNode(ISD::VP_IS_FPCLASS, DL, DestVT,
8954 {OpValues[0], Check, OpValues[2], OpValues[3]});
8955 setValue(&VPIntrin, V);
8956 return;
8957 }
8958 case ISD::VP_INTTOPTR: {
8959 SDValue N = OpValues[0];
8960 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), VPIntrin.getType());
8961 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(), VPIntrin.getType());
8962 N = DAG.getVPPtrExtOrTrunc(getCurSDLoc(), DestVT, N, OpValues[1],
8963 OpValues[2]);
8964 N = DAG.getVPZExtOrTrunc(getCurSDLoc(), PtrMemVT, N, OpValues[1],
8965 OpValues[2]);
8966 setValue(&VPIntrin, N);
8967 break;
8968 }
8969 case ISD::VP_PTRTOINT: {
8970 SDValue N = OpValues[0];
8971 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
8972 VPIntrin.getType());
8973 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(),
8974 VPIntrin.getOperand(0)->getType());
8975 N = DAG.getVPPtrExtOrTrunc(getCurSDLoc(), PtrMemVT, N, OpValues[1],
8976 OpValues[2]);
8977 N = DAG.getVPZExtOrTrunc(getCurSDLoc(), DestVT, N, OpValues[1],
8978 OpValues[2]);
8979 setValue(&VPIntrin, N);
8980 break;
8981 }
8982 case ISD::VP_ABS:
8983 case ISD::VP_CTLZ:
8984 case ISD::VP_CTLZ_ZERO_UNDEF:
8985 case ISD::VP_CTTZ:
8986 case ISD::VP_CTTZ_ZERO_UNDEF:
8987 case ISD::VP_CTTZ_ELTS_ZERO_UNDEF:
8988 case ISD::VP_CTTZ_ELTS: {
8989 SDValue Result =
8990 DAG.getNode(Opcode, DL, VTs, {OpValues[0], OpValues[2], OpValues[3]});
8991 setValue(&VPIntrin, Result);
8992 break;
8993 }
8994 }
8995}
8996
8997SDValue SelectionDAGBuilder::lowerStartEH(SDValue Chain,
8998 const BasicBlock *EHPadBB,
8999 MCSymbol *&BeginLabel) {
9000 MachineFunction &MF = DAG.getMachineFunction();
9001
9002 // Insert a label before the invoke call to mark the try range. This can be
9003 // used to detect deletion of the invoke via the MachineModuleInfo.
9004 BeginLabel = MF.getContext().createTempSymbol();
9005
9006 // For SjLj, keep track of which landing pads go with which invokes
9007 // so as to maintain the ordering of pads in the LSDA.
9008 unsigned CallSiteIndex = FuncInfo.getCurrentCallSite();
9009 if (CallSiteIndex) {
9010 MF.setCallSiteBeginLabel(BeginLabel, CallSiteIndex);
9011 LPadToCallSiteMap[FuncInfo.getMBB(EHPadBB)].push_back(CallSiteIndex);
9012
9013 // Now that the call site is handled, stop tracking it.
9014 FuncInfo.setCurrentCallSite(0);
9015 }
9016
9017 return DAG.getEHLabel(getCurSDLoc(), Chain, BeginLabel);
9018}
9019
9020SDValue SelectionDAGBuilder::lowerEndEH(SDValue Chain, const InvokeInst *II,
9021 const BasicBlock *EHPadBB,
9022 MCSymbol *BeginLabel) {
9023 assert(BeginLabel && "BeginLabel should've been set");
9024
9025 MachineFunction &MF = DAG.getMachineFunction();
9026
9027 // Insert a label at the end of the invoke call to mark the try range. This
9028 // can be used to detect deletion of the invoke via the MachineModuleInfo.
9029 MCSymbol *EndLabel = MF.getContext().createTempSymbol();
9030 Chain = DAG.getEHLabel(getCurSDLoc(), Chain, EndLabel);
9031
9032 // Inform MachineModuleInfo of range.
9033 auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn());
9034 // There is a platform (e.g. wasm) that uses funclet style IR but does not
9035 // actually use outlined funclets and their LSDA info style.
9036 if (MF.hasEHFunclets() && isFuncletEHPersonality(Pers)) {
9037 assert(II && "II should've been set");
9038 WinEHFuncInfo *EHInfo = MF.getWinEHFuncInfo();
9039 EHInfo->addIPToStateRange(II, BeginLabel, EndLabel);
9040 } else if (!isScopedEHPersonality(Pers)) {
9041 assert(EHPadBB);
9042 MF.addInvoke(FuncInfo.getMBB(EHPadBB), BeginLabel, EndLabel);
9043 }
9044
9045 return Chain;
9046}
9047
9048std::pair<SDValue, SDValue>
9050 const BasicBlock *EHPadBB) {
9051 MCSymbol *BeginLabel = nullptr;
9052
9053 if (EHPadBB) {
9054 // Both PendingLoads and PendingExports must be flushed here;
9055 // this call might not return.
9056 (void)getRoot();
9057 DAG.setRoot(lowerStartEH(getControlRoot(), EHPadBB, BeginLabel));
9058 CLI.setChain(getRoot());
9059 }
9060
9061 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9062 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
9063
9064 assert((CLI.IsTailCall || Result.second.getNode()) &&
9065 "Non-null chain expected with non-tail call!");
9066 assert((Result.second.getNode() || !Result.first.getNode()) &&
9067 "Null value expected with tail call!");
9068
9069 if (!Result.second.getNode()) {
9070 // As a special case, a null chain means that a tail call has been emitted
9071 // and the DAG root is already updated.
9072 HasTailCall = true;
9073
9074 // Since there's no actual continuation from this block, nothing can be
9075 // relying on us setting vregs for them.
9076 PendingExports.clear();
9077 } else {
9078 DAG.setRoot(Result.second);
9079 }
9080
9081 if (EHPadBB) {
9082 DAG.setRoot(lowerEndEH(getRoot(), cast_or_null<InvokeInst>(CLI.CB), EHPadBB,
9083 BeginLabel));
9084 Result.second = getRoot();
9085 }
9086
9087 return Result;
9088}
9089
9091 bool isMustTailCall = CB.isMustTailCall();
9092
9093 // Avoid emitting tail calls in functions with the disable-tail-calls
9094 // attribute.
9095 const Function *Caller = CB.getParent()->getParent();
9096 if (!isMustTailCall &&
9097 Caller->getFnAttribute("disable-tail-calls").getValueAsBool())
9098 return false;
9099
9100 // We can't tail call inside a function with a swifterror argument. Lowering
9101 // does not support this yet. It would have to move into the swifterror
9102 // register before the call.
9103 if (DAG.getTargetLoweringInfo().supportSwiftError() &&
9104 Caller->getAttributes().hasAttrSomewhere(Attribute::SwiftError))
9105 return false;
9106
9107 // Check if target-independent constraints permit a tail call here.
9108 // Target-dependent constraints are checked within TLI->LowerCallTo.
9109 return isInTailCallPosition(CB, DAG.getTarget());
9110}
9111
9113 bool isTailCall, bool isMustTailCall,
9114 const BasicBlock *EHPadBB,
9115 const TargetLowering::PtrAuthInfo *PAI) {
9116 auto &DL = DAG.getDataLayout();
9117 FunctionType *FTy = CB.getFunctionType();
9118 Type *RetTy = CB.getType();
9119
9121 Args.reserve(CB.arg_size());
9122
9123 const Value *SwiftErrorVal = nullptr;
9124 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9125
9126 if (isTailCall)
9127 isTailCall = canTailCall(CB);
9128
9129 for (auto I = CB.arg_begin(), E = CB.arg_end(); I != E; ++I) {
9130 const Value *V = *I;
9131
9132 // Skip empty types
9133 if (V->getType()->isEmptyTy())
9134 continue;
9135
9136 SDValue ArgNode = getValue(V);
9137 TargetLowering::ArgListEntry Entry(ArgNode, V->getType());
9138 Entry.setAttributes(&CB, I - CB.arg_begin());
9139
9140 // Use swifterror virtual register as input to the call.
9141 if (Entry.IsSwiftError && TLI.supportSwiftError()) {
9142 SwiftErrorVal = V;
9143 // We find the virtual register for the actual swifterror argument.
9144 // Instead of using the Value, we use the virtual register instead.
9145 Entry.Node =
9146 DAG.getRegister(SwiftError.getOrCreateVRegUseAt(&CB, FuncInfo.MBB, V),
9147 EVT(TLI.getPointerTy(DL)));
9148 }
9149
9150 Args.push_back(Entry);
9151
9152 // If we have an explicit sret argument that is an Instruction, (i.e., it
9153 // might point to function-local memory), we can't meaningfully tail-call.
9154 if (Entry.IsSRet && isa<Instruction>(V))
9155 isTailCall = false;
9156 }
9157
9158 // If call site has a cfguardtarget operand bundle, create and add an
9159 // additional ArgListEntry.
9160 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_cfguardtarget)) {
9161 Value *V = Bundle->Inputs[0];
9163 Entry.IsCFGuardTarget = true;
9164 Args.push_back(Entry);
9165 }
9166
9167 // Disable tail calls if there is an swifterror argument. Targets have not
9168 // been updated to support tail calls.
9169 if (TLI.supportSwiftError() && SwiftErrorVal)
9170 isTailCall = false;
9171
9172 ConstantInt *CFIType = nullptr;
9173 if (CB.isIndirectCall()) {
9174 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_kcfi)) {
9175 if (!TLI.supportKCFIBundles())
9177 "Target doesn't support calls with kcfi operand bundles.");
9178 CFIType = cast<ConstantInt>(Bundle->Inputs[0]);
9179 assert(CFIType->getType()->isIntegerTy(32) && "Invalid CFI type");
9180 }
9181 }
9182
9183 SDValue ConvControlToken;
9184 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_convergencectrl)) {
9185 auto *Token = Bundle->Inputs[0].get();
9186 ConvControlToken = getValue(Token);
9187 }
9188
9189 GlobalValue *DeactivationSymbol = nullptr;
9191 DeactivationSymbol = cast<GlobalValue>(Bundle->Inputs[0].get());
9192 }
9193
9196 .setChain(getRoot())
9197 .setCallee(RetTy, FTy, Callee, std::move(Args), CB)
9198 .setTailCall(isTailCall)
9202 .setCFIType(CFIType)
9203 .setConvergenceControlToken(ConvControlToken)
9204 .setDeactivationSymbol(DeactivationSymbol);
9205
9206 // Set the pointer authentication info if we have it.
9207 if (PAI) {
9208 if (!TLI.supportPtrAuthBundles())
9210 "This target doesn't support calls with ptrauth operand bundles.");
9211 CLI.setPtrAuth(*PAI);
9212 }
9213
9214 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
9215
9216 if (Result.first.getNode()) {
9217 Result.first = lowerRangeToAssertZExt(DAG, CB, Result.first);
9218 Result.first = lowerNoFPClassToAssertNoFPClass(DAG, CB, Result.first);
9219 setValue(&CB, Result.first);
9220 }
9221
9222 // The last element of CLI.InVals has the SDValue for swifterror return.
9223 // Here we copy it to a virtual register and update SwiftErrorMap for
9224 // book-keeping.
9225 if (SwiftErrorVal && TLI.supportSwiftError()) {
9226 // Get the last element of InVals.
9227 SDValue Src = CLI.InVals.back();
9228 Register VReg =
9229 SwiftError.getOrCreateVRegDefAt(&CB, FuncInfo.MBB, SwiftErrorVal);
9230 SDValue CopyNode = CLI.DAG.getCopyToReg(Result.second, CLI.DL, VReg, Src);
9231 DAG.setRoot(CopyNode);
9232 }
9233}
9234
9235static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT,
9236 SelectionDAGBuilder &Builder) {
9237 // Check to see if this load can be trivially constant folded, e.g. if the
9238 // input is from a string literal.
9239 if (const Constant *LoadInput = dyn_cast<Constant>(PtrVal)) {
9240 // Cast pointer to the type we really want to load.
9241 Type *LoadTy =
9242 Type::getIntNTy(PtrVal->getContext(), LoadVT.getScalarSizeInBits());
9243 if (LoadVT.isVector())
9244 LoadTy = FixedVectorType::get(LoadTy, LoadVT.getVectorNumElements());
9245 if (const Constant *LoadCst =
9246 ConstantFoldLoadFromConstPtr(const_cast<Constant *>(LoadInput),
9247 LoadTy, Builder.DAG.getDataLayout()))
9248 return Builder.getValue(LoadCst);
9249 }
9250
9251 // Otherwise, we have to emit the load. If the pointer is to unfoldable but
9252 // still constant memory, the input chain can be the entry node.
9253 SDValue Root;
9254 bool ConstantMemory = false;
9255
9256 // Do not serialize (non-volatile) loads of constant memory with anything.
9257 if (Builder.BatchAA && Builder.BatchAA->pointsToConstantMemory(PtrVal)) {
9258 Root = Builder.DAG.getEntryNode();
9259 ConstantMemory = true;
9260 } else {
9261 // Do not serialize non-volatile loads against each other.
9262 Root = Builder.DAG.getRoot();
9263 }
9264
9265 SDValue Ptr = Builder.getValue(PtrVal);
9266 SDValue LoadVal =
9267 Builder.DAG.getLoad(LoadVT, Builder.getCurSDLoc(), Root, Ptr,
9268 MachinePointerInfo(PtrVal), Align(1));
9269
9270 if (!ConstantMemory)
9271 Builder.PendingLoads.push_back(LoadVal.getValue(1));
9272 return LoadVal;
9273}
9274
9275/// Record the value for an instruction that produces an integer result,
9276/// converting the type where necessary.
9277void SelectionDAGBuilder::processIntegerCallValue(const Instruction &I,
9278 SDValue Value,
9279 bool IsSigned) {
9280 EVT VT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9281 I.getType(), true);
9282 Value = DAG.getExtOrTrunc(IsSigned, Value, getCurSDLoc(), VT);
9283 setValue(&I, Value);
9284}
9285
9286/// See if we can lower a memcmp/bcmp call into an optimized form. If so, return
9287/// true and lower it. Otherwise return false, and it will be lowered like a
9288/// normal call.
9289/// The caller already checked that \p I calls the appropriate LibFunc with a
9290/// correct prototype.
9291bool SelectionDAGBuilder::visitMemCmpBCmpCall(const CallInst &I) {
9292 const Value *LHS = I.getArgOperand(0), *RHS = I.getArgOperand(1);
9293 const Value *Size = I.getArgOperand(2);
9294 const ConstantSDNode *CSize = dyn_cast<ConstantSDNode>(getValue(Size));
9295 if (CSize && CSize->getZExtValue() == 0) {
9296 EVT CallVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9297 I.getType(), true);
9298 setValue(&I, DAG.getConstant(0, getCurSDLoc(), CallVT));
9299 return true;
9300 }
9301
9302 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9303 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForMemcmp(
9304 DAG, getCurSDLoc(), DAG.getRoot(), getValue(LHS), getValue(RHS),
9305 getValue(Size), &I);
9306 if (Res.first.getNode()) {
9307 processIntegerCallValue(I, Res.first, true);
9308 PendingLoads.push_back(Res.second);
9309 return true;
9310 }
9311
9312 // memcmp(S1,S2,2) != 0 -> (*(short*)LHS != *(short*)RHS) != 0
9313 // memcmp(S1,S2,4) != 0 -> (*(int*)LHS != *(int*)RHS) != 0
9314 if (!CSize || !isOnlyUsedInZeroEqualityComparison(&I))
9315 return false;
9316
9317 // If the target has a fast compare for the given size, it will return a
9318 // preferred load type for that size. Require that the load VT is legal and
9319 // that the target supports unaligned loads of that type. Otherwise, return
9320 // INVALID.
9321 auto hasFastLoadsAndCompare = [&](unsigned NumBits) {
9322 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9323 MVT LVT = TLI.hasFastEqualityCompare(NumBits);
9324 if (LVT != MVT::INVALID_SIMPLE_VALUE_TYPE) {
9325 // TODO: Handle 5 byte compare as 4-byte + 1 byte.
9326 // TODO: Handle 8 byte compare on x86-32 as two 32-bit loads.
9327 // TODO: Check alignment of src and dest ptrs.
9328 unsigned DstAS = LHS->getType()->getPointerAddressSpace();
9329 unsigned SrcAS = RHS->getType()->getPointerAddressSpace();
9330 if (!TLI.isTypeLegal(LVT) ||
9331 !TLI.allowsMisalignedMemoryAccesses(LVT, SrcAS) ||
9332 !TLI.allowsMisalignedMemoryAccesses(LVT, DstAS))
9334 }
9335
9336 return LVT;
9337 };
9338
9339 // This turns into unaligned loads. We only do this if the target natively
9340 // supports the MVT we'll be loading or if it is small enough (<= 4) that
9341 // we'll only produce a small number of byte loads.
9342 MVT LoadVT;
9343 unsigned NumBitsToCompare = CSize->getZExtValue() * 8;
9344 switch (NumBitsToCompare) {
9345 default:
9346 return false;
9347 case 16:
9348 LoadVT = MVT::i16;
9349 break;
9350 case 32:
9351 LoadVT = MVT::i32;
9352 break;
9353 case 64:
9354 case 128:
9355 case 256:
9356 LoadVT = hasFastLoadsAndCompare(NumBitsToCompare);
9357 break;
9358 }
9359
9360 if (LoadVT == MVT::INVALID_SIMPLE_VALUE_TYPE)
9361 return false;
9362
9363 SDValue LoadL = getMemCmpLoad(LHS, LoadVT, *this);
9364 SDValue LoadR = getMemCmpLoad(RHS, LoadVT, *this);
9365
9366 // Bitcast to a wide integer type if the loads are vectors.
9367 if (LoadVT.isVector()) {
9368 EVT CmpVT = EVT::getIntegerVT(LHS->getContext(), LoadVT.getSizeInBits());
9369 LoadL = DAG.getBitcast(CmpVT, LoadL);
9370 LoadR = DAG.getBitcast(CmpVT, LoadR);
9371 }
9372
9373 SDValue Cmp = DAG.getSetCC(getCurSDLoc(), MVT::i1, LoadL, LoadR, ISD::SETNE);
9374 processIntegerCallValue(I, Cmp, false);
9375 return true;
9376}
9377
9378/// See if we can lower a memchr call into an optimized form. If so, return
9379/// true and lower it. Otherwise return false, and it will be lowered like a
9380/// normal call.
9381/// The caller already checked that \p I calls the appropriate LibFunc with a
9382/// correct prototype.
9383bool SelectionDAGBuilder::visitMemChrCall(const CallInst &I) {
9384 const Value *Src = I.getArgOperand(0);
9385 const Value *Char = I.getArgOperand(1);
9386 const Value *Length = I.getArgOperand(2);
9387
9388 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9389 std::pair<SDValue, SDValue> Res =
9390 TSI.EmitTargetCodeForMemchr(DAG, getCurSDLoc(), DAG.getRoot(),
9391 getValue(Src), getValue(Char), getValue(Length),
9392 MachinePointerInfo(Src));
9393 if (Res.first.getNode()) {
9394 setValue(&I, Res.first);
9395 PendingLoads.push_back(Res.second);
9396 return true;
9397 }
9398
9399 return false;
9400}
9401
9402/// See if we can lower a memccpy call into an optimized form. If so, return
9403/// true and lower it, otherwise return false and it will be lowered like a
9404/// normal call.
9405/// The caller already checked that \p I calls the appropriate LibFunc with a
9406/// correct prototype.
9407bool SelectionDAGBuilder::visitMemCCpyCall(const CallInst &I) {
9408 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9409 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForMemccpy(
9410 DAG, getCurSDLoc(), DAG.getRoot(), getValue(I.getArgOperand(0)),
9411 getValue(I.getArgOperand(1)), getValue(I.getArgOperand(2)),
9412 getValue(I.getArgOperand(3)), &I);
9413
9414 if (Res.first) {
9415 processIntegerCallValue(I, Res.first, true);
9416 PendingLoads.push_back(Res.second);
9417 return true;
9418 }
9419 return false;
9420}
9421
9422/// See if we can lower a mempcpy call into an optimized form. If so, return
9423/// true and lower it. Otherwise return false, and it will be lowered like a
9424/// normal call.
9425/// The caller already checked that \p I calls the appropriate LibFunc with a
9426/// correct prototype.
9427bool SelectionDAGBuilder::visitMemPCpyCall(const CallInst &I) {
9428 SDValue Dst = getValue(I.getArgOperand(0));
9429 SDValue Src = getValue(I.getArgOperand(1));
9430 SDValue Size = getValue(I.getArgOperand(2));
9431
9432 Align DstAlign = DAG.InferPtrAlign(Dst).valueOrOne();
9433 Align SrcAlign = DAG.InferPtrAlign(Src).valueOrOne();
9434 // DAG::getMemcpy needs Alignment to be defined.
9435 Align Alignment = std::min(DstAlign, SrcAlign);
9436
9437 SDLoc sdl = getCurSDLoc();
9438
9439 // In the mempcpy context we need to pass in a false value for isTailCall
9440 // because the return pointer needs to be adjusted by the size of
9441 // the copied memory.
9442 SDValue Root = getMemoryRoot();
9443 SDValue MC = DAG.getMemcpy(
9444 Root, sdl, Dst, Src, Size, Alignment, false, false, /*CI=*/nullptr,
9445 std::nullopt, MachinePointerInfo(I.getArgOperand(0)),
9446 MachinePointerInfo(I.getArgOperand(1)), I.getAAMetadata());
9447 assert(MC.getNode() != nullptr &&
9448 "** memcpy should not be lowered as TailCall in mempcpy context **");
9449 DAG.setRoot(MC);
9450
9451 // Check if Size needs to be truncated or extended.
9452 Size = DAG.getSExtOrTrunc(Size, sdl, Dst.getValueType());
9453
9454 // Adjust return pointer to point just past the last dst byte.
9455 SDValue DstPlusSize = DAG.getMemBasePlusOffset(Dst, Size, sdl);
9456 setValue(&I, DstPlusSize);
9457 return true;
9458}
9459
9460/// See if we can lower a strcpy call into an optimized form. If so, return
9461/// true and lower it, otherwise return false and it will be lowered like a
9462/// normal call.
9463/// The caller already checked that \p I calls the appropriate LibFunc with a
9464/// correct prototype.
9465bool SelectionDAGBuilder::visitStrCpyCall(const CallInst &I, bool isStpcpy) {
9466 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9467
9468 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9469 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrcpy(
9470 DAG, getCurSDLoc(), getRoot(), getValue(Arg0), getValue(Arg1),
9471 MachinePointerInfo(Arg0), MachinePointerInfo(Arg1), isStpcpy, &I);
9472 if (Res.first.getNode()) {
9473 setValue(&I, Res.first);
9474 DAG.setRoot(Res.second);
9475 return true;
9476 }
9477
9478 return false;
9479}
9480
9481/// See if we can lower a strcmp call into an optimized form. If so, return
9482/// true and lower it, otherwise return false and it will be lowered like a
9483/// normal call.
9484/// The caller already checked that \p I calls the appropriate LibFunc with a
9485/// correct prototype.
9486bool SelectionDAGBuilder::visitStrCmpCall(const CallInst &I) {
9487 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9488
9489 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9490 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrcmp(
9491 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), getValue(Arg1),
9492 MachinePointerInfo(Arg0), MachinePointerInfo(Arg1), &I);
9493 if (Res.first.getNode()) {
9494 processIntegerCallValue(I, Res.first, true);
9495 PendingLoads.push_back(Res.second);
9496 return true;
9497 }
9498
9499 return false;
9500}
9501
9502/// See if we can lower a strlen call into an optimized form. If so, return
9503/// true and lower it, otherwise return false and it will be lowered like a
9504/// normal call.
9505/// The caller already checked that \p I calls the appropriate LibFunc with a
9506/// correct prototype.
9507bool SelectionDAGBuilder::visitStrLenCall(const CallInst &I) {
9508 const Value *Arg0 = I.getArgOperand(0);
9509
9510 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9511 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrlen(
9512 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), &I);
9513 if (Res.first.getNode()) {
9514 processIntegerCallValue(I, Res.first, false);
9515 PendingLoads.push_back(Res.second);
9516 return true;
9517 }
9518
9519 return false;
9520}
9521
9522/// See if we can lower a strnlen call into an optimized form. If so, return
9523/// true and lower it, otherwise return false and it will be lowered like a
9524/// normal call.
9525/// The caller already checked that \p I calls the appropriate LibFunc with a
9526/// correct prototype.
9527bool SelectionDAGBuilder::visitStrNLenCall(const CallInst &I) {
9528 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9529
9530 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9531 std::pair<SDValue, SDValue> Res =
9532 TSI.EmitTargetCodeForStrnlen(DAG, getCurSDLoc(), DAG.getRoot(),
9533 getValue(Arg0), getValue(Arg1),
9534 MachinePointerInfo(Arg0));
9535 if (Res.first.getNode()) {
9536 processIntegerCallValue(I, Res.first, false);
9537 PendingLoads.push_back(Res.second);
9538 return true;
9539 }
9540
9541 return false;
9542}
9543
9544/// See if we can lower a Strstr call into an optimized form. If so, return
9545/// true and lower it, otherwise return false and it will be lowered like a
9546/// normal call.
9547/// The caller already checked that \p I calls the appropriate LibFunc with a
9548/// correct prototype.
9549bool SelectionDAGBuilder::visitStrstrCall(const CallInst &I) {
9550 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9551 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9552 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrstr(
9553 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), getValue(Arg1), &I);
9554 if (Res.first) {
9555 processIntegerCallValue(I, Res.first, false);
9556 PendingLoads.push_back(Res.second);
9557 return true;
9558 }
9559 return false;
9560}
9561
9562/// See if we can lower a unary floating-point operation into an SDNode with
9563/// the specified Opcode. If so, return true and lower it, otherwise return
9564/// false and it will be lowered like a normal call.
9565/// The caller already checked that \p I calls the appropriate LibFunc with a
9566/// correct prototype.
9567bool SelectionDAGBuilder::visitUnaryFloatCall(const CallInst &I,
9568 unsigned Opcode) {
9569 // We already checked this call's prototype; verify it doesn't modify errno.
9570 // Do not perform optimizations for call sites that require strict
9571 // floating-point semantics.
9572 if (!I.onlyReadsMemory() || I.isStrictFP())
9573 return false;
9574
9575 SDNodeFlags Flags;
9576 Flags.copyFMF(cast<FPMathOperator>(I));
9577
9578 SDValue Tmp = getValue(I.getArgOperand(0));
9579 setValue(&I,
9580 DAG.getNode(Opcode, getCurSDLoc(), Tmp.getValueType(), Tmp, Flags));
9581 return true;
9582}
9583
9584/// See if we can lower a binary floating-point operation into an SDNode with
9585/// the specified Opcode. If so, return true and lower it. Otherwise return
9586/// false, and it will be lowered like a normal call.
9587/// The caller already checked that \p I calls the appropriate LibFunc with a
9588/// correct prototype.
9589bool SelectionDAGBuilder::visitBinaryFloatCall(const CallInst &I,
9590 unsigned Opcode) {
9591 // We already checked this call's prototype; verify it doesn't modify errno.
9592 // Do not perform optimizations for call sites that require strict
9593 // floating-point semantics.
9594 if (!I.onlyReadsMemory() || I.isStrictFP())
9595 return false;
9596
9597 SDNodeFlags Flags;
9598 Flags.copyFMF(cast<FPMathOperator>(I));
9599
9600 SDValue Tmp0 = getValue(I.getArgOperand(0));
9601 SDValue Tmp1 = getValue(I.getArgOperand(1));
9602 EVT VT = Tmp0.getValueType();
9603 setValue(&I, DAG.getNode(Opcode, getCurSDLoc(), VT, Tmp0, Tmp1, Flags));
9604 return true;
9605}
9606
9607void SelectionDAGBuilder::visitCall(const CallInst &I) {
9608 // Handle inline assembly differently.
9609 if (I.isInlineAsm()) {
9610 visitInlineAsm(I);
9611 return;
9612 }
9613
9615
9616 if (Function *F = I.getCalledFunction()) {
9617 if (F->isDeclaration()) {
9618 // Is this an LLVM intrinsic?
9619 if (unsigned IID = F->getIntrinsicID()) {
9620 visitIntrinsicCall(I, IID);
9621 return;
9622 }
9623 }
9624
9625 // Check for well-known libc/libm calls. If the function is internal, it
9626 // can't be a library call. Don't do the check if marked as nobuiltin for
9627 // some reason.
9628 // This code should not handle libcalls that are already canonicalized to
9629 // intrinsics by the middle-end.
9630 LibFunc Func;
9631 if (!I.isNoBuiltin() && !F->hasLocalLinkage() && F->hasName() &&
9632 LibInfo->getLibFunc(*F, Func) && LibInfo->hasOptimizedCodeGen(Func)) {
9633 switch (Func) {
9634 default: break;
9635 case LibFunc_bcmp:
9636 if (visitMemCmpBCmpCall(I))
9637 return;
9638 break;
9639 case LibFunc_copysign:
9640 case LibFunc_copysignf:
9641 case LibFunc_copysignl:
9642 // We already checked this call's prototype; verify it doesn't modify
9643 // errno.
9644 if (I.onlyReadsMemory()) {
9645 SDValue LHS = getValue(I.getArgOperand(0));
9646 SDValue RHS = getValue(I.getArgOperand(1));
9648 LHS.getValueType(), LHS, RHS));
9649 return;
9650 }
9651 break;
9652 case LibFunc_sin:
9653 case LibFunc_sinf:
9654 case LibFunc_sinl:
9655 if (visitUnaryFloatCall(I, ISD::FSIN))
9656 return;
9657 break;
9658 case LibFunc_cos:
9659 case LibFunc_cosf:
9660 case LibFunc_cosl:
9661 if (visitUnaryFloatCall(I, ISD::FCOS))
9662 return;
9663 break;
9664 case LibFunc_tan:
9665 case LibFunc_tanf:
9666 case LibFunc_tanl:
9667 if (visitUnaryFloatCall(I, ISD::FTAN))
9668 return;
9669 break;
9670 case LibFunc_asin:
9671 case LibFunc_asinf:
9672 case LibFunc_asinl:
9673 if (visitUnaryFloatCall(I, ISD::FASIN))
9674 return;
9675 break;
9676 case LibFunc_acos:
9677 case LibFunc_acosf:
9678 case LibFunc_acosl:
9679 if (visitUnaryFloatCall(I, ISD::FACOS))
9680 return;
9681 break;
9682 case LibFunc_atan:
9683 case LibFunc_atanf:
9684 case LibFunc_atanl:
9685 if (visitUnaryFloatCall(I, ISD::FATAN))
9686 return;
9687 break;
9688 case LibFunc_atan2:
9689 case LibFunc_atan2f:
9690 case LibFunc_atan2l:
9691 if (visitBinaryFloatCall(I, ISD::FATAN2))
9692 return;
9693 break;
9694 case LibFunc_sinh:
9695 case LibFunc_sinhf:
9696 case LibFunc_sinhl:
9697 if (visitUnaryFloatCall(I, ISD::FSINH))
9698 return;
9699 break;
9700 case LibFunc_cosh:
9701 case LibFunc_coshf:
9702 case LibFunc_coshl:
9703 if (visitUnaryFloatCall(I, ISD::FCOSH))
9704 return;
9705 break;
9706 case LibFunc_tanh:
9707 case LibFunc_tanhf:
9708 case LibFunc_tanhl:
9709 if (visitUnaryFloatCall(I, ISD::FTANH))
9710 return;
9711 break;
9712 case LibFunc_sqrt:
9713 case LibFunc_sqrtf:
9714 case LibFunc_sqrtl:
9715 case LibFunc_sqrt_finite:
9716 case LibFunc_sqrtf_finite:
9717 case LibFunc_sqrtl_finite:
9718 if (visitUnaryFloatCall(I, ISD::FSQRT))
9719 return;
9720 break;
9721 case LibFunc_log2:
9722 case LibFunc_log2f:
9723 case LibFunc_log2l:
9724 if (visitUnaryFloatCall(I, ISD::FLOG2))
9725 return;
9726 break;
9727 case LibFunc_exp2:
9728 case LibFunc_exp2f:
9729 case LibFunc_exp2l:
9730 if (visitUnaryFloatCall(I, ISD::FEXP2))
9731 return;
9732 break;
9733 case LibFunc_exp10:
9734 case LibFunc_exp10f:
9735 case LibFunc_exp10l:
9736 if (visitUnaryFloatCall(I, ISD::FEXP10))
9737 return;
9738 break;
9739 case LibFunc_ldexp:
9740 case LibFunc_ldexpf:
9741 case LibFunc_ldexpl:
9742 if (visitBinaryFloatCall(I, ISD::FLDEXP))
9743 return;
9744 break;
9745 case LibFunc_strstr:
9746 if (visitStrstrCall(I))
9747 return;
9748 break;
9749 case LibFunc_memcmp:
9750 if (visitMemCmpBCmpCall(I))
9751 return;
9752 break;
9753 case LibFunc_memccpy:
9754 if (visitMemCCpyCall(I))
9755 return;
9756 break;
9757 case LibFunc_mempcpy:
9758 if (visitMemPCpyCall(I))
9759 return;
9760 break;
9761 case LibFunc_memchr:
9762 if (visitMemChrCall(I))
9763 return;
9764 break;
9765 case LibFunc_strcpy:
9766 if (visitStrCpyCall(I, false))
9767 return;
9768 break;
9769 case LibFunc_stpcpy:
9770 if (visitStrCpyCall(I, true))
9771 return;
9772 break;
9773 case LibFunc_strcmp:
9774 if (visitStrCmpCall(I))
9775 return;
9776 break;
9777 case LibFunc_strlen:
9778 if (visitStrLenCall(I))
9779 return;
9780 break;
9781 case LibFunc_strnlen:
9782 if (visitStrNLenCall(I))
9783 return;
9784 break;
9785 }
9786 }
9787 }
9788
9789 if (I.countOperandBundlesOfType(LLVMContext::OB_ptrauth)) {
9790 LowerCallSiteWithPtrAuthBundle(cast<CallBase>(I), /*EHPadBB=*/nullptr);
9791 return;
9792 }
9793
9794 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
9795 // have to do anything here to lower funclet bundles.
9796 // CFGuardTarget bundles are lowered in LowerCallTo.
9798 I, "calls",
9803
9804 SDValue Callee = getValue(I.getCalledOperand());
9805
9806 if (I.hasDeoptState())
9807 LowerCallSiteWithDeoptBundle(&I, Callee, nullptr);
9808 else
9809 // Check if we can potentially perform a tail call. More detailed checking
9810 // is be done within LowerCallTo, after more information about the call is
9811 // known.
9812 LowerCallTo(I, Callee, I.isTailCall(), I.isMustTailCall());
9813}
9814
9816 const CallBase &CB, const BasicBlock *EHPadBB) {
9817 auto PAB = CB.getOperandBundle("ptrauth");
9818 const Value *CalleeV = CB.getCalledOperand();
9819
9820 // Gather the call ptrauth data from the operand bundle:
9821 // [ i32 <key>, i64 <discriminator> ]
9822 const auto *Key = cast<ConstantInt>(PAB->Inputs[0]);
9823 const Value *Discriminator = PAB->Inputs[1];
9824
9825 assert(Key->getType()->isIntegerTy(32) && "Invalid ptrauth key");
9826 assert(Discriminator->getType()->isIntegerTy(64) &&
9827 "Invalid ptrauth discriminator");
9828
9829 // Look through ptrauth constants to find the raw callee.
9830 // Do a direct unauthenticated call if we found it and everything matches.
9831 if (const auto *CalleeCPA = dyn_cast<ConstantPtrAuth>(CalleeV))
9832 if (CalleeCPA->isKnownCompatibleWith(Key, Discriminator,
9833 DAG.getDataLayout()))
9834 return LowerCallTo(CB, getValue(CalleeCPA->getPointer()), CB.isTailCall(),
9835 CB.isMustTailCall(), EHPadBB);
9836
9837 // Functions should never be ptrauth-called directly.
9838 assert(!isa<Function>(CalleeV) && "invalid direct ptrauth call");
9839
9840 // Otherwise, do an authenticated indirect call.
9841 TargetLowering::PtrAuthInfo PAI = {Key->getZExtValue(),
9842 getValue(Discriminator)};
9843
9844 LowerCallTo(CB, getValue(CalleeV), CB.isTailCall(), CB.isMustTailCall(),
9845 EHPadBB, &PAI);
9846}
9847
9848namespace {
9849
9850/// AsmOperandInfo - This contains information for each constraint that we are
9851/// lowering.
9852class SDISelAsmOperandInfo : public TargetLowering::AsmOperandInfo {
9853public:
9854 /// CallOperand - If this is the result output operand or a clobber
9855 /// this is null, otherwise it is the incoming operand to the CallInst.
9856 /// This gets modified as the asm is processed.
9857 SDValue CallOperand;
9858
9859 /// AssignedRegs - If this is a register or register class operand, this
9860 /// contains the set of register corresponding to the operand.
9861 RegsForValue AssignedRegs;
9862
9863 explicit SDISelAsmOperandInfo(const TargetLowering::AsmOperandInfo &info)
9864 : TargetLowering::AsmOperandInfo(info), CallOperand(nullptr, 0) {
9865 }
9866
9867 /// Whether or not this operand accesses memory
9868 bool hasMemory(const TargetLowering &TLI) const {
9869 // Indirect operand accesses access memory.
9870 if (isIndirect)
9871 return true;
9872
9873 for (const auto &Code : Codes)
9875 return true;
9876
9877 return false;
9878 }
9879};
9880
9881
9882} // end anonymous namespace
9883
9884/// Make sure that the output operand \p OpInfo and its corresponding input
9885/// operand \p MatchingOpInfo have compatible constraint types (otherwise error
9886/// out).
9887static void patchMatchingInput(const SDISelAsmOperandInfo &OpInfo,
9888 SDISelAsmOperandInfo &MatchingOpInfo,
9889 SelectionDAG &DAG) {
9890 if (OpInfo.ConstraintVT == MatchingOpInfo.ConstraintVT)
9891 return;
9892
9894 const auto &TLI = DAG.getTargetLoweringInfo();
9895
9896 std::pair<unsigned, const TargetRegisterClass *> MatchRC =
9897 TLI.getRegForInlineAsmConstraint(TRI, OpInfo.ConstraintCode,
9898 OpInfo.ConstraintVT);
9899 std::pair<unsigned, const TargetRegisterClass *> InputRC =
9900 TLI.getRegForInlineAsmConstraint(TRI, MatchingOpInfo.ConstraintCode,
9901 MatchingOpInfo.ConstraintVT);
9902 const bool OutOpIsIntOrFP =
9903 OpInfo.ConstraintVT.isInteger() || OpInfo.ConstraintVT.isFloatingPoint();
9904 const bool InOpIsIntOrFP = MatchingOpInfo.ConstraintVT.isInteger() ||
9905 MatchingOpInfo.ConstraintVT.isFloatingPoint();
9906 if ((OutOpIsIntOrFP != InOpIsIntOrFP) || (MatchRC.second != InputRC.second)) {
9907 // FIXME: error out in a more elegant fashion
9908 report_fatal_error("Unsupported asm: input constraint"
9909 " with a matching output constraint of"
9910 " incompatible type!");
9911 }
9912 MatchingOpInfo.ConstraintVT = OpInfo.ConstraintVT;
9913}
9914
9915/// Get a direct memory input to behave well as an indirect operand.
9916/// This may introduce stores, hence the need for a \p Chain.
9917/// \return The (possibly updated) chain.
9918static SDValue getAddressForMemoryInput(SDValue Chain, const SDLoc &Location,
9919 SDISelAsmOperandInfo &OpInfo,
9920 SelectionDAG &DAG) {
9921 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9922
9923 // If we don't have an indirect input, put it in the constpool if we can,
9924 // otherwise spill it to a stack slot.
9925 // TODO: This isn't quite right. We need to handle these according to
9926 // the addressing mode that the constraint wants. Also, this may take
9927 // an additional register for the computation and we don't want that
9928 // either.
9929
9930 // If the operand is a float, integer, or vector constant, spill to a
9931 // constant pool entry to get its address.
9932 const Value *OpVal = OpInfo.CallOperandVal;
9933 if (isa<ConstantFP>(OpVal) || isa<ConstantInt>(OpVal) ||
9935 OpInfo.CallOperand = DAG.getConstantPool(
9936 cast<Constant>(OpVal), TLI.getPointerTy(DAG.getDataLayout()));
9937 return Chain;
9938 }
9939
9940 // Otherwise, create a stack slot and emit a store to it before the asm.
9941 Type *Ty = OpVal->getType();
9942 auto &DL = DAG.getDataLayout();
9943 TypeSize TySize = DL.getTypeAllocSize(Ty);
9946 int StackID = 0;
9947 if (TySize.isScalable())
9948 StackID = TFI->getStackIDForScalableVectors();
9949 int SSFI = MF.getFrameInfo().CreateStackObject(TySize.getKnownMinValue(),
9950 DL.getPrefTypeAlign(Ty), false,
9951 nullptr, StackID);
9952 SDValue StackSlot = DAG.getFrameIndex(SSFI, TLI.getFrameIndexTy(DL));
9953 Chain = DAG.getTruncStore(Chain, Location, OpInfo.CallOperand, StackSlot,
9955 TLI.getMemValueType(DL, Ty));
9956 OpInfo.CallOperand = StackSlot;
9957
9958 return Chain;
9959}
9960
9961/// GetRegistersForValue - Assign registers (virtual or physical) for the
9962/// specified operand. We prefer to assign virtual registers, to allow the
9963/// register allocator to handle the assignment process. However, if the asm
9964/// uses features that we can't model on machineinstrs, we have SDISel do the
9965/// allocation. This produces generally horrible, but correct, code.
9966///
9967/// OpInfo describes the operand
9968/// RefOpInfo describes the matching operand if any, the operand otherwise
9969static std::optional<unsigned>
9971 SDISelAsmOperandInfo &OpInfo,
9972 SDISelAsmOperandInfo &RefOpInfo) {
9973 LLVMContext &Context = *DAG.getContext();
9974 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9975
9979
9980 // No work to do for memory/address operands.
9981 if (OpInfo.ConstraintType == TargetLowering::C_Memory ||
9982 OpInfo.ConstraintType == TargetLowering::C_Address)
9983 return std::nullopt;
9984
9985 // If this is a constraint for a single physreg, or a constraint for a
9986 // register class, find it.
9987 unsigned AssignedReg;
9988 const TargetRegisterClass *RC;
9989 std::tie(AssignedReg, RC) = TLI.getRegForInlineAsmConstraint(
9990 &TRI, RefOpInfo.ConstraintCode, RefOpInfo.ConstraintVT);
9991 // RC is unset only on failure. Return immediately.
9992 if (!RC)
9993 return std::nullopt;
9994
9995 // Get the actual register value type. This is important, because the user
9996 // may have asked for (e.g.) the AX register in i32 type. We need to
9997 // remember that AX is actually i16 to get the right extension.
9998 const MVT RegVT = *TRI.legalclasstypes_begin(*RC);
9999
10000 if (OpInfo.ConstraintVT != MVT::Other && RegVT != MVT::Untyped) {
10001 // If this is an FP operand in an integer register (or visa versa), or more
10002 // generally if the operand value disagrees with the register class we plan
10003 // to stick it in, fix the operand type.
10004 //
10005 // If this is an input value, the bitcast to the new type is done now.
10006 // Bitcast for output value is done at the end of visitInlineAsm().
10007 if ((OpInfo.Type == InlineAsm::isOutput ||
10008 OpInfo.Type == InlineAsm::isInput) &&
10009 !TRI.isTypeLegalForClass(*RC, OpInfo.ConstraintVT)) {
10010 // Try to convert to the first EVT that the reg class contains. If the
10011 // types are identical size, use a bitcast to convert (e.g. two differing
10012 // vector types). Note: output bitcast is done at the end of
10013 // visitInlineAsm().
10014 if (RegVT.getSizeInBits() == OpInfo.ConstraintVT.getSizeInBits()) {
10015 // Exclude indirect inputs while they are unsupported because the code
10016 // to perform the load is missing and thus OpInfo.CallOperand still
10017 // refers to the input address rather than the pointed-to value.
10018 if (OpInfo.Type == InlineAsm::isInput && !OpInfo.isIndirect)
10019 OpInfo.CallOperand =
10020 DAG.getNode(ISD::BITCAST, DL, RegVT, OpInfo.CallOperand);
10021 OpInfo.ConstraintVT = RegVT;
10022 // If the operand is an FP value and we want it in integer registers,
10023 // use the corresponding integer type. This turns an f64 value into
10024 // i64, which can be passed with two i32 values on a 32-bit machine.
10025 } else if (RegVT.isInteger() && OpInfo.ConstraintVT.isFloatingPoint()) {
10026 MVT VT = MVT::getIntegerVT(OpInfo.ConstraintVT.getSizeInBits());
10027 if (OpInfo.Type == InlineAsm::isInput)
10028 OpInfo.CallOperand =
10029 DAG.getNode(ISD::BITCAST, DL, VT, OpInfo.CallOperand);
10030 OpInfo.ConstraintVT = VT;
10031 }
10032 }
10033 }
10034
10035 // No need to allocate a matching input constraint since the constraint it's
10036 // matching to has already been allocated.
10037 if (OpInfo.isMatchingInputConstraint())
10038 return std::nullopt;
10039
10040 EVT ValueVT = OpInfo.ConstraintVT;
10041 if (OpInfo.ConstraintVT == MVT::Other)
10042 ValueVT = RegVT;
10043
10044 // Initialize NumRegs.
10045 unsigned NumRegs = 1;
10046 if (OpInfo.ConstraintVT != MVT::Other)
10047 NumRegs = TLI.getNumRegisters(Context, OpInfo.ConstraintVT, RegVT);
10048
10049 // If this is a constraint for a specific physical register, like {r17},
10050 // assign it now.
10051
10052 // If this associated to a specific register, initialize iterator to correct
10053 // place. If virtual, make sure we have enough registers
10054
10055 // Initialize iterator if necessary
10058
10059 // Do not check for single registers.
10060 if (AssignedReg) {
10061 I = std::find(I, RC->end(), AssignedReg);
10062 if (I == RC->end()) {
10063 // RC does not contain the selected register, which indicates a
10064 // mismatch between the register and the required type/bitwidth.
10065 return {AssignedReg};
10066 }
10067 }
10068
10069 for (; NumRegs; --NumRegs, ++I) {
10070 assert(I != RC->end() && "Ran out of registers to allocate!");
10071 Register R = AssignedReg ? Register(*I) : RegInfo.createVirtualRegister(RC);
10072 Regs.push_back(R);
10073 }
10074
10075 OpInfo.AssignedRegs = RegsForValue(Regs, RegVT, ValueVT);
10076 return std::nullopt;
10077}
10078
10079static unsigned
10081 const std::vector<SDValue> &AsmNodeOperands) {
10082 // Scan until we find the definition we already emitted of this operand.
10083 unsigned CurOp = InlineAsm::Op_FirstOperand;
10084 for (; OperandNo; --OperandNo) {
10085 // Advance to the next operand.
10086 unsigned OpFlag = AsmNodeOperands[CurOp]->getAsZExtVal();
10087 const InlineAsm::Flag F(OpFlag);
10088 assert(
10089 (F.isRegDefKind() || F.isRegDefEarlyClobberKind() || F.isMemKind()) &&
10090 "Skipped past definitions?");
10091 CurOp += F.getNumOperandRegisters() + 1;
10092 }
10093 return CurOp;
10094}
10095
10096namespace {
10097
10098class ExtraFlags {
10099 unsigned Flags = 0;
10100
10101public:
10102 explicit ExtraFlags(const CallBase &Call) {
10103 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
10104 if (IA->hasSideEffects())
10106 if (IA->isAlignStack())
10108 if (IA->canThrow())
10110 if (Call.isConvergent())
10112 Flags |= IA->getDialect() * InlineAsm::Extra_AsmDialect;
10113 }
10114
10115 void update(const TargetLowering::AsmOperandInfo &OpInfo) {
10116 // Ideally, we would only check against memory constraints. However, the
10117 // meaning of an Other constraint can be target-specific and we can't easily
10118 // reason about it. Therefore, be conservative and set MayLoad/MayStore
10119 // for Other constraints as well.
10122 if (OpInfo.Type == InlineAsm::isInput)
10124 else if (OpInfo.Type == InlineAsm::isOutput)
10126 else if (OpInfo.Type == InlineAsm::isClobber)
10128 }
10129 }
10130
10131 unsigned get() const { return Flags; }
10132};
10133
10134} // end anonymous namespace
10135
10136static bool isFunction(SDValue Op) {
10137 if (Op && Op.getOpcode() == ISD::GlobalAddress) {
10138 if (auto *GA = dyn_cast<GlobalAddressSDNode>(Op)) {
10139 auto Fn = dyn_cast_or_null<Function>(GA->getGlobal());
10140
10141 // In normal "call dllimport func" instruction (non-inlineasm) it force
10142 // indirect access by specifing call opcode. And usually specially print
10143 // asm with indirect symbol (i.g: "*") according to opcode. Inline asm can
10144 // not do in this way now. (In fact, this is similar with "Data Access"
10145 // action). So here we ignore dllimport function.
10146 if (Fn && !Fn->hasDLLImportStorageClass())
10147 return true;
10148 }
10149 }
10150 return false;
10151}
10152
10153/// visitInlineAsm - Handle a call to an InlineAsm object.
10154void SelectionDAGBuilder::visitInlineAsm(const CallBase &Call,
10155 const BasicBlock *EHPadBB) {
10156 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
10157
10158 /// ConstraintOperands - Information about all of the constraints.
10159 SmallVector<SDISelAsmOperandInfo, 16> ConstraintOperands;
10160
10161 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10163 DAG.getDataLayout(), DAG.getSubtarget().getRegisterInfo(), Call);
10164
10165 // First Pass: Calculate HasSideEffects and ExtraFlags (AlignStack,
10166 // AsmDialect, MayLoad, MayStore).
10167 bool HasSideEffect = IA->hasSideEffects();
10168 ExtraFlags ExtraInfo(Call);
10169
10170 for (auto &T : TargetConstraints) {
10171 ConstraintOperands.push_back(SDISelAsmOperandInfo(T));
10172 SDISelAsmOperandInfo &OpInfo = ConstraintOperands.back();
10173
10174 if (OpInfo.CallOperandVal)
10175 OpInfo.CallOperand = getValue(OpInfo.CallOperandVal);
10176
10177 if (!HasSideEffect)
10178 HasSideEffect = OpInfo.hasMemory(TLI);
10179
10180 // Determine if this InlineAsm MayLoad or MayStore based on the constraints.
10181 // FIXME: Could we compute this on OpInfo rather than T?
10182
10183 // Compute the constraint code and ConstraintType to use.
10185
10186 if (T.ConstraintType == TargetLowering::C_Immediate &&
10187 OpInfo.CallOperand && !isa<ConstantSDNode>(OpInfo.CallOperand))
10188 // We've delayed emitting a diagnostic like the "n" constraint because
10189 // inlining could cause an integer showing up.
10190 return emitInlineAsmError(Call, "constraint '" + Twine(T.ConstraintCode) +
10191 "' expects an integer constant "
10192 "expression");
10193
10194 ExtraInfo.update(T);
10195 }
10196
10197 // We won't need to flush pending loads if this asm doesn't touch
10198 // memory and is nonvolatile.
10199 SDValue Glue, Chain = (HasSideEffect) ? getRoot() : DAG.getRoot();
10200
10201 bool EmitEHLabels = isa<InvokeInst>(Call);
10202 if (EmitEHLabels) {
10203 assert(EHPadBB && "InvokeInst must have an EHPadBB");
10204 }
10205 bool IsCallBr = isa<CallBrInst>(Call);
10206
10207 if (IsCallBr || EmitEHLabels) {
10208 // If this is a callbr or invoke we need to flush pending exports since
10209 // inlineasm_br and invoke are terminators.
10210 // We need to do this before nodes are glued to the inlineasm_br node.
10211 Chain = getControlRoot();
10212 }
10213
10214 MCSymbol *BeginLabel = nullptr;
10215 if (EmitEHLabels) {
10216 Chain = lowerStartEH(Chain, EHPadBB, BeginLabel);
10217 }
10218
10219 int OpNo = -1;
10220 SmallVector<StringRef> AsmStrs;
10221 IA->collectAsmStrs(AsmStrs);
10222
10223 // Second pass over the constraints: compute which constraint option to use.
10224 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
10225 if (OpInfo.hasArg() || OpInfo.Type == InlineAsm::isOutput)
10226 OpNo++;
10227
10228 // If this is an output operand with a matching input operand, look up the
10229 // matching input. If their types mismatch, e.g. one is an integer, the
10230 // other is floating point, or their sizes are different, flag it as an
10231 // error.
10232 if (OpInfo.hasMatchingInput()) {
10233 SDISelAsmOperandInfo &Input = ConstraintOperands[OpInfo.MatchingInput];
10234 patchMatchingInput(OpInfo, Input, DAG);
10235 }
10236
10237 // Compute the constraint code and ConstraintType to use.
10238 TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
10239
10240 if ((OpInfo.ConstraintType == TargetLowering::C_Memory &&
10241 OpInfo.Type == InlineAsm::isClobber) ||
10242 OpInfo.ConstraintType == TargetLowering::C_Address)
10243 continue;
10244
10245 // In Linux PIC model, there are 4 cases about value/label addressing:
10246 //
10247 // 1: Function call or Label jmp inside the module.
10248 // 2: Data access (such as global variable, static variable) inside module.
10249 // 3: Function call or Label jmp outside the module.
10250 // 4: Data access (such as global variable) outside the module.
10251 //
10252 // Due to current llvm inline asm architecture designed to not "recognize"
10253 // the asm code, there are quite troubles for us to treat mem addressing
10254 // differently for same value/adress used in different instuctions.
10255 // For example, in pic model, call a func may in plt way or direclty
10256 // pc-related, but lea/mov a function adress may use got.
10257 //
10258 // Here we try to "recognize" function call for the case 1 and case 3 in
10259 // inline asm. And try to adjust the constraint for them.
10260 //
10261 // TODO: Due to current inline asm didn't encourage to jmp to the outsider
10262 // label, so here we don't handle jmp function label now, but we need to
10263 // enhance it (especilly in PIC model) if we meet meaningful requirements.
10264 if (OpInfo.isIndirect && isFunction(OpInfo.CallOperand) &&
10265 TLI.isInlineAsmTargetBranch(AsmStrs, OpNo) &&
10266 TM.getCodeModel() != CodeModel::Large) {
10267 OpInfo.isIndirect = false;
10268 OpInfo.ConstraintType = TargetLowering::C_Address;
10269 }
10270
10271 // If this is a memory input, and if the operand is not indirect, do what we
10272 // need to provide an address for the memory input.
10273 if (OpInfo.ConstraintType == TargetLowering::C_Memory &&
10274 !OpInfo.isIndirect) {
10275 assert((OpInfo.isMultipleAlternative ||
10276 (OpInfo.Type == InlineAsm::isInput)) &&
10277 "Can only indirectify direct input operands!");
10278
10279 // Memory operands really want the address of the value.
10280 Chain = getAddressForMemoryInput(Chain, getCurSDLoc(), OpInfo, DAG);
10281
10282 // There is no longer a Value* corresponding to this operand.
10283 OpInfo.CallOperandVal = nullptr;
10284
10285 // It is now an indirect operand.
10286 OpInfo.isIndirect = true;
10287 }
10288
10289 }
10290
10291 // AsmNodeOperands - The operands for the ISD::INLINEASM node.
10292 std::vector<SDValue> AsmNodeOperands;
10293 AsmNodeOperands.push_back(SDValue()); // reserve space for input chain
10294 AsmNodeOperands.push_back(DAG.getTargetExternalSymbol(
10295 IA->getAsmString().data(), TLI.getProgramPointerTy(DAG.getDataLayout())));
10296
10297 // If we have a !srcloc metadata node associated with it, we want to attach
10298 // this to the ultimately generated inline asm machineinstr. To do this, we
10299 // pass in the third operand as this (potentially null) inline asm MDNode.
10300 const MDNode *SrcLoc = Call.getMetadata("srcloc");
10301 AsmNodeOperands.push_back(DAG.getMDNode(SrcLoc));
10302
10303 // Remember the HasSideEffect, AlignStack, AsmDialect, MayLoad and MayStore
10304 // bits as operand 3.
10305 AsmNodeOperands.push_back(DAG.getTargetConstant(
10306 ExtraInfo.get(), getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10307
10308 // Third pass: Loop over operands to prepare DAG-level operands.. As part of
10309 // this, assign virtual and physical registers for inputs and otput.
10310 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
10311 // Assign Registers.
10312 SDISelAsmOperandInfo &RefOpInfo =
10313 OpInfo.isMatchingInputConstraint()
10314 ? ConstraintOperands[OpInfo.getMatchedOperand()]
10315 : OpInfo;
10316 const auto RegError =
10317 getRegistersForValue(DAG, getCurSDLoc(), OpInfo, RefOpInfo);
10318 if (RegError) {
10319 const MachineFunction &MF = DAG.getMachineFunction();
10320 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
10321 const char *RegName = TRI.getName(*RegError);
10322 emitInlineAsmError(Call, "register '" + Twine(RegName) +
10323 "' allocated for constraint '" +
10324 Twine(OpInfo.ConstraintCode) +
10325 "' does not match required type");
10326 return;
10327 }
10328
10329 auto DetectWriteToReservedRegister = [&]() {
10330 const MachineFunction &MF = DAG.getMachineFunction();
10331 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
10332 for (Register Reg : OpInfo.AssignedRegs.Regs) {
10333 if (Reg.isPhysical() && TRI.isInlineAsmReadOnlyReg(MF, Reg)) {
10334 const char *RegName = TRI.getName(Reg);
10335 emitInlineAsmError(Call, "write to reserved register '" +
10336 Twine(RegName) + "'");
10337 return true;
10338 }
10339 }
10340 return false;
10341 };
10342 assert((OpInfo.ConstraintType != TargetLowering::C_Address ||
10343 (OpInfo.Type == InlineAsm::isInput &&
10344 !OpInfo.isMatchingInputConstraint())) &&
10345 "Only address as input operand is allowed.");
10346
10347 switch (OpInfo.Type) {
10349 if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
10350 const InlineAsm::ConstraintCode ConstraintID =
10351 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10353 "Failed to convert memory constraint code to constraint id.");
10354
10355 // Add information to the INLINEASM node to know about this output.
10356 InlineAsm::Flag OpFlags(InlineAsm::Kind::Mem, 1);
10357 OpFlags.setMemConstraint(ConstraintID);
10358 AsmNodeOperands.push_back(DAG.getTargetConstant(OpFlags, getCurSDLoc(),
10359 MVT::i32));
10360 AsmNodeOperands.push_back(OpInfo.CallOperand);
10361 } else {
10362 // Otherwise, this outputs to a register (directly for C_Register /
10363 // C_RegisterClass, and a target-defined fashion for
10364 // C_Immediate/C_Other). Find a register that we can use.
10365 if (OpInfo.AssignedRegs.Regs.empty()) {
10366 emitInlineAsmError(
10367 Call, "couldn't allocate output register for constraint '" +
10368 Twine(OpInfo.ConstraintCode) + "'");
10369 return;
10370 }
10371
10372 if (DetectWriteToReservedRegister())
10373 return;
10374
10375 // Add information to the INLINEASM node to know that this register is
10376 // set.
10377 OpInfo.AssignedRegs.AddInlineAsmOperands(
10378 OpInfo.isEarlyClobber ? InlineAsm::Kind::RegDefEarlyClobber
10380 false, 0, getCurSDLoc(), DAG, AsmNodeOperands);
10381 }
10382 break;
10383
10384 case InlineAsm::isInput:
10385 case InlineAsm::isLabel: {
10386 SDValue InOperandVal = OpInfo.CallOperand;
10387
10388 if (OpInfo.isMatchingInputConstraint()) {
10389 // If this is required to match an output register we have already set,
10390 // just use its register.
10391 auto CurOp = findMatchingInlineAsmOperand(OpInfo.getMatchedOperand(),
10392 AsmNodeOperands);
10393 InlineAsm::Flag Flag(AsmNodeOperands[CurOp]->getAsZExtVal());
10394 if (Flag.isRegDefKind() || Flag.isRegDefEarlyClobberKind()) {
10395 if (OpInfo.isIndirect) {
10396 // This happens on gcc/testsuite/gcc.dg/pr8788-1.c
10397 emitInlineAsmError(Call, "inline asm not supported yet: "
10398 "don't know how to handle tied "
10399 "indirect register inputs");
10400 return;
10401 }
10402
10404 MachineFunction &MF = DAG.getMachineFunction();
10405 MachineRegisterInfo &MRI = MF.getRegInfo();
10406 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
10407 auto *R = cast<RegisterSDNode>(AsmNodeOperands[CurOp+1]);
10408 Register TiedReg = R->getReg();
10409 MVT RegVT = R->getSimpleValueType(0);
10410 const TargetRegisterClass *RC =
10411 TiedReg.isVirtual() ? MRI.getRegClass(TiedReg)
10412 : RegVT != MVT::Untyped ? TLI.getRegClassFor(RegVT)
10413 : TRI.getMinimalPhysRegClass(TiedReg);
10414 for (unsigned i = 0, e = Flag.getNumOperandRegisters(); i != e; ++i)
10415 Regs.push_back(MRI.createVirtualRegister(RC));
10416
10417 RegsForValue MatchedRegs(Regs, RegVT, InOperandVal.getValueType());
10418
10419 SDLoc dl = getCurSDLoc();
10420 // Use the produced MatchedRegs object to
10421 MatchedRegs.getCopyToRegs(InOperandVal, DAG, dl, Chain, &Glue, &Call);
10422 MatchedRegs.AddInlineAsmOperands(InlineAsm::Kind::RegUse, true,
10423 OpInfo.getMatchedOperand(), dl, DAG,
10424 AsmNodeOperands);
10425 break;
10426 }
10427
10428 assert(Flag.isMemKind() && "Unknown matching constraint!");
10429 assert(Flag.getNumOperandRegisters() == 1 &&
10430 "Unexpected number of operands");
10431 // Add information to the INLINEASM node to know about this input.
10432 // See InlineAsm.h isUseOperandTiedToDef.
10433 Flag.clearMemConstraint();
10434 Flag.setMatchingOp(OpInfo.getMatchedOperand());
10435 AsmNodeOperands.push_back(DAG.getTargetConstant(
10436 Flag, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10437 AsmNodeOperands.push_back(AsmNodeOperands[CurOp+1]);
10438 break;
10439 }
10440
10441 // Treat indirect 'X' constraint as memory.
10442 if (OpInfo.ConstraintType == TargetLowering::C_Other &&
10443 OpInfo.isIndirect)
10444 OpInfo.ConstraintType = TargetLowering::C_Memory;
10445
10446 if (OpInfo.ConstraintType == TargetLowering::C_Immediate ||
10447 OpInfo.ConstraintType == TargetLowering::C_Other) {
10448 std::vector<SDValue> Ops;
10449 TLI.LowerAsmOperandForConstraint(InOperandVal, OpInfo.ConstraintCode,
10450 Ops, DAG);
10451 if (Ops.empty()) {
10452 if (OpInfo.ConstraintType == TargetLowering::C_Immediate)
10453 if (isa<ConstantSDNode>(InOperandVal)) {
10454 emitInlineAsmError(Call, "value out of range for constraint '" +
10455 Twine(OpInfo.ConstraintCode) + "'");
10456 return;
10457 }
10458
10459 emitInlineAsmError(Call,
10460 "invalid operand for inline asm constraint '" +
10461 Twine(OpInfo.ConstraintCode) + "'");
10462 return;
10463 }
10464
10465 // Add information to the INLINEASM node to know about this input.
10466 InlineAsm::Flag ResOpType(InlineAsm::Kind::Imm, Ops.size());
10467 AsmNodeOperands.push_back(DAG.getTargetConstant(
10468 ResOpType, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10469 llvm::append_range(AsmNodeOperands, Ops);
10470 break;
10471 }
10472
10473 if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
10474 assert((OpInfo.isIndirect ||
10475 OpInfo.ConstraintType != TargetLowering::C_Memory) &&
10476 "Operand must be indirect to be a mem!");
10477 assert(InOperandVal.getValueType() ==
10478 TLI.getPointerTy(DAG.getDataLayout()) &&
10479 "Memory operands expect pointer values");
10480
10481 const InlineAsm::ConstraintCode ConstraintID =
10482 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10484 "Failed to convert memory constraint code to constraint id.");
10485
10486 // Add information to the INLINEASM node to know about this input.
10487 InlineAsm::Flag ResOpType(InlineAsm::Kind::Mem, 1);
10488 ResOpType.setMemConstraint(ConstraintID);
10489 AsmNodeOperands.push_back(DAG.getTargetConstant(ResOpType,
10490 getCurSDLoc(),
10491 MVT::i32));
10492 AsmNodeOperands.push_back(InOperandVal);
10493 break;
10494 }
10495
10496 if (OpInfo.ConstraintType == TargetLowering::C_Address) {
10497 const InlineAsm::ConstraintCode ConstraintID =
10498 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10500 "Failed to convert memory constraint code to constraint id.");
10501
10502 InlineAsm::Flag ResOpType(InlineAsm::Kind::Mem, 1);
10503
10504 SDValue AsmOp = InOperandVal;
10505 if (isFunction(InOperandVal)) {
10506 auto *GA = cast<GlobalAddressSDNode>(InOperandVal);
10507 ResOpType = InlineAsm::Flag(InlineAsm::Kind::Func, 1);
10508 AsmOp = DAG.getTargetGlobalAddress(GA->getGlobal(), getCurSDLoc(),
10509 InOperandVal.getValueType(),
10510 GA->getOffset());
10511 }
10512
10513 // Add information to the INLINEASM node to know about this input.
10514 ResOpType.setMemConstraint(ConstraintID);
10515
10516 AsmNodeOperands.push_back(
10517 DAG.getTargetConstant(ResOpType, getCurSDLoc(), MVT::i32));
10518
10519 AsmNodeOperands.push_back(AsmOp);
10520 break;
10521 }
10522
10523 if (OpInfo.ConstraintType != TargetLowering::C_RegisterClass &&
10524 OpInfo.ConstraintType != TargetLowering::C_Register) {
10525 emitInlineAsmError(Call, "unknown asm constraint '" +
10526 Twine(OpInfo.ConstraintCode) + "'");
10527 return;
10528 }
10529
10530 // TODO: Support this.
10531 if (OpInfo.isIndirect) {
10532 emitInlineAsmError(
10533 Call, "Don't know how to handle indirect register inputs yet "
10534 "for constraint '" +
10535 Twine(OpInfo.ConstraintCode) + "'");
10536 return;
10537 }
10538
10539 // Copy the input into the appropriate registers.
10540 if (OpInfo.AssignedRegs.Regs.empty()) {
10541 emitInlineAsmError(Call,
10542 "couldn't allocate input reg for constraint '" +
10543 Twine(OpInfo.ConstraintCode) + "'");
10544 return;
10545 }
10546
10547 if (DetectWriteToReservedRegister())
10548 return;
10549
10550 SDLoc dl = getCurSDLoc();
10551
10552 OpInfo.AssignedRegs.getCopyToRegs(InOperandVal, DAG, dl, Chain, &Glue,
10553 &Call);
10554
10555 OpInfo.AssignedRegs.AddInlineAsmOperands(InlineAsm::Kind::RegUse, false,
10556 0, dl, DAG, AsmNodeOperands);
10557 break;
10558 }
10560 // Add the clobbered value to the operand list, so that the register
10561 // allocator is aware that the physreg got clobbered.
10562 if (!OpInfo.AssignedRegs.Regs.empty())
10564 false, 0, getCurSDLoc(), DAG,
10565 AsmNodeOperands);
10566 break;
10567 }
10568 }
10569
10570 // Finish up input operands. Set the input chain and add the flag last.
10571 AsmNodeOperands[InlineAsm::Op_InputChain] = Chain;
10572 if (Glue.getNode()) AsmNodeOperands.push_back(Glue);
10573
10574 unsigned ISDOpc = IsCallBr ? ISD::INLINEASM_BR : ISD::INLINEASM;
10575 Chain = DAG.getNode(ISDOpc, getCurSDLoc(),
10576 DAG.getVTList(MVT::Other, MVT::Glue), AsmNodeOperands);
10577 Glue = Chain.getValue(1);
10578
10579 // Do additional work to generate outputs.
10580
10581 SmallVector<EVT, 1> ResultVTs;
10582 SmallVector<SDValue, 1> ResultValues;
10583 SmallVector<SDValue, 8> OutChains;
10584
10585 llvm::Type *CallResultType = Call.getType();
10586 ArrayRef<Type *> ResultTypes;
10587 if (StructType *StructResult = dyn_cast<StructType>(CallResultType))
10588 ResultTypes = StructResult->elements();
10589 else if (!CallResultType->isVoidTy())
10590 ResultTypes = ArrayRef(CallResultType);
10591
10592 auto CurResultType = ResultTypes.begin();
10593 auto handleRegAssign = [&](SDValue V) {
10594 assert(CurResultType != ResultTypes.end() && "Unexpected value");
10595 assert((*CurResultType)->isSized() && "Unexpected unsized type");
10596 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), *CurResultType);
10597 ++CurResultType;
10598 // If the type of the inline asm call site return value is different but has
10599 // same size as the type of the asm output bitcast it. One example of this
10600 // is for vectors with different width / number of elements. This can
10601 // happen for register classes that can contain multiple different value
10602 // types. The preg or vreg allocated may not have the same VT as was
10603 // expected.
10604 //
10605 // This can also happen for a return value that disagrees with the register
10606 // class it is put in, eg. a double in a general-purpose register on a
10607 // 32-bit machine.
10608 if (ResultVT != V.getValueType() &&
10609 ResultVT.getSizeInBits() == V.getValueSizeInBits())
10610 V = DAG.getNode(ISD::BITCAST, getCurSDLoc(), ResultVT, V);
10611 else if (ResultVT != V.getValueType() && ResultVT.isInteger() &&
10612 V.getValueType().isInteger()) {
10613 // If a result value was tied to an input value, the computed result
10614 // may have a wider width than the expected result. Extract the
10615 // relevant portion.
10616 V = DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), ResultVT, V);
10617 }
10618 assert(ResultVT == V.getValueType() && "Asm result value mismatch!");
10619 ResultVTs.push_back(ResultVT);
10620 ResultValues.push_back(V);
10621 };
10622
10623 // Deal with output operands.
10624 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
10625 if (OpInfo.Type == InlineAsm::isOutput) {
10626 SDValue Val;
10627 // Skip trivial output operands.
10628 if (OpInfo.AssignedRegs.Regs.empty())
10629 continue;
10630
10631 switch (OpInfo.ConstraintType) {
10634 Val = OpInfo.AssignedRegs.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(),
10635 Chain, &Glue, &Call);
10636 break;
10639 Val = TLI.LowerAsmOutputForConstraint(Chain, Glue, getCurSDLoc(),
10640 OpInfo, DAG);
10641 break;
10643 break; // Already handled.
10645 break; // Silence warning.
10647 assert(false && "Unexpected unknown constraint");
10648 }
10649
10650 // Indirect output manifest as stores. Record output chains.
10651 if (OpInfo.isIndirect) {
10652 const Value *Ptr = OpInfo.CallOperandVal;
10653 assert(Ptr && "Expected value CallOperandVal for indirect asm operand");
10654 SDValue Store = DAG.getStore(Chain, getCurSDLoc(), Val, getValue(Ptr),
10655 MachinePointerInfo(Ptr));
10656 OutChains.push_back(Store);
10657 } else {
10658 // generate CopyFromRegs to associated registers.
10659 assert(!Call.getType()->isVoidTy() && "Bad inline asm!");
10660 if (Val.getOpcode() == ISD::MERGE_VALUES) {
10661 for (const SDValue &V : Val->op_values())
10662 handleRegAssign(V);
10663 } else
10664 handleRegAssign(Val);
10665 }
10666 }
10667 }
10668
10669 // Set results.
10670 if (!ResultValues.empty()) {
10671 assert(CurResultType == ResultTypes.end() &&
10672 "Mismatch in number of ResultTypes");
10673 assert(ResultValues.size() == ResultTypes.size() &&
10674 "Mismatch in number of output operands in asm result");
10675
10677 DAG.getVTList(ResultVTs), ResultValues);
10678 setValue(&Call, V);
10679 }
10680
10681 // Collect store chains.
10682 if (!OutChains.empty())
10683 Chain = DAG.getNode(ISD::TokenFactor, getCurSDLoc(), MVT::Other, OutChains);
10684
10685 if (EmitEHLabels) {
10686 Chain = lowerEndEH(Chain, cast<InvokeInst>(&Call), EHPadBB, BeginLabel);
10687 }
10688
10689 // Only Update Root if inline assembly has a memory effect.
10690 if (ResultValues.empty() || HasSideEffect || !OutChains.empty() || IsCallBr ||
10691 EmitEHLabels)
10692 DAG.setRoot(Chain);
10693}
10694
10695void SelectionDAGBuilder::emitInlineAsmError(const CallBase &Call,
10696 const Twine &Message) {
10697 LLVMContext &Ctx = *DAG.getContext();
10698 Ctx.diagnose(DiagnosticInfoInlineAsm(Call, Message));
10699
10700 // Make sure we leave the DAG in a valid state
10701 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10702 SmallVector<EVT, 1> ValueVTs;
10703 ComputeValueVTs(TLI, DAG.getDataLayout(), Call.getType(), ValueVTs);
10704
10705 if (ValueVTs.empty())
10706 return;
10707
10709 for (const EVT &VT : ValueVTs)
10710 Ops.push_back(DAG.getUNDEF(VT));
10711
10712 setValue(&Call, DAG.getMergeValues(Ops, getCurSDLoc()));
10713}
10714
10715void SelectionDAGBuilder::visitVAStart(const CallInst &I) {
10716 DAG.setRoot(DAG.getNode(ISD::VASTART, getCurSDLoc(),
10717 MVT::Other, getRoot(),
10718 getValue(I.getArgOperand(0)),
10719 DAG.getSrcValue(I.getArgOperand(0))));
10720}
10721
10722void SelectionDAGBuilder::visitVAArg(const VAArgInst &I) {
10723 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10724 const DataLayout &DL = DAG.getDataLayout();
10725 SDValue V = DAG.getVAArg(
10726 TLI.getMemValueType(DAG.getDataLayout(), I.getType()), getCurSDLoc(),
10727 getRoot(), getValue(I.getOperand(0)), DAG.getSrcValue(I.getOperand(0)),
10728 DL.getABITypeAlign(I.getType()).value());
10729 DAG.setRoot(V.getValue(1));
10730
10731 if (I.getType()->isPointerTy())
10732 V = DAG.getPtrExtOrTrunc(
10733 V, getCurSDLoc(), TLI.getValueType(DAG.getDataLayout(), I.getType()));
10734 setValue(&I, V);
10735}
10736
10737void SelectionDAGBuilder::visitVAEnd(const CallInst &I) {
10738 DAG.setRoot(DAG.getNode(ISD::VAEND, getCurSDLoc(),
10739 MVT::Other, getRoot(),
10740 getValue(I.getArgOperand(0)),
10741 DAG.getSrcValue(I.getArgOperand(0))));
10742}
10743
10744void SelectionDAGBuilder::visitVACopy(const CallInst &I) {
10745 DAG.setRoot(DAG.getNode(ISD::VACOPY, getCurSDLoc(),
10746 MVT::Other, getRoot(),
10747 getValue(I.getArgOperand(0)),
10748 getValue(I.getArgOperand(1)),
10749 DAG.getSrcValue(I.getArgOperand(0)),
10750 DAG.getSrcValue(I.getArgOperand(1))));
10751}
10752
10754 const Instruction &I,
10755 SDValue Op) {
10756 std::optional<ConstantRange> CR = getRange(I);
10757
10758 if (!CR || CR->isFullSet() || CR->isEmptySet() || CR->isUpperWrapped())
10759 return Op;
10760
10761 APInt Lo = CR->getUnsignedMin();
10762 if (!Lo.isMinValue())
10763 return Op;
10764
10765 APInt Hi = CR->getUnsignedMax();
10766 unsigned Bits = std::max(Hi.getActiveBits(),
10767 static_cast<unsigned>(IntegerType::MIN_INT_BITS));
10768
10769 EVT SmallVT = EVT::getIntegerVT(*DAG.getContext(), Bits);
10770
10771 SDLoc SL = getCurSDLoc();
10772
10773 SDValue ZExt = DAG.getNode(ISD::AssertZext, SL, Op.getValueType(), Op,
10774 DAG.getValueType(SmallVT));
10775 unsigned NumVals = Op.getNode()->getNumValues();
10776 if (NumVals == 1)
10777 return ZExt;
10778
10780
10781 Ops.push_back(ZExt);
10782 for (unsigned I = 1; I != NumVals; ++I)
10783 Ops.push_back(Op.getValue(I));
10784
10785 return DAG.getMergeValues(Ops, SL);
10786}
10787
10789 SelectionDAG &DAG, const Instruction &I, SDValue Op) {
10790 FPClassTest Classes = getNoFPClass(I);
10791 if (Classes == fcNone)
10792 return Op;
10793
10794 SDLoc SL = getCurSDLoc();
10795 SDValue TestConst = DAG.getTargetConstant(Classes, SDLoc(), MVT::i32);
10796
10797 if (Op.getOpcode() != ISD::MERGE_VALUES) {
10798 return DAG.getNode(ISD::AssertNoFPClass, SL, Op.getValueType(), Op,
10799 TestConst);
10800 }
10801
10802 SmallVector<SDValue, 8> Ops(Op.getNumOperands());
10803 for (unsigned I = 0, E = Ops.size(); I != E; ++I) {
10804 SDValue MergeOp = Op.getOperand(I);
10805 Ops[I] = DAG.getNode(ISD::AssertNoFPClass, SL, MergeOp.getValueType(),
10806 MergeOp, TestConst);
10807 }
10808
10809 return DAG.getMergeValues(Ops, SL);
10810}
10811
10812/// Populate a CallLowerinInfo (into \p CLI) based on the properties of
10813/// the call being lowered.
10814///
10815/// This is a helper for lowering intrinsics that follow a target calling
10816/// convention or require stack pointer adjustment. Only a subset of the
10817/// intrinsic's operands need to participate in the calling convention.
10820 unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy,
10821 AttributeSet RetAttrs, bool IsPatchPoint) {
10823 Args.reserve(NumArgs);
10824
10825 // Populate the argument list.
10826 // Attributes for args start at offset 1, after the return attribute.
10827 for (unsigned ArgI = ArgIdx, ArgE = ArgIdx + NumArgs;
10828 ArgI != ArgE; ++ArgI) {
10829 const Value *V = Call->getOperand(ArgI);
10830
10831 assert(!V->getType()->isEmptyTy() && "Empty type passed to intrinsic.");
10832
10833 TargetLowering::ArgListEntry Entry(getValue(V), V->getType());
10834 Entry.setAttributes(Call, ArgI);
10835 Args.push_back(Entry);
10836 }
10837
10839 .setChain(getRoot())
10840 .setCallee(Call->getCallingConv(), ReturnTy, Callee, std::move(Args),
10841 RetAttrs)
10842 .setDiscardResult(Call->use_empty())
10843 .setIsPatchPoint(IsPatchPoint)
10845 Call->countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0);
10846}
10847
10848/// Add a stack map intrinsic call's live variable operands to a stackmap
10849/// or patchpoint target node's operand list.
10850///
10851/// Constants are converted to TargetConstants purely as an optimization to
10852/// avoid constant materialization and register allocation.
10853///
10854/// FrameIndex operands are converted to TargetFrameIndex so that ISEL does not
10855/// generate addess computation nodes, and so FinalizeISel can convert the
10856/// TargetFrameIndex into a DirectMemRefOp StackMap location. This avoids
10857/// address materialization and register allocation, but may also be required
10858/// for correctness. If a StackMap (or PatchPoint) intrinsic directly uses an
10859/// alloca in the entry block, then the runtime may assume that the alloca's
10860/// StackMap location can be read immediately after compilation and that the
10861/// location is valid at any point during execution (this is similar to the
10862/// assumption made by the llvm.gcroot intrinsic). If the alloca's location were
10863/// only available in a register, then the runtime would need to trap when
10864/// execution reaches the StackMap in order to read the alloca's location.
10865static void addStackMapLiveVars(const CallBase &Call, unsigned StartIdx,
10867 SelectionDAGBuilder &Builder) {
10868 SelectionDAG &DAG = Builder.DAG;
10869 for (unsigned I = StartIdx; I < Call.arg_size(); I++) {
10870 SDValue Op = Builder.getValue(Call.getArgOperand(I));
10871
10872 // Things on the stack are pointer-typed, meaning that they are already
10873 // legal and can be emitted directly to target nodes.
10875 Ops.push_back(DAG.getTargetFrameIndex(FI->getIndex(), Op.getValueType()));
10876 } else {
10877 // Otherwise emit a target independent node to be legalised.
10878 Ops.push_back(Builder.getValue(Call.getArgOperand(I)));
10879 }
10880 }
10881}
10882
10883/// Lower llvm.experimental.stackmap.
10884void SelectionDAGBuilder::visitStackmap(const CallInst &CI) {
10885 // void @llvm.experimental.stackmap(i64 <id>, i32 <numShadowBytes>,
10886 // [live variables...])
10887
10888 assert(CI.getType()->isVoidTy() && "Stackmap cannot return a value.");
10889
10890 SDValue Chain, InGlue, Callee;
10892
10893 SDLoc DL = getCurSDLoc();
10895
10896 // The stackmap intrinsic only records the live variables (the arguments
10897 // passed to it) and emits NOPS (if requested). Unlike the patchpoint
10898 // intrinsic, this won't be lowered to a function call. This means we don't
10899 // have to worry about calling conventions and target specific lowering code.
10900 // Instead we perform the call lowering right here.
10901 //
10902 // chain, flag = CALLSEQ_START(chain, 0, 0)
10903 // chain, flag = STACKMAP(id, nbytes, ..., chain, flag)
10904 // chain, flag = CALLSEQ_END(chain, 0, 0, flag)
10905 //
10906 Chain = DAG.getCALLSEQ_START(getRoot(), 0, 0, DL);
10907 InGlue = Chain.getValue(1);
10908
10909 // Add the STACKMAP operands, starting with DAG house-keeping.
10910 Ops.push_back(Chain);
10911 Ops.push_back(InGlue);
10912
10913 // Add the <id>, <numShadowBytes> operands.
10914 //
10915 // These do not require legalisation, and can be emitted directly to target
10916 // constant nodes.
10918 assert(ID.getValueType() == MVT::i64);
10919 SDValue IDConst =
10920 DAG.getTargetConstant(ID->getAsZExtVal(), DL, ID.getValueType());
10921 Ops.push_back(IDConst);
10922
10923 SDValue Shad = getValue(CI.getArgOperand(1));
10924 assert(Shad.getValueType() == MVT::i32);
10925 SDValue ShadConst =
10926 DAG.getTargetConstant(Shad->getAsZExtVal(), DL, Shad.getValueType());
10927 Ops.push_back(ShadConst);
10928
10929 // Add the live variables.
10930 addStackMapLiveVars(CI, 2, DL, Ops, *this);
10931
10932 // Create the STACKMAP node.
10933 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
10934 Chain = DAG.getNode(ISD::STACKMAP, DL, NodeTys, Ops);
10935 InGlue = Chain.getValue(1);
10936
10937 Chain = DAG.getCALLSEQ_END(Chain, 0, 0, InGlue, DL);
10938
10939 // Stackmaps don't generate values, so nothing goes into the NodeMap.
10940
10941 // Set the root to the target-lowered call chain.
10942 DAG.setRoot(Chain);
10943
10944 // Inform the Frame Information that we have a stackmap in this function.
10945 FuncInfo.MF->getFrameInfo().setHasStackMap();
10946}
10947
10948/// Lower llvm.experimental.patchpoint directly to its target opcode.
10949void SelectionDAGBuilder::visitPatchpoint(const CallBase &CB,
10950 const BasicBlock *EHPadBB) {
10951 // <ty> @llvm.experimental.patchpoint.<ty>(i64 <id>,
10952 // i32 <numBytes>,
10953 // i8* <target>,
10954 // i32 <numArgs>,
10955 // [Args...],
10956 // [live variables...])
10957
10959 bool IsAnyRegCC = CC == CallingConv::AnyReg;
10960 bool HasDef = !CB.getType()->isVoidTy();
10961 SDLoc dl = getCurSDLoc();
10963
10964 // Handle immediate and symbolic callees.
10965 if (auto* ConstCallee = dyn_cast<ConstantSDNode>(Callee))
10966 Callee = DAG.getIntPtrConstant(ConstCallee->getZExtValue(), dl,
10967 /*isTarget=*/true);
10968 else if (auto* SymbolicCallee = dyn_cast<GlobalAddressSDNode>(Callee))
10969 Callee = DAG.getTargetGlobalAddress(SymbolicCallee->getGlobal(),
10970 SDLoc(SymbolicCallee),
10971 SymbolicCallee->getValueType(0));
10972
10973 // Get the real number of arguments participating in the call <numArgs>
10975 unsigned NumArgs = NArgVal->getAsZExtVal();
10976
10977 // Skip the four meta args: <id>, <numNopBytes>, <target>, <numArgs>
10978 // Intrinsics include all meta-operands up to but not including CC.
10979 unsigned NumMetaOpers = PatchPointOpers::CCPos;
10980 assert(CB.arg_size() >= NumMetaOpers + NumArgs &&
10981 "Not enough arguments provided to the patchpoint intrinsic");
10982
10983 // For AnyRegCC the arguments are lowered later on manually.
10984 unsigned NumCallArgs = IsAnyRegCC ? 0 : NumArgs;
10985 Type *ReturnTy =
10986 IsAnyRegCC ? Type::getVoidTy(*DAG.getContext()) : CB.getType();
10987
10988 TargetLowering::CallLoweringInfo CLI(DAG);
10989 populateCallLoweringInfo(CLI, &CB, NumMetaOpers, NumCallArgs, Callee,
10990 ReturnTy, CB.getAttributes().getRetAttrs(), true);
10991 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
10992
10993 SDNode *CallEnd = Result.second.getNode();
10994 if (CallEnd->getOpcode() == ISD::EH_LABEL)
10995 CallEnd = CallEnd->getOperand(0).getNode();
10996 if (HasDef && (CallEnd->getOpcode() == ISD::CopyFromReg))
10997 CallEnd = CallEnd->getOperand(0).getNode();
10998
10999 /// Get a call instruction from the call sequence chain.
11000 /// Tail calls are not allowed.
11001 assert(CallEnd->getOpcode() == ISD::CALLSEQ_END &&
11002 "Expected a callseq node.");
11003 SDNode *Call = CallEnd->getOperand(0).getNode();
11004 bool HasGlue = Call->getGluedNode();
11005
11006 // Replace the target specific call node with the patchable intrinsic.
11008
11009 // Push the chain.
11010 Ops.push_back(*(Call->op_begin()));
11011
11012 // Optionally, push the glue (if any).
11013 if (HasGlue)
11014 Ops.push_back(*(Call->op_end() - 1));
11015
11016 // Push the register mask info.
11017 if (HasGlue)
11018 Ops.push_back(*(Call->op_end() - 2));
11019 else
11020 Ops.push_back(*(Call->op_end() - 1));
11021
11022 // Add the <id> and <numBytes> constants.
11024 Ops.push_back(DAG.getTargetConstant(IDVal->getAsZExtVal(), dl, MVT::i64));
11026 Ops.push_back(DAG.getTargetConstant(NBytesVal->getAsZExtVal(), dl, MVT::i32));
11027
11028 // Add the callee.
11029 Ops.push_back(Callee);
11030
11031 // Adjust <numArgs> to account for any arguments that have been passed on the
11032 // stack instead.
11033 // Call Node: Chain, Target, {Args}, RegMask, [Glue]
11034 unsigned NumCallRegArgs = Call->getNumOperands() - (HasGlue ? 4 : 3);
11035 NumCallRegArgs = IsAnyRegCC ? NumArgs : NumCallRegArgs;
11036 Ops.push_back(DAG.getTargetConstant(NumCallRegArgs, dl, MVT::i32));
11037
11038 // Add the calling convention
11039 Ops.push_back(DAG.getTargetConstant((unsigned)CC, dl, MVT::i32));
11040
11041 // Add the arguments we omitted previously. The register allocator should
11042 // place these in any free register.
11043 if (IsAnyRegCC)
11044 for (unsigned i = NumMetaOpers, e = NumMetaOpers + NumArgs; i != e; ++i)
11045 Ops.push_back(getValue(CB.getArgOperand(i)));
11046
11047 // Push the arguments from the call instruction.
11048 SDNode::op_iterator e = HasGlue ? Call->op_end()-2 : Call->op_end()-1;
11049 Ops.append(Call->op_begin() + 2, e);
11050
11051 // Push live variables for the stack map.
11052 addStackMapLiveVars(CB, NumMetaOpers + NumArgs, dl, Ops, *this);
11053
11054 SDVTList NodeTys;
11055 if (IsAnyRegCC && HasDef) {
11056 // Create the return types based on the intrinsic definition
11057 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11058 SmallVector<EVT, 3> ValueVTs;
11059 ComputeValueVTs(TLI, DAG.getDataLayout(), CB.getType(), ValueVTs);
11060 assert(ValueVTs.size() == 1 && "Expected only one return value type.");
11061
11062 // There is always a chain and a glue type at the end
11063 ValueVTs.push_back(MVT::Other);
11064 ValueVTs.push_back(MVT::Glue);
11065 NodeTys = DAG.getVTList(ValueVTs);
11066 } else
11067 NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
11068
11069 // Replace the target specific call node with a PATCHPOINT node.
11070 SDValue PPV = DAG.getNode(ISD::PATCHPOINT, dl, NodeTys, Ops);
11071
11072 // Update the NodeMap.
11073 if (HasDef) {
11074 if (IsAnyRegCC)
11075 setValue(&CB, SDValue(PPV.getNode(), 0));
11076 else
11077 setValue(&CB, Result.first);
11078 }
11079
11080 // Fixup the consumers of the intrinsic. The chain and glue may be used in the
11081 // call sequence. Furthermore the location of the chain and glue can change
11082 // when the AnyReg calling convention is used and the intrinsic returns a
11083 // value.
11084 if (IsAnyRegCC && HasDef) {
11085 SDValue From[] = {SDValue(Call, 0), SDValue(Call, 1)};
11086 SDValue To[] = {PPV.getValue(1), PPV.getValue(2)};
11087 DAG.ReplaceAllUsesOfValuesWith(From, To, 2);
11088 } else
11089 DAG.ReplaceAllUsesWith(Call, PPV.getNode());
11090 DAG.DeleteNode(Call);
11091
11092 // Inform the Frame Information that we have a patchpoint in this function.
11093 FuncInfo.MF->getFrameInfo().setHasPatchPoint();
11094}
11095
11096void SelectionDAGBuilder::visitVectorReduce(const CallInst &I,
11097 unsigned Intrinsic) {
11098 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11099 SDValue Op1 = getValue(I.getArgOperand(0));
11100 SDValue Op2;
11101 if (I.arg_size() > 1)
11102 Op2 = getValue(I.getArgOperand(1));
11103 SDLoc dl = getCurSDLoc();
11104 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
11105 SDValue Res;
11106 SDNodeFlags SDFlags;
11107 if (auto *FPMO = dyn_cast<FPMathOperator>(&I))
11108 SDFlags.copyFMF(*FPMO);
11109
11110 switch (Intrinsic) {
11111 case Intrinsic::vector_reduce_fadd:
11112 if (SDFlags.hasAllowReassociation())
11113 Res = DAG.getNode(ISD::FADD, dl, VT, Op1,
11114 DAG.getNode(ISD::VECREDUCE_FADD, dl, VT, Op2, SDFlags),
11115 SDFlags);
11116 else
11117 Res = DAG.getNode(ISD::VECREDUCE_SEQ_FADD, dl, VT, Op1, Op2, SDFlags);
11118 break;
11119 case Intrinsic::vector_reduce_fmul:
11120 if (SDFlags.hasAllowReassociation())
11121 Res = DAG.getNode(ISD::FMUL, dl, VT, Op1,
11122 DAG.getNode(ISD::VECREDUCE_FMUL, dl, VT, Op2, SDFlags),
11123 SDFlags);
11124 else
11125 Res = DAG.getNode(ISD::VECREDUCE_SEQ_FMUL, dl, VT, Op1, Op2, SDFlags);
11126 break;
11127 case Intrinsic::vector_reduce_add:
11128 Res = DAG.getNode(ISD::VECREDUCE_ADD, dl, VT, Op1);
11129 break;
11130 case Intrinsic::vector_reduce_mul:
11131 Res = DAG.getNode(ISD::VECREDUCE_MUL, dl, VT, Op1);
11132 break;
11133 case Intrinsic::vector_reduce_and:
11134 Res = DAG.getNode(ISD::VECREDUCE_AND, dl, VT, Op1);
11135 break;
11136 case Intrinsic::vector_reduce_or:
11137 Res = DAG.getNode(ISD::VECREDUCE_OR, dl, VT, Op1);
11138 break;
11139 case Intrinsic::vector_reduce_xor:
11140 Res = DAG.getNode(ISD::VECREDUCE_XOR, dl, VT, Op1);
11141 break;
11142 case Intrinsic::vector_reduce_smax:
11143 Res = DAG.getNode(ISD::VECREDUCE_SMAX, dl, VT, Op1);
11144 break;
11145 case Intrinsic::vector_reduce_smin:
11146 Res = DAG.getNode(ISD::VECREDUCE_SMIN, dl, VT, Op1);
11147 break;
11148 case Intrinsic::vector_reduce_umax:
11149 Res = DAG.getNode(ISD::VECREDUCE_UMAX, dl, VT, Op1);
11150 break;
11151 case Intrinsic::vector_reduce_umin:
11152 Res = DAG.getNode(ISD::VECREDUCE_UMIN, dl, VT, Op1);
11153 break;
11154 case Intrinsic::vector_reduce_fmax:
11155 Res = DAG.getNode(ISD::VECREDUCE_FMAX, dl, VT, Op1, SDFlags);
11156 break;
11157 case Intrinsic::vector_reduce_fmin:
11158 Res = DAG.getNode(ISD::VECREDUCE_FMIN, dl, VT, Op1, SDFlags);
11159 break;
11160 case Intrinsic::vector_reduce_fmaximum:
11161 Res = DAG.getNode(ISD::VECREDUCE_FMAXIMUM, dl, VT, Op1, SDFlags);
11162 break;
11163 case Intrinsic::vector_reduce_fminimum:
11164 Res = DAG.getNode(ISD::VECREDUCE_FMINIMUM, dl, VT, Op1, SDFlags);
11165 break;
11166 default:
11167 llvm_unreachable("Unhandled vector reduce intrinsic");
11168 }
11169 setValue(&I, Res);
11170}
11171
11172/// Returns an AttributeList representing the attributes applied to the return
11173/// value of the given call.
11176 if (CLI.RetSExt)
11177 Attrs.push_back(Attribute::SExt);
11178 if (CLI.RetZExt)
11179 Attrs.push_back(Attribute::ZExt);
11180 if (CLI.IsInReg)
11181 Attrs.push_back(Attribute::InReg);
11182
11183 return AttributeList::get(CLI.RetTy->getContext(), AttributeList::ReturnIndex,
11184 Attrs);
11185}
11186
11187/// TargetLowering::LowerCallTo - This is the default LowerCallTo
11188/// implementation, which just calls LowerCall.
11189/// FIXME: When all targets are
11190/// migrated to using LowerCall, this hook should be integrated into SDISel.
11191std::pair<SDValue, SDValue>
11193 LLVMContext &Context = CLI.RetTy->getContext();
11194
11195 // Handle the incoming return values from the call.
11196 CLI.Ins.clear();
11197 SmallVector<Type *, 4> RetOrigTys;
11199 auto &DL = CLI.DAG.getDataLayout();
11200 ComputeValueTypes(DL, CLI.OrigRetTy, RetOrigTys, &Offsets);
11201
11202 SmallVector<EVT, 4> RetVTs;
11203 if (CLI.RetTy != CLI.OrigRetTy) {
11204 assert(RetOrigTys.size() == 1 &&
11205 "Only supported for non-aggregate returns");
11206 RetVTs.push_back(getValueType(DL, CLI.RetTy));
11207 } else {
11208 for (Type *Ty : RetOrigTys)
11209 RetVTs.push_back(getValueType(DL, Ty));
11210 }
11211
11212 if (CLI.IsPostTypeLegalization) {
11213 // If we are lowering a libcall after legalization, split the return type.
11214 SmallVector<Type *, 4> OldRetOrigTys;
11215 SmallVector<EVT, 4> OldRetVTs;
11216 SmallVector<TypeSize, 4> OldOffsets;
11217 RetOrigTys.swap(OldRetOrigTys);
11218 RetVTs.swap(OldRetVTs);
11219 Offsets.swap(OldOffsets);
11220
11221 for (size_t i = 0, e = OldRetVTs.size(); i != e; ++i) {
11222 EVT RetVT = OldRetVTs[i];
11223 uint64_t Offset = OldOffsets[i];
11224 MVT RegisterVT = getRegisterType(Context, RetVT);
11225 unsigned NumRegs = getNumRegisters(Context, RetVT);
11226 unsigned RegisterVTByteSZ = RegisterVT.getSizeInBits() / 8;
11227 RetOrigTys.append(NumRegs, OldRetOrigTys[i]);
11228 RetVTs.append(NumRegs, RegisterVT);
11229 for (unsigned j = 0; j != NumRegs; ++j)
11230 Offsets.push_back(TypeSize::getFixed(Offset + j * RegisterVTByteSZ));
11231 }
11232 }
11233
11235 GetReturnInfo(CLI.CallConv, CLI.RetTy, getReturnAttrs(CLI), Outs, *this, DL);
11236
11237 bool CanLowerReturn =
11239 CLI.IsVarArg, Outs, Context, CLI.RetTy);
11240
11241 SDValue DemoteStackSlot;
11242 int DemoteStackIdx = -100;
11243 if (!CanLowerReturn) {
11244 // FIXME: equivalent assert?
11245 // assert(!CS.hasInAllocaArgument() &&
11246 // "sret demotion is incompatible with inalloca");
11247 uint64_t TySize = DL.getTypeAllocSize(CLI.RetTy);
11248 Align Alignment = DL.getPrefTypeAlign(CLI.RetTy);
11250 DemoteStackIdx =
11251 MF.getFrameInfo().CreateStackObject(TySize, Alignment, false);
11252 Type *StackSlotPtrType = PointerType::get(Context, DL.getAllocaAddrSpace());
11253
11254 DemoteStackSlot = CLI.DAG.getFrameIndex(DemoteStackIdx, getFrameIndexTy(DL));
11255 ArgListEntry Entry(DemoteStackSlot, StackSlotPtrType);
11256 Entry.IsSRet = true;
11257 Entry.Alignment = Alignment;
11258 CLI.getArgs().insert(CLI.getArgs().begin(), Entry);
11259 CLI.NumFixedArgs += 1;
11260 CLI.getArgs()[0].IndirectType = CLI.RetTy;
11261 CLI.RetTy = CLI.OrigRetTy = Type::getVoidTy(Context);
11262
11263 // sret demotion isn't compatible with tail-calls, since the sret argument
11264 // points into the callers stack frame.
11265 CLI.IsTailCall = false;
11266 } else {
11267 bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
11268 CLI.RetTy, CLI.CallConv, CLI.IsVarArg, DL);
11269 for (unsigned I = 0, E = RetVTs.size(); I != E; ++I) {
11270 ISD::ArgFlagsTy Flags;
11271 if (NeedsRegBlock) {
11272 Flags.setInConsecutiveRegs();
11273 if (I == RetVTs.size() - 1)
11274 Flags.setInConsecutiveRegsLast();
11275 }
11276 EVT VT = RetVTs[I];
11277 MVT RegisterVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11278 unsigned NumRegs =
11279 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11280 for (unsigned i = 0; i != NumRegs; ++i) {
11281 ISD::InputArg Ret(Flags, RegisterVT, VT, RetOrigTys[I],
11283 if (CLI.RetTy->isPointerTy()) {
11284 Ret.Flags.setPointer();
11286 cast<PointerType>(CLI.RetTy)->getAddressSpace());
11287 }
11288 if (CLI.RetSExt)
11289 Ret.Flags.setSExt();
11290 if (CLI.RetZExt)
11291 Ret.Flags.setZExt();
11292 if (CLI.IsInReg)
11293 Ret.Flags.setInReg();
11294 CLI.Ins.push_back(Ret);
11295 }
11296 }
11297 }
11298
11299 // We push in swifterror return as the last element of CLI.Ins.
11300 ArgListTy &Args = CLI.getArgs();
11301 if (supportSwiftError()) {
11302 for (const ArgListEntry &Arg : Args) {
11303 if (Arg.IsSwiftError) {
11304 ISD::ArgFlagsTy Flags;
11305 Flags.setSwiftError();
11307 PointerType::getUnqual(Context),
11308 /*Used=*/true, ISD::InputArg::NoArgIndex, 0);
11309 CLI.Ins.push_back(Ret);
11310 }
11311 }
11312 }
11313
11314 // Handle all of the outgoing arguments.
11315 CLI.Outs.clear();
11316 CLI.OutVals.clear();
11317 for (unsigned i = 0, e = Args.size(); i != e; ++i) {
11318 SmallVector<Type *, 4> OrigArgTys;
11319 ComputeValueTypes(DL, Args[i].OrigTy, OrigArgTys);
11320 // FIXME: Split arguments if CLI.IsPostTypeLegalization
11321 Type *FinalType = Args[i].Ty;
11322 if (Args[i].IsByVal)
11323 FinalType = Args[i].IndirectType;
11324 bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
11325 FinalType, CLI.CallConv, CLI.IsVarArg, DL);
11326 for (unsigned Value = 0, NumValues = OrigArgTys.size(); Value != NumValues;
11327 ++Value) {
11328 Type *OrigArgTy = OrigArgTys[Value];
11329 Type *ArgTy = OrigArgTy;
11330 if (Args[i].Ty != Args[i].OrigTy) {
11331 assert(Value == 0 && "Only supported for non-aggregate arguments");
11332 ArgTy = Args[i].Ty;
11333 }
11334
11335 EVT VT = getValueType(DL, ArgTy);
11336 SDValue Op = SDValue(Args[i].Node.getNode(),
11337 Args[i].Node.getResNo() + Value);
11338 ISD::ArgFlagsTy Flags;
11339
11340 // Certain targets (such as MIPS), may have a different ABI alignment
11341 // for a type depending on the context. Give the target a chance to
11342 // specify the alignment it wants.
11343 const Align OriginalAlignment(getABIAlignmentForCallingConv(ArgTy, DL));
11344 Flags.setOrigAlign(OriginalAlignment);
11345
11346 if (i >= CLI.NumFixedArgs)
11347 Flags.setVarArg();
11348 if (ArgTy->isPointerTy()) {
11349 Flags.setPointer();
11350 Flags.setPointerAddrSpace(cast<PointerType>(ArgTy)->getAddressSpace());
11351 }
11352 if (Args[i].IsZExt)
11353 Flags.setZExt();
11354 if (Args[i].IsSExt)
11355 Flags.setSExt();
11356 if (Args[i].IsNoExt)
11357 Flags.setNoExt();
11358 if (Args[i].IsInReg) {
11359 // If we are using vectorcall calling convention, a structure that is
11360 // passed InReg - is surely an HVA
11362 isa<StructType>(FinalType)) {
11363 // The first value of a structure is marked
11364 if (0 == Value)
11365 Flags.setHvaStart();
11366 Flags.setHva();
11367 }
11368 // Set InReg Flag
11369 Flags.setInReg();
11370 }
11371 if (Args[i].IsSRet)
11372 Flags.setSRet();
11373 if (Args[i].IsSwiftSelf)
11374 Flags.setSwiftSelf();
11375 if (Args[i].IsSwiftAsync)
11376 Flags.setSwiftAsync();
11377 if (Args[i].IsSwiftError)
11378 Flags.setSwiftError();
11379 if (Args[i].IsCFGuardTarget)
11380 Flags.setCFGuardTarget();
11381 if (Args[i].IsByVal)
11382 Flags.setByVal();
11383 if (Args[i].IsByRef)
11384 Flags.setByRef();
11385 if (Args[i].IsPreallocated) {
11386 Flags.setPreallocated();
11387 // Set the byval flag for CCAssignFn callbacks that don't know about
11388 // preallocated. This way we can know how many bytes we should've
11389 // allocated and how many bytes a callee cleanup function will pop. If
11390 // we port preallocated to more targets, we'll have to add custom
11391 // preallocated handling in the various CC lowering callbacks.
11392 Flags.setByVal();
11393 }
11394 if (Args[i].IsInAlloca) {
11395 Flags.setInAlloca();
11396 // Set the byval flag for CCAssignFn callbacks that don't know about
11397 // inalloca. This way we can know how many bytes we should've allocated
11398 // and how many bytes a callee cleanup function will pop. If we port
11399 // inalloca to more targets, we'll have to add custom inalloca handling
11400 // in the various CC lowering callbacks.
11401 Flags.setByVal();
11402 }
11403 Align MemAlign;
11404 if (Args[i].IsByVal || Args[i].IsInAlloca || Args[i].IsPreallocated) {
11405 unsigned FrameSize = DL.getTypeAllocSize(Args[i].IndirectType);
11406 Flags.setByValSize(FrameSize);
11407
11408 // info is not there but there are cases it cannot get right.
11409 if (auto MA = Args[i].Alignment)
11410 MemAlign = *MA;
11411 else
11412 MemAlign = getByValTypeAlignment(Args[i].IndirectType, DL);
11413 } else if (auto MA = Args[i].Alignment) {
11414 MemAlign = *MA;
11415 } else {
11416 MemAlign = OriginalAlignment;
11417 }
11418 Flags.setMemAlign(MemAlign);
11419 if (Args[i].IsNest)
11420 Flags.setNest();
11421 if (NeedsRegBlock)
11422 Flags.setInConsecutiveRegs();
11423
11424 MVT PartVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11425 unsigned NumParts =
11426 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11427 SmallVector<SDValue, 4> Parts(NumParts);
11428 ISD::NodeType ExtendKind = ISD::ANY_EXTEND;
11429
11430 if (Args[i].IsSExt)
11431 ExtendKind = ISD::SIGN_EXTEND;
11432 else if (Args[i].IsZExt)
11433 ExtendKind = ISD::ZERO_EXTEND;
11434
11435 // Conservatively only handle 'returned' on non-vectors that can be lowered,
11436 // for now.
11437 if (Args[i].IsReturned && !Op.getValueType().isVector() &&
11439 assert((CLI.RetTy == Args[i].Ty ||
11440 (CLI.RetTy->isPointerTy() && Args[i].Ty->isPointerTy() &&
11442 Args[i].Ty->getPointerAddressSpace())) &&
11443 RetVTs.size() == NumValues && "unexpected use of 'returned'");
11444 // Before passing 'returned' to the target lowering code, ensure that
11445 // either the register MVT and the actual EVT are the same size or that
11446 // the return value and argument are extended in the same way; in these
11447 // cases it's safe to pass the argument register value unchanged as the
11448 // return register value (although it's at the target's option whether
11449 // to do so)
11450 // TODO: allow code generation to take advantage of partially preserved
11451 // registers rather than clobbering the entire register when the
11452 // parameter extension method is not compatible with the return
11453 // extension method
11454 if ((NumParts * PartVT.getSizeInBits() == VT.getSizeInBits()) ||
11455 (ExtendKind != ISD::ANY_EXTEND && CLI.RetSExt == Args[i].IsSExt &&
11456 CLI.RetZExt == Args[i].IsZExt))
11457 Flags.setReturned();
11458 }
11459
11460 getCopyToParts(CLI.DAG, CLI.DL, Op, &Parts[0], NumParts, PartVT, CLI.CB,
11461 CLI.CallConv, ExtendKind);
11462
11463 for (unsigned j = 0; j != NumParts; ++j) {
11464 // if it isn't first piece, alignment must be 1
11465 // For scalable vectors the scalable part is currently handled
11466 // by individual targets, so we just use the known minimum size here.
11467 ISD::OutputArg MyFlags(
11468 Flags, Parts[j].getValueType().getSimpleVT(), VT, OrigArgTy, i,
11469 j * Parts[j].getValueType().getStoreSize().getKnownMinValue());
11470 if (NumParts > 1 && j == 0)
11471 MyFlags.Flags.setSplit();
11472 else if (j != 0) {
11473 MyFlags.Flags.setOrigAlign(Align(1));
11474 if (j == NumParts - 1)
11475 MyFlags.Flags.setSplitEnd();
11476 }
11477
11478 CLI.Outs.push_back(MyFlags);
11479 CLI.OutVals.push_back(Parts[j]);
11480 }
11481
11482 if (NeedsRegBlock && Value == NumValues - 1)
11483 CLI.Outs[CLI.Outs.size() - 1].Flags.setInConsecutiveRegsLast();
11484 }
11485 }
11486
11488 CLI.Chain = LowerCall(CLI, InVals);
11489
11490 // Update CLI.InVals to use outside of this function.
11491 CLI.InVals = InVals;
11492
11493 // Verify that the target's LowerCall behaved as expected.
11494 assert(CLI.Chain.getNode() && CLI.Chain.getValueType() == MVT::Other &&
11495 "LowerCall didn't return a valid chain!");
11496 assert((!CLI.IsTailCall || InVals.empty()) &&
11497 "LowerCall emitted a return value for a tail call!");
11498 assert((CLI.IsTailCall || InVals.size() == CLI.Ins.size()) &&
11499 "LowerCall didn't emit the correct number of values!");
11500
11501 // For a tail call, the return value is merely live-out and there aren't
11502 // any nodes in the DAG representing it. Return a special value to
11503 // indicate that a tail call has been emitted and no more Instructions
11504 // should be processed in the current block.
11505 if (CLI.IsTailCall) {
11506 CLI.DAG.setRoot(CLI.Chain);
11507 return std::make_pair(SDValue(), SDValue());
11508 }
11509
11510#ifndef NDEBUG
11511 for (unsigned i = 0, e = CLI.Ins.size(); i != e; ++i) {
11512 assert(InVals[i].getNode() && "LowerCall emitted a null value!");
11513 assert(EVT(CLI.Ins[i].VT) == InVals[i].getValueType() &&
11514 "LowerCall emitted a value with the wrong type!");
11515 }
11516#endif
11517
11518 SmallVector<SDValue, 4> ReturnValues;
11519 if (!CanLowerReturn) {
11520 // The instruction result is the result of loading from the
11521 // hidden sret parameter.
11522 MVT PtrVT = getPointerTy(DL, DL.getAllocaAddrSpace());
11523
11524 unsigned NumValues = RetVTs.size();
11525 ReturnValues.resize(NumValues);
11526 SmallVector<SDValue, 4> Chains(NumValues);
11527
11528 // An aggregate return value cannot wrap around the address space, so
11529 // offsets to its parts don't wrap either.
11531 Align HiddenSRetAlign = MF.getFrameInfo().getObjectAlign(DemoteStackIdx);
11532 for (unsigned i = 0; i < NumValues; ++i) {
11534 DemoteStackSlot, CLI.DAG.getConstant(Offsets[i], CLI.DL, PtrVT),
11536 SDValue L = CLI.DAG.getLoad(
11537 RetVTs[i], CLI.DL, CLI.Chain, Add,
11539 DemoteStackIdx, Offsets[i]),
11540 HiddenSRetAlign);
11541 ReturnValues[i] = L;
11542 Chains[i] = L.getValue(1);
11543 }
11544
11545 CLI.Chain = CLI.DAG.getNode(ISD::TokenFactor, CLI.DL, MVT::Other, Chains);
11546 } else {
11547 // Collect the legal value parts into potentially illegal values
11548 // that correspond to the original function's return values.
11549 std::optional<ISD::NodeType> AssertOp;
11550 if (CLI.RetSExt)
11551 AssertOp = ISD::AssertSext;
11552 else if (CLI.RetZExt)
11553 AssertOp = ISD::AssertZext;
11554 unsigned CurReg = 0;
11555 for (EVT VT : RetVTs) {
11556 MVT RegisterVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11557 unsigned NumRegs =
11558 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11559
11560 ReturnValues.push_back(getCopyFromParts(
11561 CLI.DAG, CLI.DL, &InVals[CurReg], NumRegs, RegisterVT, VT, nullptr,
11562 CLI.Chain, CLI.CallConv, AssertOp));
11563 CurReg += NumRegs;
11564 }
11565
11566 // For a function returning void, there is no return value. We can't create
11567 // such a node, so we just return a null return value in that case. In
11568 // that case, nothing will actually look at the value.
11569 if (ReturnValues.empty())
11570 return std::make_pair(SDValue(), CLI.Chain);
11571 }
11572
11573 SDValue Res = CLI.DAG.getNode(ISD::MERGE_VALUES, CLI.DL,
11574 CLI.DAG.getVTList(RetVTs), ReturnValues);
11575 return std::make_pair(Res, CLI.Chain);
11576}
11577
11578/// Places new result values for the node in Results (their number
11579/// and types must exactly match those of the original return values of
11580/// the node), or leaves Results empty, which indicates that the node is not
11581/// to be custom lowered after all.
11584 SelectionDAG &DAG) const {
11585 SDValue Res = LowerOperation(SDValue(N, 0), DAG);
11586
11587 if (!Res.getNode())
11588 return;
11589
11590 // If the original node has one result, take the return value from
11591 // LowerOperation as is. It might not be result number 0.
11592 if (N->getNumValues() == 1) {
11593 Results.push_back(Res);
11594 return;
11595 }
11596
11597 // If the original node has multiple results, then the return node should
11598 // have the same number of results.
11599 assert((N->getNumValues() == Res->getNumValues()) &&
11600 "Lowering returned the wrong number of results!");
11601
11602 // Places new result values base on N result number.
11603 for (unsigned I = 0, E = N->getNumValues(); I != E; ++I)
11604 Results.push_back(Res.getValue(I));
11605}
11606
11608 llvm_unreachable("LowerOperation not implemented for this target!");
11609}
11610
11612 Register Reg,
11613 ISD::NodeType ExtendType) {
11615 assert((Op.getOpcode() != ISD::CopyFromReg ||
11616 cast<RegisterSDNode>(Op.getOperand(1))->getReg() != Reg) &&
11617 "Copy from a reg to the same reg!");
11618 assert(!Reg.isPhysical() && "Is a physreg");
11619
11620 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11621 // If this is an InlineAsm we have to match the registers required, not the
11622 // notional registers required by the type.
11623
11624 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), Reg, V->getType(),
11625 std::nullopt); // This is not an ABI copy.
11626 SDValue Chain = DAG.getEntryNode();
11627
11628 if (ExtendType == ISD::ANY_EXTEND) {
11629 auto PreferredExtendIt = FuncInfo.PreferredExtendType.find(V);
11630 if (PreferredExtendIt != FuncInfo.PreferredExtendType.end())
11631 ExtendType = PreferredExtendIt->second;
11632 }
11633 RFV.getCopyToRegs(Op, DAG, getCurSDLoc(), Chain, nullptr, V, ExtendType);
11634 PendingExports.push_back(Chain);
11635}
11636
11638
11639/// isOnlyUsedInEntryBlock - If the specified argument is only used in the
11640/// entry block, return true. This includes arguments used by switches, since
11641/// the switch may expand into multiple basic blocks.
11642static bool isOnlyUsedInEntryBlock(const Argument *A, bool FastISel) {
11643 // With FastISel active, we may be splitting blocks, so force creation
11644 // of virtual registers for all non-dead arguments.
11645 if (FastISel)
11646 return A->use_empty();
11647
11648 const BasicBlock &Entry = A->getParent()->front();
11649 for (const User *U : A->users())
11650 if (cast<Instruction>(U)->getParent() != &Entry || isa<SwitchInst>(U))
11651 return false; // Use not in entry block.
11652
11653 return true;
11654}
11655
11657 DenseMap<const Argument *,
11658 std::pair<const AllocaInst *, const StoreInst *>>;
11659
11660/// Scan the entry block of the function in FuncInfo for arguments that look
11661/// like copies into a local alloca. Record any copied arguments in
11662/// ArgCopyElisionCandidates.
11663static void
11665 FunctionLoweringInfo *FuncInfo,
11666 ArgCopyElisionMapTy &ArgCopyElisionCandidates) {
11667 // Record the state of every static alloca used in the entry block. Argument
11668 // allocas are all used in the entry block, so we need approximately as many
11669 // entries as we have arguments.
11670 enum StaticAllocaInfo { Unknown, Clobbered, Elidable };
11672 unsigned NumArgs = FuncInfo->Fn->arg_size();
11673 StaticAllocas.reserve(NumArgs * 2);
11674
11675 auto GetInfoIfStaticAlloca = [&](const Value *V) -> StaticAllocaInfo * {
11676 if (!V)
11677 return nullptr;
11678 V = V->stripPointerCasts();
11679 const auto *AI = dyn_cast<AllocaInst>(V);
11680 if (!AI || !AI->isStaticAlloca() || !FuncInfo->StaticAllocaMap.count(AI))
11681 return nullptr;
11682 auto Iter = StaticAllocas.insert({AI, Unknown});
11683 return &Iter.first->second;
11684 };
11685
11686 // Look for stores of arguments to static allocas. Look through bitcasts and
11687 // GEPs to handle type coercions, as long as the alloca is fully initialized
11688 // by the store. Any non-store use of an alloca escapes it and any subsequent
11689 // unanalyzed store might write it.
11690 // FIXME: Handle structs initialized with multiple stores.
11691 for (const Instruction &I : FuncInfo->Fn->getEntryBlock()) {
11692 // Look for stores, and handle non-store uses conservatively.
11693 const auto *SI = dyn_cast<StoreInst>(&I);
11694 if (!SI) {
11695 // We will look through cast uses, so ignore them completely.
11696 if (I.isCast())
11697 continue;
11698 // Ignore debug info and pseudo op intrinsics, they don't escape or store
11699 // to allocas.
11700 if (I.isDebugOrPseudoInst())
11701 continue;
11702 // This is an unknown instruction. Assume it escapes or writes to all
11703 // static alloca operands.
11704 for (const Use &U : I.operands()) {
11705 if (StaticAllocaInfo *Info = GetInfoIfStaticAlloca(U))
11706 *Info = StaticAllocaInfo::Clobbered;
11707 }
11708 continue;
11709 }
11710
11711 // If the stored value is a static alloca, mark it as escaped.
11712 if (StaticAllocaInfo *Info = GetInfoIfStaticAlloca(SI->getValueOperand()))
11713 *Info = StaticAllocaInfo::Clobbered;
11714
11715 // Check if the destination is a static alloca.
11716 const Value *Dst = SI->getPointerOperand()->stripPointerCasts();
11717 StaticAllocaInfo *Info = GetInfoIfStaticAlloca(Dst);
11718 if (!Info)
11719 continue;
11720 const AllocaInst *AI = cast<AllocaInst>(Dst);
11721
11722 // Skip allocas that have been initialized or clobbered.
11723 if (*Info != StaticAllocaInfo::Unknown)
11724 continue;
11725
11726 // Check if the stored value is an argument, and that this store fully
11727 // initializes the alloca.
11728 // If the argument type has padding bits we can't directly forward a pointer
11729 // as the upper bits may contain garbage.
11730 // Don't elide copies from the same argument twice.
11731 const Value *Val = SI->getValueOperand()->stripPointerCasts();
11732 const auto *Arg = dyn_cast<Argument>(Val);
11733 std::optional<TypeSize> AllocaSize = AI->getAllocationSize(DL);
11734 if (!Arg || Arg->hasPassPointeeByValueCopyAttr() ||
11735 Arg->getType()->isEmptyTy() || !AllocaSize ||
11736 DL.getTypeStoreSize(Arg->getType()) != *AllocaSize ||
11737 !DL.typeSizeEqualsStoreSize(Arg->getType()) ||
11738 ArgCopyElisionCandidates.count(Arg)) {
11739 *Info = StaticAllocaInfo::Clobbered;
11740 continue;
11741 }
11742
11743 LLVM_DEBUG(dbgs() << "Found argument copy elision candidate: " << *AI
11744 << '\n');
11745
11746 // Mark this alloca and store for argument copy elision.
11747 *Info = StaticAllocaInfo::Elidable;
11748 ArgCopyElisionCandidates.insert({Arg, {AI, SI}});
11749
11750 // Stop scanning if we've seen all arguments. This will happen early in -O0
11751 // builds, which is useful, because -O0 builds have large entry blocks and
11752 // many allocas.
11753 if (ArgCopyElisionCandidates.size() == NumArgs)
11754 break;
11755 }
11756}
11757
11758/// Try to elide argument copies from memory into a local alloca. Succeeds if
11759/// ArgVal is a load from a suitable fixed stack object.
11762 DenseMap<int, int> &ArgCopyElisionFrameIndexMap,
11763 SmallPtrSetImpl<const Instruction *> &ElidedArgCopyInstrs,
11764 ArgCopyElisionMapTy &ArgCopyElisionCandidates, const Argument &Arg,
11765 ArrayRef<SDValue> ArgVals, bool &ArgHasUses) {
11766 // Check if this is a load from a fixed stack object.
11767 auto *LNode = dyn_cast<LoadSDNode>(ArgVals[0]);
11768 if (!LNode)
11769 return;
11770 auto *FINode = dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode());
11771 if (!FINode)
11772 return;
11773
11774 // Check that the fixed stack object is the right size and alignment.
11775 // Look at the alignment that the user wrote on the alloca instead of looking
11776 // at the stack object.
11777 auto ArgCopyIter = ArgCopyElisionCandidates.find(&Arg);
11778 assert(ArgCopyIter != ArgCopyElisionCandidates.end());
11779 const AllocaInst *AI = ArgCopyIter->second.first;
11780 int FixedIndex = FINode->getIndex();
11781 int &AllocaIndex = FuncInfo.StaticAllocaMap[AI];
11782 int OldIndex = AllocaIndex;
11783 MachineFrameInfo &MFI = FuncInfo.MF->getFrameInfo();
11784 if (MFI.getObjectSize(FixedIndex) != MFI.getObjectSize(OldIndex)) {
11785 LLVM_DEBUG(
11786 dbgs() << " argument copy elision failed due to bad fixed stack "
11787 "object size\n");
11788 return;
11789 }
11790 Align RequiredAlignment = AI->getAlign();
11791 if (MFI.getObjectAlign(FixedIndex) < RequiredAlignment) {
11792 LLVM_DEBUG(dbgs() << " argument copy elision failed: alignment of alloca "
11793 "greater than stack argument alignment ("
11794 << DebugStr(RequiredAlignment) << " vs "
11795 << DebugStr(MFI.getObjectAlign(FixedIndex)) << ")\n");
11796 return;
11797 }
11798
11799 // Perform the elision. Delete the old stack object and replace its only use
11800 // in the variable info map. Mark the stack object as mutable and aliased.
11801 LLVM_DEBUG({
11802 dbgs() << "Eliding argument copy from " << Arg << " to " << *AI << '\n'
11803 << " Replacing frame index " << OldIndex << " with " << FixedIndex
11804 << '\n';
11805 });
11806 MFI.RemoveStackObject(OldIndex);
11807 MFI.setIsImmutableObjectIndex(FixedIndex, false);
11808 MFI.setIsAliasedObjectIndex(FixedIndex, true);
11809 AllocaIndex = FixedIndex;
11810 ArgCopyElisionFrameIndexMap.insert({OldIndex, FixedIndex});
11811 for (SDValue ArgVal : ArgVals)
11812 Chains.push_back(ArgVal.getValue(1));
11813
11814 // Avoid emitting code for the store implementing the copy.
11815 const StoreInst *SI = ArgCopyIter->second.second;
11816 ElidedArgCopyInstrs.insert(SI);
11817
11818 // Check for uses of the argument again so that we can avoid exporting ArgVal
11819 // if it is't used by anything other than the store.
11820 for (const Value *U : Arg.users()) {
11821 if (U != SI) {
11822 ArgHasUses = true;
11823 break;
11824 }
11825 }
11826}
11827
11828void SelectionDAGISel::LowerArguments(const Function &F) {
11829 SelectionDAG &DAG = SDB->DAG;
11830 SDLoc dl = SDB->getCurSDLoc();
11831 const DataLayout &DL = DAG.getDataLayout();
11833
11834 // In Naked functions we aren't going to save any registers.
11835 if (F.hasFnAttribute(Attribute::Naked))
11836 return;
11837
11838 if (!FuncInfo->CanLowerReturn) {
11839 // Put in an sret pointer parameter before all the other parameters.
11840 MVT ValueVT = TLI->getPointerTy(DL, DL.getAllocaAddrSpace());
11841
11842 ISD::ArgFlagsTy Flags;
11843 Flags.setSRet();
11844 MVT RegisterVT = TLI->getRegisterType(*DAG.getContext(), ValueVT);
11845 ISD::InputArg RetArg(Flags, RegisterVT, ValueVT, F.getReturnType(), true,
11847 Ins.push_back(RetArg);
11848 }
11849
11850 // Look for stores of arguments to static allocas. Mark such arguments with a
11851 // flag to ask the target to give us the memory location of that argument if
11852 // available.
11853 ArgCopyElisionMapTy ArgCopyElisionCandidates;
11855 ArgCopyElisionCandidates);
11856
11857 // Set up the incoming argument description vector.
11858 for (const Argument &Arg : F.args()) {
11859 unsigned ArgNo = Arg.getArgNo();
11861 ComputeValueTypes(DAG.getDataLayout(), Arg.getType(), Types);
11862 bool isArgValueUsed = !Arg.use_empty();
11863 Type *FinalType = Arg.getType();
11864 if (Arg.hasAttribute(Attribute::ByVal))
11865 FinalType = Arg.getParamByValType();
11866 bool NeedsRegBlock = TLI->functionArgumentNeedsConsecutiveRegisters(
11867 FinalType, F.getCallingConv(), F.isVarArg(), DL);
11868 for (unsigned Value = 0, NumValues = Types.size(); Value != NumValues;
11869 ++Value) {
11870 Type *ArgTy = Types[Value];
11871 EVT VT = TLI->getValueType(DL, ArgTy);
11872 ISD::ArgFlagsTy Flags;
11873
11874 if (ArgTy->isPointerTy()) {
11875 Flags.setPointer();
11876 Flags.setPointerAddrSpace(cast<PointerType>(ArgTy)->getAddressSpace());
11877 }
11878 if (Arg.hasAttribute(Attribute::ZExt))
11879 Flags.setZExt();
11880 if (Arg.hasAttribute(Attribute::SExt))
11881 Flags.setSExt();
11882 if (Arg.hasAttribute(Attribute::InReg)) {
11883 // If we are using vectorcall calling convention, a structure that is
11884 // passed InReg - is surely an HVA
11885 if (F.getCallingConv() == CallingConv::X86_VectorCall &&
11886 isa<StructType>(Arg.getType())) {
11887 // The first value of a structure is marked
11888 if (0 == Value)
11889 Flags.setHvaStart();
11890 Flags.setHva();
11891 }
11892 // Set InReg Flag
11893 Flags.setInReg();
11894 }
11895 if (Arg.hasAttribute(Attribute::StructRet))
11896 Flags.setSRet();
11897 if (Arg.hasAttribute(Attribute::SwiftSelf))
11898 Flags.setSwiftSelf();
11899 if (Arg.hasAttribute(Attribute::SwiftAsync))
11900 Flags.setSwiftAsync();
11901 if (Arg.hasAttribute(Attribute::SwiftError))
11902 Flags.setSwiftError();
11903 if (Arg.hasAttribute(Attribute::ByVal))
11904 Flags.setByVal();
11905 if (Arg.hasAttribute(Attribute::ByRef))
11906 Flags.setByRef();
11907 if (Arg.hasAttribute(Attribute::InAlloca)) {
11908 Flags.setInAlloca();
11909 // Set the byval flag for CCAssignFn callbacks that don't know about
11910 // inalloca. This way we can know how many bytes we should've allocated
11911 // and how many bytes a callee cleanup function will pop. If we port
11912 // inalloca to more targets, we'll have to add custom inalloca handling
11913 // in the various CC lowering callbacks.
11914 Flags.setByVal();
11915 }
11916 if (Arg.hasAttribute(Attribute::Preallocated)) {
11917 Flags.setPreallocated();
11918 // Set the byval flag for CCAssignFn callbacks that don't know about
11919 // preallocated. This way we can know how many bytes we should've
11920 // allocated and how many bytes a callee cleanup function will pop. If
11921 // we port preallocated to more targets, we'll have to add custom
11922 // preallocated handling in the various CC lowering callbacks.
11923 Flags.setByVal();
11924 }
11925
11926 // Certain targets (such as MIPS), may have a different ABI alignment
11927 // for a type depending on the context. Give the target a chance to
11928 // specify the alignment it wants.
11929 const Align OriginalAlignment(
11930 TLI->getABIAlignmentForCallingConv(ArgTy, DL));
11931 Flags.setOrigAlign(OriginalAlignment);
11932
11933 Align MemAlign;
11934 Type *ArgMemTy = nullptr;
11935 if (Flags.isByVal() || Flags.isInAlloca() || Flags.isPreallocated() ||
11936 Flags.isByRef()) {
11937 if (!ArgMemTy)
11938 ArgMemTy = Arg.getPointeeInMemoryValueType();
11939
11940 uint64_t MemSize = DL.getTypeAllocSize(ArgMemTy);
11941
11942 // For in-memory arguments, size and alignment should be passed from FE.
11943 // BE will guess if this info is not there but there are cases it cannot
11944 // get right.
11945 if (auto ParamAlign = Arg.getParamStackAlign())
11946 MemAlign = *ParamAlign;
11947 else if ((ParamAlign = Arg.getParamAlign()))
11948 MemAlign = *ParamAlign;
11949 else
11950 MemAlign = TLI->getByValTypeAlignment(ArgMemTy, DL);
11951 if (Flags.isByRef())
11952 Flags.setByRefSize(MemSize);
11953 else
11954 Flags.setByValSize(MemSize);
11955 } else if (auto ParamAlign = Arg.getParamStackAlign()) {
11956 MemAlign = *ParamAlign;
11957 } else {
11958 MemAlign = OriginalAlignment;
11959 }
11960 Flags.setMemAlign(MemAlign);
11961
11962 if (Arg.hasAttribute(Attribute::Nest))
11963 Flags.setNest();
11964 if (NeedsRegBlock)
11965 Flags.setInConsecutiveRegs();
11966 if (ArgCopyElisionCandidates.count(&Arg))
11967 Flags.setCopyElisionCandidate();
11968 if (Arg.hasAttribute(Attribute::Returned))
11969 Flags.setReturned();
11970
11971 MVT RegisterVT = TLI->getRegisterTypeForCallingConv(
11972 *CurDAG->getContext(), F.getCallingConv(), VT);
11973 unsigned NumRegs = TLI->getNumRegistersForCallingConv(
11974 *CurDAG->getContext(), F.getCallingConv(), VT);
11975 for (unsigned i = 0; i != NumRegs; ++i) {
11976 // For scalable vectors, use the minimum size; individual targets
11977 // are responsible for handling scalable vector arguments and
11978 // return values.
11979 ISD::InputArg MyFlags(
11980 Flags, RegisterVT, VT, ArgTy, isArgValueUsed, ArgNo,
11981 i * RegisterVT.getStoreSize().getKnownMinValue());
11982 if (NumRegs > 1 && i == 0)
11983 MyFlags.Flags.setSplit();
11984 // if it isn't first piece, alignment must be 1
11985 else if (i > 0) {
11986 MyFlags.Flags.setOrigAlign(Align(1));
11987 if (i == NumRegs - 1)
11988 MyFlags.Flags.setSplitEnd();
11989 }
11990 Ins.push_back(MyFlags);
11991 }
11992 if (NeedsRegBlock && Value == NumValues - 1)
11993 Ins[Ins.size() - 1].Flags.setInConsecutiveRegsLast();
11994 }
11995 }
11996
11997 // Call the target to set up the argument values.
11999 SDValue NewRoot = TLI->LowerFormalArguments(
12000 DAG.getRoot(), F.getCallingConv(), F.isVarArg(), Ins, dl, DAG, InVals);
12001
12002 // Verify that the target's LowerFormalArguments behaved as expected.
12003 assert(NewRoot.getNode() && NewRoot.getValueType() == MVT::Other &&
12004 "LowerFormalArguments didn't return a valid chain!");
12005 assert(InVals.size() == Ins.size() &&
12006 "LowerFormalArguments didn't emit the correct number of values!");
12007 LLVM_DEBUG({
12008 for (unsigned i = 0, e = Ins.size(); i != e; ++i) {
12009 assert(InVals[i].getNode() &&
12010 "LowerFormalArguments emitted a null value!");
12011 assert(EVT(Ins[i].VT) == InVals[i].getValueType() &&
12012 "LowerFormalArguments emitted a value with the wrong type!");
12013 }
12014 });
12015
12016 // Update the DAG with the new chain value resulting from argument lowering.
12017 DAG.setRoot(NewRoot);
12018
12019 // Set up the argument values.
12020 unsigned i = 0;
12021 if (!FuncInfo->CanLowerReturn) {
12022 // Create a virtual register for the sret pointer, and put in a copy
12023 // from the sret argument into it.
12024 MVT VT = TLI->getPointerTy(DL, DL.getAllocaAddrSpace());
12025 MVT RegVT = TLI->getRegisterType(*CurDAG->getContext(), VT);
12026 std::optional<ISD::NodeType> AssertOp;
12027 SDValue ArgValue =
12028 getCopyFromParts(DAG, dl, &InVals[0], 1, RegVT, VT, nullptr, NewRoot,
12029 F.getCallingConv(), AssertOp);
12030
12031 MachineFunction& MF = SDB->DAG.getMachineFunction();
12032 MachineRegisterInfo& RegInfo = MF.getRegInfo();
12033 Register SRetReg =
12034 RegInfo.createVirtualRegister(TLI->getRegClassFor(RegVT));
12035 FuncInfo->DemoteRegister = SRetReg;
12036 NewRoot =
12037 SDB->DAG.getCopyToReg(NewRoot, SDB->getCurSDLoc(), SRetReg, ArgValue);
12038 DAG.setRoot(NewRoot);
12039
12040 // i indexes lowered arguments. Bump it past the hidden sret argument.
12041 ++i;
12042 }
12043
12045 DenseMap<int, int> ArgCopyElisionFrameIndexMap;
12046 for (const Argument &Arg : F.args()) {
12047 SmallVector<SDValue, 4> ArgValues;
12048 SmallVector<EVT, 4> ValueVTs;
12049 ComputeValueVTs(*TLI, DAG.getDataLayout(), Arg.getType(), ValueVTs);
12050 unsigned NumValues = ValueVTs.size();
12051 if (NumValues == 0)
12052 continue;
12053
12054 bool ArgHasUses = !Arg.use_empty();
12055
12056 // Elide the copying store if the target loaded this argument from a
12057 // suitable fixed stack object.
12058 if (Ins[i].Flags.isCopyElisionCandidate()) {
12059 unsigned NumParts = 0;
12060 for (EVT VT : ValueVTs)
12061 NumParts += TLI->getNumRegistersForCallingConv(*CurDAG->getContext(),
12062 F.getCallingConv(), VT);
12063
12064 tryToElideArgumentCopy(*FuncInfo, Chains, ArgCopyElisionFrameIndexMap,
12065 ElidedArgCopyInstrs, ArgCopyElisionCandidates, Arg,
12066 ArrayRef(&InVals[i], NumParts), ArgHasUses);
12067 }
12068
12069 // If this argument is unused then remember its value. It is used to generate
12070 // debugging information.
12071 bool isSwiftErrorArg =
12072 TLI->supportSwiftError() &&
12073 Arg.hasAttribute(Attribute::SwiftError);
12074 if (!ArgHasUses && !isSwiftErrorArg) {
12075 SDB->setUnusedArgValue(&Arg, InVals[i]);
12076
12077 // Also remember any frame index for use in FastISel.
12078 if (FrameIndexSDNode *FI =
12080 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12081 }
12082
12083 for (unsigned Val = 0; Val != NumValues; ++Val) {
12084 EVT VT = ValueVTs[Val];
12085 MVT PartVT = TLI->getRegisterTypeForCallingConv(*CurDAG->getContext(),
12086 F.getCallingConv(), VT);
12087 unsigned NumParts = TLI->getNumRegistersForCallingConv(
12088 *CurDAG->getContext(), F.getCallingConv(), VT);
12089
12090 // Even an apparent 'unused' swifterror argument needs to be returned. So
12091 // we do generate a copy for it that can be used on return from the
12092 // function.
12093 if (ArgHasUses || isSwiftErrorArg) {
12094 std::optional<ISD::NodeType> AssertOp;
12095 if (Arg.hasAttribute(Attribute::SExt))
12096 AssertOp = ISD::AssertSext;
12097 else if (Arg.hasAttribute(Attribute::ZExt))
12098 AssertOp = ISD::AssertZext;
12099
12100 SDValue OutVal =
12101 getCopyFromParts(DAG, dl, &InVals[i], NumParts, PartVT, VT, nullptr,
12102 NewRoot, F.getCallingConv(), AssertOp);
12103
12104 FPClassTest NoFPClass = Arg.getNoFPClass();
12105 if (NoFPClass != fcNone) {
12106 SDValue SDNoFPClass = DAG.getTargetConstant(
12107 static_cast<uint64_t>(NoFPClass), dl, MVT::i32);
12108 OutVal = DAG.getNode(ISD::AssertNoFPClass, dl, OutVal.getValueType(),
12109 OutVal, SDNoFPClass);
12110 }
12111 ArgValues.push_back(OutVal);
12112 }
12113
12114 i += NumParts;
12115 }
12116
12117 // We don't need to do anything else for unused arguments.
12118 if (ArgValues.empty())
12119 continue;
12120
12121 // Note down frame index.
12122 if (FrameIndexSDNode *FI =
12123 dyn_cast<FrameIndexSDNode>(ArgValues[0].getNode()))
12124 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12125
12126 SDValue Res = DAG.getMergeValues(ArrayRef(ArgValues.data(), NumValues),
12127 SDB->getCurSDLoc());
12128
12129 SDB->setValue(&Arg, Res);
12130 if (!TM.Options.EnableFastISel && Res.getOpcode() == ISD::BUILD_PAIR) {
12131 // We want to associate the argument with the frame index, among
12132 // involved operands, that correspond to the lowest address. The
12133 // getCopyFromParts function, called earlier, is swapping the order of
12134 // the operands to BUILD_PAIR depending on endianness. The result of
12135 // that swapping is that the least significant bits of the argument will
12136 // be in the first operand of the BUILD_PAIR node, and the most
12137 // significant bits will be in the second operand.
12138 unsigned LowAddressOp = DAG.getDataLayout().isBigEndian() ? 1 : 0;
12139 if (LoadSDNode *LNode =
12140 dyn_cast<LoadSDNode>(Res.getOperand(LowAddressOp).getNode()))
12141 if (FrameIndexSDNode *FI =
12142 dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
12143 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12144 }
12145
12146 // Analyses past this point are naive and don't expect an assertion.
12147 if (Res.getOpcode() == ISD::AssertZext)
12148 Res = Res.getOperand(0);
12149
12150 // Update the SwiftErrorVRegDefMap.
12151 if (Res.getOpcode() == ISD::CopyFromReg && isSwiftErrorArg) {
12152 Register Reg = cast<RegisterSDNode>(Res.getOperand(1))->getReg();
12153 if (Reg.isVirtual())
12154 SwiftError->setCurrentVReg(FuncInfo->MBB, SwiftError->getFunctionArg(),
12155 Reg);
12156 }
12157
12158 // If this argument is live outside of the entry block, insert a copy from
12159 // wherever we got it to the vreg that other BB's will reference it as.
12160 if (Res.getOpcode() == ISD::CopyFromReg) {
12161 // If we can, though, try to skip creating an unnecessary vreg.
12162 // FIXME: This isn't very clean... it would be nice to make this more
12163 // general.
12164 Register Reg = cast<RegisterSDNode>(Res.getOperand(1))->getReg();
12165 if (Reg.isVirtual()) {
12166 FuncInfo->ValueMap[&Arg] = Reg;
12167 continue;
12168 }
12169 }
12170 if (!isOnlyUsedInEntryBlock(&Arg, TM.Options.EnableFastISel)) {
12171 FuncInfo->InitializeRegForValue(&Arg);
12172 SDB->CopyToExportRegsIfNeeded(&Arg);
12173 }
12174 }
12175
12176 if (!Chains.empty()) {
12177 Chains.push_back(NewRoot);
12178 NewRoot = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chains);
12179 }
12180
12181 DAG.setRoot(NewRoot);
12182
12183 assert(i == InVals.size() && "Argument register count mismatch!");
12184
12185 // If any argument copy elisions occurred and we have debug info, update the
12186 // stale frame indices used in the dbg.declare variable info table.
12187 if (!ArgCopyElisionFrameIndexMap.empty()) {
12188 for (MachineFunction::VariableDbgInfo &VI :
12189 MF->getInStackSlotVariableDbgInfo()) {
12190 auto I = ArgCopyElisionFrameIndexMap.find(VI.getStackSlot());
12191 if (I != ArgCopyElisionFrameIndexMap.end())
12192 VI.updateStackSlot(I->second);
12193 }
12194 }
12195
12196 // Finally, if the target has anything special to do, allow it to do so.
12198}
12199
12200/// Handle PHI nodes in successor blocks. Emit code into the SelectionDAG to
12201/// ensure constants are generated when needed. Remember the virtual registers
12202/// that need to be added to the Machine PHI nodes as input. We cannot just
12203/// directly add them, because expansion might result in multiple MBB's for one
12204/// BB. As such, the start of the BB might correspond to a different MBB than
12205/// the end.
12206void
12207SelectionDAGBuilder::HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) {
12208 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12209
12210 SmallPtrSet<MachineBasicBlock *, 4> SuccsHandled;
12211
12212 // Check PHI nodes in successors that expect a value to be available from this
12213 // block.
12214 for (const BasicBlock *SuccBB : successors(LLVMBB->getTerminator())) {
12215 if (!isa<PHINode>(SuccBB->begin())) continue;
12216 MachineBasicBlock *SuccMBB = FuncInfo.getMBB(SuccBB);
12217
12218 // If this terminator has multiple identical successors (common for
12219 // switches), only handle each succ once.
12220 if (!SuccsHandled.insert(SuccMBB).second)
12221 continue;
12222
12224
12225 // At this point we know that there is a 1-1 correspondence between LLVM PHI
12226 // nodes and Machine PHI nodes, but the incoming operands have not been
12227 // emitted yet.
12228 for (const PHINode &PN : SuccBB->phis()) {
12229 // Ignore dead phi's.
12230 if (PN.use_empty())
12231 continue;
12232
12233 // Skip empty types
12234 if (PN.getType()->isEmptyTy())
12235 continue;
12236
12237 Register Reg;
12238 const Value *PHIOp = PN.getIncomingValueForBlock(LLVMBB);
12239
12240 if (const auto *C = dyn_cast<Constant>(PHIOp)) {
12241 Register &RegOut = ConstantsOut[C];
12242 if (!RegOut) {
12243 RegOut = FuncInfo.CreateRegs(&PN);
12244 // We need to zero/sign extend ConstantInt phi operands to match
12245 // assumptions in FunctionLoweringInfo::ComputePHILiveOutRegInfo.
12246 ISD::NodeType ExtendType = ISD::ANY_EXTEND;
12247 if (auto *CI = dyn_cast<ConstantInt>(C))
12248 ExtendType = TLI.signExtendConstant(CI) ? ISD::SIGN_EXTEND
12250 CopyValueToVirtualRegister(C, RegOut, ExtendType);
12251 }
12252 Reg = RegOut;
12253 } else {
12255 FuncInfo.ValueMap.find(PHIOp);
12256 if (I != FuncInfo.ValueMap.end())
12257 Reg = I->second;
12258 else {
12259 assert(isa<AllocaInst>(PHIOp) &&
12260 FuncInfo.StaticAllocaMap.count(cast<AllocaInst>(PHIOp)) &&
12261 "Didn't codegen value into a register!??");
12262 Reg = FuncInfo.CreateRegs(&PN);
12264 }
12265 }
12266
12267 // Remember that this register needs to added to the machine PHI node as
12268 // the input for this MBB.
12269 SmallVector<EVT, 4> ValueVTs;
12270 ComputeValueVTs(TLI, DAG.getDataLayout(), PN.getType(), ValueVTs);
12271 for (EVT VT : ValueVTs) {
12272 const unsigned NumRegisters = TLI.getNumRegisters(*DAG.getContext(), VT);
12273 for (unsigned i = 0; i != NumRegisters; ++i)
12274 FuncInfo.PHINodesToUpdate.emplace_back(&*MBBI++, Reg + i);
12275 Reg += NumRegisters;
12276 }
12277 }
12278 }
12279
12280 ConstantsOut.clear();
12281}
12282
12283MachineBasicBlock *SelectionDAGBuilder::NextBlock(MachineBasicBlock *MBB) {
12285 if (++I == FuncInfo.MF->end())
12286 return nullptr;
12287 return &*I;
12288}
12289
12290/// During lowering new call nodes can be created (such as memset, etc.).
12291/// Those will become new roots of the current DAG, but complications arise
12292/// when they are tail calls. In such cases, the call lowering will update
12293/// the root, but the builder still needs to know that a tail call has been
12294/// lowered in order to avoid generating an additional return.
12295void SelectionDAGBuilder::updateDAGForMaybeTailCall(SDValue MaybeTC) {
12296 // If the node is null, we do have a tail call.
12297 if (MaybeTC.getNode() != nullptr)
12298 DAG.setRoot(MaybeTC);
12299 else
12300 HasTailCall = true;
12301}
12302
12303void SelectionDAGBuilder::lowerWorkItem(SwitchWorkListItem W, Value *Cond,
12304 MachineBasicBlock *SwitchMBB,
12305 MachineBasicBlock *DefaultMBB) {
12306 MachineFunction *CurMF = FuncInfo.MF;
12307 MachineBasicBlock *NextMBB = nullptr;
12309 if (++BBI != FuncInfo.MF->end())
12310 NextMBB = &*BBI;
12311
12312 unsigned Size = W.LastCluster - W.FirstCluster + 1;
12313
12314 BranchProbabilityInfo *BPI = FuncInfo.BPI;
12315
12316 if (Size == 2 && W.MBB == SwitchMBB) {
12317 // If any two of the cases has the same destination, and if one value
12318 // is the same as the other, but has one bit unset that the other has set,
12319 // use bit manipulation to do two compares at once. For example:
12320 // "if (X == 6 || X == 4)" -> "if ((X|2) == 6)"
12321 // TODO: This could be extended to merge any 2 cases in switches with 3
12322 // cases.
12323 // TODO: Handle cases where W.CaseBB != SwitchBB.
12324 CaseCluster &Small = *W.FirstCluster;
12325 CaseCluster &Big = *W.LastCluster;
12326
12327 if (Small.Low == Small.High && Big.Low == Big.High &&
12328 Small.MBB == Big.MBB) {
12329 const APInt &SmallValue = Small.Low->getValue();
12330 const APInt &BigValue = Big.Low->getValue();
12331
12332 // Check that there is only one bit different.
12333 APInt CommonBit = BigValue ^ SmallValue;
12334 if (CommonBit.isPowerOf2()) {
12335 SDValue CondLHS = getValue(Cond);
12336 EVT VT = CondLHS.getValueType();
12337 SDLoc DL = getCurSDLoc();
12338
12339 SDValue Or = DAG.getNode(ISD::OR, DL, VT, CondLHS,
12340 DAG.getConstant(CommonBit, DL, VT));
12341 SDValue Cond = DAG.getSetCC(
12342 DL, MVT::i1, Or, DAG.getConstant(BigValue | SmallValue, DL, VT),
12343 ISD::SETEQ);
12344
12345 // Update successor info.
12346 // Both Small and Big will jump to Small.BB, so we sum up the
12347 // probabilities.
12348 addSuccessorWithProb(SwitchMBB, Small.MBB, Small.Prob + Big.Prob);
12349 if (BPI)
12350 addSuccessorWithProb(
12351 SwitchMBB, DefaultMBB,
12352 // The default destination is the first successor in IR.
12353 BPI->getEdgeProbability(SwitchMBB->getBasicBlock(), (unsigned)0));
12354 else
12355 addSuccessorWithProb(SwitchMBB, DefaultMBB);
12356
12357 // Insert the true branch.
12358 SDValue BrCond =
12359 DAG.getNode(ISD::BRCOND, DL, MVT::Other, getControlRoot(), Cond,
12360 DAG.getBasicBlock(Small.MBB));
12361 // Insert the false branch.
12362 BrCond = DAG.getNode(ISD::BR, DL, MVT::Other, BrCond,
12363 DAG.getBasicBlock(DefaultMBB));
12364
12365 DAG.setRoot(BrCond);
12366 return;
12367 }
12368 }
12369 }
12370
12371 if (TM.getOptLevel() != CodeGenOptLevel::None) {
12372 // Here, we order cases by probability so the most likely case will be
12373 // checked first. However, two clusters can have the same probability in
12374 // which case their relative ordering is non-deterministic. So we use Low
12375 // as a tie-breaker as clusters are guaranteed to never overlap.
12376 llvm::sort(W.FirstCluster, W.LastCluster + 1,
12377 [](const CaseCluster &a, const CaseCluster &b) {
12378 return a.Prob != b.Prob ?
12379 a.Prob > b.Prob :
12380 a.Low->getValue().slt(b.Low->getValue());
12381 });
12382
12383 // Rearrange the case blocks so that the last one falls through if possible
12384 // without changing the order of probabilities.
12385 for (CaseClusterIt I = W.LastCluster; I > W.FirstCluster; ) {
12386 --I;
12387 if (I->Prob > W.LastCluster->Prob)
12388 break;
12389 if (I->Kind == CC_Range && I->MBB == NextMBB) {
12390 std::swap(*I, *W.LastCluster);
12391 break;
12392 }
12393 }
12394 }
12395
12396 // Compute total probability.
12397 BranchProbability DefaultProb = W.DefaultProb;
12398 BranchProbability UnhandledProbs = DefaultProb;
12399 for (CaseClusterIt I = W.FirstCluster; I <= W.LastCluster; ++I)
12400 UnhandledProbs += I->Prob;
12401
12402 MachineBasicBlock *CurMBB = W.MBB;
12403 for (CaseClusterIt I = W.FirstCluster, E = W.LastCluster; I <= E; ++I) {
12404 bool FallthroughUnreachable = false;
12405 MachineBasicBlock *Fallthrough;
12406 if (I == W.LastCluster) {
12407 // For the last cluster, fall through to the default destination.
12408 Fallthrough = DefaultMBB;
12409 FallthroughUnreachable = isa<UnreachableInst>(
12410 DefaultMBB->getBasicBlock()->getFirstNonPHIOrDbg());
12411 } else {
12412 Fallthrough = CurMF->CreateMachineBasicBlock(CurMBB->getBasicBlock());
12413 CurMF->insert(BBI, Fallthrough);
12414 // Put Cond in a virtual register to make it available from the new blocks.
12416 }
12417 UnhandledProbs -= I->Prob;
12418
12419 switch (I->Kind) {
12420 case CC_JumpTable: {
12421 // FIXME: Optimize away range check based on pivot comparisons.
12422 JumpTableHeader *JTH = &SL->JTCases[I->JTCasesIndex].first;
12423 SwitchCG::JumpTable *JT = &SL->JTCases[I->JTCasesIndex].second;
12424
12425 // The jump block hasn't been inserted yet; insert it here.
12426 MachineBasicBlock *JumpMBB = JT->MBB;
12427 CurMF->insert(BBI, JumpMBB);
12428
12429 auto JumpProb = I->Prob;
12430 auto FallthroughProb = UnhandledProbs;
12431
12432 // If the default statement is a target of the jump table, we evenly
12433 // distribute the default probability to successors of CurMBB. Also
12434 // update the probability on the edge from JumpMBB to Fallthrough.
12435 for (MachineBasicBlock::succ_iterator SI = JumpMBB->succ_begin(),
12436 SE = JumpMBB->succ_end();
12437 SI != SE; ++SI) {
12438 if (*SI == DefaultMBB) {
12439 JumpProb += DefaultProb / 2;
12440 FallthroughProb -= DefaultProb / 2;
12441 JumpMBB->setSuccProbability(SI, DefaultProb / 2);
12442 JumpMBB->normalizeSuccProbs();
12443 break;
12444 }
12445 }
12446
12447 // If the default clause is unreachable, propagate that knowledge into
12448 // JTH->FallthroughUnreachable which will use it to suppress the range
12449 // check.
12450 //
12451 // However, don't do this if we're doing branch target enforcement,
12452 // because a table branch _without_ a range check can be a tempting JOP
12453 // gadget - out-of-bounds inputs that are impossible in correct
12454 // execution become possible again if an attacker can influence the
12455 // control flow. So if an attacker doesn't already have a BTI bypass
12456 // available, we don't want them to be able to get one out of this
12457 // table branch.
12458 if (FallthroughUnreachable) {
12459 Function &CurFunc = CurMF->getFunction();
12460 if (!CurFunc.hasFnAttribute("branch-target-enforcement"))
12461 JTH->FallthroughUnreachable = true;
12462 }
12463
12464 if (!JTH->FallthroughUnreachable)
12465 addSuccessorWithProb(CurMBB, Fallthrough, FallthroughProb);
12466 addSuccessorWithProb(CurMBB, JumpMBB, JumpProb);
12467 CurMBB->normalizeSuccProbs();
12468
12469 // The jump table header will be inserted in our current block, do the
12470 // range check, and fall through to our fallthrough block.
12471 JTH->HeaderBB = CurMBB;
12472 JT->Default = Fallthrough; // FIXME: Move Default to JumpTableHeader.
12473
12474 // If we're in the right place, emit the jump table header right now.
12475 if (CurMBB == SwitchMBB) {
12476 visitJumpTableHeader(*JT, *JTH, SwitchMBB);
12477 JTH->Emitted = true;
12478 }
12479 break;
12480 }
12481 case CC_BitTests: {
12482 // FIXME: Optimize away range check based on pivot comparisons.
12483 BitTestBlock *BTB = &SL->BitTestCases[I->BTCasesIndex];
12484
12485 // The bit test blocks haven't been inserted yet; insert them here.
12486 for (BitTestCase &BTC : BTB->Cases)
12487 CurMF->insert(BBI, BTC.ThisBB);
12488
12489 // Fill in fields of the BitTestBlock.
12490 BTB->Parent = CurMBB;
12491 BTB->Default = Fallthrough;
12492
12493 BTB->DefaultProb = UnhandledProbs;
12494 // If the cases in bit test don't form a contiguous range, we evenly
12495 // distribute the probability on the edge to Fallthrough to two
12496 // successors of CurMBB.
12497 if (!BTB->ContiguousRange) {
12498 BTB->Prob += DefaultProb / 2;
12499 BTB->DefaultProb -= DefaultProb / 2;
12500 }
12501
12502 if (FallthroughUnreachable)
12503 BTB->FallthroughUnreachable = true;
12504
12505 // If we're in the right place, emit the bit test header right now.
12506 if (CurMBB == SwitchMBB) {
12507 visitBitTestHeader(*BTB, SwitchMBB);
12508 BTB->Emitted = true;
12509 }
12510 break;
12511 }
12512 case CC_Range: {
12513 const Value *RHS, *LHS, *MHS;
12514 ISD::CondCode CC;
12515 if (I->Low == I->High) {
12516 // Check Cond == I->Low.
12517 CC = ISD::SETEQ;
12518 LHS = Cond;
12519 RHS=I->Low;
12520 MHS = nullptr;
12521 } else {
12522 // Check I->Low <= Cond <= I->High.
12523 CC = ISD::SETLE;
12524 LHS = I->Low;
12525 MHS = Cond;
12526 RHS = I->High;
12527 }
12528
12529 // If Fallthrough is unreachable, fold away the comparison.
12530 if (FallthroughUnreachable)
12531 CC = ISD::SETTRUE;
12532
12533 // The false probability is the sum of all unhandled cases.
12534 CaseBlock CB(CC, LHS, RHS, MHS, I->MBB, Fallthrough, CurMBB,
12535 getCurSDLoc(), I->Prob, UnhandledProbs);
12536
12537 if (CurMBB == SwitchMBB)
12538 visitSwitchCase(CB, SwitchMBB);
12539 else
12540 SL->SwitchCases.push_back(CB);
12541
12542 break;
12543 }
12544 }
12545 CurMBB = Fallthrough;
12546 }
12547}
12548
12549void SelectionDAGBuilder::splitWorkItem(SwitchWorkList &WorkList,
12550 const SwitchWorkListItem &W,
12551 Value *Cond,
12552 MachineBasicBlock *SwitchMBB) {
12553 assert(W.FirstCluster->Low->getValue().slt(W.LastCluster->Low->getValue()) &&
12554 "Clusters not sorted?");
12555 assert(W.LastCluster - W.FirstCluster + 1 >= 2 && "Too small to split!");
12556
12557 auto [LastLeft, FirstRight, LeftProb, RightProb] =
12558 SL->computeSplitWorkItemInfo(W);
12559
12560 // Use the first element on the right as pivot since we will make less-than
12561 // comparisons against it.
12562 CaseClusterIt PivotCluster = FirstRight;
12563 assert(PivotCluster > W.FirstCluster);
12564 assert(PivotCluster <= W.LastCluster);
12565
12566 CaseClusterIt FirstLeft = W.FirstCluster;
12567 CaseClusterIt LastRight = W.LastCluster;
12568
12569 const ConstantInt *Pivot = PivotCluster->Low;
12570
12571 // New blocks will be inserted immediately after the current one.
12573 ++BBI;
12574
12575 // We will branch to the LHS if Value < Pivot. If LHS is a single cluster,
12576 // we can branch to its destination directly if it's squeezed exactly in
12577 // between the known lower bound and Pivot - 1.
12578 MachineBasicBlock *LeftMBB;
12579 if (FirstLeft == LastLeft && FirstLeft->Kind == CC_Range &&
12580 FirstLeft->Low == W.GE &&
12581 (FirstLeft->High->getValue() + 1LL) == Pivot->getValue()) {
12582 LeftMBB = FirstLeft->MBB;
12583 } else {
12584 LeftMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
12585 FuncInfo.MF->insert(BBI, LeftMBB);
12586 WorkList.push_back(
12587 {LeftMBB, FirstLeft, LastLeft, W.GE, Pivot, W.DefaultProb / 2});
12588 // Put Cond in a virtual register to make it available from the new blocks.
12590 }
12591
12592 // Similarly, we will branch to the RHS if Value >= Pivot. If RHS is a
12593 // single cluster, RHS.Low == Pivot, and we can branch to its destination
12594 // directly if RHS.High equals the current upper bound.
12595 MachineBasicBlock *RightMBB;
12596 if (FirstRight == LastRight && FirstRight->Kind == CC_Range &&
12597 W.LT && (FirstRight->High->getValue() + 1ULL) == W.LT->getValue()) {
12598 RightMBB = FirstRight->MBB;
12599 } else {
12600 RightMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
12601 FuncInfo.MF->insert(BBI, RightMBB);
12602 WorkList.push_back(
12603 {RightMBB, FirstRight, LastRight, Pivot, W.LT, W.DefaultProb / 2});
12604 // Put Cond in a virtual register to make it available from the new blocks.
12606 }
12607
12608 // Create the CaseBlock record that will be used to lower the branch.
12609 CaseBlock CB(ISD::SETLT, Cond, Pivot, nullptr, LeftMBB, RightMBB, W.MBB,
12610 getCurSDLoc(), LeftProb, RightProb);
12611
12612 if (W.MBB == SwitchMBB)
12613 visitSwitchCase(CB, SwitchMBB);
12614 else
12615 SL->SwitchCases.push_back(CB);
12616}
12617
12618// Scale CaseProb after peeling a case with the probablity of PeeledCaseProb
12619// from the swith statement.
12621 BranchProbability PeeledCaseProb) {
12622 if (PeeledCaseProb == BranchProbability::getOne())
12624 BranchProbability SwitchProb = PeeledCaseProb.getCompl();
12625
12626 uint32_t Numerator = CaseProb.getNumerator();
12627 uint32_t Denominator = SwitchProb.scale(CaseProb.getDenominator());
12628 return BranchProbability(Numerator, std::max(Numerator, Denominator));
12629}
12630
12631// Try to peel the top probability case if it exceeds the threshold.
12632// Return current MachineBasicBlock for the switch statement if the peeling
12633// does not occur.
12634// If the peeling is performed, return the newly created MachineBasicBlock
12635// for the peeled switch statement. Also update Clusters to remove the peeled
12636// case. PeeledCaseProb is the BranchProbability for the peeled case.
12637MachineBasicBlock *SelectionDAGBuilder::peelDominantCaseCluster(
12638 const SwitchInst &SI, CaseClusterVector &Clusters,
12639 BranchProbability &PeeledCaseProb) {
12640 MachineBasicBlock *SwitchMBB = FuncInfo.MBB;
12641 // Don't perform if there is only one cluster or optimizing for size.
12642 if (SwitchPeelThreshold > 100 || !FuncInfo.BPI || Clusters.size() < 2 ||
12643 TM.getOptLevel() == CodeGenOptLevel::None ||
12644 SwitchMBB->getParent()->getFunction().hasMinSize())
12645 return SwitchMBB;
12646
12647 BranchProbability TopCaseProb = BranchProbability(SwitchPeelThreshold, 100);
12648 unsigned PeeledCaseIndex = 0;
12649 bool SwitchPeeled = false;
12650 for (unsigned Index = 0; Index < Clusters.size(); ++Index) {
12651 CaseCluster &CC = Clusters[Index];
12652 if (CC.Prob < TopCaseProb)
12653 continue;
12654 TopCaseProb = CC.Prob;
12655 PeeledCaseIndex = Index;
12656 SwitchPeeled = true;
12657 }
12658 if (!SwitchPeeled)
12659 return SwitchMBB;
12660
12661 LLVM_DEBUG(dbgs() << "Peeled one top case in switch stmt, prob: "
12662 << TopCaseProb << "\n");
12663
12664 // Record the MBB for the peeled switch statement.
12665 MachineFunction::iterator BBI(SwitchMBB);
12666 ++BBI;
12667 MachineBasicBlock *PeeledSwitchMBB =
12668 FuncInfo.MF->CreateMachineBasicBlock(SwitchMBB->getBasicBlock());
12669 FuncInfo.MF->insert(BBI, PeeledSwitchMBB);
12670
12671 ExportFromCurrentBlock(SI.getCondition());
12672 auto PeeledCaseIt = Clusters.begin() + PeeledCaseIndex;
12673 SwitchWorkListItem W = {SwitchMBB, PeeledCaseIt, PeeledCaseIt,
12674 nullptr, nullptr, TopCaseProb.getCompl()};
12675 lowerWorkItem(W, SI.getCondition(), SwitchMBB, PeeledSwitchMBB);
12676
12677 Clusters.erase(PeeledCaseIt);
12678 for (CaseCluster &CC : Clusters) {
12679 LLVM_DEBUG(
12680 dbgs() << "Scale the probablity for one cluster, before scaling: "
12681 << CC.Prob << "\n");
12682 CC.Prob = scaleCaseProbality(CC.Prob, TopCaseProb);
12683 LLVM_DEBUG(dbgs() << "After scaling: " << CC.Prob << "\n");
12684 }
12685 PeeledCaseProb = TopCaseProb;
12686 return PeeledSwitchMBB;
12687}
12688
12689void SelectionDAGBuilder::visitSwitch(const SwitchInst &SI) {
12690 // Extract cases from the switch.
12691 BranchProbabilityInfo *BPI = FuncInfo.BPI;
12692 CaseClusterVector Clusters;
12693 Clusters.reserve(SI.getNumCases());
12694 for (auto I : SI.cases()) {
12695 MachineBasicBlock *Succ = FuncInfo.getMBB(I.getCaseSuccessor());
12696 const ConstantInt *CaseVal = I.getCaseValue();
12697 BranchProbability Prob =
12698 BPI ? BPI->getEdgeProbability(SI.getParent(), I.getSuccessorIndex())
12699 : BranchProbability(1, SI.getNumCases() + 1);
12700 Clusters.push_back(CaseCluster::range(CaseVal, CaseVal, Succ, Prob));
12701 }
12702
12703 MachineBasicBlock *DefaultMBB = FuncInfo.getMBB(SI.getDefaultDest());
12704
12705 // Cluster adjacent cases with the same destination. We do this at all
12706 // optimization levels because it's cheap to do and will make codegen faster
12707 // if there are many clusters.
12708 sortAndRangeify(Clusters);
12709
12710 // The branch probablity of the peeled case.
12711 BranchProbability PeeledCaseProb = BranchProbability::getZero();
12712 MachineBasicBlock *PeeledSwitchMBB =
12713 peelDominantCaseCluster(SI, Clusters, PeeledCaseProb);
12714
12715 // If there is only the default destination, jump there directly.
12716 MachineBasicBlock *SwitchMBB = FuncInfo.MBB;
12717 if (Clusters.empty()) {
12718 assert(PeeledSwitchMBB == SwitchMBB);
12719 SwitchMBB->addSuccessor(DefaultMBB);
12720 if (DefaultMBB != NextBlock(SwitchMBB)) {
12721 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
12722 getControlRoot(), DAG.getBasicBlock(DefaultMBB)));
12723 }
12724 return;
12725 }
12726
12727 SL->findJumpTables(Clusters, &SI, getCurSDLoc(), DefaultMBB, DAG.getPSI(),
12728 DAG.getBFI());
12729 SL->findBitTestClusters(Clusters, &SI);
12730
12731 LLVM_DEBUG({
12732 dbgs() << "Case clusters: ";
12733 for (const CaseCluster &C : Clusters) {
12734 if (C.Kind == CC_JumpTable)
12735 dbgs() << "JT:";
12736 if (C.Kind == CC_BitTests)
12737 dbgs() << "BT:";
12738
12739 C.Low->getValue().print(dbgs(), true);
12740 if (C.Low != C.High) {
12741 dbgs() << '-';
12742 C.High->getValue().print(dbgs(), true);
12743 }
12744 dbgs() << ' ';
12745 }
12746 dbgs() << '\n';
12747 });
12748
12749 assert(!Clusters.empty());
12750 SwitchWorkList WorkList;
12751 CaseClusterIt First = Clusters.begin();
12752 CaseClusterIt Last = Clusters.end() - 1;
12753 auto DefaultProb = getEdgeProbability(PeeledSwitchMBB, DefaultMBB);
12754 // Scale the branchprobability for DefaultMBB if the peel occurs and
12755 // DefaultMBB is not replaced.
12756 if (PeeledCaseProb != BranchProbability::getZero() &&
12757 DefaultMBB == FuncInfo.getMBB(SI.getDefaultDest()))
12758 DefaultProb = scaleCaseProbality(DefaultProb, PeeledCaseProb);
12759 WorkList.push_back(
12760 {PeeledSwitchMBB, First, Last, nullptr, nullptr, DefaultProb});
12761
12762 while (!WorkList.empty()) {
12763 SwitchWorkListItem W = WorkList.pop_back_val();
12764 unsigned NumClusters = W.LastCluster - W.FirstCluster + 1;
12765
12766 if (NumClusters > 3 && TM.getOptLevel() != CodeGenOptLevel::None &&
12767 !DefaultMBB->getParent()->getFunction().hasMinSize()) {
12768 // For optimized builds, lower large range as a balanced binary tree.
12769 splitWorkItem(WorkList, W, SI.getCondition(), SwitchMBB);
12770 continue;
12771 }
12772
12773 lowerWorkItem(W, SI.getCondition(), SwitchMBB, DefaultMBB);
12774 }
12775}
12776
12777void SelectionDAGBuilder::visitStepVector(const CallInst &I) {
12778 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12779 auto DL = getCurSDLoc();
12780 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12781 setValue(&I, DAG.getStepVector(DL, ResultVT));
12782}
12783
12784void SelectionDAGBuilder::visitVectorReverse(const CallInst &I) {
12785 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12786 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12787
12788 SDLoc DL = getCurSDLoc();
12789 SDValue V = getValue(I.getOperand(0));
12790 assert(VT == V.getValueType() && "Malformed vector.reverse!");
12791
12792 if (VT.isScalableVector()) {
12793 setValue(&I, DAG.getNode(ISD::VECTOR_REVERSE, DL, VT, V));
12794 return;
12795 }
12796
12797 // Use VECTOR_SHUFFLE for the fixed-length vector
12798 // to maintain existing behavior.
12799 SmallVector<int, 8> Mask;
12800 unsigned NumElts = VT.getVectorMinNumElements();
12801 for (unsigned i = 0; i != NumElts; ++i)
12802 Mask.push_back(NumElts - 1 - i);
12803
12804 setValue(&I, DAG.getVectorShuffle(VT, DL, V, DAG.getUNDEF(VT), Mask));
12805}
12806
12807void SelectionDAGBuilder::visitVectorDeinterleave(const CallInst &I,
12808 unsigned Factor) {
12809 auto DL = getCurSDLoc();
12810 SDValue InVec = getValue(I.getOperand(0));
12811
12812 SmallVector<EVT, 4> ValueVTs;
12813 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
12814 ValueVTs);
12815
12816 EVT OutVT = ValueVTs[0];
12817 unsigned OutNumElts = OutVT.getVectorMinNumElements();
12818
12819 SmallVector<SDValue, 4> SubVecs(Factor);
12820 for (unsigned i = 0; i != Factor; ++i) {
12821 assert(ValueVTs[i] == OutVT && "Expected VTs to be the same");
12822 SubVecs[i] = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, OutVT, InVec,
12823 DAG.getVectorIdxConstant(OutNumElts * i, DL));
12824 }
12825
12826 // Use VECTOR_SHUFFLE for fixed-length vectors with factor of 2 to benefit
12827 // from existing legalisation and combines.
12828 if (OutVT.isFixedLengthVector() && Factor == 2) {
12829 SDValue Even = DAG.getVectorShuffle(OutVT, DL, SubVecs[0], SubVecs[1],
12830 createStrideMask(0, 2, OutNumElts));
12831 SDValue Odd = DAG.getVectorShuffle(OutVT, DL, SubVecs[0], SubVecs[1],
12832 createStrideMask(1, 2, OutNumElts));
12833 SDValue Res = DAG.getMergeValues({Even, Odd}, getCurSDLoc());
12834 setValue(&I, Res);
12835 return;
12836 }
12837
12838 SDValue Res = DAG.getNode(ISD::VECTOR_DEINTERLEAVE, DL,
12839 DAG.getVTList(ValueVTs), SubVecs);
12840 setValue(&I, Res);
12841}
12842
12843void SelectionDAGBuilder::visitVectorInterleave(const CallInst &I,
12844 unsigned Factor) {
12845 auto DL = getCurSDLoc();
12846 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12847 EVT InVT = getValue(I.getOperand(0)).getValueType();
12848 EVT OutVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12849
12850 SmallVector<SDValue, 8> InVecs(Factor);
12851 for (unsigned i = 0; i < Factor; ++i) {
12852 InVecs[i] = getValue(I.getOperand(i));
12853 assert(InVecs[i].getValueType() == InVecs[0].getValueType() &&
12854 "Expected VTs to be the same");
12855 }
12856
12857 // Use VECTOR_SHUFFLE for fixed-length vectors with factor of 2 to benefit
12858 // from existing legalisation and combines.
12859 if (OutVT.isFixedLengthVector() && Factor == 2) {
12860 unsigned NumElts = InVT.getVectorMinNumElements();
12861 SDValue V = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, InVecs);
12862 setValue(&I, DAG.getVectorShuffle(OutVT, DL, V, DAG.getUNDEF(OutVT),
12863 createInterleaveMask(NumElts, 2)));
12864 return;
12865 }
12866
12867 SmallVector<EVT, 8> ValueVTs(Factor, InVT);
12868 SDValue Res =
12869 DAG.getNode(ISD::VECTOR_INTERLEAVE, DL, DAG.getVTList(ValueVTs), InVecs);
12870
12872 for (unsigned i = 0; i < Factor; ++i)
12873 Results[i] = Res.getValue(i);
12874
12875 Res = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, Results);
12876 setValue(&I, Res);
12877}
12878
12879void SelectionDAGBuilder::visitFreeze(const FreezeInst &I) {
12880 SmallVector<EVT, 4> ValueVTs;
12881 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
12882 ValueVTs);
12883 unsigned NumValues = ValueVTs.size();
12884 if (NumValues == 0) return;
12885
12886 SmallVector<SDValue, 4> Values(NumValues);
12887 SDValue Op = getValue(I.getOperand(0));
12888
12889 for (unsigned i = 0; i != NumValues; ++i)
12890 Values[i] = DAG.getNode(ISD::FREEZE, getCurSDLoc(), ValueVTs[i],
12891 SDValue(Op.getNode(), Op.getResNo() + i));
12892
12894 DAG.getVTList(ValueVTs), Values));
12895}
12896
12897void SelectionDAGBuilder::visitVectorSplice(const CallInst &I) {
12898 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12899 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12900
12901 SDLoc DL = getCurSDLoc();
12902 SDValue V1 = getValue(I.getOperand(0));
12903 SDValue V2 = getValue(I.getOperand(1));
12904 const bool IsLeft = I.getIntrinsicID() == Intrinsic::vector_splice_left;
12905
12906 // VECTOR_SHUFFLE doesn't support a scalable or non-constant mask.
12907 if (VT.isScalableVector() || !isa<ConstantInt>(I.getOperand(2))) {
12908 SDValue Offset = DAG.getZExtOrTrunc(
12909 getValue(I.getOperand(2)), DL, TLI.getVectorIdxTy(DAG.getDataLayout()));
12910 setValue(&I, DAG.getNode(IsLeft ? ISD::VECTOR_SPLICE_LEFT
12912 DL, VT, V1, V2, Offset));
12913 return;
12914 }
12915 uint64_t Imm = cast<ConstantInt>(I.getOperand(2))->getZExtValue();
12916
12917 unsigned NumElts = VT.getVectorNumElements();
12918
12919 uint64_t Idx = IsLeft ? Imm : NumElts - Imm;
12920
12921 // Use VECTOR_SHUFFLE to maintain original behaviour for fixed-length vectors.
12922 SmallVector<int, 8> Mask;
12923 for (unsigned i = 0; i < NumElts; ++i)
12924 Mask.push_back(Idx + i);
12925 setValue(&I, DAG.getVectorShuffle(VT, DL, V1, V2, Mask));
12926}
12927
12928// Consider the following MIR after SelectionDAG, which produces output in
12929// phyregs in the first case or virtregs in the second case.
12930//
12931// INLINEASM_BR ..., implicit-def $ebx, ..., implicit-def $edx
12932// %5:gr32 = COPY $ebx
12933// %6:gr32 = COPY $edx
12934// %1:gr32 = COPY %6:gr32
12935// %0:gr32 = COPY %5:gr32
12936//
12937// INLINEASM_BR ..., def %5:gr32, ..., def %6:gr32
12938// %1:gr32 = COPY %6:gr32
12939// %0:gr32 = COPY %5:gr32
12940//
12941// Given %0, we'd like to return $ebx in the first case and %5 in the second.
12942// Given %1, we'd like to return $edx in the first case and %6 in the second.
12943//
12944// If a callbr has outputs, it will have a single mapping in FuncInfo.ValueMap
12945// to a single virtreg (such as %0). The remaining outputs monotonically
12946// increase in virtreg number from there. If a callbr has no outputs, then it
12947// should not have a corresponding callbr landingpad; in fact, the callbr
12948// landingpad would not even be able to refer to such a callbr.
12950 MachineInstr *MI = MRI.def_begin(Reg)->getParent();
12951 // There is definitely at least one copy.
12952 assert(MI->getOpcode() == TargetOpcode::COPY &&
12953 "start of copy chain MUST be COPY");
12954 Reg = MI->getOperand(1).getReg();
12955
12956 // If the copied register in the first copy must be virtual.
12957 assert(Reg.isVirtual() && "expected COPY of virtual register");
12958 MI = MRI.def_begin(Reg)->getParent();
12959
12960 // There may be an optional second copy.
12961 if (MI->getOpcode() == TargetOpcode::COPY) {
12962 assert(Reg.isVirtual() && "expected COPY of virtual register");
12963 Reg = MI->getOperand(1).getReg();
12964 assert(Reg.isPhysical() && "expected COPY of physical register");
12965 } else {
12966 // The start of the chain must be an INLINEASM_BR.
12967 assert(MI->getOpcode() == TargetOpcode::INLINEASM_BR &&
12968 "end of copy chain MUST be INLINEASM_BR");
12969 }
12970
12971 return Reg;
12972}
12973
12974// We must do this walk rather than the simpler
12975// setValue(&I, getCopyFromRegs(CBR, CBR->getType()));
12976// otherwise we will end up with copies of virtregs only valid along direct
12977// edges.
12978void SelectionDAGBuilder::visitCallBrLandingPad(const CallInst &I) {
12979 SmallVector<EVT, 8> ResultVTs;
12980 SmallVector<SDValue, 8> ResultValues;
12981 const auto *CBR =
12982 cast<CallBrInst>(I.getParent()->getUniquePredecessor()->getTerminator());
12983
12984 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12985 const TargetRegisterInfo *TRI = DAG.getSubtarget().getRegisterInfo();
12986 MachineRegisterInfo &MRI = DAG.getMachineFunction().getRegInfo();
12987
12988 Register InitialDef = FuncInfo.ValueMap[CBR];
12989 SDValue Chain = DAG.getRoot();
12990
12991 // Re-parse the asm constraints string.
12992 TargetLowering::AsmOperandInfoVector TargetConstraints =
12993 TLI.ParseConstraints(DAG.getDataLayout(), TRI, *CBR);
12994 for (auto &T : TargetConstraints) {
12995 SDISelAsmOperandInfo OpInfo(T);
12996 if (OpInfo.Type != InlineAsm::isOutput)
12997 continue;
12998
12999 // Pencil in OpInfo.ConstraintType and OpInfo.ConstraintVT based on the
13000 // individual constraint.
13001 TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
13002
13003 switch (OpInfo.ConstraintType) {
13006 // Fill in OpInfo.AssignedRegs.Regs.
13007 getRegistersForValue(DAG, getCurSDLoc(), OpInfo, OpInfo);
13008
13009 // getRegistersForValue may produce 1 to many registers based on whether
13010 // the OpInfo.ConstraintVT is legal on the target or not.
13011 for (Register &Reg : OpInfo.AssignedRegs.Regs) {
13012 Register OriginalDef = FollowCopyChain(MRI, InitialDef++);
13013 if (OriginalDef.isPhysical())
13014 FuncInfo.MBB->addLiveIn(OriginalDef);
13015 // Update the assigned registers to use the original defs.
13016 Reg = OriginalDef;
13017 }
13018
13019 SDValue V = OpInfo.AssignedRegs.getCopyFromRegs(
13020 DAG, FuncInfo, getCurSDLoc(), Chain, nullptr, CBR);
13021 ResultValues.push_back(V);
13022 ResultVTs.push_back(OpInfo.ConstraintVT);
13023 break;
13024 }
13026 SDValue Flag;
13027 SDValue V = TLI.LowerAsmOutputForConstraint(Chain, Flag, getCurSDLoc(),
13028 OpInfo, DAG);
13029 ++InitialDef;
13030 ResultValues.push_back(V);
13031 ResultVTs.push_back(OpInfo.ConstraintVT);
13032 break;
13033 }
13034 default:
13035 break;
13036 }
13037 }
13039 DAG.getVTList(ResultVTs), ResultValues);
13040 setValue(&I, V);
13041}
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")
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 uint8_t *MatcherTable, size_t &MatcherIndex)
getSimpleVT - Decode a value in MatcherTable, if it's a VBR encoded value, use GetVBR to decode it.
This file defines the SmallPtrSet class.
This file contains some functions that are useful when dealing with strings.
#define LLVM_DEBUG(...)
Definition Debug.h:114
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
This pass exposes codegen information to IR-level passes.
uint16_t RegSizeInBits(const MCRegisterInfo &MRI, MCRegister RegNo)
Value * RHS
Value * LHS
static const fltSemantics & IEEEsingle()
Definition APFloat.h:296
Class for arbitrary precision integers.
Definition APInt.h:78
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:335
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:441
an instruction to allocate memory on the stack
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
LLVM_ABI std::optional< TypeSize > getAllocationSize(const DataLayout &DL) const
Get allocation size in bytes.
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
LLVM_ABI bool hasAttribute(Attribute::AttrKind Kind) const
Check if an argument has a given attribute.
Definition Function.cpp:338
unsigned getArgNo() const
Return the index of this formal argument in its containing function.
Definition Argument.h:50
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator end() const
Definition ArrayRef.h:131
size_t size() const
size - Get the array size.
Definition ArrayRef.h:142
iterator begin() const
Definition ArrayRef.h:130
bool empty() const
empty - Check if the array is empty.
Definition ArrayRef.h:137
A cache of @llvm.assume calls within a function.
An instruction that atomically checks whether a specified value is in a memory location,...
an instruction that atomically reads a memory location, combines it with another value,...
@ Add
*p = old + v
@ FAdd
*p = old + v
@ USubCond
Subtract only if no unsigned overflow.
@ FMinimum
*p = minimum(old, v) minimum matches the behavior of llvm.minimum.
@ Min
*p = old <signed v ? old : v
@ Sub
*p = old - v
@ And
*p = old & v
@ Xor
*p = old ^ v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ FMaximum
*p = maximum(old, v) maximum matches the behavior of llvm.maximum.
@ FSub
*p = old - v
@ UIncWrap
Increment one up to a maximum value.
@ Max
*p = old >signed v ? old : v
@ UMin
*p = old <unsigned v ? old : v
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
@ UMax
*p = old >unsigned v ? old : v
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
@ Nand
*p = ~(old & v)
This class holds the attributes for a particular argument, parameter, function, or return value.
Definition Attributes.h:407
LLVM Basic Block Representation.
Definition BasicBlock.h:62
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
InstListType::const_iterator const_iterator
Definition BasicBlock.h:171
LLVM_ABI bool isEntryBlock() const
Return true if this is the entry block of the containing function.
LLVM_ABI InstListType::const_iterator getFirstNonPHIOrDbg(bool SkipPseudoOp=true) const
Returns a pointer to the first instruction in this block that is not a PHINode or a debug intrinsic,...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
Definition BasicBlock.h:233
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
This class represents a no-op cast from one type to another.
The address of a basic block.
Definition Constants.h:904
Conditional or Unconditional Branch instruction.
Analysis providing branch probability information.
LLVM_ABI BranchProbability getEdgeProbability(const BasicBlock *Src, unsigned IndexInSuccessors) const
Get an edge's probability, relative to other out-edges of the Src.
LLVM_ABI bool isEdgeHot(const BasicBlock *Src, const BasicBlock *Dst) const
Test if an edge is hot relative to other out-edges of the Src.
static uint32_t getDenominator()
static BranchProbability getOne()
static BranchProbability getUnknown()
uint32_t getNumerator() const
LLVM_ABI uint64_t scale(uint64_t Num) const
Scale a large integer.
BranchProbability getCompl() const
static BranchProbability getZero()
static void normalizeProbabilities(ProbabilityIter Begin, ProbabilityIter End)
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
std::optional< OperandBundleUse > getOperandBundle(StringRef Name) const
Return an operand bundle by name, if present.
CallingConv::ID getCallingConv() const
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
LLVM_ABI bool isMustTailCall() const
Tests if this call site must be tail call optimized.
LLVM_ABI bool isIndirectCall() const
Return true if the callsite is an indirect call.
unsigned countOperandBundlesOfType(StringRef Name) const
Return the number of operand bundles with the tag Name attached to this instruction.
Value * getCalledOperand() const
Value * getArgOperand(unsigned i) const
User::op_iterator arg_end()
Return the iterator pointing to the end of the argument list.
bool isConvergent() const
Determine if the invoke is convergent.
FunctionType * getFunctionType() const
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
LLVM_ABI bool isTailCall() const
Tests if this call site is marked as a tail call.
CallBr instruction, tracking function calls that may not return control but instead transfer it to a ...
This class represents a function call, abstracting a target machine's calling convention.
This class is the base class for the comparison instructions.
Definition InstrTypes.h:664
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:676
ConstantDataSequential - A vector or array constant whose element type is a simple 1/2/4/8-byte integ...
Definition Constants.h:598
A constant value that is initialized with an expression using other constant values.
Definition Constants.h:1130
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:282
This is the shared class of boolean and integer constants.
Definition Constants.h:87
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition Constants.h:219
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
Definition Constants.h:168
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
A signed pointer, in the ptrauth sense.
Definition Constants.h:1037
uint64_t getZExtValue() const
Constant Vector Declarations.
Definition Constants.h:522
This is an important base class in LLVM.
Definition Constant.h:43
This is the common base class for constrained floating point intrinsics.
LLVM_ABI std::optional< fp::ExceptionBehavior > getExceptionBehavior() const
LLVM_ABI unsigned getNonMetadataArgCount() const
DWARF expression.
LLVM_ABI bool isEntryValue() const
Check if the expression consists of exactly one entry value operand.
static bool fragmentsOverlap(const FragmentInfo &A, const FragmentInfo &B)
Check if fragments overlap between a pair of FragmentInfos.
static LLVM_ABI DIExpression * appendOpsToArg(const DIExpression *Expr, ArrayRef< uint64_t > Ops, unsigned ArgNo, bool StackValue=false)
Create a copy of Expr by appending the given list of Ops to each instance of the operand DW_OP_LLVM_a...
static LLVM_ABI std::optional< FragmentInfo > getFragmentInfo(expr_op_iterator Start, expr_op_iterator End)
Retrieve the details of this fragment expression.
LLVM_ABI uint64_t getNumLocationOperands() const
Return the number of unique location operands referred to (via DW_OP_LLVM_arg) in this expression; th...
static LLVM_ABI std::optional< DIExpression * > createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits)
Create a DIExpression to describe one part of an aggregate variable that is fragmented across multipl...
static LLVM_ABI const DIExpression * convertToUndefExpression(const DIExpression *Expr)
Removes all elements from Expr that do not apply to an undef debug value, which includes every operat...
static LLVM_ABI DIExpression * prepend(const DIExpression *Expr, uint8_t Flags, int64_t Offset=0)
Prepend DIExpr with a deref and offset operation and optionally turn it into a stack value or/and an ...
static LLVM_ABI DIExpression * prependOpcodes(const DIExpression *Expr, SmallVectorImpl< uint64_t > &Ops, bool StackValue=false, bool EntryValue=false)
Prepend DIExpr with the given opcodes and optionally turn it into a stack value.
Base class for variables.
LLVM_ABI std::optional< uint64_t > getSizeInBits() const
Determines the size of the variable's type.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
bool isBigEndian() const
Definition DataLayout.h: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:67
An instruction for ordering other memory operations.
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
Definition Type.cpp:802
This class represents a freeze function that returns random concrete value if an operand is either a ...
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
BranchProbabilityInfo * BPI
MachineBasicBlock * getMBB(const BasicBlock *BB) const
DenseMap< const AllocaInst *, int > StaticAllocaMap
StaticAllocaMap - Keep track of frame indices for fixed sized allocas in the entry block.
const LiveOutInfo * GetLiveOutRegInfo(Register Reg)
GetLiveOutRegInfo - Gets LiveOutInfo for a register, returning NULL if the register is a PHI destinat...
MachineBasicBlock * MBB
MBB - The current block.
Class to represent function types.
unsigned getNumParams() const
Return the number of fixed parameters this function type requires.
Type * getParamType(unsigned i) const
Parameter type accessors.
Type * getReturnType() const
Data structure describing the variable locations in a function.
const BasicBlock & getEntryBlock() const
Definition Function.h:809
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Definition Function.h:211
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
Definition Function.h:246
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition Function.h:711
bool hasParamAttribute(unsigned ArgNo, Attribute::AttrKind Kind) const
check if an attributes is in the list of attributes.
Definition Function.cpp:741
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
Definition Function.h:272
Constant * getPersonalityFn() const
Get the personality function associated with this function.
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:354
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
Definition Function.h:251
size_t arg_size() const
Definition Function.h:901
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:729
Garbage collection metadata for a single function.
Definition GCMetadata.h:80
bool hasNoUnsignedSignedWrap() const
bool hasNoUnsignedWrap() const
bool isInBounds() const
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
bool hasDLLImportStorageClass() const
Module * getParent()
Get the module that this global value is contained inside of...
This instruction compares its operands according to the predicate given to the constructor.
Indirect Branch Instruction.
This instruction inserts a struct field of array element value into an aggregate value.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
LLVM_ABI FastMathFlags getFastMathFlags() const LLVM_READONLY
Convenience function for getting all the fast-math flags, which must be an operator which supports th...
LLVM_ABI AAMDNodes getAAMetadata() const
Returns the AA metadata for this instruction.
@ MIN_INT_BITS
Minimum number of bits that can be specified.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
Invoke instruction.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
LLVM_ABI void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
The landingpad instruction holds all of the information necessary to generate correct exception handl...
A helper class to return the specified delimiter string after the first invocation of operator String...
An instruction for reading from memory.
static LocationSize precise(uint64_t Value)
static constexpr LocationSize beforeOrAfterPointer()
Any location before or after the base pointer (but still within the underlying object).
LLVM_ABI MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
LLVM_ABI MCSymbol * getOrCreateFrameAllocSymbol(const Twine &FuncName, unsigned Idx)
Gets a symbol that will be defined to the final stack offset of a local variable after codegen.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
Metadata node.
Definition Metadata.h:1080
Machine Value Type.
@ INVALID_SIMPLE_VALUE_TYPE
uint64_t getScalarSizeInBits() const
unsigned getVectorNumElements() const
bool isVector() const
Return true if this is a vector value type.
bool isInteger() const
Return true if this is an integer or a vector integer type.
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
ElementCount getVectorElementCount() const
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
bool bitsGE(MVT VT) const
Return true if this has no less bits than VT.
bool isScalarInteger() const
Return true if this is an integer, not including vectors.
static MVT getVectorVT(MVT VT, unsigned NumElements)
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
static MVT getIntegerVT(unsigned BitWidth)
void normalizeSuccProbs()
Normalize probabilities of all successors so that the sum of them becomes one.
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
LLVM_ABI void setSuccProbability(succ_iterator I, BranchProbability Prob)
Set successor probability of a given iterator.
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
SmallVectorImpl< MachineBasicBlock * >::iterator succ_iterator
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
void setIsEHContTarget(bool V=true)
Indicates if this is a target of Windows EH Continuation Guard.
void setIsEHFuncletEntry(bool V=true)
Indicates if this is the entry block of an EH funclet.
MachineInstrBundleIterator< MachineInstr > iterator
void setIsEHScopeEntry(bool V=true)
Indicates if this is the entry block of an EH scope, i.e., the block that that used to have a catchpa...
void setMachineBlockAddressTaken()
Set this block to indicate that its address is used as something other than the target of a terminato...
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
void setIsImmutableObjectIndex(int ObjectIdx, bool IsImmutable)
Marks the immutability of an object.
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
bool hasOpaqueSPAdjustment() const
Returns true if the function contains opaque dynamic stack adjustments.
int getStackProtectorIndex() const
Return the index for the stack protector object.
void setIsAliasedObjectIndex(int ObjectIdx, bool IsAliased)
Set "maybe pointed to by an LLVM IR value" for an object.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
void RemoveStackObject(int ObjectIdx)
Remove or mark dead a statically sized stack object.
void setFunctionContextIndex(int I)
const WinEHFuncInfo * getWinEHFuncInfo() const
getWinEHFuncInfo - Return information about how the current function uses Windows exception handling.
bool useDebugInstrRef() const
Returns true if the function's variable locations are tracked with instruction referencing.
void setCallSiteBeginLabel(MCSymbol *BeginLabel, unsigned Site)
Map the begin label for a call site.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, Align base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MCContext & getContext() const
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
void addCodeViewAnnotation(MCSymbol *Label, MDNode *MD)
Record annotations associated with a particular label.
Function & getFunction()
Return the LLVM function that this machine code represents.
BasicBlockListType::iterator iterator
void setHasEHContTarget(bool V)
void addInvoke(MachineBasicBlock *LandingPad, MCSymbol *BeginLabel, MCSymbol *EndLabel)
Provide the begin and end labels of an invoke style call and associate it with a try landing pad bloc...
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineInstr - Allocate a new MachineInstr.
void insert(iterator MBBI, MachineBasicBlock *MBB)
const MachineInstrBuilder & addSym(MCSymbol *Sym, unsigned char TargetFlags=0) const
const MachineInstrBuilder & addFrameIndex(int Idx) const
Representation of each machine instruction.
A description of a memory reference used in the backend.
Flags
Flags values. These may be or'd together.
@ MOVolatile
The memory access is volatile.
@ MODereferenceable
The memory access is dereferenceable (i.e., doesn't trap).
@ MOLoad
The memory access reads data.
@ MONonTemporal
The memory access is non-temporal.
@ MOInvariant
The memory access always returns the same value (or traps).
@ MOStore
The memory access writes data.
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:184
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:79
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Definition Register.h:83
Resume the propagation of an exception.
Return a value (possibly void), from a function.
Holds the information from a dbg_label node through SDISel.
static SDDbgOperand fromNode(SDNode *Node, unsigned ResNo)
static SDDbgOperand fromFrameIdx(unsigned FrameIdx)
static SDDbgOperand fromVReg(Register VReg)
static SDDbgOperand fromConst(const Value *Const)
Holds the information from a dbg_value node through SDISel.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
iterator_range< value_op_iterator > op_values() const
unsigned getIROrder() const
Return the node ordering.
uint64_t getAsZExtVal() const
Helper method returns the zero-extended integer value of a ConstantSDNode.
unsigned getNumValues() const
Return the number of values defined/returned by this operator.
const SDValue & getOperand(unsigned Num) const
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDNode * getNode() const
get the SDNode which holds the desired result
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
TypeSize getValueSizeInBits() const
Returns the size of the value in bits.
const SDValue & getOperand(unsigned i) const
unsigned getResNo() const
get the index which selects a specific result in the SDNode
MVT getSimpleValueType() const
Return the simple ValueType of the referenced return value.
unsigned getOpcode() const
SelectionDAGBuilder - This is the common target-independent lowering implementation that is parameter...
SDValue getValue(const Value *V)
getValue - Return an SDValue for the given Value.
DenseMap< const Constant *, Register > ConstantsOut
void addDanglingDebugInfo(SmallVectorImpl< Value * > &Values, DILocalVariable *Var, DIExpression *Expr, bool IsVariadic, DebugLoc DL, unsigned Order)
Register a dbg_value which relies on a Value which we have not yet seen.
void visitDbgInfo(const Instruction &I)
void clearDanglingDebugInfo()
Clear the dangling debug information map.
void LowerCallTo(const CallBase &CB, SDValue Callee, bool IsTailCall, bool IsMustTailCall, const BasicBlock *EHPadBB=nullptr, const TargetLowering::PtrAuthInfo *PAI=nullptr)
void clear()
Clear out the current SelectionDAG and the associated state and prepare this SelectionDAGBuilder obje...
void visitBitTestHeader(SwitchCG::BitTestBlock &B, MachineBasicBlock *SwitchBB)
visitBitTestHeader - This function emits necessary code to produce value suitable for "bit tests"
void LowerStatepoint(const GCStatepointInst &I, const BasicBlock *EHPadBB=nullptr)
std::unique_ptr< SDAGSwitchLowering > SL
SDValue lowerRangeToAssertZExt(SelectionDAG &DAG, const Instruction &I, SDValue Op)
bool HasTailCall
This is set to true if a call in the current block has been translated as a tail call.
bool ShouldEmitAsBranches(const std::vector< SwitchCG::CaseBlock > &Cases)
If the set of cases should be emitted as a series of branches, return true.
void EmitBranchForMergedCondition(const Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB, BranchProbability TProb, BranchProbability FProb, bool InvertCond)
EmitBranchForMergedCondition - Helper method for FindMergedConditions.
void LowerDeoptimizeCall(const CallInst *CI)
void LowerCallSiteWithDeoptBundle(const CallBase *Call, SDValue Callee, const BasicBlock *EHPadBB)
SwiftErrorValueTracking & SwiftError
Information about the swifterror values used throughout the function.
SDValue getNonRegisterValue(const Value *V)
getNonRegisterValue - Return an SDValue for the given Value, but don't look in FuncInfo....
const TargetTransformInfo * TTI
DenseMap< MachineBasicBlock *, SmallVector< unsigned, 4 > > LPadToCallSiteMap
Map a landing pad to the call site indexes.
SDValue lowerNoFPClassToAssertNoFPClass(SelectionDAG &DAG, const Instruction &I, SDValue Op)
void handleDebugDeclare(Value *Address, DILocalVariable *Variable, DIExpression *Expression, DebugLoc DL)
bool shouldKeepJumpConditionsTogether(const FunctionLoweringInfo &FuncInfo, const BranchInst &I, Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs, TargetLoweringBase::CondMergingParams Params) const
StatepointLoweringState StatepointLowering
State used while lowering a statepoint sequence (gc_statepoint, gc_relocate, and gc_result).
void visitBitTestCase(SwitchCG::BitTestBlock &BB, MachineBasicBlock *NextMBB, BranchProbability BranchProbToNext, Register Reg, SwitchCG::BitTestCase &B, MachineBasicBlock *SwitchBB)
visitBitTestCase - this function produces one "bit test"
bool canTailCall(const CallBase &CB) const
void populateCallLoweringInfo(TargetLowering::CallLoweringInfo &CLI, const CallBase *Call, unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy, AttributeSet RetAttrs, bool IsPatchPoint)
Populate a CallLowerinInfo (into CLI) based on the properties of the call being lowered.
void CopyValueToVirtualRegister(const Value *V, Register Reg, ISD::NodeType ExtendType=ISD::ANY_EXTEND)
void salvageUnresolvedDbgValue(const Value *V, DanglingDebugInfo &DDI)
For the given dangling debuginfo record, perform last-ditch efforts to resolve the debuginfo to somet...
SmallVector< SDValue, 8 > PendingLoads
Loads are not emitted to the program immediately.
GCFunctionInfo * GFI
Garbage collection metadata for the function.
void init(GCFunctionInfo *gfi, BatchAAResults *BatchAA, AssumptionCache *AC, const TargetLibraryInfo *li, const TargetTransformInfo &TTI)
SDValue getRoot()
Similar to getMemoryRoot, but also flushes PendingConstrainedFP(Strict) items.
void ExportFromCurrentBlock(const Value *V)
ExportFromCurrentBlock - If this condition isn't known to be exported from the current basic block,...
void resolveOrClearDbgInfo()
Evict any dangling debug information, attempting to salvage it first.
std::pair< SDValue, SDValue > lowerInvokable(TargetLowering::CallLoweringInfo &CLI, const BasicBlock *EHPadBB=nullptr)
SDValue getMemoryRoot()
Return the current virtual root of the Selection DAG, flushing any PendingLoad items.
void resolveDanglingDebugInfo(const Value *V, SDValue Val)
If we saw an earlier dbg_value referring to V, generate the debug data structures now that we've seen...
void visit(const Instruction &I)
void dropDanglingDebugInfo(const DILocalVariable *Variable, const DIExpression *Expr)
If we have dangling debug info that describes Variable, or an overlapping part of variable considerin...
SDValue getCopyFromRegs(const Value *V, Type *Ty)
If there was virtual register allocated for the value V emit CopyFromReg of the specified type Ty.
void CopyToExportRegsIfNeeded(const Value *V)
CopyToExportRegsIfNeeded - If the given value has virtual registers created for it,...
void handleKillDebugValue(DILocalVariable *Var, DIExpression *Expr, DebugLoc DbgLoc, unsigned Order)
Create a record for a kill location debug intrinsic.
void visitJumpTable(SwitchCG::JumpTable &JT)
visitJumpTable - Emit JumpTable node in the current MBB
SDValue getFPOperationRoot(fp::ExceptionBehavior EB)
Return the current virtual root of the Selection DAG, flushing PendingConstrainedFP or PendingConstra...
void visitJumpTableHeader(SwitchCG::JumpTable &JT, SwitchCG::JumpTableHeader &JTH, MachineBasicBlock *SwitchBB)
visitJumpTableHeader - This function emits necessary code to produce index in the JumpTable from swit...
void LowerCallSiteWithPtrAuthBundle(const CallBase &CB, const BasicBlock *EHPadBB)
static const unsigned LowestSDNodeOrder
Lowest valid SDNodeOrder.
FunctionLoweringInfo & FuncInfo
Information about the function as a whole.
void setValue(const Value *V, SDValue NewN)
void FindMergedConditions(const Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB, Instruction::BinaryOps Opc, BranchProbability TProb, BranchProbability FProb, bool InvertCond)
const TargetLibraryInfo * LibInfo
bool isExportableFromCurrentBlock(const Value *V, const BasicBlock *FromBB)
void visitSPDescriptorParent(StackProtectorDescriptor &SPD, MachineBasicBlock *ParentBB)
Codegen a new tail for a stack protector check ParentMBB which has had its tail spliced into a stack ...
bool handleDebugValue(ArrayRef< const Value * > Values, DILocalVariable *Var, DIExpression *Expr, DebugLoc DbgLoc, unsigned Order, bool IsVariadic)
For a given list of Values, attempt to create and record a SDDbgValue in the SelectionDAG.
SDValue getControlRoot()
Similar to getRoot, but instead of flushing all the PendingLoad items, flush all the PendingExports (...
void UpdateSplitBlock(MachineBasicBlock *First, MachineBasicBlock *Last)
When an MBB was split during scheduling, update the references that need to refer to the last resulti...
SDValue getValueImpl(const Value *V)
getValueImpl - Helper function for getValue and getNonRegisterValue.
void visitSwitchCase(SwitchCG::CaseBlock &CB, MachineBasicBlock *SwitchBB)
visitSwitchCase - Emits the necessary code to represent a single node in the binary search tree resul...
void visitSPDescriptorFailure(StackProtectorDescriptor &SPD)
Codegen the failure basic block for a stack protector check.
std::unique_ptr< FunctionLoweringInfo > FuncInfo
SmallPtrSet< const Instruction *, 4 > ElidedArgCopyInstrs
const TargetLowering * TLI
MachineRegisterInfo * RegInfo
std::unique_ptr< SwiftErrorValueTracking > SwiftError
virtual void emitFunctionEntryCode()
std::unique_ptr< SelectionDAGBuilder > SDB
virtual std::pair< SDValue, SDValue > EmitTargetCodeForMemccpy(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, SDValue C, SDValue Size, const CallInst *CI) const
Emit target-specific code that performs a memccpy, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrnlen(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src, SDValue MaxLength, MachinePointerInfo SrcPtrInfo) const
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrlen(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src, const CallInst *CI) const
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrstr(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, const CallInst *CI) const
Emit target-specific code that performs a strstr, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForMemchr(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Src, SDValue Char, SDValue Length, MachinePointerInfo SrcPtrInfo) const
Emit target-specific code that performs a memchr, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrcmp(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, MachinePointerInfo Op1PtrInfo, MachinePointerInfo Op2PtrInfo, const CallInst *CI) const
Emit target-specific code that performs a strcmp, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForMemcmp(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, SDValue Op3, const CallInst *CI) const
Emit target-specific code that performs a memcmp/bcmp, in cases where that is faster than a libcall.
virtual SDValue EmitTargetCodeForSetTag(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Addr, SDValue Size, MachinePointerInfo DstPtrInfo, bool ZeroData) const
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrcpy(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dest, SDValue Src, MachinePointerInfo DestPtrInfo, MachinePointerInfo SrcPtrInfo, bool isStpcpy, const CallInst *CI) const
Emit target-specific code that performs a strcpy or stpcpy, in cases where that is faster than a libc...
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
SDValue getExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT, unsigned Opcode)
Convert Op, which must be of integer type, to the integer type VT, by either any/sign/zero-extending ...
const SDValue & getRoot() const
Return the root tag of the SelectionDAG.
const TargetSubtargetInfo & getSubtarget() const
SDValue getCopyToReg(SDValue Chain, const SDLoc &dl, Register Reg, SDValue N)
LLVM_ABI SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
LLVM_ABI SDValue getShiftAmountConstant(uint64_t Val, EVT VT, const SDLoc &DL)
LLVM_ABI MachineSDNode * getMachineNode(unsigned Opcode, const SDLoc &dl, EVT VT)
These are used for target selectors to create a new node with specified return type(s),...
LLVM_ABI void ExtractVectorElements(SDValue Op, SmallVectorImpl< SDValue > &Args, unsigned Start=0, unsigned Count=0, EVT EltVT=EVT())
Append the extracted elements from Start to Count out of the vector Op in Args.
LLVM_ABI SDValue getConstantPool(const Constant *C, EVT VT, MaybeAlign Align=std::nullopt, int Offs=0, bool isT=false, unsigned TargetFlags=0)
LLVM_ABI SDValue getConstantFP(double Val, const SDLoc &DL, EVT VT, bool isTarget=false)
Create a ConstantFPSDNode wrapping a constant value.
LLVM_ABI SDValue getRegister(Register Reg, EVT VT)
LLVM_ABI SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr)
Loads are not normal binary operators: their result type is not determined by their operands,...
LLVM_ABI Align getEVTAlign(EVT MemoryVT) const
Compute the default alignment value for the given type.
LLVM_ABI bool shouldOptForSize() const
const TargetLowering & getTargetLoweringInfo() const
static constexpr unsigned MaxRecursionDepth
LLVM_ABI void AddDbgValue(SDDbgValue *DB, bool isParameter)
Add a dbg_value SDNode.
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Ops)
Return an ISD::BUILD_VECTOR node.
LLVM_ABI SDValue getBitcast(EVT VT, SDValue V)
Return a bitcast using the SDLoc of the value operand, and casting to the provided type.
LLVM_ABI SDDbgValue * getDbgValueList(DIVariable *Var, DIExpression *Expr, ArrayRef< SDDbgOperand > Locs, ArrayRef< SDNode * > Dependencies, bool IsIndirect, const DebugLoc &DL, unsigned O, bool IsVariadic)
Creates a SDDbgValue node from a list of locations.
SDValue getCopyFromReg(SDValue Chain, const SDLoc &dl, Register Reg, EVT VT)
LLVM_ABI void setNodeMemRefs(MachineSDNode *N, ArrayRef< MachineMemOperand * > NewMemRefs)
Mutate the specified machine node's memory references to the provided list.
const DataLayout & getDataLayout() const
SDValue getTargetFrameIndex(int FI, EVT VT)
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getMemBasePlusOffset(SDValue Base, TypeSize Offset, const SDLoc &DL, const SDNodeFlags Flags=SDNodeFlags())
Returns sum of the base pointer and offset.
LLVM_ABI SDValue getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
LLVM_ABI SDValue getBasicBlock(MachineBasicBlock *MBB)
LLVM_ABI SDValue getPtrExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either truncating it or perform...
LLVM_ABI SDValue getAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either any-extending or truncat...
const LibcallLoweringInfo & getLibcalls() const
LLVM_ABI SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI SDValue getValueType(EVT)
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
LLVM_ABI SDValue getFPExtendOrRound(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of float type, to the float type VT, by either extending or rounding (by tr...
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
LLVM_ABI SDValue getVectorIdxConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
MachineFunction & getMachineFunction() const
LLVM_ABI SDValue getFrameIndex(int FI, EVT VT, bool isTarget=false)
LLVM_ABI SDValue getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either zero-extending or trunca...
LLVMContext * getContext() const
const SDValue & setRoot(SDValue N)
Set the current root tag of the SelectionDAG.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void swap(SmallVectorImpl &RHS)
void resize(size_type N)
void push_back(const T &Elt)
pointer data()
Return a pointer to the vector's buffer, even if empty().
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Encapsulates all of the information needed to generate a stack protector check, and signals to isel w...
MachineBasicBlock * getSuccessMBB()
MachineBasicBlock * getFailureMBB()
MachineBasicBlock * getParentMBB()
bool shouldEmitFunctionBasedCheckStackProtector() const
An instruction for storing to memory.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:140
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:137
Multiway switch.
Information about stack frame layout on the target.
virtual TargetStackID::Value getStackIDForScalableVectors() const
Returns the StackID that scalable vectors should be associated with.
Provides information about what library functions are available for the current target.
virtual Align getByValTypeAlignment(Type *Ty, const DataLayout &DL) const
Returns the desired alignment for ByVal or InAlloca aggregate function arguments in the caller parame...
virtual bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF, EVT) const
Return true if an FMA operation is faster than a pair of fmul and fadd instructions.
EVT getMemValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Function * getSSPStackGuardCheck(const Module &M, const LibcallLoweringInfo &Libcalls) const
If the target has a standard stack protection check function that performs validation and error handl...
EVT getValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Return the EVT corresponding to this LLVM type.
LegalizeAction
This enum indicates whether operations are valid for a target, and if not, what action should be used...
virtual bool useStackGuardXorFP() const
If this function returns true, stack protection checks should XOR the frame pointer (or whichever poi...
virtual const TargetRegisterClass * getRegClassFor(MVT VT, bool isDivergent=false) const
Return the register class that should be used for the specified value type.
virtual bool isLegalScaleForGatherScatter(uint64_t Scale, uint64_t ElemSize) const
virtual bool isSExtCheaperThanZExt(EVT FromTy, EVT ToTy) const
Return true if sign-extension from FromTy to ToTy is cheaper than zero-extension.
MVT getVectorIdxTy(const DataLayout &DL) const
Returns the type to be used for the index operand of: ISD::INSERT_VECTOR_ELT, ISD::EXTRACT_VECTOR_ELT...
virtual unsigned getNumRegistersForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain targets require unusual breakdowns of certain types.
virtual bool isZExtFree(Type *FromTy, Type *ToTy) const
Return true if any actual instruction that defines a value of type FromTy implicitly zero-extends the...
virtual MVT getRegisterTypeForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain combinations of ABIs, Targets and features require that types are legal for some operations a...
virtual unsigned getNumRegisters(LLVMContext &Context, EVT VT, std::optional< MVT > RegisterVT=std::nullopt) const
Return the number of registers that this ValueType will eventually require.
unsigned getBitWidthForCttzElements(Type *RetTy, ElementCount EC, bool ZeroIsPoison, const ConstantRange *VScaleRange) const
Return the minimum number of bits required to hold the maximum possible number of trailing zero vecto...
virtual bool shouldExtendGSIndex(EVT VT, EVT &EltTy) const
Returns true if the index type for a masked gather/scatter requires extending.
virtual unsigned getVectorTypeBreakdownForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const
Certain targets such as MIPS require that some types such as vectors are always broken down into scal...
Register getStackPointerRegisterToSaveRestore() const
If a physical register, this specifies the register that llvm.savestack/llvm.restorestack should save...
LegalizeAction getFixedPointOperationAction(unsigned Op, EVT VT, unsigned Scale) const
Some fixed point operations may be natively supported by the target but only for specific scales.
MachineMemOperand::Flags getAtomicMemOperandFlags(const Instruction &AI, const DataLayout &DL) const
virtual bool allowsMisalignedMemoryAccesses(EVT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *=nullptr) const
Determine if the target supports unaligned memory accesses.
bool isOperationCustom(unsigned Op, EVT VT) const
Return true if the operation uses custom lowering, regardless of whether the type is legal or not.
bool hasBigEndianPartOrdering(EVT VT, const DataLayout &DL) const
When splitting a value of the specified type into parts, does the Lo or Hi part come first?
EVT getShiftAmountTy(EVT LHSTy, const DataLayout &DL) const
Returns the type for the shift amount of a shift opcode.
virtual Align getABIAlignmentForCallingConv(Type *ArgTy, const DataLayout &DL) const
Certain targets have context sensitive alignment requirements, where one type has the alignment requi...
MachineMemOperand::Flags getVPIntrinsicMemOperandFlags(const VPIntrinsic &VPIntrin) const
virtual bool shouldExpandGetActiveLaneMask(EVT VT, EVT OpVT) const
Return true if the @llvm.get.active.lane.mask intrinsic should be expanded using generic code in Sele...
virtual EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const
Return the ValueType of the result of SETCC operations.
MachineMemOperand::Flags getLoadMemOperandFlags(const LoadInst &LI, const DataLayout &DL, AssumptionCache *AC=nullptr, const TargetLibraryInfo *LibInfo=nullptr) const
virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
MVT getProgramPointerTy(const DataLayout &DL) const
Return the type for code pointers, which is determined by the program address space specified through...
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
bool isOperationLegal(unsigned Op, EVT VT) const
Return true if the specified operation is legal on this target.
virtual bool shouldExpandVectorMatch(EVT VT, unsigned SearchSize) const
Return true if the @llvm.experimental.vector.match intrinsic should be expanded for vector type ‘VT’ ...
virtual MVT getFenceOperandTy(const DataLayout &DL) const
Return the type for operands of fence.
virtual bool shouldExpandGetVectorLength(EVT CountVT, unsigned VF, bool IsScalable) const
bool isOperationLegalOrCustom(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal with custom lower...
virtual MVT hasFastEqualityCompare(unsigned NumBits) const
Return the preferred operand type if the target has a quick way to compare integer values of the give...
MachineMemOperand::Flags getStoreMemOperandFlags(const StoreInst &SI, const DataLayout &DL) const
virtual void getTgtMemIntrinsic(SmallVectorImpl< IntrinsicInfo > &Infos, const CallBase &I, MachineFunction &MF, unsigned Intrinsic) const
Given an intrinsic, checks if on the target the intrinsic will need to map to a MemIntrinsicNode (tou...
virtual bool shouldExpandCttzElements(EVT VT) const
Return true if the @llvm.experimental.cttz.elts intrinsic should be expanded using generic code in Se...
virtual bool signExtendConstant(const ConstantInt *C) const
Return true if this constant should be sign extended when promoting to a larger type.
virtual Value * getSDagStackGuard(const Module &M, const LibcallLoweringInfo &Libcalls) const
Return the variable that's previously inserted by insertSSPDeclarations, if any, otherwise return nul...
LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const
Return how we should legalize values of this type, either it is already legal (return 'Legal') or we ...
virtual Register getExceptionPointerRegister(const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception address on entry to an ...
bool supportsUnalignedAtomics() const
Whether the target supports unaligned atomic operations.
std::vector< ArgListEntry > ArgListTy
bool isBeneficialToExpandPowI(int64_t Exponent, bool OptForSize) const
Return true if it is beneficial to expand an @llvm.powi.
MVT getFrameIndexTy(const DataLayout &DL) const
Return the type for frame index, which is determined by the alloca address space specified through th...
virtual Register getExceptionSelectorRegister(const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception typeid on entry to a la...
virtual MVT getPointerMemTy(const DataLayout &DL, uint32_t AS=0) const
Return the in-memory pointer type for the given address space, defaults to the pointer type from the ...
MVT getRegisterType(MVT VT) const
Return the type of registers that this ValueType will eventually require.
unsigned getVectorTypeBreakdown(LLVMContext &Context, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const
Vector types are broken down into some number of legal first class types.
virtual MVT getVPExplicitVectorLengthTy() const
Returns the type to be used for the EVL/AVL operand of VP nodes: ISD::VP_ADD, ISD::VP_SUB,...
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
virtual bool supportKCFIBundles() const
Return true if the target supports kcfi operand bundles.
virtual bool supportPtrAuthBundles() const
Return true if the target supports ptrauth operand bundles.
virtual bool supportSwiftError() const
Return true if the target supports swifterror attribute.
virtual SDValue visitMaskedLoad(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, MachineMemOperand *MMO, SDValue &NewLoad, SDValue Ptr, SDValue PassThru, SDValue Mask) const
virtual SDValue emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val, const SDLoc &DL) const
virtual EVT getTypeForExtReturn(LLVMContext &Context, EVT VT, ISD::NodeType) const
Return the type that should be used to zero or sign extend a zeroext/signext integer return value.
virtual InlineAsm::ConstraintCode getInlineAsmMemConstraint(StringRef ConstraintCode) const
std::vector< AsmOperandInfo > AsmOperandInfoVector
SDValue expandIS_FPCLASS(EVT ResultVT, SDValue Op, FPClassTest Test, SDNodeFlags Flags, const SDLoc &DL, SelectionDAG &DAG) const
Expand check for floating point class.
virtual SDValue prepareVolatileOrAtomicLoad(SDValue Chain, const SDLoc &DL, SelectionDAG &DAG) const
This callback is used to prepare for a volatile or atomic load.
virtual ConstraintType getConstraintType(StringRef Constraint) const
Given a constraint, return the type of constraint it is for this target.
virtual bool splitValueIntoRegisterParts(SelectionDAG &DAG, const SDLoc &DL, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, std::optional< CallingConv::ID > CC) const
Target-specific splitting of values into parts that fit a register storing a legal type.
virtual SDValue joinRegisterPartsIntoValue(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, std::optional< CallingConv::ID > CC) const
Target-specific combining of register parts into its original value.
virtual SDValue LowerCall(CallLoweringInfo &, SmallVectorImpl< SDValue > &) const
This hook must be implemented to lower calls into the specified DAG.
std::pair< SDValue, SDValue > LowerCallTo(CallLoweringInfo &CLI) const
This function lowers an abstract call to a function into an actual call.
virtual SDValue LowerAsmOutputForConstraint(SDValue &Chain, SDValue &Glue, const SDLoc &DL, const AsmOperandInfo &OpInfo, SelectionDAG &DAG) const
virtual std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const
Given a physical register constraint (e.g.
virtual AsmOperandInfoVector ParseConstraints(const DataLayout &DL, const TargetRegisterInfo *TRI, const CallBase &Call) const
Split up the constraint string from the inline assembly value into the specific constraints and their...
virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const
This callback is invoked for operations that are unsupported by the target, which are registered to u...
virtual bool functionArgumentNeedsConsecutiveRegisters(Type *Ty, CallingConv::ID CallConv, bool isVarArg, const DataLayout &DL) const
For some targets, an LLVM struct type must be broken down into multiple simple types,...
virtual void ComputeConstraintToUse(AsmOperandInfo &OpInfo, SDValue Op, SelectionDAG *DAG=nullptr) const
Determines the constraint code and constraint type to use for the specific AsmOperandInfo,...
virtual void CollectTargetIntrinsicOperands(const CallInst &I, SmallVectorImpl< SDValue > &Ops, SelectionDAG &DAG) const
virtual SDValue visitMaskedStore(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, MachineMemOperand *MMO, SDValue Ptr, SDValue Val, SDValue Mask) const
virtual bool useLoadStackGuardNode(const Module &M) const
If this function returns true, SelectionDAGBuilder emits a LOAD_STACK_GUARD node when it is lowering ...
virtual void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint, std::vector< SDValue > &Ops, SelectionDAG &DAG) const
Lower the specified operand into the Ops vector.
std::pair< SDValue, SDValue > makeLibCall(SelectionDAG &DAG, RTLIB::LibcallImpl LibcallImpl, EVT RetVT, ArrayRef< SDValue > Ops, MakeLibCallOptions CallOptions, const SDLoc &dl, SDValue Chain=SDValue()) const
Returns a pair of (return value, chain).
virtual void LowerOperationWrapper(SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG) const
This callback is invoked by the type legalizer to legalize nodes with an illegal operand type but leg...
virtual bool isInlineAsmTargetBranch(const SmallVectorImpl< StringRef > &AsmStrs, unsigned OpNo) const
On x86, return true if the operand with index OpNo is a CALL or JUMP instruction, which can use eithe...
virtual MVT getJumpTableRegTy(const DataLayout &DL) const
virtual bool CanLowerReturn(CallingConv::ID, MachineFunction &, bool, const SmallVectorImpl< ISD::OutputArg > &, LLVMContext &, const Type *RetTy) const
This hook should be implemented to check whether the return values described by the Outs array can fi...
CodeGenOptLevel getOptLevel() const
Returns the optimization level: None, Less, Default, or Aggressive.
unsigned NoTrapAfterNoreturn
Do not emit a trap instruction for 'unreachable' IR instructions behind noreturn calls,...
unsigned TrapUnreachable
Emit target-specific trap instruction for 'unreachable' IR instructions.
unsigned getID() const
Return the register class ID number.
iterator begin() const
begin/end - Return all of the registers in this class.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
@ TCK_Latency
The latency of instruction.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:343
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
LLVM_ABI bool isEmptyTy() const
Return true if this type is empty, that is, it has no elements or all of its elements are empty.
Definition Type.cpp:180
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:273
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:267
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:280
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:352
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:128
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:293
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:240
bool isTokenTy() const
Return true if this is 'token'.
Definition Type.h:234
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
Definition Type.cpp:300
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Definition Type.h:225
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:139
This function has undefined behavior.
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
op_iterator op_begin()
Definition User.h:259
Value * getOperand(unsigned i) const
Definition User.h:207
unsigned getNumOperands() const
Definition User.h:229
op_iterator op_end()
Definition User.h:261
This class represents the va_arg llvm instruction, which returns an argument of the specified type gi...
LLVM_ABI CmpInst::Predicate getPredicate() const
This is the common base class for vector predication intrinsics.
static LLVM_ABI std::optional< unsigned > getVectorLengthParamPos(Intrinsic::ID IntrinsicID)
LLVM_ABI MaybeAlign getPointerAlignment() const
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:439
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:259
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 StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
Base class of all SIMD vector types.
Type * getElementType() const
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:230
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
const ParentTy * getParent() const
Definition ilist_node.h:34
A raw_ostream that writes to an std::string.
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char SymbolName[]
Key for Kernel::Metadata::mSymbolName.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
Definition CallingConv.h:60
@ AMDGPU_CS_Chain
Used on AMDGPUs to give the middle-end more control over argument placement.
@ X86_VectorCall
MSVC calling convention that passes vectors and vector aggregates in SSE registers.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:41
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition ISDOpcodes.h:261
@ STACKRESTORE
STACKRESTORE has two operands, an input chain and a pointer to restore to it returns an output chain.
@ STACKSAVE
STACKSAVE - STACKSAVE has one operand, an input chain.
@ CTLZ_ZERO_UNDEF
Definition ISDOpcodes.h:788
@ CONVERGENCECTRL_ANCHOR
The llvm.experimental.convergence.* intrinsics.
@ STRICT_FSETCC
STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used for floating-point operands only.
Definition ISDOpcodes.h:511
@ DELETED_NODE
DELETED_NODE - This is an illegal value that is used to catch errors.
Definition ISDOpcodes.h:45
@ SET_FPENV
Sets the current floating-point environment.
@ LOOP_DEPENDENCE_RAW_MASK
@ VECREDUCE_SEQ_FADD
Generic reduction nodes.
@ COND_LOOP
COND_LOOP is a conditional branch to self, used for implementing efficient conditional traps.
@ EH_SJLJ_LONGJMP
OUTCHAIN = EH_SJLJ_LONGJMP(INCHAIN, buffer) This corresponds to the eh.sjlj.longjmp intrinsic.
Definition ISDOpcodes.h:168
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition ISDOpcodes.h:600
@ STACKADDRESS
STACKADDRESS - Represents the llvm.stackaddress intrinsic.
Definition ISDOpcodes.h:127
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:779
@ SMULFIX
RESULT = [US]MULFIX(LHS, RHS, SCALE) - Perform fixed point multiplication on 2 integers with the same...
Definition ISDOpcodes.h:394
@ VAEND
VAEND, VASTART - VAEND and VASTART have three operands: an input chain, pointer, and a SRCVALUE.
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, val, ptr) This corresponds to "store atomic" instruction.
@ RESET_FPENV
Set floating-point environment to default state.
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:264
@ SMULFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
Definition ISDOpcodes.h:400
@ SET_FPMODE
Sets the current dynamic floating-point control modes.
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:853
@ ATOMIC_LOAD_USUB_COND
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:518
@ VECTOR_FIND_LAST_ACTIVE
Finds the index of the last active mask element Operands: Mask.
@ FMODF
FMODF - Decomposes the operand into integral and fractional parts, each having the same type and sign...
@ FATAN2
FATAN2 - atan2, inspired by libm.
@ FSINCOSPI
FSINCOSPI - Compute both the sine and cosine times pi more accurately than FSINCOS(pi*x),...
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition ISDOpcodes.h:220
@ EH_SJLJ_SETUP_DISPATCH
OUTCHAIN = EH_SJLJ_SETUP_DISPATCH(INCHAIN) The target initializes the dispatch table here.
Definition ISDOpcodes.h:172
@ GlobalAddress
Definition ISDOpcodes.h:88
@ ATOMIC_CMP_SWAP_WITH_SUCCESS
Val, Success, OUTCHAIN = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) N.b.
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
Definition ISDOpcodes.h:880
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition ISDOpcodes.h:584
@ VECREDUCE_FMAX
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:417
@ VECREDUCE_FMAXIMUM
FMINIMUM/FMAXIMUM nodes propatate NaNs and signed zeroes using the llvm.minimum and llvm....
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
Definition ISDOpcodes.h:747
@ ATOMIC_FENCE
OUTCHAIN = ATOMIC_FENCE(INCHAIN, ordering, scope) This corresponds to the fence instruction.
@ RESET_FPMODE
Sets default dynamic floating-point control modes.
@ FMULADD
FMULADD - Performs a * b + c, with, or without, intermediate rounding.
Definition ISDOpcodes.h:528
@ FPTRUNC_ROUND
FPTRUNC_ROUND - This corresponds to the fptrunc_round intrinsic.
Definition ISDOpcodes.h:515
@ FAKE_USE
FAKE_USE represents a use of the operand but does not do anything.
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
Definition ISDOpcodes.h:993
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
Definition ISDOpcodes.h:254
@ CLMUL
Carry-less multiplication operations.
Definition ISDOpcodes.h:774
@ INIT_TRAMPOLINE
INIT_TRAMPOLINE - This corresponds to the init_trampoline intrinsic.
@ FLDEXP
FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
@ SDIVFIX
RESULT = [US]DIVFIX(LHS, RHS, SCALE) - Perform fixed point division on 2 integers with the same width...
Definition ISDOpcodes.h:407
@ EH_LABEL
EH_LABEL - Represents a label in mid basic block used to track locations needed for debug and excepti...
@ ATOMIC_LOAD_USUB_SAT
@ EH_RETURN
OUTCHAIN = EH_RETURN(INCHAIN, OFFSET, HANDLER) - This node represents 'eh_return' gcc dwarf builtin,...
Definition ISDOpcodes.h:156
@ ANNOTATION_LABEL
ANNOTATION_LABEL - Represents a mid basic block label used by annotations.
@ SET_ROUNDING
Set rounding mode.
Definition ISDOpcodes.h:975
@ CONVERGENCECTRL_GLUE
This does not correspond to any convergence control intrinsic.
@ PARTIAL_REDUCE_UMLA
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:844
@ PREALLOCATED_SETUP
PREALLOCATED_SETUP - This has 2 operands: an input chain and a SRCVALUE with the preallocated call Va...
@ READSTEADYCOUNTER
READSTEADYCOUNTER - This corresponds to the readfixedcounter intrinsic.
@ ADDROFRETURNADDR
ADDROFRETURNADDR - Represents the llvm.addressofreturnaddress intrinsic.
Definition ISDOpcodes.h:117
@ CONVERGENCECTRL_ENTRY
@ BR
Control flow instructions. These all have token chains.
@ VECREDUCE_FADD
These reductions have relaxed evaluation order semantics, and have a single vector operand.
@ CTTZ_ZERO_UNDEF
Bit counting operators with an undefined result for zero inputs.
Definition ISDOpcodes.h:787
@ PARTIAL_REDUCE_FMLA
@ PREFETCH
PREFETCH - This corresponds to a prefetch intrinsic.
@ FSINCOS
FSINCOS - Compute both fsin and fcos as a single operation.
@ SSUBO
Same for subtraction.
Definition ISDOpcodes.h:352
@ PREALLOCATED_ARG
PREALLOCATED_ARG - This has 3 operands: an input chain, a SRCVALUE with the preallocated call Value,...
@ BRIND
BRIND - Indirect branch.
@ BR_JT
BR_JT - Jumptable branch.
@ VECTOR_INTERLEAVE
VECTOR_INTERLEAVE(VEC1, VEC2, ...) - Returns N vectors from N input vectors, where N is the factor to...
Definition ISDOpcodes.h:635
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition ISDOpcodes.h:541
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
Definition ISDOpcodes.h:548
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition ISDOpcodes.h:374
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:796
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
Definition ISDOpcodes.h:247
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition ISDOpcodes.h:672
@ VACOPY
VACOPY - VACOPY has 5 operands: an input chain, a destination pointer, a source pointer,...
@ GET_ACTIVE_LANE_MASK
GET_ACTIVE_LANE_MASK - this corrosponds to the llvm.get.active.lane.mask intrinsic.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition ISDOpcodes.h:230
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition ISDOpcodes.h:348
@ ARITH_FENCE
ARITH_FENCE - This corresponds to a arithmetic fence intrinsic.
@ VECREDUCE_ADD
Integer reductions may have a result type larger than the vector element type.
@ GET_ROUNDING
Returns current rounding mode: -1 Undefined 0 Round to 0 1 Round to nearest, ties to even 2 Round to ...
Definition ISDOpcodes.h:970
@ CLEANUPRET
CLEANUPRET - Represents a return from a cleanup block funclet.
@ ATOMIC_LOAD_FMAXIMUM
@ GET_FPMODE
Reads the current dynamic floating-point control modes.
@ GET_FPENV
Gets the current floating-point environment.
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:765
@ AssertNoFPClass
AssertNoFPClass - These nodes record if a register contains a float value that is known to be not som...
Definition ISDOpcodes.h:78
@ PtrAuthGlobalAddress
A ptrauth constant.
Definition ISDOpcodes.h:100
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition ISDOpcodes.h:614
@ EntryToken
EntryToken - This is the marker used to indicate the start of a region.
Definition ISDOpcodes.h:48
@ READ_REGISTER
READ_REGISTER, WRITE_REGISTER - This node represents llvm.register on the DAG, which implements the n...
Definition ISDOpcodes.h:139
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition ISDOpcodes.h:576
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:850
@ DEBUGTRAP
DEBUGTRAP - Trap intended to get the attention of a debugger.
@ VSCALE
VSCALE(IMM) - Returns the runtime scaling factor used to calculate the number of elements within a sc...
@ LOCAL_RECOVER
LOCAL_RECOVER - Represents the llvm.localrecover intrinsic.
Definition ISDOpcodes.h:135
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum maximum on two values, following IEEE-754 definition...
@ UBSANTRAP
UBSANTRAP - Trap with an immediate describing the kind of sanitizer failure.
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
Definition ISDOpcodes.h:386
@ PATCHPOINT
The llvm.experimental.patchpoint.
@ SMULO
Same for multiplication.
Definition ISDOpcodes.h:356
@ ATOMIC_LOAD_FMINIMUM
@ DYNAMIC_STACKALLOC
DYNAMIC_STACKALLOC - Allocate some number of bytes on the stack aligned to a specified boundary.
@ VECTOR_SPLICE_LEFT
VECTOR_SPLICE_LEFT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1, VEC2) left by OFFSET elements an...
Definition ISDOpcodes.h:653
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:727
@ VECTOR_REVERSE
VECTOR_REVERSE(VECTOR) - Returns a vector, of the same type as VECTOR, whose elements are shuffled us...
Definition ISDOpcodes.h:640
@ SDIVFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
Definition ISDOpcodes.h:413
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:978
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition ISDOpcodes.h:805
@ PCMARKER
PCMARKER - This corresponds to the pcmarker intrinsic.
@ INLINEASM_BR
INLINEASM_BR - Branching version of inline asm. Used by asm-goto.
@ EH_DWARF_CFA
EH_DWARF_CFA - This node represents the pointer to the DWARF Canonical Frame Address (CFA),...
Definition ISDOpcodes.h:150
@ FRAMEADDR
FRAMEADDR, RETURNADDR - These nodes represent llvm.frameaddress and llvm.returnaddress on the DAG.
Definition ISDOpcodes.h:110
@ ATOMIC_LOAD_UDEC_WRAP
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition ISDOpcodes.h:500
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:926
@ READCYCLECOUNTER
READCYCLECOUNTER - This corresponds to the readcyclecounter intrinsic.
@ RELOC_NONE
Issue a no-op relocation against a given symbol at the current location.
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:739
@ TRAP
TRAP - Trapping instruction.
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition ISDOpcodes.h:205
@ SCMP
[US]CMP - 3-way comparison of signed or unsigned integers.
Definition ISDOpcodes.h:735
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1,VEC2) right by OFFSET elements a...
Definition ISDOpcodes.h:657
@ STRICT_FADD
Constrained versions of the binary floating point operators.
Definition ISDOpcodes.h:427
@ STACKMAP
The llvm.experimental.stackmap intrinsic.
@ FREEZE
FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or is evaluated to UNDEF),...
Definition ISDOpcodes.h:241
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition ISDOpcodes.h:565
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:53
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition ISDOpcodes.h:959
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
Definition ISDOpcodes.h:699
@ SPONENTRY
SPONENTRY - Represents the llvm.sponentry intrinsic.
Definition ISDOpcodes.h:122
@ CLEAR_CACHE
llvm.clear_cache intrinsic Operands: Input Chain, Start Addres, End Address Outputs: Output Chain
@ CONVERGENCECTRL_LOOP
@ INLINEASM
INLINEASM - Represents an inline asm block.
@ FP_TO_SINT_SAT
FP_TO_[US]INT_SAT - Convert floating point value in operand 0 to a signed or unsigned scalar integer ...
Definition ISDOpcodes.h:945
@ VECREDUCE_FMINIMUM
@ EH_SJLJ_SETJMP
RESULT, OUTCHAIN = EH_SJLJ_SETJMP(INCHAIN, buffer) This corresponds to the eh.sjlj....
Definition ISDOpcodes.h:162
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:856
@ BRCOND
BRCOND - Conditional branch.
@ VECREDUCE_SEQ_FMUL
@ CATCHRET
CATCHRET - Represents a return from a catch block funclet.
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition ISDOpcodes.h:62
@ ATOMIC_LOAD_UINC_WRAP
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition ISDOpcodes.h:534
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition ISDOpcodes.h:365
@ VECTOR_DEINTERLEAVE
VECTOR_DEINTERLEAVE(VEC1, VEC2, ...) - Returns N vectors from N input vectors, where N is the factor ...
Definition ISDOpcodes.h:624
@ GET_DYNAMIC_AREA_OFFSET
GET_DYNAMIC_AREA_OFFSET - get offset from native SP to the address of the most recent dynamic alloca.
@ FMINIMUMNUM
FMINIMUMNUM/FMAXIMUMNUM - minimumnum/maximumnum that is same with FMINNUM_IEEE and FMAXNUM_IEEE besid...
@ ADJUST_TRAMPOLINE
ADJUST_TRAMPOLINE - This corresponds to the adjust_trampoline intrinsic.
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition ISDOpcodes.h:213
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:556
@ LOOP_DEPENDENCE_WAR_MASK
The llvm.loop.dependence.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM.
Flag
These should be considered private to the implementation of the MCInstrDesc class.
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
bool match(Val *V, const Pattern &P)
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
TwoOps_match< Val_t, Idx_t, Instruction::ExtractElement > m_ExtractElt(const Val_t &Val, const Idx_t &Idx)
Matches ExtractElementInst.
IntrinsicID_match m_VScale()
Matches a call to llvm.vscale().
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
Offsets
Offsets in bytes from the start of the input buffer.
std::pair< JumpTableHeader, JumpTable > JumpTableBlock
void sortAndRangeify(CaseClusterVector &Clusters)
Sort Clusters and merge adjacent cases.
std::vector< CaseCluster > CaseClusterVector
@ CC_Range
A cluster of adjacent case labels with the same destination, or just one case.
@ CC_JumpTable
A cluster of cases suitable for jump table lowering.
@ CC_BitTests
A cluster of cases suitable for bit test lowering.
SmallVector< SwitchWorkListItem, 4 > SwitchWorkList
CaseClusterVector::iterator CaseClusterIt
initializer< Ty > init(const Ty &Val)
LocationClass< Ty > location(Ty &L)
@ DW_OP_LLVM_arg
Only used in LLVM metadata.
Definition Dwarf.h:149
ExceptionBehavior
Exception behavior used for floating point operations.
Definition FPEnv.h:39
@ ebStrict
This corresponds to "fpexcept.strict".
Definition FPEnv.h:42
@ ebMayTrap
This corresponds to "fpexcept.maytrap".
Definition FPEnv.h:41
@ ebIgnore
This corresponds to "fpexcept.ignore".
Definition FPEnv.h:40
constexpr float log2ef
Definition MathExtras.h:51
constexpr double e
constexpr float ln2f
Definition MathExtras.h:49
NodeAddr< FuncNode * > Func
Definition RDFGraph.h:393
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
Definition Threading.h:280
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition MathExtras.h:344
@ Offset
Definition DWP.cpp:532
@ Length
Definition DWP.cpp:532
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred)
getICmpCondCode - Return the ISD condition code corresponding to the given LLVM IR integer condition ...
Definition Analysis.cpp:237
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
Definition STLExtras.h:1669
LLVM_ABI void GetReturnInfo(CallingConv::ID CC, Type *ReturnType, AttributeList attr, SmallVectorImpl< ISD::OutputArg > &Outs, const TargetLowering &TLI, const DataLayout &DL)
Given an LLVM IR type and return type attributes, compute the return value EVTs and flags,...
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
LLVM_ABI bool isOnlyUsedInZeroEqualityComparison(const Instruction *CxtI)
void ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, Type *Ty, SmallVectorImpl< EVT > &ValueVTs, SmallVectorImpl< EVT > *MemVTs=nullptr, SmallVectorImpl< TypeSize > *Offsets=nullptr, TypeSize StartingOffset=TypeSize::getZero())
ComputeValueVTs - Given an LLVM IR type, compute a sequence of EVTs that represent all the individual...
Definition Analysis.cpp:119
LLVM_ABI SDValue peekThroughBitcasts(SDValue V)
Return the non-bitcasted source operand of V if it exists.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
@ Done
Definition Threading.h:60
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition bit.h:293
LLVM_ABI void diagnoseDontCall(const CallInst &CI)
auto successors(const MachineBasicBlock *BB)
bool isIntOrFPConstant(SDValue V)
Return true if V is either a integer or FP constant.
static ConstantRange getRange(Value *Op, SCCPSolver &Solver, const SmallPtrSetImpl< Value * > &InsertedValues)
Helper for getting ranges from Solver.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2208
Value * GetPointerBaseWithConstantOffset(Value *Ptr, int64_t &Offset, const DataLayout &DL, bool AllowNonInbounds=true)
Analyze the specified pointer to see if it can be expressed as a base pointer plus a constant offset.
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition MathExtras.h:243
auto cast_or_null(const Y &Val)
Definition Casting.h:714
constexpr T alignDown(U Value, V Align, W Skew=0)
Returns the largest unsigned integer less than or equal to Value and is Skew mod Align.
Definition MathExtras.h:546
gep_type_iterator gep_type_end(const User *GEP)
constexpr auto equal_to(T &&Arg)
Functor variant of std::equal_to that can be used as a UnaryPredicate in functional algorithms like a...
Definition STLExtras.h:2173
constexpr int popcount(T Value) noexcept
Count the number of set bits in a value.
Definition bit.h:154
LLVM_ABI ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
detail::concat_range< ValueT, RangeTs... > concat(RangeTs &&...Ranges)
Returns a concatenated range across two or more ranges.
Definition STLExtras.h:1152
bool isScopedEHPersonality(EHPersonality Pers)
Returns true if this personality uses scope-style EH IR instructions: catchswitch,...
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition bit.h:202
void ComputeValueTypes(const DataLayout &DL, Type *Ty, SmallVectorImpl< Type * > &Types, SmallVectorImpl< TypeSize > *Offsets=nullptr, TypeSize StartingOffset=TypeSize::getZero())
Given an LLVM IR type, compute non-aggregate subtypes.
Definition Analysis.cpp:72
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
LLVM_ABI llvm::SmallVector< int, 16 > createStrideMask(unsigned Start, unsigned Stride, unsigned VF)
Create a stride shuffle mask.
@ SPF_ABS
Floating point maxnum.
@ SPF_NABS
Absolute value.
@ SPF_FMAXNUM
Floating point minnum.
@ SPF_UMIN
Signed minimum.
@ SPF_UMAX
Signed maximum.
@ SPF_SMAX
Unsigned minimum.
@ SPF_FMINNUM
Unsigned maximum.
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
detail::zippy< detail::zip_first, T, U, Args... > zip_first(T &&t, U &&u, Args &&...args)
zip iterator that, for the sake of efficiency, assumes the first iteratee to be the shortest.
Definition STLExtras.h:854
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1636
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI SelectPatternResult matchSelectPattern(Value *V, Value *&LHS, Value *&RHS, Instruction::CastOps *CastOp=nullptr, unsigned Depth=0)
Pattern match integer [SU]MIN, [SU]MAX and ABS idioms, returning the kind and providing the out param...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
generic_gep_type_iterator<> gep_type_iterator
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
auto succ_size(const MachineBasicBlock *BB)
bool hasSingleElement(ContainerTy &&C)
Returns true if the given container only contains a single element.
Definition STLExtras.h:300
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
ISD::CondCode getFCmpCondCode(FCmpInst::Predicate Pred)
getFCmpCondCode - Return the ISD condition code corresponding to the given LLVM IR floating-point con...
Definition Analysis.cpp:203
LLVM_ABI EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
LLVM_ABI Value * salvageDebugInfoImpl(Instruction &I, uint64_t CurrentLocOps, SmallVectorImpl< uint64_t > &Ops, SmallVectorImpl< Value * > &AdditionalValues)
Definition Local.cpp:2292
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Global
Append to llvm.global_dtors.
AtomicOrdering
Atomic ordering for LLVM's memory model.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
bool isFuncletEHPersonality(EHPersonality Pers)
Returns true if this is a personality function that invokes handler funclets (which must return to it...
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:189
LLVM_ABI bool isAssignmentTrackingEnabled(const Module &M)
Return true if assignment tracking is enabled for module M.
LLVM_ABI llvm::SmallVector< int, 16 > createInterleaveMask(unsigned VF, unsigned NumVecs)
Create an interleave shuffle mask.
@ UMin
Unsigned integer min implemented in terms of select(cmp()).
@ Or
Bitwise or logical OR of integers.
@ Mul
Product of integers.
@ And
Bitwise or logical AND of integers.
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:144
@ SPNB_RETURNS_NAN
NaN behavior not applicable.
@ SPNB_RETURNS_OTHER
Given one NaN input, returns the NaN.
@ SPNB_RETURNS_ANY
Given one NaN input, returns the non-NaN.
bool isInTailCallPosition(const CallBase &Call, const TargetMachine &TM, bool ReturnsFirstArg=false)
Test if the given instruction is in a position to be optimized with a tail-call.
Definition Analysis.cpp:539
DWARFExpression::Operation Op
ISD::CondCode getFCmpCodeWithoutNaN(ISD::CondCode CC)
getFCmpCodeWithoutNaN - Given an ISD condition code comparing floats, return the equivalent code if w...
Definition Analysis.cpp:225
ArrayRef(const T &OneElt) -> ArrayRef< T >
bool isAsynchronousEHPersonality(EHPersonality Pers)
Returns true if this personality function catches asynchronous exceptions.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isKnownNeverNaN(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the floating-point scalar value is not a NaN or if the floating-point vector value has...
LLVM_ABI std::optional< RoundingMode > convertStrToRoundingMode(StringRef)
Returns a valid RoundingMode enumerator when given a string that is valid as input in constrained int...
Definition FPEnv.cpp:25
gep_type_iterator gep_type_begin(const User *GEP)
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
Definition STLExtras.h:2192
GlobalValue * ExtractTypeInfo(Value *V)
ExtractTypeInfo - Returns the type info, possibly bitcast, encoded in V.
Definition Analysis.cpp:181
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:201
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
Definition STLExtras.h:2166
LLVM_ABI Constant * ConstantFoldLoadFromConstPtr(Constant *C, Type *Ty, APInt Offset, const DataLayout &DL)
Return the value that a load from C with offset Offset would produce if it is constant and determinab...
unsigned ComputeLinearIndex(Type *Ty, const unsigned *Indices, const unsigned *IndicesEnd, unsigned CurIndex=0)
Compute the linearized index of a member in a nested aggregate/struct/array.
Definition Analysis.cpp:33
T bit_floor(T Value)
Returns the largest integral power of two no greater than Value if Value is nonzero.
Definition bit.h:330
@ Default
The result values are uniform if and only if all operands are uniform.
Definition Uniformity.h:20
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:872
#define N
#define NC
Definition regutils.h:42
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:77
Extended Value Type.
Definition ValueTypes.h:35
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
Definition ValueTypes.h:395
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
Definition ValueTypes.h:74
uint64_t getScalarStoreSize() const
Definition ValueTypes.h:402
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition ValueTypes.h:284
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:300
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition ValueTypes.h:147
ElementCount getVectorElementCount() const
Definition ValueTypes.h:350
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:373
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition ValueTypes.h:359
uint64_t getScalarSizeInBits() const
Definition ValueTypes.h:385
static LLVM_ABI EVT getEVT(Type *Ty, bool HandleUnknown=false)
Return the value type corresponding to the specified type.
EVT changeVectorElementType(LLVMContext &Context, EVT EltVT) const
Return a VT for a vector type whose attributes match ourselves with the exception of the element type...
Definition ValueTypes.h:102
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
EVT changeElementType(LLVMContext &Context, EVT EltVT) const
Return a VT for a type whose attributes match ourselves with the exception of the element type that i...
Definition ValueTypes.h:113
bool isScalarInteger() const
Return true if this is an integer, but not a vector.
Definition ValueTypes.h:157
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:264
This class contains a discriminated union of information about pointers in memory operands,...
static LLVM_ABI MachinePointerInfo getUnknownStack(MachineFunction &MF)
Stack memory without other information.
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
A lightweight accessor for an operand bundle meant to be passed around by value.
This struct represents the registers (physical or virtual) that a particular set of values is assigne...
SmallVector< std::pair< Register, TypeSize >, 4 > getRegsAndSizes() const
Return a list of registers and their sizes.
RegsForValue()=default
SmallVector< unsigned, 4 > RegCount
This list holds the number of registers for each value.
SmallVector< EVT, 4 > ValueVTs
The value types of the values, which may not be legal, and may need be promoted or synthesized from o...
SmallVector< Register, 4 > Regs
This list holds the registers assigned to the values.
void AddInlineAsmOperands(InlineAsm::Kind Code, bool HasMatching, unsigned MatchingIdx, const SDLoc &dl, SelectionDAG &DAG, std::vector< SDValue > &Ops) const
Add this value to the specified inlineasm node operand list.
SDValue getCopyFromRegs(SelectionDAG &DAG, FunctionLoweringInfo &FuncInfo, const SDLoc &dl, SDValue &Chain, SDValue *Glue, const Value *V=nullptr) const
Emit a series of CopyFromReg nodes that copies from this value and returns the result as a ValueVTs v...
SmallVector< MVT, 4 > RegVTs
The value types of the registers.
void getCopyToRegs(SDValue Val, SelectionDAG &DAG, const SDLoc &dl, SDValue &Chain, SDValue *Glue, const Value *V=nullptr, ISD::NodeType PreferredExtendType=ISD::ANY_EXTEND) const
Emit a series of CopyToReg nodes that copies the specified value into the registers specified by this...
std::optional< CallingConv::ID > CallConv
Records if this value needs to be treated in an ABI dependant manner, different to normal type legali...
bool occupiesMultipleRegs() const
Check if the total RegCount is greater than one.
These are IR-level optimization flags that may be propagated to SDNodes.
void copyFMF(const FPMathOperator &FPMO)
Propagate the fast-math-flags from an IR FPMathOperator.
void setUnpredictable(bool b)
bool hasAllowReassociation() const
void setNoUnsignedWrap(bool b)
void setNoSignedWrap(bool b)
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
A MapVector that performs no allocations if smaller than a certain size.
Definition MapVector.h:276
This structure is used to communicate between SelectionDAGBuilder and SDISel for the code generation ...
SDLoc DL
The debug location of the instruction this CaseBlock was produced from.
static CaseCluster range(const ConstantInt *Low, const ConstantInt *High, MachineBasicBlock *MBB, BranchProbability Prob)
Register Reg
The virtual register containing the index of the jump table entry to jump to.
MachineBasicBlock * Default
The MBB of the default bb, which is a successor of the range check MBB.
unsigned JTI
The JumpTableIndex for this jump table in the function.
MachineBasicBlock * MBB
The MBB into which to emit the code for the indirect jump.
std::optional< SDLoc > SL
The debug location of the instruction this JumpTable was produced from.
This contains information for each constraint that we are lowering.
TargetLowering::ConstraintType ConstraintType
Information about the constraint code, e.g.
This structure contains all information that is necessary for lowering calls.
CallLoweringInfo & setConvergent(bool Value=true)
CallLoweringInfo & setDeactivationSymbol(GlobalValue *Sym)
CallLoweringInfo & setCFIType(const ConstantInt *Type)
SmallVector< ISD::InputArg, 32 > Ins
Type * OrigRetTy
Original unlegalized return type.
CallLoweringInfo & setDiscardResult(bool Value=true)
CallLoweringInfo & setIsPatchPoint(bool Value=true)
CallLoweringInfo & setDebugLoc(const SDLoc &dl)
CallLoweringInfo & setTailCall(bool Value=true)
CallLoweringInfo & setIsPreallocated(bool Value=true)
CallLoweringInfo & setConvergenceControlToken(SDValue Token)
SmallVector< ISD::OutputArg, 32 > Outs
Type * RetTy
Same as OrigRetTy, or partially legalized for soft float libcalls.
CallLoweringInfo & setChain(SDValue InChain)
CallLoweringInfo & setPtrAuth(PtrAuthInfo Value)
CallLoweringInfo & setCallee(CallingConv::ID CC, Type *ResultType, SDValue Target, ArgListTy &&ArgsList, AttributeSet ResultAttrs={})
This structure is used to pass arguments to makeLibCall function.
MakeLibCallOptions & setDiscardResult(bool Value=true)
This structure contains the information necessary for lowering pointer-authenticating indirect calls.
void addIPToStateRange(const InvokeInst *II, MCSymbol *InvokeBegin, MCSymbol *InvokeEnd)