LLVM 22.0.0git
SelectionDAGBuilder.cpp
Go to the documentation of this file.
1//===- SelectionDAGBuilder.cpp - Selection-DAG building -------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This implements routines for translating from LLVM IR into SelectionDAG IR.
10//
11//===----------------------------------------------------------------------===//
12
13#include "SelectionDAGBuilder.h"
14#include "SDNodeDbgValue.h"
15#include "llvm/ADT/APFloat.h"
16#include "llvm/ADT/APInt.h"
17#include "llvm/ADT/BitVector.h"
18#include "llvm/ADT/STLExtras.h"
21#include "llvm/ADT/StringRef.h"
22#include "llvm/ADT/Twine.h"
26#include "llvm/Analysis/Loads.h"
58#include "llvm/IR/Argument.h"
59#include "llvm/IR/Attributes.h"
60#include "llvm/IR/BasicBlock.h"
61#include "llvm/IR/CFG.h"
62#include "llvm/IR/CallingConv.h"
63#include "llvm/IR/Constant.h"
65#include "llvm/IR/Constants.h"
66#include "llvm/IR/DataLayout.h"
67#include "llvm/IR/DebugInfo.h"
72#include "llvm/IR/Function.h"
74#include "llvm/IR/InlineAsm.h"
75#include "llvm/IR/InstrTypes.h"
78#include "llvm/IR/Intrinsics.h"
79#include "llvm/IR/IntrinsicsAArch64.h"
80#include "llvm/IR/IntrinsicsAMDGPU.h"
81#include "llvm/IR/IntrinsicsWebAssembly.h"
82#include "llvm/IR/LLVMContext.h"
84#include "llvm/IR/Metadata.h"
85#include "llvm/IR/Module.h"
86#include "llvm/IR/Operator.h"
88#include "llvm/IR/Statepoint.h"
89#include "llvm/IR/Type.h"
90#include "llvm/IR/User.h"
91#include "llvm/IR/Value.h"
92#include "llvm/MC/MCContext.h"
97#include "llvm/Support/Debug.h"
105#include <cstddef>
106#include <limits>
107#include <optional>
108#include <tuple>
109
110using namespace llvm;
111using namespace PatternMatch;
112using namespace SwitchCG;
113
114#define DEBUG_TYPE "isel"
115
116/// LimitFloatPrecision - Generate low-precision inline sequences for
117/// some float libcalls (6, 8 or 12 bits).
118static unsigned LimitFloatPrecision;
119
120static cl::opt<bool>
121 InsertAssertAlign("insert-assert-align", cl::init(true),
122 cl::desc("Insert the experimental `assertalign` node."),
124
126 LimitFPPrecision("limit-float-precision",
127 cl::desc("Generate low-precision inline sequences "
128 "for some float libcalls"),
130 cl::init(0));
131
133 "switch-peel-threshold", cl::Hidden, cl::init(66),
134 cl::desc("Set the case probability threshold for peeling the case from a "
135 "switch statement. A value greater than 100 will void this "
136 "optimization"));
137
138// Limit the width of DAG chains. This is important in general to prevent
139// DAG-based analysis from blowing up. For example, alias analysis and
140// load clustering may not complete in reasonable time. It is difficult to
141// recognize and avoid this situation within each individual analysis, and
142// future analyses are likely to have the same behavior. Limiting DAG width is
143// the safe approach and will be especially important with global DAGs.
144//
145// MaxParallelChains default is arbitrarily high to avoid affecting
146// optimization, but could be lowered to improve compile time. Any ld-ld-st-st
147// sequence over this should have been converted to llvm.memcpy by the
148// frontend. It is easy to induce this behavior with .ll code such as:
149// %buffer = alloca [4096 x i8]
150// %data = load [4096 x i8]* %argPtr
151// store [4096 x i8] %data, [4096 x i8]* %buffer
152static const unsigned MaxParallelChains = 64;
153
155 const SDValue *Parts, unsigned NumParts,
156 MVT PartVT, EVT ValueVT, const Value *V,
157 SDValue InChain,
158 std::optional<CallingConv::ID> CC);
159
160/// getCopyFromParts - Create a value that contains the specified legal parts
161/// combined into the value they represent. If the parts combine to a type
162/// larger than ValueVT then AssertOp can be used to specify whether the extra
163/// bits are known to be zero (ISD::AssertZext) or sign extended from ValueVT
164/// (ISD::AssertSext).
165static SDValue
166getCopyFromParts(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts,
167 unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V,
168 SDValue InChain,
169 std::optional<CallingConv::ID> CC = std::nullopt,
170 std::optional<ISD::NodeType> AssertOp = std::nullopt) {
171 // Let the target assemble the parts if it wants to
172 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
173 if (SDValue Val = TLI.joinRegisterPartsIntoValue(DAG, DL, Parts, NumParts,
174 PartVT, ValueVT, CC))
175 return Val;
176
177 if (ValueVT.isVector())
178 return getCopyFromPartsVector(DAG, DL, Parts, NumParts, PartVT, ValueVT, V,
179 InChain, CC);
180
181 assert(NumParts > 0 && "No parts to assemble!");
182 SDValue Val = Parts[0];
183
184 if (NumParts > 1) {
185 // Assemble the value from multiple parts.
186 if (ValueVT.isInteger()) {
187 unsigned PartBits = PartVT.getSizeInBits();
188 unsigned ValueBits = ValueVT.getSizeInBits();
189
190 // Assemble the power of 2 part.
191 unsigned RoundParts = llvm::bit_floor(NumParts);
192 unsigned RoundBits = PartBits * RoundParts;
193 EVT RoundVT = RoundBits == ValueBits ?
194 ValueVT : EVT::getIntegerVT(*DAG.getContext(), RoundBits);
195 SDValue Lo, Hi;
196
197 EVT HalfVT = EVT::getIntegerVT(*DAG.getContext(), RoundBits/2);
198
199 if (RoundParts > 2) {
200 Lo = getCopyFromParts(DAG, DL, Parts, RoundParts / 2, PartVT, HalfVT, V,
201 InChain);
202 Hi = getCopyFromParts(DAG, DL, Parts + RoundParts / 2, RoundParts / 2,
203 PartVT, HalfVT, V, InChain);
204 } else {
205 Lo = DAG.getNode(ISD::BITCAST, DL, HalfVT, Parts[0]);
206 Hi = DAG.getNode(ISD::BITCAST, DL, HalfVT, Parts[1]);
207 }
208
209 if (DAG.getDataLayout().isBigEndian())
210 std::swap(Lo, Hi);
211
212 Val = DAG.getNode(ISD::BUILD_PAIR, DL, RoundVT, Lo, Hi);
213
214 if (RoundParts < NumParts) {
215 // Assemble the trailing non-power-of-2 part.
216 unsigned OddParts = NumParts - RoundParts;
217 EVT OddVT = EVT::getIntegerVT(*DAG.getContext(), OddParts * PartBits);
218 Hi = getCopyFromParts(DAG, DL, Parts + RoundParts, OddParts, PartVT,
219 OddVT, V, InChain, CC);
220
221 // Combine the round and odd parts.
222 Lo = Val;
223 if (DAG.getDataLayout().isBigEndian())
224 std::swap(Lo, Hi);
225 EVT TotalVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
226 Hi = DAG.getNode(ISD::ANY_EXTEND, DL, TotalVT, Hi);
227 Hi = DAG.getNode(
228 ISD::SHL, DL, TotalVT, Hi,
229 DAG.getShiftAmountConstant(Lo.getValueSizeInBits(), TotalVT, DL));
230 Lo = DAG.getNode(ISD::ZERO_EXTEND, DL, TotalVT, Lo);
231 Val = DAG.getNode(ISD::OR, DL, TotalVT, Lo, Hi);
232 }
233 } else if (PartVT.isFloatingPoint()) {
234 // FP split into multiple FP parts (for ppcf128)
235 assert(ValueVT == EVT(MVT::ppcf128) && PartVT == MVT::f64 &&
236 "Unexpected split");
237 SDValue Lo, Hi;
238 Lo = DAG.getNode(ISD::BITCAST, DL, EVT(MVT::f64), Parts[0]);
239 Hi = DAG.getNode(ISD::BITCAST, DL, EVT(MVT::f64), Parts[1]);
240 if (TLI.hasBigEndianPartOrdering(ValueVT, DAG.getDataLayout()))
241 std::swap(Lo, Hi);
242 Val = DAG.getNode(ISD::BUILD_PAIR, DL, ValueVT, Lo, Hi);
243 } else {
244 // FP split into integer parts (soft fp)
245 assert(ValueVT.isFloatingPoint() && PartVT.isInteger() &&
246 !PartVT.isVector() && "Unexpected split");
247 EVT IntVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
248 Val = getCopyFromParts(DAG, DL, Parts, NumParts, PartVT, IntVT, V,
249 InChain, CC);
250 }
251 }
252
253 // There is now one part, held in Val. Correct it to match ValueVT.
254 // PartEVT is the type of the register class that holds the value.
255 // ValueVT is the type of the inline asm operation.
256 EVT PartEVT = Val.getValueType();
257
258 if (PartEVT == ValueVT)
259 return Val;
260
261 if (PartEVT.isInteger() && ValueVT.isFloatingPoint() &&
262 ValueVT.bitsLT(PartEVT)) {
263 // For an FP value in an integer part, we need to truncate to the right
264 // width first.
265 PartEVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
266 Val = DAG.getNode(ISD::TRUNCATE, DL, PartEVT, Val);
267 }
268
269 // Handle types that have the same size.
270 if (PartEVT.getSizeInBits() == ValueVT.getSizeInBits())
271 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
272
273 // Handle types with different sizes.
274 if (PartEVT.isInteger() && ValueVT.isInteger()) {
275 if (ValueVT.bitsLT(PartEVT)) {
276 // For a truncate, see if we have any information to
277 // indicate whether the truncated bits will always be
278 // zero or sign-extension.
279 if (AssertOp)
280 Val = DAG.getNode(*AssertOp, DL, PartEVT, Val,
281 DAG.getValueType(ValueVT));
282 return DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
283 }
284 return DAG.getNode(ISD::ANY_EXTEND, DL, ValueVT, Val);
285 }
286
287 if (PartEVT.isFloatingPoint() && ValueVT.isFloatingPoint()) {
288 // FP_ROUND's are always exact here.
289 if (ValueVT.bitsLT(Val.getValueType())) {
290
291 SDValue NoChange =
293
294 if (DAG.getMachineFunction().getFunction().getAttributes().hasFnAttr(
295 llvm::Attribute::StrictFP)) {
296 return DAG.getNode(ISD::STRICT_FP_ROUND, DL,
297 DAG.getVTList(ValueVT, MVT::Other), InChain, Val,
298 NoChange);
299 }
300
301 return DAG.getNode(ISD::FP_ROUND, DL, ValueVT, Val, NoChange);
302 }
303
304 return DAG.getNode(ISD::FP_EXTEND, DL, ValueVT, Val);
305 }
306
307 // Handle MMX to a narrower integer type by bitcasting MMX to integer and
308 // then truncating.
309 if (PartEVT == MVT::x86mmx && ValueVT.isInteger() &&
310 ValueVT.bitsLT(PartEVT)) {
311 Val = DAG.getNode(ISD::BITCAST, DL, MVT::i64, Val);
312 return DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
313 }
314
315 report_fatal_error("Unknown mismatch in getCopyFromParts!");
316}
317
319 const Twine &ErrMsg) {
321 if (!I)
322 return Ctx.emitError(ErrMsg);
323
324 if (const CallInst *CI = dyn_cast<CallInst>(I))
325 if (CI->isInlineAsm()) {
326 return Ctx.diagnose(DiagnosticInfoInlineAsm(
327 *CI, ErrMsg + ", possible invalid constraint for vector type"));
328 }
329
330 return Ctx.emitError(I, ErrMsg);
331}
332
333/// getCopyFromPartsVector - Create a value that contains the specified legal
334/// parts combined into the value they represent. If the parts combine to a
335/// type larger than ValueVT then AssertOp can be used to specify whether the
336/// extra bits are known to be zero (ISD::AssertZext) or sign extended from
337/// ValueVT (ISD::AssertSext).
339 const SDValue *Parts, unsigned NumParts,
340 MVT PartVT, EVT ValueVT, const Value *V,
341 SDValue InChain,
342 std::optional<CallingConv::ID> CallConv) {
343 assert(ValueVT.isVector() && "Not a vector value");
344 assert(NumParts > 0 && "No parts to assemble!");
345 const bool IsABIRegCopy = CallConv.has_value();
346
347 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
348 SDValue Val = Parts[0];
349
350 // Handle a multi-element vector.
351 if (NumParts > 1) {
352 EVT IntermediateVT;
353 MVT RegisterVT;
354 unsigned NumIntermediates;
355 unsigned NumRegs;
356
357 if (IsABIRegCopy) {
359 *DAG.getContext(), *CallConv, ValueVT, IntermediateVT,
360 NumIntermediates, RegisterVT);
361 } else {
362 NumRegs =
363 TLI.getVectorTypeBreakdown(*DAG.getContext(), ValueVT, IntermediateVT,
364 NumIntermediates, RegisterVT);
365 }
366
367 assert(NumRegs == NumParts && "Part count doesn't match vector breakdown!");
368 NumParts = NumRegs; // Silence a compiler warning.
369 assert(RegisterVT == PartVT && "Part type doesn't match vector breakdown!");
370 assert(RegisterVT.getSizeInBits() ==
371 Parts[0].getSimpleValueType().getSizeInBits() &&
372 "Part type sizes don't match!");
373
374 // Assemble the parts into intermediate operands.
375 SmallVector<SDValue, 8> Ops(NumIntermediates);
376 if (NumIntermediates == NumParts) {
377 // If the register was not expanded, truncate or copy the value,
378 // as appropriate.
379 for (unsigned i = 0; i != NumParts; ++i)
380 Ops[i] = getCopyFromParts(DAG, DL, &Parts[i], 1, PartVT, IntermediateVT,
381 V, InChain, CallConv);
382 } else if (NumParts > 0) {
383 // If the intermediate type was expanded, build the intermediate
384 // operands from the parts.
385 assert(NumParts % NumIntermediates == 0 &&
386 "Must expand into a divisible number of parts!");
387 unsigned Factor = NumParts / NumIntermediates;
388 for (unsigned i = 0; i != NumIntermediates; ++i)
389 Ops[i] = getCopyFromParts(DAG, DL, &Parts[i * Factor], Factor, PartVT,
390 IntermediateVT, V, InChain, CallConv);
391 }
392
393 // Build a vector with BUILD_VECTOR or CONCAT_VECTORS from the
394 // intermediate operands.
395 EVT BuiltVectorTy =
396 IntermediateVT.isVector()
398 *DAG.getContext(), IntermediateVT.getScalarType(),
399 IntermediateVT.getVectorElementCount() * NumParts)
401 IntermediateVT.getScalarType(),
402 NumIntermediates);
403 Val = DAG.getNode(IntermediateVT.isVector() ? ISD::CONCAT_VECTORS
405 DL, BuiltVectorTy, Ops);
406 }
407
408 // There is now one part, held in Val. Correct it to match ValueVT.
409 EVT PartEVT = Val.getValueType();
410
411 if (PartEVT == ValueVT)
412 return Val;
413
414 if (PartEVT.isVector()) {
415 // Vector/Vector bitcast.
416 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits())
417 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
418
419 // If the parts vector has more elements than the value vector, then we
420 // have a vector widening case (e.g. <2 x float> -> <4 x float>).
421 // Extract the elements we want.
422 if (PartEVT.getVectorElementCount() != ValueVT.getVectorElementCount()) {
425 (PartEVT.getVectorElementCount().isScalable() ==
426 ValueVT.getVectorElementCount().isScalable()) &&
427 "Cannot narrow, it would be a lossy transformation");
428 PartEVT =
430 ValueVT.getVectorElementCount());
431 Val = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, PartEVT, Val,
432 DAG.getVectorIdxConstant(0, DL));
433 if (PartEVT == ValueVT)
434 return Val;
435 if (PartEVT.isInteger() && ValueVT.isFloatingPoint())
436 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
437
438 // Vector/Vector bitcast (e.g. <2 x bfloat> -> <2 x half>).
439 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits())
440 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
441 }
442
443 // Promoted vector extract
444 return DAG.getAnyExtOrTrunc(Val, DL, ValueVT);
445 }
446
447 // Trivial bitcast if the types are the same size and the destination
448 // vector type is legal.
449 if (PartEVT.getSizeInBits() == ValueVT.getSizeInBits() &&
450 TLI.isTypeLegal(ValueVT))
451 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
452
453 if (ValueVT.getVectorNumElements() != 1) {
454 // Certain ABIs require that vectors are passed as integers. For vectors
455 // are the same size, this is an obvious bitcast.
456 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits()) {
457 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
458 } else if (ValueVT.bitsLT(PartEVT)) {
459 const uint64_t ValueSize = ValueVT.getFixedSizeInBits();
460 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
461 // Drop the extra bits.
462 Val = DAG.getNode(ISD::TRUNCATE, DL, IntermediateType, Val);
463 return DAG.getBitcast(ValueVT, Val);
464 }
465
467 *DAG.getContext(), V, "non-trivial scalar-to-vector conversion");
468 return DAG.getUNDEF(ValueVT);
469 }
470
471 // Handle cases such as i8 -> <1 x i1>
472 EVT ValueSVT = ValueVT.getVectorElementType();
473 if (ValueVT.getVectorNumElements() == 1 && ValueSVT != PartEVT) {
474 unsigned ValueSize = ValueSVT.getSizeInBits();
475 if (ValueSize == PartEVT.getSizeInBits()) {
476 Val = DAG.getNode(ISD::BITCAST, DL, ValueSVT, Val);
477 } else if (ValueSVT.isFloatingPoint() && PartEVT.isInteger()) {
478 // It's possible a scalar floating point type gets softened to integer and
479 // then promoted to a larger integer. If PartEVT is the larger integer
480 // we need to truncate it and then bitcast to the FP type.
481 assert(ValueSVT.bitsLT(PartEVT) && "Unexpected types");
482 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
483 Val = DAG.getNode(ISD::TRUNCATE, DL, IntermediateType, Val);
484 Val = DAG.getBitcast(ValueSVT, Val);
485 } else {
486 Val = ValueVT.isFloatingPoint()
487 ? DAG.getFPExtendOrRound(Val, DL, ValueSVT)
488 : DAG.getAnyExtOrTrunc(Val, DL, ValueSVT);
489 }
490 }
491
492 return DAG.getBuildVector(ValueVT, DL, Val);
493}
494
495static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &dl,
496 SDValue Val, SDValue *Parts, unsigned NumParts,
497 MVT PartVT, const Value *V,
498 std::optional<CallingConv::ID> CallConv);
499
500/// getCopyToParts - Create a series of nodes that contain the specified value
501/// split into legal parts. If the parts contain more bits than Val, then, for
502/// integers, ExtendKind can be used to specify how to generate the extra bits.
503static void
505 unsigned NumParts, MVT PartVT, const Value *V,
506 std::optional<CallingConv::ID> CallConv = std::nullopt,
507 ISD::NodeType ExtendKind = ISD::ANY_EXTEND) {
508 // Let the target split the parts if it wants to
509 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
510 if (TLI.splitValueIntoRegisterParts(DAG, DL, Val, Parts, NumParts, PartVT,
511 CallConv))
512 return;
513 EVT ValueVT = Val.getValueType();
514
515 // Handle the vector case separately.
516 if (ValueVT.isVector())
517 return getCopyToPartsVector(DAG, DL, Val, Parts, NumParts, PartVT, V,
518 CallConv);
519
520 unsigned OrigNumParts = NumParts;
522 "Copying to an illegal type!");
523
524 if (NumParts == 0)
525 return;
526
527 assert(!ValueVT.isVector() && "Vector case handled elsewhere");
528 EVT PartEVT = PartVT;
529 if (PartEVT == ValueVT) {
530 assert(NumParts == 1 && "No-op copy with multiple parts!");
531 Parts[0] = Val;
532 return;
533 }
534
535 unsigned PartBits = PartVT.getSizeInBits();
536 if (NumParts * PartBits > ValueVT.getSizeInBits()) {
537 // If the parts cover more bits than the value has, promote the value.
538 if (PartVT.isFloatingPoint() && ValueVT.isFloatingPoint()) {
539 assert(NumParts == 1 && "Do not know what to promote to!");
540 Val = DAG.getNode(ISD::FP_EXTEND, DL, PartVT, Val);
541 } else {
542 if (ValueVT.isFloatingPoint()) {
543 // FP values need to be bitcast, then extended if they are being put
544 // into a larger container.
545 ValueVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
546 Val = DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
547 }
548 assert((PartVT.isInteger() || PartVT == MVT::x86mmx) &&
549 ValueVT.isInteger() &&
550 "Unknown mismatch!");
551 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
552 Val = DAG.getNode(ExtendKind, DL, ValueVT, Val);
553 if (PartVT == MVT::x86mmx)
554 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
555 }
556 } else if (PartBits == ValueVT.getSizeInBits()) {
557 // Different types of the same size.
558 assert(NumParts == 1 && PartEVT != ValueVT);
559 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
560 } else if (NumParts * PartBits < ValueVT.getSizeInBits()) {
561 // If the parts cover less bits than value has, truncate the value.
562 assert((PartVT.isInteger() || PartVT == MVT::x86mmx) &&
563 ValueVT.isInteger() &&
564 "Unknown mismatch!");
565 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
566 Val = DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
567 if (PartVT == MVT::x86mmx)
568 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
569 }
570
571 // The value may have changed - recompute ValueVT.
572 ValueVT = Val.getValueType();
573 assert(NumParts * PartBits == ValueVT.getSizeInBits() &&
574 "Failed to tile the value with PartVT!");
575
576 if (NumParts == 1) {
577 if (PartEVT != ValueVT) {
579 "scalar-to-vector conversion failed");
580 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
581 }
582
583 Parts[0] = Val;
584 return;
585 }
586
587 // Expand the value into multiple parts.
588 if (NumParts & (NumParts - 1)) {
589 // The number of parts is not a power of 2. Split off and copy the tail.
590 assert(PartVT.isInteger() && ValueVT.isInteger() &&
591 "Do not know what to expand to!");
592 unsigned RoundParts = llvm::bit_floor(NumParts);
593 unsigned RoundBits = RoundParts * PartBits;
594 unsigned OddParts = NumParts - RoundParts;
595 SDValue OddVal = DAG.getNode(ISD::SRL, DL, ValueVT, Val,
596 DAG.getShiftAmountConstant(RoundBits, ValueVT, DL));
597
598 getCopyToParts(DAG, DL, OddVal, Parts + RoundParts, OddParts, PartVT, V,
599 CallConv);
600
601 if (DAG.getDataLayout().isBigEndian())
602 // The odd parts were reversed by getCopyToParts - unreverse them.
603 std::reverse(Parts + RoundParts, Parts + NumParts);
604
605 NumParts = RoundParts;
606 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
607 Val = DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
608 }
609
610 // The number of parts is a power of 2. Repeatedly bisect the value using
611 // EXTRACT_ELEMENT.
612 Parts[0] = DAG.getNode(ISD::BITCAST, DL,
614 ValueVT.getSizeInBits()),
615 Val);
616
617 for (unsigned StepSize = NumParts; StepSize > 1; StepSize /= 2) {
618 for (unsigned i = 0; i < NumParts; i += StepSize) {
619 unsigned ThisBits = StepSize * PartBits / 2;
620 EVT ThisVT = EVT::getIntegerVT(*DAG.getContext(), ThisBits);
621 SDValue &Part0 = Parts[i];
622 SDValue &Part1 = Parts[i+StepSize/2];
623
624 Part1 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL,
625 ThisVT, Part0, DAG.getIntPtrConstant(1, DL));
626 Part0 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL,
627 ThisVT, Part0, DAG.getIntPtrConstant(0, DL));
628
629 if (ThisBits == PartBits && ThisVT != PartVT) {
630 Part0 = DAG.getNode(ISD::BITCAST, DL, PartVT, Part0);
631 Part1 = DAG.getNode(ISD::BITCAST, DL, PartVT, Part1);
632 }
633 }
634 }
635
636 if (DAG.getDataLayout().isBigEndian())
637 std::reverse(Parts, Parts + OrigNumParts);
638}
639
641 const SDLoc &DL, EVT PartVT) {
642 if (!PartVT.isVector())
643 return SDValue();
644
645 EVT ValueVT = Val.getValueType();
646 EVT PartEVT = PartVT.getVectorElementType();
647 EVT ValueEVT = ValueVT.getVectorElementType();
648 ElementCount PartNumElts = PartVT.getVectorElementCount();
649 ElementCount ValueNumElts = ValueVT.getVectorElementCount();
650
651 // We only support widening vectors with equivalent element types and
652 // fixed/scalable properties. If a target needs to widen a fixed-length type
653 // to a scalable one, it should be possible to use INSERT_SUBVECTOR below.
654 if (ElementCount::isKnownLE(PartNumElts, ValueNumElts) ||
655 PartNumElts.isScalable() != ValueNumElts.isScalable())
656 return SDValue();
657
658 // Have a try for bf16 because some targets share its ABI with fp16.
659 if (ValueEVT == MVT::bf16 && PartEVT == MVT::f16) {
661 "Cannot widen to illegal type");
662 Val = DAG.getNode(
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 ValSDNodeOrder = Val.getNode()->getIROrder();
1509 unsigned DbgSDNodeOrder = DDI.getSDNodeOrder();
1510 DILocalVariable *Variable = DDI.getVariable();
1511 DIExpression *Expr = DDI.getExpression();
1512 assert(Variable->isValidLocationForIntrinsic(DL) &&
1513 "Expected inlined-at fields to agree");
1514 SDDbgValue *SDV;
1515 if (Val.getNode()) {
1516 // FIXME: I doubt that it is correct to resolve a dangling DbgValue as a
1517 // FuncArgumentDbgValue (it would be hoisted to the function entry, and if
1518 // we couldn't resolve it directly when examining the DbgValue intrinsic
1519 // in the first place we should not be more successful here). Unless we
1520 // have some test case that prove this to be correct we should avoid
1521 // calling EmitFuncArgumentDbgValue here.
1522 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 (TM.Options.NoNaNsFPMath)
2484 Condition = getFCmpCodeWithoutNaN(Condition);
2485 }
2486
2487 CaseBlock CB(Condition, BOp->getOperand(0), BOp->getOperand(1), nullptr,
2488 TBB, FBB, CurBB, getCurSDLoc(), TProb, FProb);
2489 SL->SwitchCases.push_back(CB);
2490 return;
2491 }
2492 }
2493
2494 // Create a CaseBlock record representing this branch.
2495 ISD::CondCode Opc = InvertCond ? ISD::SETNE : ISD::SETEQ;
2496 CaseBlock CB(Opc, Cond, ConstantInt::getTrue(*DAG.getContext()),
2497 nullptr, TBB, FBB, CurBB, getCurSDLoc(), TProb, FProb);
2498 SL->SwitchCases.push_back(CB);
2499}
2500
2501// Collect dependencies on V recursively. This is used for the cost analysis in
2502// `shouldKeepJumpConditionsTogether`.
2506 unsigned Depth = 0) {
2507 // Return false if we have an incomplete count.
2509 return false;
2510
2511 auto *I = dyn_cast<Instruction>(V);
2512 if (I == nullptr)
2513 return true;
2514
2515 if (Necessary != nullptr) {
2516 // This instruction is necessary for the other side of the condition so
2517 // don't count it.
2518 if (Necessary->contains(I))
2519 return true;
2520 }
2521
2522 // Already added this dep.
2523 if (!Deps->try_emplace(I, false).second)
2524 return true;
2525
2526 for (unsigned OpIdx = 0, E = I->getNumOperands(); OpIdx < E; ++OpIdx)
2527 if (!collectInstructionDeps(Deps, I->getOperand(OpIdx), Necessary,
2528 Depth + 1))
2529 return false;
2530 return true;
2531}
2532
2535 Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs,
2537 if (I.getNumSuccessors() != 2)
2538 return false;
2539
2540 if (!I.isConditional())
2541 return false;
2542
2543 if (Params.BaseCost < 0)
2544 return false;
2545
2546 // Baseline cost.
2547 InstructionCost CostThresh = Params.BaseCost;
2548
2549 BranchProbabilityInfo *BPI = nullptr;
2550 if (Params.LikelyBias || Params.UnlikelyBias)
2551 BPI = FuncInfo.BPI;
2552 if (BPI != nullptr) {
2553 // See if we are either likely to get an early out or compute both lhs/rhs
2554 // of the condition.
2555 BasicBlock *IfFalse = I.getSuccessor(0);
2556 BasicBlock *IfTrue = I.getSuccessor(1);
2557
2558 std::optional<bool> Likely;
2559 if (BPI->isEdgeHot(I.getParent(), IfTrue))
2560 Likely = true;
2561 else if (BPI->isEdgeHot(I.getParent(), IfFalse))
2562 Likely = false;
2563
2564 if (Likely) {
2565 if (Opc == (*Likely ? Instruction::And : Instruction::Or))
2566 // Its likely we will have to compute both lhs and rhs of condition
2567 CostThresh += Params.LikelyBias;
2568 else {
2569 if (Params.UnlikelyBias < 0)
2570 return false;
2571 // Its likely we will get an early out.
2572 CostThresh -= Params.UnlikelyBias;
2573 }
2574 }
2575 }
2576
2577 if (CostThresh <= 0)
2578 return false;
2579
2580 // Collect "all" instructions that lhs condition is dependent on.
2581 // Use map for stable iteration (to avoid non-determanism of iteration of
2582 // SmallPtrSet). The `bool` value is just a dummy.
2584 collectInstructionDeps(&LhsDeps, Lhs);
2585 // Collect "all" instructions that rhs condition is dependent on AND are
2586 // dependencies of lhs. This gives us an estimate on which instructions we
2587 // stand to save by splitting the condition.
2588 if (!collectInstructionDeps(&RhsDeps, Rhs, &LhsDeps))
2589 return false;
2590 // Add the compare instruction itself unless its a dependency on the LHS.
2591 if (const auto *RhsI = dyn_cast<Instruction>(Rhs))
2592 if (!LhsDeps.contains(RhsI))
2593 RhsDeps.try_emplace(RhsI, false);
2594
2595 InstructionCost CostOfIncluding = 0;
2596 // See if this instruction will need to computed independently of whether RHS
2597 // is.
2598 Value *BrCond = I.getCondition();
2599 auto ShouldCountInsn = [&RhsDeps, &BrCond](const Instruction *Ins) {
2600 for (const auto *U : Ins->users()) {
2601 // If user is independent of RHS calculation we don't need to count it.
2602 if (auto *UIns = dyn_cast<Instruction>(U))
2603 if (UIns != BrCond && !RhsDeps.contains(UIns))
2604 return false;
2605 }
2606 return true;
2607 };
2608
2609 // Prune instructions from RHS Deps that are dependencies of unrelated
2610 // instructions. The value (SelectionDAG::MaxRecursionDepth) is fairly
2611 // arbitrary and just meant to cap the how much time we spend in the pruning
2612 // loop. Its highly unlikely to come into affect.
2613 const unsigned MaxPruneIters = SelectionDAG::MaxRecursionDepth;
2614 // Stop after a certain point. No incorrectness from including too many
2615 // instructions.
2616 for (unsigned PruneIters = 0; PruneIters < MaxPruneIters; ++PruneIters) {
2617 const Instruction *ToDrop = nullptr;
2618 for (const auto &InsPair : RhsDeps) {
2619 if (!ShouldCountInsn(InsPair.first)) {
2620 ToDrop = InsPair.first;
2621 break;
2622 }
2623 }
2624 if (ToDrop == nullptr)
2625 break;
2626 RhsDeps.erase(ToDrop);
2627 }
2628
2629 for (const auto &InsPair : RhsDeps) {
2630 // Finally accumulate latency that we can only attribute to computing the
2631 // RHS condition. Use latency because we are essentially trying to calculate
2632 // the cost of the dependency chain.
2633 // Possible TODO: We could try to estimate ILP and make this more precise.
2634 CostOfIncluding += TTI->getInstructionCost(
2635 InsPair.first, TargetTransformInfo::TCK_Latency);
2636
2637 if (CostOfIncluding > CostThresh)
2638 return false;
2639 }
2640 return true;
2641}
2642
2645 MachineBasicBlock *FBB,
2646 MachineBasicBlock *CurBB,
2647 MachineBasicBlock *SwitchBB,
2649 BranchProbability TProb,
2650 BranchProbability FProb,
2651 bool InvertCond) {
2652 // Skip over not part of the tree and remember to invert op and operands at
2653 // next level.
2654 Value *NotCond;
2655 if (match(Cond, m_OneUse(m_Not(m_Value(NotCond)))) &&
2656 InBlock(NotCond, CurBB->getBasicBlock())) {
2657 FindMergedConditions(NotCond, TBB, FBB, CurBB, SwitchBB, Opc, TProb, FProb,
2658 !InvertCond);
2659 return;
2660 }
2661
2663 const Value *BOpOp0, *BOpOp1;
2664 // Compute the effective opcode for Cond, taking into account whether it needs
2665 // to be inverted, e.g.
2666 // and (not (or A, B)), C
2667 // gets lowered as
2668 // and (and (not A, not B), C)
2670 if (BOp) {
2671 BOpc = match(BOp, m_LogicalAnd(m_Value(BOpOp0), m_Value(BOpOp1)))
2672 ? Instruction::And
2673 : (match(BOp, m_LogicalOr(m_Value(BOpOp0), m_Value(BOpOp1)))
2674 ? Instruction::Or
2676 if (InvertCond) {
2677 if (BOpc == Instruction::And)
2678 BOpc = Instruction::Or;
2679 else if (BOpc == Instruction::Or)
2680 BOpc = Instruction::And;
2681 }
2682 }
2683
2684 // If this node is not part of the or/and tree, emit it as a branch.
2685 // Note that all nodes in the tree should have same opcode.
2686 bool BOpIsInOrAndTree = BOpc && BOpc == Opc && BOp->hasOneUse();
2687 if (!BOpIsInOrAndTree || BOp->getParent() != CurBB->getBasicBlock() ||
2688 !InBlock(BOpOp0, CurBB->getBasicBlock()) ||
2689 !InBlock(BOpOp1, CurBB->getBasicBlock())) {
2690 EmitBranchForMergedCondition(Cond, TBB, FBB, CurBB, SwitchBB,
2691 TProb, FProb, InvertCond);
2692 return;
2693 }
2694
2695 // Create TmpBB after CurBB.
2696 MachineFunction::iterator BBI(CurBB);
2697 MachineFunction &MF = DAG.getMachineFunction();
2699 CurBB->getParent()->insert(++BBI, TmpBB);
2700
2701 if (Opc == Instruction::Or) {
2702 // Codegen X | Y as:
2703 // BB1:
2704 // jmp_if_X TBB
2705 // jmp TmpBB
2706 // TmpBB:
2707 // jmp_if_Y TBB
2708 // jmp FBB
2709 //
2710
2711 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
2712 // The requirement is that
2713 // TrueProb for BB1 + (FalseProb for BB1 * TrueProb for TmpBB)
2714 // = TrueProb for original BB.
2715 // Assuming the original probabilities are A and B, one choice is to set
2716 // BB1's probabilities to A/2 and A/2+B, and set TmpBB's probabilities to
2717 // A/(1+B) and 2B/(1+B). This choice assumes that
2718 // TrueProb for BB1 == FalseProb for BB1 * TrueProb for TmpBB.
2719 // Another choice is to assume TrueProb for BB1 equals to TrueProb for
2720 // TmpBB, but the math is more complicated.
2721
2722 auto NewTrueProb = TProb / 2;
2723 auto NewFalseProb = TProb / 2 + FProb;
2724 // Emit the LHS condition.
2725 FindMergedConditions(BOpOp0, TBB, TmpBB, CurBB, SwitchBB, Opc, NewTrueProb,
2726 NewFalseProb, InvertCond);
2727
2728 // Normalize A/2 and B to get A/(1+B) and 2B/(1+B).
2729 SmallVector<BranchProbability, 2> Probs{TProb / 2, FProb};
2731 // Emit the RHS condition into TmpBB.
2732 FindMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
2733 Probs[1], InvertCond);
2734 } else {
2735 assert(Opc == Instruction::And && "Unknown merge op!");
2736 // Codegen X & Y as:
2737 // BB1:
2738 // jmp_if_X TmpBB
2739 // jmp FBB
2740 // TmpBB:
2741 // jmp_if_Y TBB
2742 // jmp FBB
2743 //
2744 // This requires creation of TmpBB after CurBB.
2745
2746 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
2747 // The requirement is that
2748 // FalseProb for BB1 + (TrueProb for BB1 * FalseProb for TmpBB)
2749 // = FalseProb for original BB.
2750 // Assuming the original probabilities are A and B, one choice is to set
2751 // BB1's probabilities to A+B/2 and B/2, and set TmpBB's probabilities to
2752 // 2A/(1+A) and B/(1+A). This choice assumes that FalseProb for BB1 ==
2753 // TrueProb for BB1 * FalseProb for TmpBB.
2754
2755 auto NewTrueProb = TProb + FProb / 2;
2756 auto NewFalseProb = FProb / 2;
2757 // Emit the LHS condition.
2758 FindMergedConditions(BOpOp0, TmpBB, FBB, CurBB, SwitchBB, Opc, NewTrueProb,
2759 NewFalseProb, InvertCond);
2760
2761 // Normalize A and B/2 to get 2A/(1+A) and B/(1+A).
2762 SmallVector<BranchProbability, 2> Probs{TProb, FProb / 2};
2764 // Emit the RHS condition into TmpBB.
2765 FindMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
2766 Probs[1], InvertCond);
2767 }
2768}
2769
2770/// If the set of cases should be emitted as a series of branches, return true.
2771/// If we should emit this as a bunch of and/or'd together conditions, return
2772/// false.
2773bool
2774SelectionDAGBuilder::ShouldEmitAsBranches(const std::vector<CaseBlock> &Cases) {
2775 if (Cases.size() != 2) return true;
2776
2777 // If this is two comparisons of the same values or'd or and'd together, they
2778 // will get folded into a single comparison, so don't emit two blocks.
2779 if ((Cases[0].CmpLHS == Cases[1].CmpLHS &&
2780 Cases[0].CmpRHS == Cases[1].CmpRHS) ||
2781 (Cases[0].CmpRHS == Cases[1].CmpLHS &&
2782 Cases[0].CmpLHS == Cases[1].CmpRHS)) {
2783 return false;
2784 }
2785
2786 // Handle: (X != null) | (Y != null) --> (X|Y) != 0
2787 // Handle: (X == null) & (Y == null) --> (X|Y) == 0
2788 if (Cases[0].CmpRHS == Cases[1].CmpRHS &&
2789 Cases[0].CC == Cases[1].CC &&
2790 isa<Constant>(Cases[0].CmpRHS) &&
2791 cast<Constant>(Cases[0].CmpRHS)->isNullValue()) {
2792 if (Cases[0].CC == ISD::SETEQ && Cases[0].TrueBB == Cases[1].ThisBB)
2793 return false;
2794 if (Cases[0].CC == ISD::SETNE && Cases[0].FalseBB == Cases[1].ThisBB)
2795 return false;
2796 }
2797
2798 return true;
2799}
2800
2801void SelectionDAGBuilder::visitBr(const BranchInst &I) {
2803
2804 // Update machine-CFG edges.
2805 MachineBasicBlock *Succ0MBB = FuncInfo.getMBB(I.getSuccessor(0));
2806
2807 if (I.isUnconditional()) {
2808 // Update machine-CFG edges.
2809 BrMBB->addSuccessor(Succ0MBB);
2810
2811 // If this is not a fall-through branch or optimizations are switched off,
2812 // emit the branch.
2813 if (Succ0MBB != NextBlock(BrMBB) ||
2815 auto Br = DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
2816 getControlRoot(), DAG.getBasicBlock(Succ0MBB));
2817 setValue(&I, Br);
2818 DAG.setRoot(Br);
2819 }
2820
2821 return;
2822 }
2823
2824 // If this condition is one of the special cases we handle, do special stuff
2825 // now.
2826 const Value *CondVal = I.getCondition();
2827 MachineBasicBlock *Succ1MBB = FuncInfo.getMBB(I.getSuccessor(1));
2828
2829 // If this is a series of conditions that are or'd or and'd together, emit
2830 // this as a sequence of branches instead of setcc's with and/or operations.
2831 // As long as jumps are not expensive (exceptions for multi-use logic ops,
2832 // unpredictable branches, and vector extracts because those jumps are likely
2833 // expensive for any target), this should improve performance.
2834 // For example, instead of something like:
2835 // cmp A, B
2836 // C = seteq
2837 // cmp D, E
2838 // F = setle
2839 // or C, F
2840 // jnz foo
2841 // Emit:
2842 // cmp A, B
2843 // je foo
2844 // cmp D, E
2845 // jle foo
2846 bool IsUnpredictable = I.hasMetadata(LLVMContext::MD_unpredictable);
2847 const Instruction *BOp = dyn_cast<Instruction>(CondVal);
2848 if (!DAG.getTargetLoweringInfo().isJumpExpensive() && BOp &&
2849 BOp->hasOneUse() && !IsUnpredictable) {
2850 Value *Vec;
2851 const Value *BOp0, *BOp1;
2853 if (match(BOp, m_LogicalAnd(m_Value(BOp0), m_Value(BOp1))))
2854 Opcode = Instruction::And;
2855 else if (match(BOp, m_LogicalOr(m_Value(BOp0), m_Value(BOp1))))
2856 Opcode = Instruction::Or;
2857
2858 if (Opcode &&
2859 !(match(BOp0, m_ExtractElt(m_Value(Vec), m_Value())) &&
2860 match(BOp1, m_ExtractElt(m_Specific(Vec), m_Value()))) &&
2862 FuncInfo, I, Opcode, BOp0, BOp1,
2863 DAG.getTargetLoweringInfo().getJumpConditionMergingParams(
2864 Opcode, BOp0, BOp1))) {
2865 FindMergedConditions(BOp, Succ0MBB, Succ1MBB, BrMBB, BrMBB, Opcode,
2866 getEdgeProbability(BrMBB, Succ0MBB),
2867 getEdgeProbability(BrMBB, Succ1MBB),
2868 /*InvertCond=*/false);
2869 // If the compares in later blocks need to use values not currently
2870 // exported from this block, export them now. This block should always
2871 // be the first entry.
2872 assert(SL->SwitchCases[0].ThisBB == BrMBB && "Unexpected lowering!");
2873
2874 // Allow some cases to be rejected.
2875 if (ShouldEmitAsBranches(SL->SwitchCases)) {
2876 for (unsigned i = 1, e = SL->SwitchCases.size(); i != e; ++i) {
2877 ExportFromCurrentBlock(SL->SwitchCases[i].CmpLHS);
2878 ExportFromCurrentBlock(SL->SwitchCases[i].CmpRHS);
2879 }
2880
2881 // Emit the branch for this block.
2882 visitSwitchCase(SL->SwitchCases[0], BrMBB);
2883 SL->SwitchCases.erase(SL->SwitchCases.begin());
2884 return;
2885 }
2886
2887 // Okay, we decided not to do this, remove any inserted MBB's and clear
2888 // SwitchCases.
2889 for (unsigned i = 1, e = SL->SwitchCases.size(); i != e; ++i)
2890 FuncInfo.MF->erase(SL->SwitchCases[i].ThisBB);
2891
2892 SL->SwitchCases.clear();
2893 }
2894 }
2895
2896 // Create a CaseBlock record representing this branch.
2897 CaseBlock CB(ISD::SETEQ, CondVal, ConstantInt::getTrue(*DAG.getContext()),
2898 nullptr, Succ0MBB, Succ1MBB, BrMBB, getCurSDLoc(),
2900 IsUnpredictable);
2901
2902 // Use visitSwitchCase to actually insert the fast branch sequence for this
2903 // cond branch.
2904 visitSwitchCase(CB, BrMBB);
2905}
2906
2907/// visitSwitchCase - Emits the necessary code to represent a single node in
2908/// the binary search tree resulting from lowering a switch instruction.
2910 MachineBasicBlock *SwitchBB) {
2911 SDValue Cond;
2912 SDValue CondLHS = getValue(CB.CmpLHS);
2913 SDLoc dl = CB.DL;
2914
2915 if (CB.CC == ISD::SETTRUE) {
2916 // Branch or fall through to TrueBB.
2917 addSuccessorWithProb(SwitchBB, CB.TrueBB, CB.TrueProb);
2918 SwitchBB->normalizeSuccProbs();
2919 if (CB.TrueBB != NextBlock(SwitchBB)) {
2920 DAG.setRoot(DAG.getNode(ISD::BR, dl, MVT::Other, getControlRoot(),
2921 DAG.getBasicBlock(CB.TrueBB)));
2922 }
2923 return;
2924 }
2925
2926 auto &TLI = DAG.getTargetLoweringInfo();
2927 EVT MemVT = TLI.getMemValueType(DAG.getDataLayout(), CB.CmpLHS->getType());
2928
2929 // Build the setcc now.
2930 if (!CB.CmpMHS) {
2931 // Fold "(X == true)" to X and "(X == false)" to !X to
2932 // handle common cases produced by branch lowering.
2933 if (CB.CmpRHS == ConstantInt::getTrue(*DAG.getContext()) &&
2934 CB.CC == ISD::SETEQ)
2935 Cond = CondLHS;
2936 else if (CB.CmpRHS == ConstantInt::getFalse(*DAG.getContext()) &&
2937 CB.CC == ISD::SETEQ) {
2938 SDValue True = DAG.getConstant(1, dl, CondLHS.getValueType());
2939 Cond = DAG.getNode(ISD::XOR, dl, CondLHS.getValueType(), CondLHS, True);
2940 } else {
2941 SDValue CondRHS = getValue(CB.CmpRHS);
2942
2943 // If a pointer's DAG type is larger than its memory type then the DAG
2944 // values are zero-extended. This breaks signed comparisons so truncate
2945 // back to the underlying type before doing the compare.
2946 if (CondLHS.getValueType() != MemVT) {
2947 CondLHS = DAG.getPtrExtOrTrunc(CondLHS, getCurSDLoc(), MemVT);
2948 CondRHS = DAG.getPtrExtOrTrunc(CondRHS, getCurSDLoc(), MemVT);
2949 }
2950 Cond = DAG.getSetCC(dl, MVT::i1, CondLHS, CondRHS, CB.CC);
2951 }
2952 } else {
2953 assert(CB.CC == ISD::SETLE && "Can handle only LE ranges now");
2954
2955 const APInt& Low = cast<ConstantInt>(CB.CmpLHS)->getValue();
2956 const APInt& High = cast<ConstantInt>(CB.CmpRHS)->getValue();
2957
2958 SDValue CmpOp = getValue(CB.CmpMHS);
2959 EVT VT = CmpOp.getValueType();
2960
2961 if (cast<ConstantInt>(CB.CmpLHS)->isMinValue(true)) {
2962 Cond = DAG.getSetCC(dl, MVT::i1, CmpOp, DAG.getConstant(High, dl, VT),
2963 ISD::SETLE);
2964 } else {
2965 SDValue SUB = DAG.getNode(ISD::SUB, dl,
2966 VT, CmpOp, DAG.getConstant(Low, dl, VT));
2967 Cond = DAG.getSetCC(dl, MVT::i1, SUB,
2968 DAG.getConstant(High-Low, dl, VT), ISD::SETULE);
2969 }
2970 }
2971
2972 // Update successor info
2973 addSuccessorWithProb(SwitchBB, CB.TrueBB, CB.TrueProb);
2974 // TrueBB and FalseBB are always different unless the incoming IR is
2975 // degenerate. This only happens when running llc on weird IR.
2976 if (CB.TrueBB != CB.FalseBB)
2977 addSuccessorWithProb(SwitchBB, CB.FalseBB, CB.FalseProb);
2978 SwitchBB->normalizeSuccProbs();
2979
2980 // If the lhs block is the next block, invert the condition so that we can
2981 // fall through to the lhs instead of the rhs block.
2982 if (CB.TrueBB == NextBlock(SwitchBB)) {
2983 std::swap(CB.TrueBB, CB.FalseBB);
2984 SDValue True = DAG.getConstant(1, dl, Cond.getValueType());
2985 Cond = DAG.getNode(ISD::XOR, dl, Cond.getValueType(), Cond, True);
2986 }
2987
2988 SDNodeFlags Flags;
2990 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl, MVT::Other, getControlRoot(),
2991 Cond, DAG.getBasicBlock(CB.TrueBB), Flags);
2992
2993 setValue(CurInst, BrCond);
2994
2995 // Insert the false branch. Do this even if it's a fall through branch,
2996 // this makes it easier to do DAG optimizations which require inverting
2997 // the branch condition.
2998 BrCond = DAG.getNode(ISD::BR, dl, MVT::Other, BrCond,
2999 DAG.getBasicBlock(CB.FalseBB));
3000
3001 DAG.setRoot(BrCond);
3002}
3003
3004/// visitJumpTable - Emit JumpTable node in the current MBB
3006 // Emit the code for the jump table
3007 assert(JT.SL && "Should set SDLoc for SelectionDAG!");
3008 assert(JT.Reg && "Should lower JT Header first!");
3009 EVT PTy = DAG.getTargetLoweringInfo().getJumpTableRegTy(DAG.getDataLayout());
3010 SDValue Index = DAG.getCopyFromReg(getControlRoot(), *JT.SL, JT.Reg, PTy);
3011 SDValue Table = DAG.getJumpTable(JT.JTI, PTy);
3012 SDValue BrJumpTable = DAG.getNode(ISD::BR_JT, *JT.SL, MVT::Other,
3013 Index.getValue(1), Table, Index);
3014 DAG.setRoot(BrJumpTable);
3015}
3016
3017/// visitJumpTableHeader - This function emits necessary code to produce index
3018/// in the JumpTable from switch case.
3020 JumpTableHeader &JTH,
3021 MachineBasicBlock *SwitchBB) {
3022 assert(JT.SL && "Should set SDLoc for SelectionDAG!");
3023 const SDLoc &dl = *JT.SL;
3024
3025 // Subtract the lowest switch case value from the value being switched on.
3026 SDValue SwitchOp = getValue(JTH.SValue);
3027 EVT VT = SwitchOp.getValueType();
3028 SDValue Sub = DAG.getNode(ISD::SUB, dl, VT, SwitchOp,
3029 DAG.getConstant(JTH.First, dl, VT));
3030
3031 // The SDNode we just created, which holds the value being switched on minus
3032 // the smallest case value, needs to be copied to a virtual register so it
3033 // can be used as an index into the jump table in a subsequent basic block.
3034 // This value may be smaller or larger than the target's pointer type, and
3035 // therefore require extension or truncating.
3036 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3037 SwitchOp =
3038 DAG.getZExtOrTrunc(Sub, dl, TLI.getJumpTableRegTy(DAG.getDataLayout()));
3039
3040 Register JumpTableReg =
3041 FuncInfo.CreateReg(TLI.getJumpTableRegTy(DAG.getDataLayout()));
3042 SDValue CopyTo =
3043 DAG.getCopyToReg(getControlRoot(), dl, JumpTableReg, SwitchOp);
3044 JT.Reg = JumpTableReg;
3045
3046 if (!JTH.FallthroughUnreachable) {
3047 // Emit the range check for the jump table, and branch to the default block
3048 // for the switch statement if the value being switched on exceeds the
3049 // largest case in the switch.
3050 SDValue CMP = DAG.getSetCC(
3051 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
3052 Sub.getValueType()),
3053 Sub, DAG.getConstant(JTH.Last - JTH.First, dl, VT), ISD::SETUGT);
3054
3055 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl,
3056 MVT::Other, CopyTo, CMP,
3057 DAG.getBasicBlock(JT.Default));
3058
3059 // Avoid emitting unnecessary branches to the next block.
3060 if (JT.MBB != NextBlock(SwitchBB))
3061 BrCond = DAG.getNode(ISD::BR, dl, MVT::Other, BrCond,
3062 DAG.getBasicBlock(JT.MBB));
3063
3064 DAG.setRoot(BrCond);
3065 } else {
3066 // Avoid emitting unnecessary branches to the next block.
3067 if (JT.MBB != NextBlock(SwitchBB))
3068 DAG.setRoot(DAG.getNode(ISD::BR, dl, MVT::Other, CopyTo,
3069 DAG.getBasicBlock(JT.MBB)));
3070 else
3071 DAG.setRoot(CopyTo);
3072 }
3073}
3074
3075/// Create a LOAD_STACK_GUARD node, and let it carry the target specific global
3076/// variable if there exists one.
3078 SDValue &Chain) {
3079 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3080 EVT PtrTy = TLI.getPointerTy(DAG.getDataLayout());
3081 EVT PtrMemTy = TLI.getPointerMemTy(DAG.getDataLayout());
3085 DAG.getMachineNode(TargetOpcode::LOAD_STACK_GUARD, DL, PtrTy, Chain);
3086 if (Global) {
3087 MachinePointerInfo MPInfo(Global);
3091 MPInfo, Flags, PtrTy.getSizeInBits() / 8, DAG.getEVTAlign(PtrTy));
3092 DAG.setNodeMemRefs(Node, {MemRef});
3093 }
3094 if (PtrTy != PtrMemTy)
3095 return DAG.getPtrExtOrTrunc(SDValue(Node, 0), DL, PtrMemTy);
3096 return SDValue(Node, 0);
3097}
3098
3099/// Codegen a new tail for a stack protector check ParentMBB which has had its
3100/// tail spliced into a stack protector check success bb.
3101///
3102/// For a high level explanation of how this fits into the stack protector
3103/// generation see the comment on the declaration of class
3104/// StackProtectorDescriptor.
3106 MachineBasicBlock *ParentBB) {
3107
3108 // First create the loads to the guard/stack slot for the comparison.
3109 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3110 auto &DL = DAG.getDataLayout();
3111 EVT PtrTy = TLI.getFrameIndexTy(DL);
3112 EVT PtrMemTy = TLI.getPointerMemTy(DL, DL.getAllocaAddrSpace());
3113
3114 MachineFrameInfo &MFI = ParentBB->getParent()->getFrameInfo();
3115 int FI = MFI.getStackProtectorIndex();
3116
3117 SDValue Guard;
3118 SDLoc dl = getCurSDLoc();
3119 SDValue StackSlotPtr = DAG.getFrameIndex(FI, PtrTy);
3120 const Module &M = *ParentBB->getParent()->getFunction().getParent();
3121 Align Align = DL.getPrefTypeAlign(
3122 PointerType::get(M.getContext(), DL.getAllocaAddrSpace()));
3123
3124 // Generate code to load the content of the guard slot.
3125 SDValue GuardVal = DAG.getLoad(
3126 PtrMemTy, dl, DAG.getEntryNode(), StackSlotPtr,
3127 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI), Align,
3129
3130 if (TLI.useStackGuardXorFP())
3131 GuardVal = TLI.emitStackGuardXorFP(DAG, GuardVal, dl);
3132
3133 // If we're using function-based instrumentation, call the guard check
3134 // function
3136 // Get the guard check function from the target and verify it exists since
3137 // we're using function-based instrumentation
3138 const Function *GuardCheckFn = TLI.getSSPStackGuardCheck(M);
3139 assert(GuardCheckFn && "Guard check function is null");
3140
3141 // The target provides a guard check function to validate the guard value.
3142 // Generate a call to that function with the content of the guard slot as
3143 // argument.
3144 FunctionType *FnTy = GuardCheckFn->getFunctionType();
3145 assert(FnTy->getNumParams() == 1 && "Invalid function signature");
3146
3148 TargetLowering::ArgListEntry Entry(GuardVal, FnTy->getParamType(0));
3149 if (GuardCheckFn->hasParamAttribute(0, Attribute::AttrKind::InReg))
3150 Entry.IsInReg = true;
3151 Args.push_back(Entry);
3152
3155 .setChain(DAG.getEntryNode())
3156 .setCallee(GuardCheckFn->getCallingConv(), FnTy->getReturnType(),
3157 getValue(GuardCheckFn), std::move(Args));
3158
3159 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
3160 DAG.setRoot(Result.second);
3161 return;
3162 }
3163
3164 // If useLoadStackGuardNode returns true, generate LOAD_STACK_GUARD.
3165 // Otherwise, emit a volatile load to retrieve the stack guard value.
3166 SDValue Chain = DAG.getEntryNode();
3167 if (TLI.useLoadStackGuardNode(M)) {
3168 Guard = getLoadStackGuard(DAG, dl, Chain);
3169 } else {
3170 if (const Value *IRGuard = TLI.getSDagStackGuard(M)) {
3171 SDValue GuardPtr = getValue(IRGuard);
3172 Guard = DAG.getLoad(PtrMemTy, dl, Chain, GuardPtr,
3173 MachinePointerInfo(IRGuard, 0), Align,
3175 } else {
3176 LLVMContext &Ctx = *DAG.getContext();
3177 Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
3178 Guard = DAG.getPOISON(PtrMemTy);
3179 }
3180 }
3181
3182 // Perform the comparison via a getsetcc.
3183 SDValue Cmp = DAG.getSetCC(
3184 dl, TLI.getSetCCResultType(DL, *DAG.getContext(), Guard.getValueType()),
3185 Guard, GuardVal, ISD::SETNE);
3186
3187 // If the guard/stackslot do not equal, branch to failure MBB.
3188 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl, MVT::Other, getControlRoot(),
3189 Cmp, DAG.getBasicBlock(SPD.getFailureMBB()));
3190 // Otherwise branch to success MBB.
3191 SDValue Br = DAG.getNode(ISD::BR, dl,
3192 MVT::Other, BrCond,
3193 DAG.getBasicBlock(SPD.getSuccessMBB()));
3194
3195 DAG.setRoot(Br);
3196}
3197
3198/// Codegen the failure basic block for a stack protector check.
3199///
3200/// A failure stack protector machine basic block consists simply of a call to
3201/// __stack_chk_fail().
3202///
3203/// For a high level explanation of how this fits into the stack protector
3204/// generation see the comment on the declaration of class
3205/// StackProtectorDescriptor.
3208
3209 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3210 MachineBasicBlock *ParentBB = SPD.getParentMBB();
3211 const Module &M = *ParentBB->getParent()->getFunction().getParent();
3212 SDValue Chain;
3213
3214 // For -Oz builds with a guard check function, we use function-based
3215 // instrumentation. Otherwise, if we have a guard check function, we call it
3216 // in the failure block.
3217 auto *GuardCheckFn = TLI.getSSPStackGuardCheck(M);
3218 if (GuardCheckFn && !SPD.shouldEmitFunctionBasedCheckStackProtector()) {
3219 // First create the loads to the guard/stack slot for the comparison.
3220 auto &DL = DAG.getDataLayout();
3221 EVT PtrTy = TLI.getFrameIndexTy(DL);
3222 EVT PtrMemTy = TLI.getPointerMemTy(DL, DL.getAllocaAddrSpace());
3223
3224 MachineFrameInfo &MFI = ParentBB->getParent()->getFrameInfo();
3225 int FI = MFI.getStackProtectorIndex();
3226
3227 SDLoc dl = getCurSDLoc();
3228 SDValue StackSlotPtr = DAG.getFrameIndex(FI, PtrTy);
3229 Align Align = DL.getPrefTypeAlign(
3230 PointerType::get(M.getContext(), DL.getAllocaAddrSpace()));
3231
3232 // Generate code to load the content of the guard slot.
3233 SDValue GuardVal = DAG.getLoad(
3234 PtrMemTy, dl, DAG.getEntryNode(), StackSlotPtr,
3235 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI), Align,
3237
3238 if (TLI.useStackGuardXorFP())
3239 GuardVal = TLI.emitStackGuardXorFP(DAG, GuardVal, dl);
3240
3241 // The target provides a guard check function to validate the guard value.
3242 // Generate a call to that function with the content of the guard slot as
3243 // argument.
3244 FunctionType *FnTy = GuardCheckFn->getFunctionType();
3245 assert(FnTy->getNumParams() == 1 && "Invalid function signature");
3246
3248 TargetLowering::ArgListEntry Entry(GuardVal, FnTy->getParamType(0));
3249 if (GuardCheckFn->hasParamAttribute(0, Attribute::AttrKind::InReg))
3250 Entry.IsInReg = true;
3251 Args.push_back(Entry);
3252
3255 .setChain(DAG.getEntryNode())
3256 .setCallee(GuardCheckFn->getCallingConv(), FnTy->getReturnType(),
3257 getValue(GuardCheckFn), std::move(Args));
3258
3259 Chain = TLI.LowerCallTo(CLI).second;
3260 } else {
3262 CallOptions.setDiscardResult(true);
3263 Chain = TLI.makeLibCall(DAG, RTLIB::STACKPROTECTOR_CHECK_FAIL, MVT::isVoid,
3264 {}, CallOptions, getCurSDLoc())
3265 .second;
3266 }
3267
3268 // Emit a trap instruction if we are required to do so.
3269 const TargetOptions &TargetOpts = DAG.getTarget().Options;
3270 if (TargetOpts.TrapUnreachable && !TargetOpts.NoTrapAfterNoreturn)
3271 Chain = DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, Chain);
3272
3273 DAG.setRoot(Chain);
3274}
3275
3276/// visitBitTestHeader - This function emits necessary code to produce value
3277/// suitable for "bit tests"
3279 MachineBasicBlock *SwitchBB) {
3280 SDLoc dl = getCurSDLoc();
3281
3282 // Subtract the minimum value.
3283 SDValue SwitchOp = getValue(B.SValue);
3284 EVT VT = SwitchOp.getValueType();
3285 SDValue RangeSub =
3286 DAG.getNode(ISD::SUB, dl, VT, SwitchOp, DAG.getConstant(B.First, dl, VT));
3287
3288 // Determine the type of the test operands.
3289 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3290 bool UsePtrType = false;
3291 if (!TLI.isTypeLegal(VT)) {
3292 UsePtrType = true;
3293 } else {
3294 for (const BitTestCase &Case : B.Cases)
3295 if (!isUIntN(VT.getSizeInBits(), Case.Mask)) {
3296 // Switch table case range are encoded into series of masks.
3297 // Just use pointer type, it's guaranteed to fit.
3298 UsePtrType = true;
3299 break;
3300 }
3301 }
3302 SDValue Sub = RangeSub;
3303 if (UsePtrType) {
3304 VT = TLI.getPointerTy(DAG.getDataLayout());
3305 Sub = DAG.getZExtOrTrunc(Sub, dl, VT);
3306 }
3307
3308 B.RegVT = VT.getSimpleVT();
3309 B.Reg = FuncInfo.CreateReg(B.RegVT);
3310 SDValue CopyTo = DAG.getCopyToReg(getControlRoot(), dl, B.Reg, Sub);
3311
3312 MachineBasicBlock* MBB = B.Cases[0].ThisBB;
3313
3314 if (!B.FallthroughUnreachable)
3315 addSuccessorWithProb(SwitchBB, B.Default, B.DefaultProb);
3316 addSuccessorWithProb(SwitchBB, MBB, B.Prob);
3317 SwitchBB->normalizeSuccProbs();
3318
3319 SDValue Root = CopyTo;
3320 if (!B.FallthroughUnreachable) {
3321 // Conditional branch to the default block.
3322 SDValue RangeCmp = DAG.getSetCC(dl,
3323 TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
3324 RangeSub.getValueType()),
3325 RangeSub, DAG.getConstant(B.Range, dl, RangeSub.getValueType()),
3326 ISD::SETUGT);
3327
3328 Root = DAG.getNode(ISD::BRCOND, dl, MVT::Other, Root, RangeCmp,
3329 DAG.getBasicBlock(B.Default));
3330 }
3331
3332 // Avoid emitting unnecessary branches to the next block.
3333 if (MBB != NextBlock(SwitchBB))
3334 Root = DAG.getNode(ISD::BR, dl, MVT::Other, Root, DAG.getBasicBlock(MBB));
3335
3336 DAG.setRoot(Root);
3337}
3338
3339/// visitBitTestCase - this function produces one "bit test"
3341 MachineBasicBlock *NextMBB,
3342 BranchProbability BranchProbToNext,
3343 Register Reg, BitTestCase &B,
3344 MachineBasicBlock *SwitchBB) {
3345 SDLoc dl = getCurSDLoc();
3346 MVT VT = BB.RegVT;
3347 SDValue ShiftOp = DAG.getCopyFromReg(getControlRoot(), dl, Reg, VT);
3348 SDValue Cmp;
3349 unsigned PopCount = llvm::popcount(B.Mask);
3350 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3351 if (PopCount == 1) {
3352 // Testing for a single bit; just compare the shift count with what it
3353 // would need to be to shift a 1 bit in that position.
3354 Cmp = DAG.getSetCC(
3355 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3356 ShiftOp, DAG.getConstant(llvm::countr_zero(B.Mask), dl, VT),
3357 ISD::SETEQ);
3358 } else if (PopCount == BB.Range) {
3359 // There is only one zero bit in the range, test for it directly.
3360 Cmp = DAG.getSetCC(
3361 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3362 ShiftOp, DAG.getConstant(llvm::countr_one(B.Mask), dl, VT), ISD::SETNE);
3363 } else {
3364 // Make desired shift
3365 SDValue SwitchVal = DAG.getNode(ISD::SHL, dl, VT,
3366 DAG.getConstant(1, dl, VT), ShiftOp);
3367
3368 // Emit bit tests and jumps
3369 SDValue AndOp = DAG.getNode(ISD::AND, dl,
3370 VT, SwitchVal, DAG.getConstant(B.Mask, dl, VT));
3371 Cmp = DAG.getSetCC(
3372 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3373 AndOp, DAG.getConstant(0, dl, VT), ISD::SETNE);
3374 }
3375
3376 // The branch probability from SwitchBB to B.TargetBB is B.ExtraProb.
3377 addSuccessorWithProb(SwitchBB, B.TargetBB, B.ExtraProb);
3378 // The branch probability from SwitchBB to NextMBB is BranchProbToNext.
3379 addSuccessorWithProb(SwitchBB, NextMBB, BranchProbToNext);
3380 // It is not guaranteed that the sum of B.ExtraProb and BranchProbToNext is
3381 // one as they are relative probabilities (and thus work more like weights),
3382 // and hence we need to normalize them to let the sum of them become one.
3383 SwitchBB->normalizeSuccProbs();
3384
3385 SDValue BrAnd = DAG.getNode(ISD::BRCOND, dl,
3386 MVT::Other, getControlRoot(),
3387 Cmp, DAG.getBasicBlock(B.TargetBB));
3388
3389 // Avoid emitting unnecessary branches to the next block.
3390 if (NextMBB != NextBlock(SwitchBB))
3391 BrAnd = DAG.getNode(ISD::BR, dl, MVT::Other, BrAnd,
3392 DAG.getBasicBlock(NextMBB));
3393
3394 DAG.setRoot(BrAnd);
3395}
3396
3397void SelectionDAGBuilder::visitInvoke(const InvokeInst &I) {
3398 MachineBasicBlock *InvokeMBB = FuncInfo.MBB;
3399
3400 // Retrieve successors. Look through artificial IR level blocks like
3401 // catchswitch for successors.
3402 MachineBasicBlock *Return = FuncInfo.getMBB(I.getSuccessor(0));
3403 const BasicBlock *EHPadBB = I.getSuccessor(1);
3404 MachineBasicBlock *EHPadMBB = FuncInfo.getMBB(EHPadBB);
3405
3406 // Deopt and ptrauth bundles are lowered in helper functions, and we don't
3407 // have to do anything here to lower funclet bundles.
3408 failForInvalidBundles(I, "invokes",
3414
3415 const Value *Callee(I.getCalledOperand());
3416 const Function *Fn = dyn_cast<Function>(Callee);
3417 if (isa<InlineAsm>(Callee))
3418 visitInlineAsm(I, EHPadBB);
3419 else if (Fn && Fn->isIntrinsic()) {
3420 switch (Fn->getIntrinsicID()) {
3421 default:
3422 llvm_unreachable("Cannot invoke this intrinsic");
3423 case Intrinsic::donothing:
3424 // Ignore invokes to @llvm.donothing: jump directly to the next BB.
3425 case Intrinsic::seh_try_begin:
3426 case Intrinsic::seh_scope_begin:
3427 case Intrinsic::seh_try_end:
3428 case Intrinsic::seh_scope_end:
3429 if (EHPadMBB)
3430 // a block referenced by EH table
3431 // so dtor-funclet not removed by opts
3432 EHPadMBB->setMachineBlockAddressTaken();
3433 break;
3434 case Intrinsic::experimental_patchpoint_void:
3435 case Intrinsic::experimental_patchpoint:
3436 visitPatchpoint(I, EHPadBB);
3437 break;
3438 case Intrinsic::experimental_gc_statepoint:
3440 break;
3441 // wasm_throw, wasm_rethrow: This is usually done in visitTargetIntrinsic,
3442 // but these intrinsics are special because they can be invoked, so we
3443 // manually lower it to a DAG node here.
3444 case Intrinsic::wasm_throw: {
3446 std::array<SDValue, 4> Ops = {
3447 getControlRoot(), // inchain for the terminator node
3448 DAG.getTargetConstant(Intrinsic::wasm_throw, getCurSDLoc(),
3450 getValue(I.getArgOperand(0)), // tag
3451 getValue(I.getArgOperand(1)) // thrown value
3452 };
3453 SDVTList VTs = DAG.getVTList(ArrayRef<EVT>({MVT::Other})); // outchain
3454 DAG.setRoot(DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops));
3455 break;
3456 }
3457 case Intrinsic::wasm_rethrow: {
3458 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3459 std::array<SDValue, 2> Ops = {
3460 getControlRoot(), // inchain for the terminator node
3461 DAG.getTargetConstant(Intrinsic::wasm_rethrow, getCurSDLoc(),
3462 TLI.getPointerTy(DAG.getDataLayout()))};
3463 SDVTList VTs = DAG.getVTList(ArrayRef<EVT>({MVT::Other})); // outchain
3464 DAG.setRoot(DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops));
3465 break;
3466 }
3467 }
3468 } else if (I.hasDeoptState()) {
3469 // Currently we do not lower any intrinsic calls with deopt operand bundles.
3470 // Eventually we will support lowering the @llvm.experimental.deoptimize
3471 // intrinsic, and right now there are no plans to support other intrinsics
3472 // with deopt state.
3473 LowerCallSiteWithDeoptBundle(&I, getValue(Callee), EHPadBB);
3474 } else if (I.countOperandBundlesOfType(LLVMContext::OB_ptrauth)) {
3476 } else {
3477 LowerCallTo(I, getValue(Callee), false, false, EHPadBB);
3478 }
3479
3480 // If the value of the invoke is used outside of its defining block, make it
3481 // available as a virtual register.
3482 // We already took care of the exported value for the statepoint instruction
3483 // during call to the LowerStatepoint.
3484 if (!isa<GCStatepointInst>(I)) {
3486 }
3487
3489 BranchProbabilityInfo *BPI = FuncInfo.BPI;
3490 BranchProbability EHPadBBProb =
3491 BPI ? BPI->getEdgeProbability(InvokeMBB->getBasicBlock(), EHPadBB)
3493 findUnwindDestinations(FuncInfo, EHPadBB, EHPadBBProb, UnwindDests);
3494
3495 // Update successor info.
3496 addSuccessorWithProb(InvokeMBB, Return);
3497 for (auto &UnwindDest : UnwindDests) {
3498 UnwindDest.first->setIsEHPad();
3499 addSuccessorWithProb(InvokeMBB, UnwindDest.first, UnwindDest.second);
3500 }
3501 InvokeMBB->normalizeSuccProbs();
3502
3503 // Drop into normal successor.
3504 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other, getControlRoot(),
3505 DAG.getBasicBlock(Return)));
3506}
3507
3508/// The intrinsics currently supported by callbr are implicit control flow
3509/// intrinsics such as amdgcn.kill.
3510/// - they should be called (no "dontcall-" attributes)
3511/// - they do not touch memory on the target (= !TLI.getTgtMemIntrinsic())
3512/// - they do not need custom argument handling (no
3513/// TLI.CollectTargetIntrinsicOperands())
3514void SelectionDAGBuilder::visitCallBrIntrinsic(const CallBrInst &I) {
3515 TargetLowering::IntrinsicInfo Info;
3516 assert(!DAG.getTargetLoweringInfo().getTgtMemIntrinsic(
3517 Info, I, DAG.getMachineFunction(), I.getIntrinsicID()) &&
3518 "Intrinsic touches memory");
3519
3520 auto [HasChain, OnlyLoad] = getTargetIntrinsicCallProperties(I);
3521
3523 getTargetIntrinsicOperands(I, HasChain, OnlyLoad);
3524 SDVTList VTs = getTargetIntrinsicVTList(I, HasChain);
3525
3526 // Create the node.
3527 SDValue Result =
3528 getTargetNonMemIntrinsicNode(*I.getType(), HasChain, Ops, VTs);
3529 Result = handleTargetIntrinsicRet(I, HasChain, OnlyLoad, Result);
3530
3531 setValue(&I, Result);
3532}
3533
3534void SelectionDAGBuilder::visitCallBr(const CallBrInst &I) {
3535 MachineBasicBlock *CallBrMBB = FuncInfo.MBB;
3536
3537 if (I.isInlineAsm()) {
3538 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
3539 // have to do anything here to lower funclet bundles.
3540 failForInvalidBundles(I, "callbrs",
3542 visitInlineAsm(I);
3543 } else {
3544 assert(!I.hasOperandBundles() &&
3545 "Can't have operand bundles for intrinsics");
3546 visitCallBrIntrinsic(I);
3547 }
3549
3550 // Retrieve successors.
3551 SmallPtrSet<BasicBlock *, 8> Dests;
3552 Dests.insert(I.getDefaultDest());
3553 MachineBasicBlock *Return = FuncInfo.getMBB(I.getDefaultDest());
3554
3555 // Update successor info.
3556 addSuccessorWithProb(CallBrMBB, Return, BranchProbability::getOne());
3557 // TODO: For most of the cases where there is an intrinsic callbr, we're
3558 // having exactly one indirect target, which will be unreachable. As soon as
3559 // this changes, we might need to enhance
3560 // Target->setIsInlineAsmBrIndirectTarget or add something similar for
3561 // intrinsic indirect branches.
3562 if (I.isInlineAsm()) {
3563 for (BasicBlock *Dest : I.getIndirectDests()) {
3564 MachineBasicBlock *Target = FuncInfo.getMBB(Dest);
3565 Target->setIsInlineAsmBrIndirectTarget();
3566 // If we introduce a type of asm goto statement that is permitted to use
3567 // an indirect call instruction to jump to its labels, then we should add
3568 // a call to Target->setMachineBlockAddressTaken() here, to mark the
3569 // target block as requiring a BTI.
3570
3571 Target->setLabelMustBeEmitted();
3572 // Don't add duplicate machine successors.
3573 if (Dests.insert(Dest).second)
3574 addSuccessorWithProb(CallBrMBB, Target, BranchProbability::getZero());
3575 }
3576 }
3577 CallBrMBB->normalizeSuccProbs();
3578
3579 // Drop into default successor.
3580 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(),
3581 MVT::Other, getControlRoot(),
3582 DAG.getBasicBlock(Return)));
3583}
3584
3585void SelectionDAGBuilder::visitResume(const ResumeInst &RI) {
3586 llvm_unreachable("SelectionDAGBuilder shouldn't visit resume instructions!");
3587}
3588
3589void SelectionDAGBuilder::visitLandingPad(const LandingPadInst &LP) {
3590 assert(FuncInfo.MBB->isEHPad() &&
3591 "Call to landingpad not in landing pad!");
3592
3593 // If there aren't registers to copy the values into (e.g., during SjLj
3594 // exceptions), then don't bother to create these DAG nodes.
3595 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3596 const Constant *PersonalityFn = FuncInfo.Fn->getPersonalityFn();
3597 if (TLI.getExceptionPointerRegister(PersonalityFn) == 0 &&
3598 TLI.getExceptionSelectorRegister(PersonalityFn) == 0)
3599 return;
3600
3601 // If landingpad's return type is token type, we don't create DAG nodes
3602 // for its exception pointer and selector value. The extraction of exception
3603 // pointer or selector value from token type landingpads is not currently
3604 // supported.
3605 if (LP.getType()->isTokenTy())
3606 return;
3607
3608 SmallVector<EVT, 2> ValueVTs;
3609 SDLoc dl = getCurSDLoc();
3610 ComputeValueVTs(TLI, DAG.getDataLayout(), LP.getType(), ValueVTs);
3611 assert(ValueVTs.size() == 2 && "Only two-valued landingpads are supported");
3612
3613 // Get the two live-in registers as SDValues. The physregs have already been
3614 // copied into virtual registers.
3615 SDValue Ops[2];
3616 if (FuncInfo.ExceptionPointerVirtReg) {
3617 Ops[0] = DAG.getZExtOrTrunc(
3618 DAG.getCopyFromReg(DAG.getEntryNode(), dl,
3619 FuncInfo.ExceptionPointerVirtReg,
3620 TLI.getPointerTy(DAG.getDataLayout())),
3621 dl, ValueVTs[0]);
3622 } else {
3623 Ops[0] = DAG.getConstant(0, dl, TLI.getPointerTy(DAG.getDataLayout()));
3624 }
3625 Ops[1] = DAG.getZExtOrTrunc(
3626 DAG.getCopyFromReg(DAG.getEntryNode(), dl,
3627 FuncInfo.ExceptionSelectorVirtReg,
3628 TLI.getPointerTy(DAG.getDataLayout())),
3629 dl, ValueVTs[1]);
3630
3631 // Merge into one.
3632 SDValue Res = DAG.getNode(ISD::MERGE_VALUES, dl,
3633 DAG.getVTList(ValueVTs), Ops);
3634 setValue(&LP, Res);
3635}
3636
3639 // Update JTCases.
3640 for (JumpTableBlock &JTB : SL->JTCases)
3641 if (JTB.first.HeaderBB == First)
3642 JTB.first.HeaderBB = Last;
3643
3644 // Update BitTestCases.
3645 for (BitTestBlock &BTB : SL->BitTestCases)
3646 if (BTB.Parent == First)
3647 BTB.Parent = Last;
3648}
3649
3650void SelectionDAGBuilder::visitIndirectBr(const IndirectBrInst &I) {
3651 MachineBasicBlock *IndirectBrMBB = FuncInfo.MBB;
3652
3653 // Update machine-CFG edges with unique successors.
3655 for (unsigned i = 0, e = I.getNumSuccessors(); i != e; ++i) {
3656 BasicBlock *BB = I.getSuccessor(i);
3657 bool Inserted = Done.insert(BB).second;
3658 if (!Inserted)
3659 continue;
3660
3661 MachineBasicBlock *Succ = FuncInfo.getMBB(BB);
3662 addSuccessorWithProb(IndirectBrMBB, Succ);
3663 }
3664 IndirectBrMBB->normalizeSuccProbs();
3665
3667 MVT::Other, getControlRoot(),
3668 getValue(I.getAddress())));
3669}
3670
3671void SelectionDAGBuilder::visitUnreachable(const UnreachableInst &I) {
3672 if (!I.shouldLowerToTrap(DAG.getTarget().Options.TrapUnreachable,
3673 DAG.getTarget().Options.NoTrapAfterNoreturn))
3674 return;
3675
3676 DAG.setRoot(DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, DAG.getRoot()));
3677}
3678
3679void SelectionDAGBuilder::visitUnary(const User &I, unsigned Opcode) {
3680 SDNodeFlags Flags;
3681 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3682 Flags.copyFMF(*FPOp);
3683
3684 SDValue Op = getValue(I.getOperand(0));
3685 SDValue UnNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op.getValueType(),
3686 Op, Flags);
3687 setValue(&I, UnNodeValue);
3688}
3689
3690void SelectionDAGBuilder::visitBinary(const User &I, unsigned Opcode) {
3691 SDNodeFlags Flags;
3692 if (auto *OFBinOp = dyn_cast<OverflowingBinaryOperator>(&I)) {
3693 Flags.setNoSignedWrap(OFBinOp->hasNoSignedWrap());
3694 Flags.setNoUnsignedWrap(OFBinOp->hasNoUnsignedWrap());
3695 }
3696 if (auto *ExactOp = dyn_cast<PossiblyExactOperator>(&I))
3697 Flags.setExact(ExactOp->isExact());
3698 if (auto *DisjointOp = dyn_cast<PossiblyDisjointInst>(&I))
3699 Flags.setDisjoint(DisjointOp->isDisjoint());
3700 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3701 Flags.copyFMF(*FPOp);
3702
3703 SDValue Op1 = getValue(I.getOperand(0));
3704 SDValue Op2 = getValue(I.getOperand(1));
3705 SDValue BinNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(),
3706 Op1, Op2, Flags);
3707 setValue(&I, BinNodeValue);
3708}
3709
3710void SelectionDAGBuilder::visitShift(const User &I, unsigned Opcode) {
3711 SDValue Op1 = getValue(I.getOperand(0));
3712 SDValue Op2 = getValue(I.getOperand(1));
3713
3714 EVT ShiftTy = DAG.getTargetLoweringInfo().getShiftAmountTy(
3715 Op1.getValueType(), DAG.getDataLayout());
3716
3717 // Coerce the shift amount to the right type if we can. This exposes the
3718 // truncate or zext to optimization early.
3719 if (!I.getType()->isVectorTy() && Op2.getValueType() != ShiftTy) {
3721 "Unexpected shift type");
3722 Op2 = DAG.getZExtOrTrunc(Op2, getCurSDLoc(), ShiftTy);
3723 }
3724
3725 bool nuw = false;
3726 bool nsw = false;
3727 bool exact = false;
3728
3729 if (Opcode == ISD::SRL || Opcode == ISD::SRA || Opcode == ISD::SHL) {
3730
3731 if (const OverflowingBinaryOperator *OFBinOp =
3733 nuw = OFBinOp->hasNoUnsignedWrap();
3734 nsw = OFBinOp->hasNoSignedWrap();
3735 }
3736 if (const PossiblyExactOperator *ExactOp =
3738 exact = ExactOp->isExact();
3739 }
3740 SDNodeFlags Flags;
3741 Flags.setExact(exact);
3742 Flags.setNoSignedWrap(nsw);
3743 Flags.setNoUnsignedWrap(nuw);
3744 SDValue Res = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(), Op1, Op2,
3745 Flags);
3746 setValue(&I, Res);
3747}
3748
3749void SelectionDAGBuilder::visitSDiv(const User &I) {
3750 SDValue Op1 = getValue(I.getOperand(0));
3751 SDValue Op2 = getValue(I.getOperand(1));
3752
3753 SDNodeFlags Flags;
3754 Flags.setExact(isa<PossiblyExactOperator>(&I) &&
3755 cast<PossiblyExactOperator>(&I)->isExact());
3756 setValue(&I, DAG.getNode(ISD::SDIV, getCurSDLoc(), Op1.getValueType(), Op1,
3757 Op2, Flags));
3758}
3759
3760void SelectionDAGBuilder::visitICmp(const ICmpInst &I) {
3761 ICmpInst::Predicate predicate = I.getPredicate();
3762 SDValue Op1 = getValue(I.getOperand(0));
3763 SDValue Op2 = getValue(I.getOperand(1));
3764 ISD::CondCode Opcode = getICmpCondCode(predicate);
3765
3766 auto &TLI = DAG.getTargetLoweringInfo();
3767 EVT MemVT =
3768 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
3769
3770 // If a pointer's DAG type is larger than its memory type then the DAG values
3771 // are zero-extended. This breaks signed comparisons so truncate back to the
3772 // underlying type before doing the compare.
3773 if (Op1.getValueType() != MemVT) {
3774 Op1 = DAG.getPtrExtOrTrunc(Op1, getCurSDLoc(), MemVT);
3775 Op2 = DAG.getPtrExtOrTrunc(Op2, getCurSDLoc(), MemVT);
3776 }
3777
3778 SDNodeFlags Flags;
3779 Flags.setSameSign(I.hasSameSign());
3780 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
3781
3782 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3783 I.getType());
3784 setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Opcode));
3785}
3786
3787void SelectionDAGBuilder::visitFCmp(const FCmpInst &I) {
3788 FCmpInst::Predicate predicate = I.getPredicate();
3789 SDValue Op1 = getValue(I.getOperand(0));
3790 SDValue Op2 = getValue(I.getOperand(1));
3791
3792 ISD::CondCode Condition = getFCmpCondCode(predicate);
3793 auto *FPMO = cast<FPMathOperator>(&I);
3794 if (FPMO->hasNoNaNs() || TM.Options.NoNaNsFPMath)
3795 Condition = getFCmpCodeWithoutNaN(Condition);
3796
3797 SDNodeFlags Flags;
3798 Flags.copyFMF(*FPMO);
3799 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
3800
3801 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3802 I.getType());
3803 setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Condition));
3804}
3805
3806// Check if the condition of the select has one use or two users that are both
3807// selects with the same condition.
3808static bool hasOnlySelectUsers(const Value *Cond) {
3809 return llvm::all_of(Cond->users(), [](const Value *V) {
3810 return isa<SelectInst>(V);
3811 });
3812}
3813
3814void SelectionDAGBuilder::visitSelect(const User &I) {
3815 SmallVector<EVT, 4> ValueVTs;
3816 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
3817 ValueVTs);
3818 unsigned NumValues = ValueVTs.size();
3819 if (NumValues == 0) return;
3820
3821 SmallVector<SDValue, 4> Values(NumValues);
3822 SDValue Cond = getValue(I.getOperand(0));
3823 SDValue LHSVal = getValue(I.getOperand(1));
3824 SDValue RHSVal = getValue(I.getOperand(2));
3825 SmallVector<SDValue, 1> BaseOps(1, Cond);
3827 Cond.getValueType().isVector() ? ISD::VSELECT : ISD::SELECT;
3828
3829 bool IsUnaryAbs = false;
3830 bool Negate = false;
3831
3832 SDNodeFlags Flags;
3833 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3834 Flags.copyFMF(*FPOp);
3835
3836 Flags.setUnpredictable(
3837 cast<SelectInst>(I).getMetadata(LLVMContext::MD_unpredictable));
3838
3839 // Min/max matching is only viable if all output VTs are the same.
3840 if (all_equal(ValueVTs)) {
3841 EVT VT = ValueVTs[0];
3842 LLVMContext &Ctx = *DAG.getContext();
3843 auto &TLI = DAG.getTargetLoweringInfo();
3844
3845 // We care about the legality of the operation after it has been type
3846 // legalized.
3847 while (TLI.getTypeAction(Ctx, VT) != TargetLoweringBase::TypeLegal)
3848 VT = TLI.getTypeToTransformTo(Ctx, VT);
3849
3850 // If the vselect is legal, assume we want to leave this as a vector setcc +
3851 // vselect. Otherwise, if this is going to be scalarized, we want to see if
3852 // min/max is legal on the scalar type.
3853 bool UseScalarMinMax = VT.isVector() &&
3855
3856 // ValueTracking's select pattern matching does not account for -0.0,
3857 // so we can't lower to FMINIMUM/FMAXIMUM because those nodes specify that
3858 // -0.0 is less than +0.0.
3859 const Value *LHS, *RHS;
3860 auto SPR = matchSelectPattern(&I, LHS, RHS);
3862 switch (SPR.Flavor) {
3863 case SPF_UMAX: Opc = ISD::UMAX; break;
3864 case SPF_UMIN: Opc = ISD::UMIN; break;
3865 case SPF_SMAX: Opc = ISD::SMAX; break;
3866 case SPF_SMIN: Opc = ISD::SMIN; break;
3867 case SPF_FMINNUM:
3868 switch (SPR.NaNBehavior) {
3869 case SPNB_NA: llvm_unreachable("No NaN behavior for FP op?");
3870 case SPNB_RETURNS_NAN: break;
3871 case SPNB_RETURNS_OTHER: Opc = ISD::FMINNUM; break;
3872 case SPNB_RETURNS_ANY:
3874 (UseScalarMinMax &&
3876 Opc = ISD::FMINNUM;
3877 break;
3878 }
3879 break;
3880 case SPF_FMAXNUM:
3881 switch (SPR.NaNBehavior) {
3882 case SPNB_NA: llvm_unreachable("No NaN behavior for FP op?");
3883 case SPNB_RETURNS_NAN: break;
3884 case SPNB_RETURNS_OTHER: Opc = ISD::FMAXNUM; break;
3885 case SPNB_RETURNS_ANY:
3887 (UseScalarMinMax &&
3889 Opc = ISD::FMAXNUM;
3890 break;
3891 }
3892 break;
3893 case SPF_NABS:
3894 Negate = true;
3895 [[fallthrough]];
3896 case SPF_ABS:
3897 IsUnaryAbs = true;
3898 Opc = ISD::ABS;
3899 break;
3900 default: break;
3901 }
3902
3903 if (!IsUnaryAbs && Opc != ISD::DELETED_NODE &&
3904 (TLI.isOperationLegalOrCustom(Opc, VT) ||
3905 (UseScalarMinMax &&
3907 // If the underlying comparison instruction is used by any other
3908 // instruction, the consumed instructions won't be destroyed, so it is
3909 // not profitable to convert to a min/max.
3911 OpCode = Opc;
3912 LHSVal = getValue(LHS);
3913 RHSVal = getValue(RHS);
3914 BaseOps.clear();
3915 }
3916
3917 if (IsUnaryAbs) {
3918 OpCode = Opc;
3919 LHSVal = getValue(LHS);
3920 BaseOps.clear();
3921 }
3922 }
3923
3924 if (IsUnaryAbs) {
3925 for (unsigned i = 0; i != NumValues; ++i) {
3926 SDLoc dl = getCurSDLoc();
3927 EVT VT = LHSVal.getNode()->getValueType(LHSVal.getResNo() + i);
3928 Values[i] =
3929 DAG.getNode(OpCode, dl, VT, LHSVal.getValue(LHSVal.getResNo() + i));
3930 if (Negate)
3931 Values[i] = DAG.getNegative(Values[i], dl, VT);
3932 }
3933 } else {
3934 for (unsigned i = 0; i != NumValues; ++i) {
3935 SmallVector<SDValue, 3> Ops(BaseOps.begin(), BaseOps.end());
3936 Ops.push_back(SDValue(LHSVal.getNode(), LHSVal.getResNo() + i));
3937 Ops.push_back(SDValue(RHSVal.getNode(), RHSVal.getResNo() + i));
3938 Values[i] = DAG.getNode(
3939 OpCode, getCurSDLoc(),
3940 LHSVal.getNode()->getValueType(LHSVal.getResNo() + i), Ops, Flags);
3941 }
3942 }
3943
3945 DAG.getVTList(ValueVTs), Values));
3946}
3947
3948void SelectionDAGBuilder::visitTrunc(const User &I) {
3949 // TruncInst cannot be a no-op cast because sizeof(src) > sizeof(dest).
3950 SDValue N = getValue(I.getOperand(0));
3951 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3952 I.getType());
3953 SDNodeFlags Flags;
3954 if (auto *Trunc = dyn_cast<TruncInst>(&I)) {
3955 Flags.setNoSignedWrap(Trunc->hasNoSignedWrap());
3956 Flags.setNoUnsignedWrap(Trunc->hasNoUnsignedWrap());
3957 }
3958
3959 setValue(&I, DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), DestVT, N, Flags));
3960}
3961
3962void SelectionDAGBuilder::visitZExt(const User &I) {
3963 // ZExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
3964 // ZExt also can't be a cast to bool for same reason. So, nothing much to do
3965 SDValue N = getValue(I.getOperand(0));
3966 auto &TLI = DAG.getTargetLoweringInfo();
3967 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
3968
3969 SDNodeFlags Flags;
3970 if (auto *PNI = dyn_cast<PossiblyNonNegInst>(&I))
3971 Flags.setNonNeg(PNI->hasNonNeg());
3972
3973 // Eagerly use nonneg information to canonicalize towards sign_extend if
3974 // that is the target's preference.
3975 // TODO: Let the target do this later.
3976 if (Flags.hasNonNeg() &&
3977 TLI.isSExtCheaperThanZExt(N.getValueType(), DestVT)) {
3978 setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));
3979 return;
3980 }
3981
3982 setValue(&I, DAG.getNode(ISD::ZERO_EXTEND, getCurSDLoc(), DestVT, N, Flags));
3983}
3984
3985void SelectionDAGBuilder::visitSExt(const User &I) {
3986 // SExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
3987 // SExt also can't be a cast to bool for same reason. So, nothing much to do
3988 SDValue N = getValue(I.getOperand(0));
3989 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3990 I.getType());
3991 setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));
3992}
3993
3994void SelectionDAGBuilder::visitFPTrunc(const User &I) {
3995 // FPTrunc is never a no-op cast, no need to check
3996 SDValue N = getValue(I.getOperand(0));
3997 SDLoc dl = getCurSDLoc();
3998 SDNodeFlags Flags;
3999 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
4000 Flags.copyFMF(*FPOp);
4001 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4002 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4003 setValue(&I, DAG.getNode(ISD::FP_ROUND, dl, DestVT, N,
4004 DAG.getTargetConstant(
4005 0, dl, TLI.getPointerTy(DAG.getDataLayout())),
4006 Flags));
4007}
4008
4009void SelectionDAGBuilder::visitFPExt(const User &I) {
4010 // FPExt is never a no-op cast, no need to check
4011 SDValue N = getValue(I.getOperand(0));
4012 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4013 I.getType());
4014 SDNodeFlags Flags;
4015 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
4016 Flags.copyFMF(*FPOp);
4017 setValue(&I, DAG.getNode(ISD::FP_EXTEND, getCurSDLoc(), DestVT, N, Flags));
4018}
4019
4020void SelectionDAGBuilder::visitFPToUI(const User &I) {
4021 // FPToUI is never a no-op cast, no need to check
4022 SDValue N = getValue(I.getOperand(0));
4023 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4024 I.getType());
4025 setValue(&I, DAG.getNode(ISD::FP_TO_UINT, getCurSDLoc(), DestVT, N));
4026}
4027
4028void SelectionDAGBuilder::visitFPToSI(const User &I) {
4029 // FPToSI is never a no-op cast, no need to check
4030 SDValue N = getValue(I.getOperand(0));
4031 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4032 I.getType());
4033 setValue(&I, DAG.getNode(ISD::FP_TO_SINT, getCurSDLoc(), DestVT, N));
4034}
4035
4036void SelectionDAGBuilder::visitUIToFP(const User &I) {
4037 // UIToFP is never a no-op cast, no need to check
4038 SDValue N = getValue(I.getOperand(0));
4039 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4040 I.getType());
4041 SDNodeFlags Flags;
4042 if (auto *PNI = dyn_cast<PossiblyNonNegInst>(&I))
4043 Flags.setNonNeg(PNI->hasNonNeg());
4044
4045 setValue(&I, DAG.getNode(ISD::UINT_TO_FP, getCurSDLoc(), DestVT, N, Flags));
4046}
4047
4048void SelectionDAGBuilder::visitSIToFP(const User &I) {
4049 // SIToFP is never a no-op cast, no need to check
4050 SDValue N = getValue(I.getOperand(0));
4051 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4052 I.getType());
4053 setValue(&I, DAG.getNode(ISD::SINT_TO_FP, getCurSDLoc(), DestVT, N));
4054}
4055
4056void SelectionDAGBuilder::visitPtrToAddr(const User &I) {
4057 SDValue N = getValue(I.getOperand(0));
4058 // By definition the type of the ptrtoaddr must be equal to the address type.
4059 const auto &TLI = DAG.getTargetLoweringInfo();
4060 EVT AddrVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4061 // The address width must be smaller or equal to the pointer representation
4062 // width, so we lower ptrtoaddr as a truncate (possibly folded to a no-op).
4063 N = DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), AddrVT, N);
4064 setValue(&I, N);
4065}
4066
4067void SelectionDAGBuilder::visitPtrToInt(const User &I) {
4068 // What to do depends on the size of the integer and the size of the pointer.
4069 // We can either truncate, zero extend, or no-op, accordingly.
4070 SDValue N = getValue(I.getOperand(0));
4071 auto &TLI = DAG.getTargetLoweringInfo();
4072 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4073 I.getType());
4074 EVT PtrMemVT =
4075 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
4076 N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), PtrMemVT);
4077 N = DAG.getZExtOrTrunc(N, getCurSDLoc(), DestVT);
4078 setValue(&I, N);
4079}
4080
4081void SelectionDAGBuilder::visitIntToPtr(const User &I) {
4082 // What to do depends on the size of the integer and the size of the pointer.
4083 // We can either truncate, zero extend, or no-op, accordingly.
4084 SDValue N = getValue(I.getOperand(0));
4085 auto &TLI = DAG.getTargetLoweringInfo();
4086 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4087 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(), I.getType());
4088 N = DAG.getZExtOrTrunc(N, getCurSDLoc(), PtrMemVT);
4089 N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), DestVT);
4090 setValue(&I, N);
4091}
4092
4093void SelectionDAGBuilder::visitBitCast(const User &I) {
4094 SDValue N = getValue(I.getOperand(0));
4095 SDLoc dl = getCurSDLoc();
4096 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4097 I.getType());
4098
4099 // BitCast assures us that source and destination are the same size so this is
4100 // either a BITCAST or a no-op.
4101 if (DestVT != N.getValueType())
4102 setValue(&I, DAG.getNode(ISD::BITCAST, dl,
4103 DestVT, N)); // convert types.
4104 // Check if the original LLVM IR Operand was a ConstantInt, because getValue()
4105 // might fold any kind of constant expression to an integer constant and that
4106 // is not what we are looking for. Only recognize a bitcast of a genuine
4107 // constant integer as an opaque constant.
4108 else if(ConstantInt *C = dyn_cast<ConstantInt>(I.getOperand(0)))
4109 setValue(&I, DAG.getConstant(C->getValue(), dl, DestVT, /*isTarget=*/false,
4110 /*isOpaque*/true));
4111 else
4112 setValue(&I, N); // noop cast.
4113}
4114
4115void SelectionDAGBuilder::visitAddrSpaceCast(const User &I) {
4116 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4117 const Value *SV = I.getOperand(0);
4118 SDValue N = getValue(SV);
4119 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4120
4121 unsigned SrcAS = SV->getType()->getPointerAddressSpace();
4122 unsigned DestAS = I.getType()->getPointerAddressSpace();
4123
4124 if (!TM.isNoopAddrSpaceCast(SrcAS, DestAS))
4125 N = DAG.getAddrSpaceCast(getCurSDLoc(), DestVT, N, SrcAS, DestAS);
4126
4127 setValue(&I, N);
4128}
4129
4130void SelectionDAGBuilder::visitInsertElement(const User &I) {
4131 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4132 SDValue InVec = getValue(I.getOperand(0));
4133 SDValue InVal = getValue(I.getOperand(1));
4134 SDValue InIdx = DAG.getZExtOrTrunc(getValue(I.getOperand(2)), getCurSDLoc(),
4135 TLI.getVectorIdxTy(DAG.getDataLayout()));
4137 TLI.getValueType(DAG.getDataLayout(), I.getType()),
4138 InVec, InVal, InIdx));
4139}
4140
4141void SelectionDAGBuilder::visitExtractElement(const User &I) {
4142 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4143 SDValue InVec = getValue(I.getOperand(0));
4144 SDValue InIdx = DAG.getZExtOrTrunc(getValue(I.getOperand(1)), getCurSDLoc(),
4145 TLI.getVectorIdxTy(DAG.getDataLayout()));
4147 TLI.getValueType(DAG.getDataLayout(), I.getType()),
4148 InVec, InIdx));
4149}
4150
4151void SelectionDAGBuilder::visitShuffleVector(const User &I) {
4152 SDValue Src1 = getValue(I.getOperand(0));
4153 SDValue Src2 = getValue(I.getOperand(1));
4154 ArrayRef<int> Mask;
4155 if (auto *SVI = dyn_cast<ShuffleVectorInst>(&I))
4156 Mask = SVI->getShuffleMask();
4157 else
4158 Mask = cast<ConstantExpr>(I).getShuffleMask();
4159 SDLoc DL = getCurSDLoc();
4160 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4161 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4162 EVT SrcVT = Src1.getValueType();
4163
4164 if (all_of(Mask, [](int Elem) { return Elem == 0; }) &&
4165 VT.isScalableVector()) {
4166 // Canonical splat form of first element of first input vector.
4167 SDValue FirstElt =
4168 DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, SrcVT.getScalarType(), Src1,
4169 DAG.getVectorIdxConstant(0, DL));
4170 setValue(&I, DAG.getNode(ISD::SPLAT_VECTOR, DL, VT, FirstElt));
4171 return;
4172 }
4173
4174 // For now, we only handle splats for scalable vectors.
4175 // The DAGCombiner will perform a BUILD_VECTOR -> SPLAT_VECTOR transformation
4176 // for targets that support a SPLAT_VECTOR for non-scalable vector types.
4177 assert(!VT.isScalableVector() && "Unsupported scalable vector shuffle");
4178
4179 unsigned SrcNumElts = SrcVT.getVectorNumElements();
4180 unsigned MaskNumElts = Mask.size();
4181
4182 if (SrcNumElts == MaskNumElts) {
4183 setValue(&I, DAG.getVectorShuffle(VT, DL, Src1, Src2, Mask));
4184 return;
4185 }
4186
4187 // Normalize the shuffle vector since mask and vector length don't match.
4188 if (SrcNumElts < MaskNumElts) {
4189 // Mask is longer than the source vectors. We can use concatenate vector to
4190 // make the mask and vectors lengths match.
4191
4192 if (MaskNumElts % SrcNumElts == 0) {
4193 // Mask length is a multiple of the source vector length.
4194 // Check if the shuffle is some kind of concatenation of the input
4195 // vectors.
4196 unsigned NumConcat = MaskNumElts / SrcNumElts;
4197 bool IsConcat = true;
4198 SmallVector<int, 8> ConcatSrcs(NumConcat, -1);
4199 for (unsigned i = 0; i != MaskNumElts; ++i) {
4200 int Idx = Mask[i];
4201 if (Idx < 0)
4202 continue;
4203 // Ensure the indices in each SrcVT sized piece are sequential and that
4204 // the same source is used for the whole piece.
4205 if ((Idx % SrcNumElts != (i % SrcNumElts)) ||
4206 (ConcatSrcs[i / SrcNumElts] >= 0 &&
4207 ConcatSrcs[i / SrcNumElts] != (int)(Idx / SrcNumElts))) {
4208 IsConcat = false;
4209 break;
4210 }
4211 // Remember which source this index came from.
4212 ConcatSrcs[i / SrcNumElts] = Idx / SrcNumElts;
4213 }
4214
4215 // The shuffle is concatenating multiple vectors together. Just emit
4216 // a CONCAT_VECTORS operation.
4217 if (IsConcat) {
4218 SmallVector<SDValue, 8> ConcatOps;
4219 for (auto Src : ConcatSrcs) {
4220 if (Src < 0)
4221 ConcatOps.push_back(DAG.getUNDEF(SrcVT));
4222 else if (Src == 0)
4223 ConcatOps.push_back(Src1);
4224 else
4225 ConcatOps.push_back(Src2);
4226 }
4227 setValue(&I, DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, ConcatOps));
4228 return;
4229 }
4230 }
4231
4232 unsigned PaddedMaskNumElts = alignTo(MaskNumElts, SrcNumElts);
4233 unsigned NumConcat = PaddedMaskNumElts / SrcNumElts;
4234 EVT PaddedVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(),
4235 PaddedMaskNumElts);
4236
4237 // Pad both vectors with undefs to make them the same length as the mask.
4238 SDValue UndefVal = DAG.getUNDEF(SrcVT);
4239
4240 SmallVector<SDValue, 8> MOps1(NumConcat, UndefVal);
4241 SmallVector<SDValue, 8> MOps2(NumConcat, UndefVal);
4242 MOps1[0] = Src1;
4243 MOps2[0] = Src2;
4244
4245 Src1 = DAG.getNode(ISD::CONCAT_VECTORS, DL, PaddedVT, MOps1);
4246 Src2 = DAG.getNode(ISD::CONCAT_VECTORS, DL, PaddedVT, MOps2);
4247
4248 // Readjust mask for new input vector length.
4249 SmallVector<int, 8> MappedOps(PaddedMaskNumElts, -1);
4250 for (unsigned i = 0; i != MaskNumElts; ++i) {
4251 int Idx = Mask[i];
4252 if (Idx >= (int)SrcNumElts)
4253 Idx -= SrcNumElts - PaddedMaskNumElts;
4254 MappedOps[i] = Idx;
4255 }
4256
4257 SDValue Result = DAG.getVectorShuffle(PaddedVT, DL, Src1, Src2, MappedOps);
4258
4259 // If the concatenated vector was padded, extract a subvector with the
4260 // correct number of elements.
4261 if (MaskNumElts != PaddedMaskNumElts)
4262 Result = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Result,
4263 DAG.getVectorIdxConstant(0, DL));
4264
4265 setValue(&I, Result);
4266 return;
4267 }
4268
4269 assert(SrcNumElts > MaskNumElts);
4270
4271 // Analyze the access pattern of the vector to see if we can extract
4272 // two subvectors and do the shuffle.
4273 int StartIdx[2] = {-1, -1}; // StartIdx to extract from
4274 bool CanExtract = true;
4275 for (int Idx : Mask) {
4276 unsigned Input = 0;
4277 if (Idx < 0)
4278 continue;
4279
4280 if (Idx >= (int)SrcNumElts) {
4281 Input = 1;
4282 Idx -= SrcNumElts;
4283 }
4284
4285 // If all the indices come from the same MaskNumElts sized portion of
4286 // the sources we can use extract. Also make sure the extract wouldn't
4287 // extract past the end of the source.
4288 int NewStartIdx = alignDown(Idx, MaskNumElts);
4289 if (NewStartIdx + MaskNumElts > SrcNumElts ||
4290 (StartIdx[Input] >= 0 && StartIdx[Input] != NewStartIdx))
4291 CanExtract = false;
4292 // Make sure we always update StartIdx as we use it to track if all
4293 // elements are undef.
4294 StartIdx[Input] = NewStartIdx;
4295 }
4296
4297 if (StartIdx[0] < 0 && StartIdx[1] < 0) {
4298 setValue(&I, DAG.getUNDEF(VT)); // Vectors are not used.
4299 return;
4300 }
4301 if (CanExtract) {
4302 // Extract appropriate subvector and generate a vector shuffle
4303 for (unsigned Input = 0; Input < 2; ++Input) {
4304 SDValue &Src = Input == 0 ? Src1 : Src2;
4305 if (StartIdx[Input] < 0)
4306 Src = DAG.getUNDEF(VT);
4307 else {
4308 Src = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Src,
4309 DAG.getVectorIdxConstant(StartIdx[Input], DL));
4310 }
4311 }
4312
4313 // Calculate new mask.
4314 SmallVector<int, 8> MappedOps(Mask);
4315 for (int &Idx : MappedOps) {
4316 if (Idx >= (int)SrcNumElts)
4317 Idx -= SrcNumElts + StartIdx[1] - MaskNumElts;
4318 else if (Idx >= 0)
4319 Idx -= StartIdx[0];
4320 }
4321
4322 setValue(&I, DAG.getVectorShuffle(VT, DL, Src1, Src2, MappedOps));
4323 return;
4324 }
4325
4326 // We can't use either concat vectors or extract subvectors so fall back to
4327 // replacing the shuffle with extract and build vector.
4328 // to insert and build vector.
4329 EVT EltVT = VT.getVectorElementType();
4331 for (int Idx : Mask) {
4332 SDValue Res;
4333
4334 if (Idx < 0) {
4335 Res = DAG.getUNDEF(EltVT);
4336 } else {
4337 SDValue &Src = Idx < (int)SrcNumElts ? Src1 : Src2;
4338 if (Idx >= (int)SrcNumElts) Idx -= SrcNumElts;
4339
4340 Res = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Src,
4341 DAG.getVectorIdxConstant(Idx, DL));
4342 }
4343
4344 Ops.push_back(Res);
4345 }
4346
4347 setValue(&I, DAG.getBuildVector(VT, DL, Ops));
4348}
4349
4350void SelectionDAGBuilder::visitInsertValue(const InsertValueInst &I) {
4351 ArrayRef<unsigned> Indices = I.getIndices();
4352 const Value *Op0 = I.getOperand(0);
4353 const Value *Op1 = I.getOperand(1);
4354 Type *AggTy = I.getType();
4355 Type *ValTy = Op1->getType();
4356 bool IntoUndef = isa<UndefValue>(Op0);
4357 bool FromUndef = isa<UndefValue>(Op1);
4358
4359 unsigned LinearIndex = ComputeLinearIndex(AggTy, Indices);
4360
4361 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4362 SmallVector<EVT, 4> AggValueVTs;
4363 ComputeValueVTs(TLI, DAG.getDataLayout(), AggTy, AggValueVTs);
4364 SmallVector<EVT, 4> ValValueVTs;
4365 ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);
4366
4367 unsigned NumAggValues = AggValueVTs.size();
4368 unsigned NumValValues = ValValueVTs.size();
4369 SmallVector<SDValue, 4> Values(NumAggValues);
4370
4371 // Ignore an insertvalue that produces an empty object
4372 if (!NumAggValues) {
4373 setValue(&I, DAG.getUNDEF(MVT(MVT::Other)));
4374 return;
4375 }
4376
4377 SDValue Agg = getValue(Op0);
4378 unsigned i = 0;
4379 // Copy the beginning value(s) from the original aggregate.
4380 for (; i != LinearIndex; ++i)
4381 Values[i] = IntoUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4382 SDValue(Agg.getNode(), Agg.getResNo() + i);
4383 // Copy values from the inserted value(s).
4384 if (NumValValues) {
4385 SDValue Val = getValue(Op1);
4386 for (; i != LinearIndex + NumValValues; ++i)
4387 Values[i] = FromUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4388 SDValue(Val.getNode(), Val.getResNo() + i - LinearIndex);
4389 }
4390 // Copy remaining value(s) from the original aggregate.
4391 for (; i != NumAggValues; ++i)
4392 Values[i] = IntoUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4393 SDValue(Agg.getNode(), Agg.getResNo() + i);
4394
4396 DAG.getVTList(AggValueVTs), Values));
4397}
4398
4399void SelectionDAGBuilder::visitExtractValue(const ExtractValueInst &I) {
4400 ArrayRef<unsigned> Indices = I.getIndices();
4401 const Value *Op0 = I.getOperand(0);
4402 Type *AggTy = Op0->getType();
4403 Type *ValTy = I.getType();
4404 bool OutOfUndef = isa<UndefValue>(Op0);
4405
4406 unsigned LinearIndex = ComputeLinearIndex(AggTy, Indices);
4407
4408 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4409 SmallVector<EVT, 4> ValValueVTs;
4410 ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);
4411
4412 unsigned NumValValues = ValValueVTs.size();
4413
4414 // Ignore a extractvalue that produces an empty object
4415 if (!NumValValues) {
4416 setValue(&I, DAG.getUNDEF(MVT(MVT::Other)));
4417 return;
4418 }
4419
4420 SmallVector<SDValue, 4> Values(NumValValues);
4421
4422 SDValue Agg = getValue(Op0);
4423 // Copy out the selected value(s).
4424 for (unsigned i = LinearIndex; i != LinearIndex + NumValValues; ++i)
4425 Values[i - LinearIndex] =
4426 OutOfUndef ?
4427 DAG.getUNDEF(Agg.getNode()->getValueType(Agg.getResNo() + i)) :
4428 SDValue(Agg.getNode(), Agg.getResNo() + i);
4429
4431 DAG.getVTList(ValValueVTs), Values));
4432}
4433
4434void SelectionDAGBuilder::visitGetElementPtr(const User &I) {
4435 Value *Op0 = I.getOperand(0);
4436 // Note that the pointer operand may be a vector of pointers. Take the scalar
4437 // element which holds a pointer.
4438 unsigned AS = Op0->getType()->getScalarType()->getPointerAddressSpace();
4439 SDValue N = getValue(Op0);
4440 SDLoc dl = getCurSDLoc();
4441 auto &TLI = DAG.getTargetLoweringInfo();
4442 GEPNoWrapFlags NW = cast<GEPOperator>(I).getNoWrapFlags();
4443
4444 // For a vector GEP, keep the prefix scalar as long as possible, then
4445 // convert any scalars encountered after the first vector operand to vectors.
4446 bool IsVectorGEP = I.getType()->isVectorTy();
4447 ElementCount VectorElementCount =
4448 IsVectorGEP ? cast<VectorType>(I.getType())->getElementCount()
4450
4452 GTI != E; ++GTI) {
4453 const Value *Idx = GTI.getOperand();
4454 if (StructType *StTy = GTI.getStructTypeOrNull()) {
4455 unsigned Field = cast<Constant>(Idx)->getUniqueInteger().getZExtValue();
4456 if (Field) {
4457 // N = N + Offset
4458 uint64_t Offset =
4459 DAG.getDataLayout().getStructLayout(StTy)->getElementOffset(Field);
4460
4461 // In an inbounds GEP with an offset that is nonnegative even when
4462 // interpreted as signed, assume there is no unsigned overflow.
4463 SDNodeFlags Flags;
4464 if (NW.hasNoUnsignedWrap() ||
4465 (int64_t(Offset) >= 0 && NW.hasNoUnsignedSignedWrap()))
4467 Flags.setInBounds(NW.isInBounds());
4468
4469 N = DAG.getMemBasePlusOffset(
4470 N, DAG.getConstant(Offset, dl, N.getValueType()), dl, Flags);
4471 }
4472 } else {
4473 // IdxSize is the width of the arithmetic according to IR semantics.
4474 // In SelectionDAG, we may prefer to do arithmetic in a wider bitwidth
4475 // (and fix up the result later).
4476 unsigned IdxSize = DAG.getDataLayout().getIndexSizeInBits(AS);
4477 MVT IdxTy = MVT::getIntegerVT(IdxSize);
4478 TypeSize ElementSize =
4479 GTI.getSequentialElementStride(DAG.getDataLayout());
4480 // We intentionally mask away the high bits here; ElementSize may not
4481 // fit in IdxTy.
4482 APInt ElementMul(IdxSize, ElementSize.getKnownMinValue(),
4483 /*isSigned=*/false, /*implicitTrunc=*/true);
4484 bool ElementScalable = ElementSize.isScalable();
4485
4486 // If this is a scalar constant or a splat vector of constants,
4487 // handle it quickly.
4488 const auto *C = dyn_cast<Constant>(Idx);
4489 if (C && isa<VectorType>(C->getType()))
4490 C = C->getSplatValue();
4491
4492 const auto *CI = dyn_cast_or_null<ConstantInt>(C);
4493 if (CI && CI->isZero())
4494 continue;
4495 if (CI && !ElementScalable) {
4496 APInt Offs = ElementMul * CI->getValue().sextOrTrunc(IdxSize);
4497 LLVMContext &Context = *DAG.getContext();
4498 SDValue OffsVal;
4499 if (N.getValueType().isVector())
4500 OffsVal = DAG.getConstant(
4501 Offs, dl, EVT::getVectorVT(Context, IdxTy, VectorElementCount));
4502 else
4503 OffsVal = DAG.getConstant(Offs, dl, IdxTy);
4504
4505 // In an inbounds GEP with an offset that is nonnegative even when
4506 // interpreted as signed, assume there is no unsigned overflow.
4507 SDNodeFlags Flags;
4508 if (NW.hasNoUnsignedWrap() ||
4509 (Offs.isNonNegative() && NW.hasNoUnsignedSignedWrap()))
4510 Flags.setNoUnsignedWrap(true);
4511 Flags.setInBounds(NW.isInBounds());
4512
4513 OffsVal = DAG.getSExtOrTrunc(OffsVal, dl, N.getValueType());
4514
4515 N = DAG.getMemBasePlusOffset(N, OffsVal, dl, Flags);
4516 continue;
4517 }
4518
4519 // N = N + Idx * ElementMul;
4520 SDValue IdxN = getValue(Idx);
4521
4522 if (IdxN.getValueType().isVector() != N.getValueType().isVector()) {
4523 if (N.getValueType().isVector()) {
4524 EVT VT = EVT::getVectorVT(*Context, IdxN.getValueType(),
4525 VectorElementCount);
4526 IdxN = DAG.getSplat(VT, dl, IdxN);
4527 } else {
4528 EVT VT =
4529 EVT::getVectorVT(*Context, N.getValueType(), VectorElementCount);
4530 N = DAG.getSplat(VT, dl, N);
4531 }
4532 }
4533
4534 // If the index is smaller or larger than intptr_t, truncate or extend
4535 // it.
4536 IdxN = DAG.getSExtOrTrunc(IdxN, dl, N.getValueType());
4537
4538 SDNodeFlags ScaleFlags;
4539 // The multiplication of an index by the type size does not wrap the
4540 // pointer index type in a signed sense (mul nsw).
4542
4543 // The multiplication of an index by the type size does not wrap the
4544 // pointer index type in an unsigned sense (mul nuw).
4545 ScaleFlags.setNoUnsignedWrap(NW.hasNoUnsignedWrap());
4546
4547 if (ElementScalable) {
4548 EVT VScaleTy = N.getValueType().getScalarType();
4549 SDValue VScale = DAG.getNode(
4550 ISD::VSCALE, dl, VScaleTy,
4551 DAG.getConstant(ElementMul.getZExtValue(), dl, VScaleTy));
4552 if (N.getValueType().isVector())
4553 VScale = DAG.getSplatVector(N.getValueType(), dl, VScale);
4554 IdxN = DAG.getNode(ISD::MUL, dl, N.getValueType(), IdxN, VScale,
4555 ScaleFlags);
4556 } else {
4557 // If this is a multiply by a power of two, turn it into a shl
4558 // immediately. This is a very common case.
4559 if (ElementMul != 1) {
4560 if (ElementMul.isPowerOf2()) {
4561 unsigned Amt = ElementMul.logBase2();
4562 IdxN = DAG.getNode(
4563 ISD::SHL, dl, N.getValueType(), IdxN,
4564 DAG.getShiftAmountConstant(Amt, N.getValueType(), dl),
4565 ScaleFlags);
4566 } else {
4567 SDValue Scale = DAG.getConstant(ElementMul.getZExtValue(), dl,
4568 IdxN.getValueType());
4569 IdxN = DAG.getNode(ISD::MUL, dl, N.getValueType(), IdxN, Scale,
4570 ScaleFlags);
4571 }
4572 }
4573 }
4574
4575 // The successive addition of the current address, truncated to the
4576 // pointer index type and interpreted as an unsigned number, and each
4577 // offset, also interpreted as an unsigned number, does not wrap the
4578 // pointer index type (add nuw).
4579 SDNodeFlags AddFlags;
4580 AddFlags.setNoUnsignedWrap(NW.hasNoUnsignedWrap());
4581 AddFlags.setInBounds(NW.isInBounds());
4582
4583 N = DAG.getMemBasePlusOffset(N, IdxN, dl, AddFlags);
4584 }
4585 }
4586
4587 if (IsVectorGEP && !N.getValueType().isVector()) {
4588 EVT VT = EVT::getVectorVT(*Context, N.getValueType(), VectorElementCount);
4589 N = DAG.getSplat(VT, dl, N);
4590 }
4591
4592 MVT PtrTy = TLI.getPointerTy(DAG.getDataLayout(), AS);
4593 MVT PtrMemTy = TLI.getPointerMemTy(DAG.getDataLayout(), AS);
4594 if (IsVectorGEP) {
4595 PtrTy = MVT::getVectorVT(PtrTy, VectorElementCount);
4596 PtrMemTy = MVT::getVectorVT(PtrMemTy, VectorElementCount);
4597 }
4598
4599 if (PtrMemTy != PtrTy && !cast<GEPOperator>(I).isInBounds())
4600 N = DAG.getPtrExtendInReg(N, dl, PtrMemTy);
4601
4602 setValue(&I, N);
4603}
4604
4605void SelectionDAGBuilder::visitAlloca(const AllocaInst &I) {
4606 // If this is a fixed sized alloca in the entry block of the function,
4607 // allocate it statically on the stack.
4608 if (FuncInfo.StaticAllocaMap.count(&I))
4609 return; // getValue will auto-populate this.
4610
4611 SDLoc dl = getCurSDLoc();
4612 Type *Ty = I.getAllocatedType();
4613 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4614 auto &DL = DAG.getDataLayout();
4615 TypeSize TySize = DL.getTypeAllocSize(Ty);
4616 MaybeAlign Alignment = std::max(DL.getPrefTypeAlign(Ty), I.getAlign());
4617
4618 SDValue AllocSize = getValue(I.getArraySize());
4619
4620 EVT IntPtr = TLI.getPointerTy(DL, I.getAddressSpace());
4621 if (AllocSize.getValueType() != IntPtr)
4622 AllocSize = DAG.getZExtOrTrunc(AllocSize, dl, IntPtr);
4623
4624 AllocSize = DAG.getNode(
4625 ISD::MUL, dl, IntPtr, AllocSize,
4626 DAG.getZExtOrTrunc(DAG.getTypeSize(dl, MVT::i64, TySize), dl, IntPtr));
4627
4628 // Handle alignment. If the requested alignment is less than or equal to
4629 // the stack alignment, ignore it. If the size is greater than or equal to
4630 // the stack alignment, we note this in the DYNAMIC_STACKALLOC node.
4631 Align StackAlign = DAG.getSubtarget().getFrameLowering()->getStackAlign();
4632 if (*Alignment <= StackAlign)
4633 Alignment = std::nullopt;
4634
4635 const uint64_t StackAlignMask = StackAlign.value() - 1U;
4636 // Round the size of the allocation up to the stack alignment size
4637 // by add SA-1 to the size. This doesn't overflow because we're computing
4638 // an address inside an alloca.
4639 AllocSize = DAG.getNode(ISD::ADD, dl, AllocSize.getValueType(), AllocSize,
4640 DAG.getConstant(StackAlignMask, dl, IntPtr),
4642
4643 // Mask out the low bits for alignment purposes.
4644 AllocSize = DAG.getNode(ISD::AND, dl, AllocSize.getValueType(), AllocSize,
4645 DAG.getSignedConstant(~StackAlignMask, dl, IntPtr));
4646
4647 SDValue Ops[] = {
4648 getRoot(), AllocSize,
4649 DAG.getConstant(Alignment ? Alignment->value() : 0, dl, IntPtr)};
4650 SDVTList VTs = DAG.getVTList(AllocSize.getValueType(), MVT::Other);
4651 SDValue DSA = DAG.getNode(ISD::DYNAMIC_STACKALLOC, dl, VTs, Ops);
4652 setValue(&I, DSA);
4653 DAG.setRoot(DSA.getValue(1));
4654
4655 assert(FuncInfo.MF->getFrameInfo().hasVarSizedObjects());
4656}
4657
4658static const MDNode *getRangeMetadata(const Instruction &I) {
4659 return I.getMetadata(LLVMContext::MD_range);
4660}
4661
4662static std::optional<ConstantRange> getRange(const Instruction &I) {
4663 if (const auto *CB = dyn_cast<CallBase>(&I))
4664 if (std::optional<ConstantRange> CR = CB->getRange())
4665 return CR;
4666 if (const MDNode *Range = getRangeMetadata(I))
4668 return std::nullopt;
4669}
4670
4672 if (const auto *CB = dyn_cast<CallBase>(&I))
4673 return CB->getRetNoFPClass();
4674 return fcNone;
4675}
4676
4677void SelectionDAGBuilder::visitLoad(const LoadInst &I) {
4678 if (I.isAtomic())
4679 return visitAtomicLoad(I);
4680
4681 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4682 const Value *SV = I.getOperand(0);
4683 if (TLI.supportSwiftError()) {
4684 // Swifterror values can come from either a function parameter with
4685 // swifterror attribute or an alloca with swifterror attribute.
4686 if (const Argument *Arg = dyn_cast<Argument>(SV)) {
4687 if (Arg->hasSwiftErrorAttr())
4688 return visitLoadFromSwiftError(I);
4689 }
4690
4691 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(SV)) {
4692 if (Alloca->isSwiftError())
4693 return visitLoadFromSwiftError(I);
4694 }
4695 }
4696
4697 SDValue Ptr = getValue(SV);
4698
4699 Type *Ty = I.getType();
4700 SmallVector<EVT, 4> ValueVTs, MemVTs;
4702 ComputeValueVTs(TLI, DAG.getDataLayout(), Ty, ValueVTs, &MemVTs, &Offsets);
4703 unsigned NumValues = ValueVTs.size();
4704 if (NumValues == 0)
4705 return;
4706
4707 Align Alignment = I.getAlign();
4708 AAMDNodes AAInfo = I.getAAMetadata();
4709 const MDNode *Ranges = getRangeMetadata(I);
4710 bool isVolatile = I.isVolatile();
4711 MachineMemOperand::Flags MMOFlags =
4712 TLI.getLoadMemOperandFlags(I, DAG.getDataLayout(), AC, LibInfo);
4713
4714 SDValue Root;
4715 bool ConstantMemory = false;
4716 if (isVolatile)
4717 // Serialize volatile loads with other side effects.
4718 Root = getRoot();
4719 else if (NumValues > MaxParallelChains)
4720 Root = getMemoryRoot();
4721 else if (BatchAA &&
4722 BatchAA->pointsToConstantMemory(MemoryLocation(
4723 SV,
4724 LocationSize::precise(DAG.getDataLayout().getTypeStoreSize(Ty)),
4725 AAInfo))) {
4726 // Do not serialize (non-volatile) loads of constant memory with anything.
4727 Root = DAG.getEntryNode();
4728 ConstantMemory = true;
4730 } else {
4731 // Do not serialize non-volatile loads against each other.
4732 Root = DAG.getRoot();
4733 }
4734
4735 SDLoc dl = getCurSDLoc();
4736
4737 if (isVolatile)
4738 Root = TLI.prepareVolatileOrAtomicLoad(Root, dl, DAG);
4739
4740 SmallVector<SDValue, 4> Values(NumValues);
4741 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4742
4743 unsigned ChainI = 0;
4744 for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
4745 // Serializing loads here may result in excessive register pressure, and
4746 // TokenFactor places arbitrary choke points on the scheduler. SD scheduling
4747 // could recover a bit by hoisting nodes upward in the chain by recognizing
4748 // they are side-effect free or do not alias. The optimizer should really
4749 // avoid this case by converting large object/array copies to llvm.memcpy
4750 // (MaxParallelChains should always remain as failsafe).
4751 if (ChainI == MaxParallelChains) {
4752 assert(PendingLoads.empty() && "PendingLoads must be serialized first");
4753 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4754 ArrayRef(Chains.data(), ChainI));
4755 Root = Chain;
4756 ChainI = 0;
4757 }
4758
4759 // TODO: MachinePointerInfo only supports a fixed length offset.
4760 MachinePointerInfo PtrInfo =
4761 !Offsets[i].isScalable() || Offsets[i].isZero()
4762 ? MachinePointerInfo(SV, Offsets[i].getKnownMinValue())
4763 : MachinePointerInfo();
4764
4765 SDValue A = DAG.getObjectPtrOffset(dl, Ptr, Offsets[i]);
4766 SDValue L = DAG.getLoad(MemVTs[i], dl, Root, A, PtrInfo, Alignment,
4767 MMOFlags, AAInfo, Ranges);
4768 Chains[ChainI] = L.getValue(1);
4769
4770 if (MemVTs[i] != ValueVTs[i])
4771 L = DAG.getPtrExtOrTrunc(L, dl, ValueVTs[i]);
4772
4773 Values[i] = L;
4774 }
4775
4776 if (!ConstantMemory) {
4777 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4778 ArrayRef(Chains.data(), ChainI));
4779 if (isVolatile)
4780 DAG.setRoot(Chain);
4781 else
4782 PendingLoads.push_back(Chain);
4783 }
4784
4785 setValue(&I, DAG.getNode(ISD::MERGE_VALUES, dl,
4786 DAG.getVTList(ValueVTs), Values));
4787}
4788
4789void SelectionDAGBuilder::visitStoreToSwiftError(const StoreInst &I) {
4790 assert(DAG.getTargetLoweringInfo().supportSwiftError() &&
4791 "call visitStoreToSwiftError when backend supports swifterror");
4792
4793 SmallVector<EVT, 4> ValueVTs;
4794 SmallVector<uint64_t, 4> Offsets;
4795 const Value *SrcV = I.getOperand(0);
4796 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(),
4797 SrcV->getType(), ValueVTs, /*MemVTs=*/nullptr, &Offsets, 0);
4798 assert(ValueVTs.size() == 1 && Offsets[0] == 0 &&
4799 "expect a single EVT for swifterror");
4800
4801 SDValue Src = getValue(SrcV);
4802 // Create a virtual register, then update the virtual register.
4803 Register VReg =
4804 SwiftError.getOrCreateVRegDefAt(&I, FuncInfo.MBB, I.getPointerOperand());
4805 // Chain, DL, Reg, N or Chain, DL, Reg, N, Glue
4806 // Chain can be getRoot or getControlRoot.
4807 SDValue CopyNode = DAG.getCopyToReg(getRoot(), getCurSDLoc(), VReg,
4808 SDValue(Src.getNode(), Src.getResNo()));
4809 DAG.setRoot(CopyNode);
4810}
4811
4812void SelectionDAGBuilder::visitLoadFromSwiftError(const LoadInst &I) {
4813 assert(DAG.getTargetLoweringInfo().supportSwiftError() &&
4814 "call visitLoadFromSwiftError when backend supports swifterror");
4815
4816 assert(!I.isVolatile() &&
4817 !I.hasMetadata(LLVMContext::MD_nontemporal) &&
4818 !I.hasMetadata(LLVMContext::MD_invariant_load) &&
4819 "Support volatile, non temporal, invariant for load_from_swift_error");
4820
4821 const Value *SV = I.getOperand(0);
4822 Type *Ty = I.getType();
4823 assert(
4824 (!BatchAA ||
4825 !BatchAA->pointsToConstantMemory(MemoryLocation(
4826 SV, LocationSize::precise(DAG.getDataLayout().getTypeStoreSize(Ty)),
4827 I.getAAMetadata()))) &&
4828 "load_from_swift_error should not be constant memory");
4829
4830 SmallVector<EVT, 4> ValueVTs;
4831 SmallVector<uint64_t, 4> Offsets;
4832 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), Ty,
4833 ValueVTs, /*MemVTs=*/nullptr, &Offsets, 0);
4834 assert(ValueVTs.size() == 1 && Offsets[0] == 0 &&
4835 "expect a single EVT for swifterror");
4836
4837 // Chain, DL, Reg, VT, Glue or Chain, DL, Reg, VT
4838 SDValue L = DAG.getCopyFromReg(
4839 getRoot(), getCurSDLoc(),
4840 SwiftError.getOrCreateVRegUseAt(&I, FuncInfo.MBB, SV), ValueVTs[0]);
4841
4842 setValue(&I, L);
4843}
4844
4845void SelectionDAGBuilder::visitStore(const StoreInst &I) {
4846 if (I.isAtomic())
4847 return visitAtomicStore(I);
4848
4849 const Value *SrcV = I.getOperand(0);
4850 const Value *PtrV = I.getOperand(1);
4851
4852 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4853 if (TLI.supportSwiftError()) {
4854 // Swifterror values can come from either a function parameter with
4855 // swifterror attribute or an alloca with swifterror attribute.
4856 if (const Argument *Arg = dyn_cast<Argument>(PtrV)) {
4857 if (Arg->hasSwiftErrorAttr())
4858 return visitStoreToSwiftError(I);
4859 }
4860
4861 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(PtrV)) {
4862 if (Alloca->isSwiftError())
4863 return visitStoreToSwiftError(I);
4864 }
4865 }
4866
4867 SmallVector<EVT, 4> ValueVTs, MemVTs;
4869 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(),
4870 SrcV->getType(), ValueVTs, &MemVTs, &Offsets);
4871 unsigned NumValues = ValueVTs.size();
4872 if (NumValues == 0)
4873 return;
4874
4875 // Get the lowered operands. Note that we do this after
4876 // checking if NumResults is zero, because with zero results
4877 // the operands won't have values in the map.
4878 SDValue Src = getValue(SrcV);
4879 SDValue Ptr = getValue(PtrV);
4880
4881 SDValue Root = I.isVolatile() ? getRoot() : getMemoryRoot();
4882 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4883 SDLoc dl = getCurSDLoc();
4884 Align Alignment = I.getAlign();
4885 AAMDNodes AAInfo = I.getAAMetadata();
4886
4887 auto MMOFlags = TLI.getStoreMemOperandFlags(I, DAG.getDataLayout());
4888
4889 unsigned ChainI = 0;
4890 for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
4891 // See visitLoad comments.
4892 if (ChainI == MaxParallelChains) {
4893 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4894 ArrayRef(Chains.data(), ChainI));
4895 Root = Chain;
4896 ChainI = 0;
4897 }
4898
4899 // TODO: MachinePointerInfo only supports a fixed length offset.
4900 MachinePointerInfo PtrInfo =
4901 !Offsets[i].isScalable() || Offsets[i].isZero()
4902 ? MachinePointerInfo(PtrV, Offsets[i].getKnownMinValue())
4903 : MachinePointerInfo();
4904
4905 SDValue Add = DAG.getObjectPtrOffset(dl, Ptr, Offsets[i]);
4906 SDValue Val = SDValue(Src.getNode(), Src.getResNo() + i);
4907 if (MemVTs[i] != ValueVTs[i])
4908 Val = DAG.getPtrExtOrTrunc(Val, dl, MemVTs[i]);
4909 SDValue St =
4910 DAG.getStore(Root, dl, Val, Add, PtrInfo, Alignment, MMOFlags, AAInfo);
4911 Chains[ChainI] = St;
4912 }
4913
4914 SDValue StoreNode = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4915 ArrayRef(Chains.data(), ChainI));
4916 setValue(&I, StoreNode);
4917 DAG.setRoot(StoreNode);
4918}
4919
4920void SelectionDAGBuilder::visitMaskedStore(const CallInst &I,
4921 bool IsCompressing) {
4922 SDLoc sdl = getCurSDLoc();
4923
4924 Value *Src0Operand = I.getArgOperand(0);
4925 Value *PtrOperand = I.getArgOperand(1);
4926 Value *MaskOperand = I.getArgOperand(2);
4927 Align Alignment = I.getParamAlign(1).valueOrOne();
4928
4929 SDValue Ptr = getValue(PtrOperand);
4930 SDValue Src0 = getValue(Src0Operand);
4931 SDValue Mask = getValue(MaskOperand);
4932 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
4933
4934 EVT VT = Src0.getValueType();
4935
4936 auto MMOFlags = MachineMemOperand::MOStore;
4937 if (I.hasMetadata(LLVMContext::MD_nontemporal))
4939
4940 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
4941 MachinePointerInfo(PtrOperand), MMOFlags,
4942 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata());
4943
4944 const auto &TLI = DAG.getTargetLoweringInfo();
4945
4946 SDValue StoreNode =
4947 !IsCompressing && TTI->hasConditionalLoadStoreForType(
4948 I.getArgOperand(0)->getType(), /*IsStore=*/true)
4949 ? TLI.visitMaskedStore(DAG, sdl, getMemoryRoot(), MMO, Ptr, Src0,
4950 Mask)
4951 : DAG.getMaskedStore(getMemoryRoot(), sdl, Src0, Ptr, Offset, Mask,
4952 VT, MMO, ISD::UNINDEXED, /*Truncating=*/false,
4953 IsCompressing);
4954 DAG.setRoot(StoreNode);
4955 setValue(&I, StoreNode);
4956}
4957
4958// Get a uniform base for the Gather/Scatter intrinsic.
4959// The first argument of the Gather/Scatter intrinsic is a vector of pointers.
4960// We try to represent it as a base pointer + vector of indices.
4961// Usually, the vector of pointers comes from a 'getelementptr' instruction.
4962// The first operand of the GEP may be a single pointer or a vector of pointers
4963// Example:
4964// %gep.ptr = getelementptr i32, <8 x i32*> %vptr, <8 x i32> %ind
4965// or
4966// %gep.ptr = getelementptr i32, i32* %ptr, <8 x i32> %ind
4967// %res = call <8 x i32> @llvm.masked.gather.v8i32(<8 x i32*> %gep.ptr, ..
4968//
4969// When the first GEP operand is a single pointer - it is the uniform base we
4970// are looking for. If first operand of the GEP is a splat vector - we
4971// extract the splat value and use it as a uniform base.
4972// In all other cases the function returns 'false'.
4973static bool getUniformBase(const Value *Ptr, SDValue &Base, SDValue &Index,
4974 SDValue &Scale, SelectionDAGBuilder *SDB,
4975 const BasicBlock *CurBB, uint64_t ElemSize) {
4976 SelectionDAG& DAG = SDB->DAG;
4977 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4978 const DataLayout &DL = DAG.getDataLayout();
4979
4980 assert(Ptr->getType()->isVectorTy() && "Unexpected pointer type");
4981
4982 // Handle splat constant pointer.
4983 if (auto *C = dyn_cast<Constant>(Ptr)) {
4984 C = C->getSplatValue();
4985 if (!C)
4986 return false;
4987
4988 Base = SDB->getValue(C);
4989
4990 ElementCount NumElts = cast<VectorType>(Ptr->getType())->getElementCount();
4991 EVT VT = EVT::getVectorVT(*DAG.getContext(), TLI.getPointerTy(DL), NumElts);
4992 Index = DAG.getConstant(0, SDB->getCurSDLoc(), VT);
4993 Scale = DAG.getTargetConstant(1, SDB->getCurSDLoc(), TLI.getPointerTy(DL));
4994 return true;
4995 }
4996
4998 if (!GEP || GEP->getParent() != CurBB)
4999 return false;
5000
5001 if (GEP->getNumOperands() != 2)
5002 return false;
5003
5004 const Value *BasePtr = GEP->getPointerOperand();
5005 const Value *IndexVal = GEP->getOperand(GEP->getNumOperands() - 1);
5006
5007 // Make sure the base is scalar and the index is a vector.
5008 if (BasePtr->getType()->isVectorTy() || !IndexVal->getType()->isVectorTy())
5009 return false;
5010
5011 TypeSize ScaleVal = DL.getTypeAllocSize(GEP->getResultElementType());
5012 if (ScaleVal.isScalable())
5013 return false;
5014
5015 // Target may not support the required addressing mode.
5016 if (ScaleVal != 1 &&
5017 !TLI.isLegalScaleForGatherScatter(ScaleVal.getFixedValue(), ElemSize))
5018 return false;
5019
5020 Base = SDB->getValue(BasePtr);
5021 Index = SDB->getValue(IndexVal);
5022
5023 Scale =
5024 DAG.getTargetConstant(ScaleVal, SDB->getCurSDLoc(), TLI.getPointerTy(DL));
5025 return true;
5026}
5027
5028void SelectionDAGBuilder::visitMaskedScatter(const CallInst &I) {
5029 SDLoc sdl = getCurSDLoc();
5030
5031 // llvm.masked.scatter.*(Src0, Ptrs, Mask)
5032 const Value *Ptr = I.getArgOperand(1);
5033 SDValue Src0 = getValue(I.getArgOperand(0));
5034 SDValue Mask = getValue(I.getArgOperand(2));
5035 EVT VT = Src0.getValueType();
5036 Align Alignment = I.getParamAlign(1).valueOrOne();
5037 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5038
5039 SDValue Base;
5040 SDValue Index;
5041 SDValue Scale;
5042 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
5043 I.getParent(), VT.getScalarStoreSize());
5044
5045 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
5046 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5047 MachinePointerInfo(AS), MachineMemOperand::MOStore,
5048 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata());
5049 if (!UniformBase) {
5050 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5051 Index = getValue(Ptr);
5052 Scale =
5053 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5054 }
5055
5056 EVT IdxVT = Index.getValueType();
5057 EVT EltTy = IdxVT.getVectorElementType();
5058 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
5059 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
5060 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
5061 }
5062
5063 SDValue Ops[] = { getMemoryRoot(), Src0, Mask, Base, Index, Scale };
5064 SDValue Scatter = DAG.getMaskedScatter(DAG.getVTList(MVT::Other), VT, sdl,
5065 Ops, MMO, ISD::SIGNED_SCALED, false);
5066 DAG.setRoot(Scatter);
5067 setValue(&I, Scatter);
5068}
5069
5070void SelectionDAGBuilder::visitMaskedLoad(const CallInst &I, bool IsExpanding) {
5071 SDLoc sdl = getCurSDLoc();
5072
5073 Value *PtrOperand = I.getArgOperand(0);
5074 Value *MaskOperand = I.getArgOperand(1);
5075 Value *Src0Operand = I.getArgOperand(2);
5076 Align Alignment = I.getParamAlign(0).valueOrOne();
5077
5078 SDValue Ptr = getValue(PtrOperand);
5079 SDValue Src0 = getValue(Src0Operand);
5080 SDValue Mask = getValue(MaskOperand);
5081 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
5082
5083 EVT VT = Src0.getValueType();
5084 AAMDNodes AAInfo = I.getAAMetadata();
5085 const MDNode *Ranges = getRangeMetadata(I);
5086
5087 // Do not serialize masked loads of constant memory with anything.
5088 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
5089 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
5090
5091 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
5092
5093 auto MMOFlags = MachineMemOperand::MOLoad;
5094 if (I.hasMetadata(LLVMContext::MD_nontemporal))
5096 if (I.hasMetadata(LLVMContext::MD_invariant_load))
5098
5099 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5100 MachinePointerInfo(PtrOperand), MMOFlags,
5101 LocationSize::beforeOrAfterPointer(), Alignment, AAInfo, Ranges);
5102
5103 const auto &TLI = DAG.getTargetLoweringInfo();
5104
5105 // The Load/Res may point to different values and both of them are output
5106 // variables.
5107 SDValue Load;
5108 SDValue Res;
5109 if (!IsExpanding &&
5110 TTI->hasConditionalLoadStoreForType(Src0Operand->getType(),
5111 /*IsStore=*/false))
5112 Res = TLI.visitMaskedLoad(DAG, sdl, InChain, MMO, Load, Ptr, Src0, Mask);
5113 else
5114 Res = Load =
5115 DAG.getMaskedLoad(VT, sdl, InChain, Ptr, Offset, Mask, Src0, VT, MMO,
5116 ISD::UNINDEXED, ISD::NON_EXTLOAD, IsExpanding);
5117 if (AddToChain)
5118 PendingLoads.push_back(Load.getValue(1));
5119 setValue(&I, Res);
5120}
5121
5122void SelectionDAGBuilder::visitMaskedGather(const CallInst &I) {
5123 SDLoc sdl = getCurSDLoc();
5124
5125 // @llvm.masked.gather.*(Ptrs, Mask, Src0)
5126 const Value *Ptr = I.getArgOperand(0);
5127 SDValue Src0 = getValue(I.getArgOperand(2));
5128 SDValue Mask = getValue(I.getArgOperand(1));
5129
5130 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5131 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
5132 Align Alignment = I.getParamAlign(0).valueOrOne();
5133
5134 const MDNode *Ranges = getRangeMetadata(I);
5135
5136 SDValue Root = DAG.getRoot();
5137 SDValue Base;
5138 SDValue Index;
5139 SDValue Scale;
5140 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
5141 I.getParent(), VT.getScalarStoreSize());
5142 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
5143 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5144 MachinePointerInfo(AS), MachineMemOperand::MOLoad,
5145 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata(),
5146 Ranges);
5147
5148 if (!UniformBase) {
5149 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5150 Index = getValue(Ptr);
5151 Scale =
5152 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5153 }
5154
5155 EVT IdxVT = Index.getValueType();
5156 EVT EltTy = IdxVT.getVectorElementType();
5157 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
5158 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
5159 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
5160 }
5161
5162 SDValue Ops[] = { Root, Src0, Mask, Base, Index, Scale };
5163 SDValue Gather =
5164 DAG.getMaskedGather(DAG.getVTList(VT, MVT::Other), VT, sdl, Ops, MMO,
5166
5167 PendingLoads.push_back(Gather.getValue(1));
5168 setValue(&I, Gather);
5169}
5170
5171void SelectionDAGBuilder::visitAtomicCmpXchg(const AtomicCmpXchgInst &I) {
5172 SDLoc dl = getCurSDLoc();
5173 AtomicOrdering SuccessOrdering = I.getSuccessOrdering();
5174 AtomicOrdering FailureOrdering = I.getFailureOrdering();
5175 SyncScope::ID SSID = I.getSyncScopeID();
5176
5177 SDValue InChain = getRoot();
5178
5179 MVT MemVT = getValue(I.getCompareOperand()).getSimpleValueType();
5180 SDVTList VTs = DAG.getVTList(MemVT, MVT::i1, MVT::Other);
5181
5182 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5183 auto Flags = TLI.getAtomicMemOperandFlags(I, DAG.getDataLayout());
5184
5185 MachineFunction &MF = DAG.getMachineFunction();
5186 MachineMemOperand *MMO = MF.getMachineMemOperand(
5187 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5188 DAG.getEVTAlign(MemVT), AAMDNodes(), nullptr, SSID, SuccessOrdering,
5189 FailureOrdering);
5190
5192 dl, MemVT, VTs, InChain,
5193 getValue(I.getPointerOperand()),
5194 getValue(I.getCompareOperand()),
5195 getValue(I.getNewValOperand()), MMO);
5196
5197 SDValue OutChain = L.getValue(2);
5198
5199 setValue(&I, L);
5200 DAG.setRoot(OutChain);
5201}
5202
5203void SelectionDAGBuilder::visitAtomicRMW(const AtomicRMWInst &I) {
5204 SDLoc dl = getCurSDLoc();
5206 switch (I.getOperation()) {
5207 default: llvm_unreachable("Unknown atomicrmw operation");
5225 break;
5228 break;
5231 break;
5234 break;
5237 break;
5240 break;
5241 }
5242 AtomicOrdering Ordering = I.getOrdering();
5243 SyncScope::ID SSID = I.getSyncScopeID();
5244
5245 SDValue InChain = getRoot();
5246
5247 auto MemVT = getValue(I.getValOperand()).getSimpleValueType();
5248 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5249 auto Flags = TLI.getAtomicMemOperandFlags(I, DAG.getDataLayout());
5250
5251 MachineFunction &MF = DAG.getMachineFunction();
5252 MachineMemOperand *MMO = MF.getMachineMemOperand(
5253 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5254 DAG.getEVTAlign(MemVT), AAMDNodes(), nullptr, SSID, Ordering);
5255
5256 SDValue L =
5257 DAG.getAtomic(NT, dl, MemVT, InChain,
5258 getValue(I.getPointerOperand()), getValue(I.getValOperand()),
5259 MMO);
5260
5261 SDValue OutChain = L.getValue(1);
5262
5263 setValue(&I, L);
5264 DAG.setRoot(OutChain);
5265}
5266
5267void SelectionDAGBuilder::visitFence(const FenceInst &I) {
5268 SDLoc dl = getCurSDLoc();
5269 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5270 SDValue Ops[3];
5271 Ops[0] = getRoot();
5272 Ops[1] = DAG.getTargetConstant((unsigned)I.getOrdering(), dl,
5273 TLI.getFenceOperandTy(DAG.getDataLayout()));
5274 Ops[2] = DAG.getTargetConstant(I.getSyncScopeID(), dl,
5275 TLI.getFenceOperandTy(DAG.getDataLayout()));
5276 SDValue N = DAG.getNode(ISD::ATOMIC_FENCE, dl, MVT::Other, Ops);
5277 setValue(&I, N);
5278 DAG.setRoot(N);
5279}
5280
5281void SelectionDAGBuilder::visitAtomicLoad(const LoadInst &I) {
5282 SDLoc dl = getCurSDLoc();
5283 AtomicOrdering Order = I.getOrdering();
5284 SyncScope::ID SSID = I.getSyncScopeID();
5285
5286 SDValue InChain = getRoot();
5287
5288 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5289 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
5290 EVT MemVT = TLI.getMemValueType(DAG.getDataLayout(), I.getType());
5291
5292 if (!TLI.supportsUnalignedAtomics() &&
5293 I.getAlign().value() < MemVT.getSizeInBits() / 8)
5294 report_fatal_error("Cannot generate unaligned atomic load");
5295
5296 auto Flags = TLI.getLoadMemOperandFlags(I, DAG.getDataLayout(), AC, LibInfo);
5297
5298 const MDNode *Ranges = getRangeMetadata(I);
5299 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5300 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5301 I.getAlign(), AAMDNodes(), Ranges, SSID, Order);
5302
5303 InChain = TLI.prepareVolatileOrAtomicLoad(InChain, dl, DAG);
5304
5305 SDValue Ptr = getValue(I.getPointerOperand());
5306 SDValue L =
5307 DAG.getAtomicLoad(ISD::NON_EXTLOAD, dl, MemVT, MemVT, InChain, Ptr, MMO);
5308
5309 SDValue OutChain = L.getValue(1);
5310 if (MemVT != VT)
5311 L = DAG.getPtrExtOrTrunc(L, dl, VT);
5312
5313 setValue(&I, L);
5314 DAG.setRoot(OutChain);
5315}
5316
5317void SelectionDAGBuilder::visitAtomicStore(const StoreInst &I) {
5318 SDLoc dl = getCurSDLoc();
5319
5320 AtomicOrdering Ordering = I.getOrdering();
5321 SyncScope::ID SSID = I.getSyncScopeID();
5322
5323 SDValue InChain = getRoot();
5324
5325 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5326 EVT MemVT =
5327 TLI.getMemValueType(DAG.getDataLayout(), I.getValueOperand()->getType());
5328
5329 if (!TLI.supportsUnalignedAtomics() &&
5330 I.getAlign().value() < MemVT.getSizeInBits() / 8)
5331 report_fatal_error("Cannot generate unaligned atomic store");
5332
5333 auto Flags = TLI.getStoreMemOperandFlags(I, DAG.getDataLayout());
5334
5335 MachineFunction &MF = DAG.getMachineFunction();
5336 MachineMemOperand *MMO = MF.getMachineMemOperand(
5337 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5338 I.getAlign(), AAMDNodes(), nullptr, SSID, Ordering);
5339
5340 SDValue Val = getValue(I.getValueOperand());
5341 if (Val.getValueType() != MemVT)
5342 Val = DAG.getPtrExtOrTrunc(Val, dl, MemVT);
5343 SDValue Ptr = getValue(I.getPointerOperand());
5344
5345 SDValue OutChain =
5346 DAG.getAtomic(ISD::ATOMIC_STORE, dl, MemVT, InChain, Val, Ptr, MMO);
5347
5348 setValue(&I, OutChain);
5349 DAG.setRoot(OutChain);
5350}
5351
5352/// Check if this intrinsic call depends on the chain (1st return value)
5353/// and if it only *loads* memory.
5354/// Ignore the callsite's attributes. A specific call site may be marked with
5355/// readnone, but the lowering code will expect the chain based on the
5356/// definition.
5357std::pair<bool, bool>
5358SelectionDAGBuilder::getTargetIntrinsicCallProperties(const CallBase &I) {
5359 const Function *F = I.getCalledFunction();
5360 bool HasChain = !F->doesNotAccessMemory();
5361 bool OnlyLoad =
5362 HasChain && F->onlyReadsMemory() && F->willReturn() && F->doesNotThrow();
5363
5364 return {HasChain, OnlyLoad};
5365}
5366
5367SmallVector<SDValue, 8> SelectionDAGBuilder::getTargetIntrinsicOperands(
5368 const CallBase &I, bool HasChain, bool OnlyLoad,
5369 TargetLowering::IntrinsicInfo *TgtMemIntrinsicInfo) {
5370 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5371
5372 // Build the operand list.
5374 if (HasChain) { // If this intrinsic has side-effects, chainify it.
5375 if (OnlyLoad) {
5376 // We don't need to serialize loads against other loads.
5377 Ops.push_back(DAG.getRoot());
5378 } else {
5379 Ops.push_back(getRoot());
5380 }
5381 }
5382
5383 // Add the intrinsic ID as an integer operand if it's not a target intrinsic.
5384 if (!TgtMemIntrinsicInfo || TgtMemIntrinsicInfo->opc == ISD::INTRINSIC_VOID ||
5385 TgtMemIntrinsicInfo->opc == ISD::INTRINSIC_W_CHAIN)
5386 Ops.push_back(DAG.getTargetConstant(I.getIntrinsicID(), getCurSDLoc(),
5387 TLI.getPointerTy(DAG.getDataLayout())));
5388
5389 // Add all operands of the call to the operand list.
5390 for (unsigned i = 0, e = I.arg_size(); i != e; ++i) {
5391 const Value *Arg = I.getArgOperand(i);
5392 if (!I.paramHasAttr(i, Attribute::ImmArg)) {
5393 Ops.push_back(getValue(Arg));
5394 continue;
5395 }
5396
5397 // Use TargetConstant instead of a regular constant for immarg.
5398 EVT VT = TLI.getValueType(DAG.getDataLayout(), Arg->getType(), true);
5399 if (const ConstantInt *CI = dyn_cast<ConstantInt>(Arg)) {
5400 assert(CI->getBitWidth() <= 64 &&
5401 "large intrinsic immediates not handled");
5402 Ops.push_back(DAG.getTargetConstant(*CI, SDLoc(), VT));
5403 } else {
5404 Ops.push_back(
5405 DAG.getTargetConstantFP(*cast<ConstantFP>(Arg), SDLoc(), VT));
5406 }
5407 }
5408
5409 if (std::optional<OperandBundleUse> Bundle =
5410 I.getOperandBundle(LLVMContext::OB_deactivation_symbol)) {
5411 auto *Sym = Bundle->Inputs[0].get();
5412 SDValue SDSym = getValue(Sym);
5413 SDSym = DAG.getDeactivationSymbol(cast<GlobalValue>(Sym));
5414 Ops.push_back(SDSym);
5415 }
5416
5417 if (std::optional<OperandBundleUse> Bundle =
5418 I.getOperandBundle(LLVMContext::OB_convergencectrl)) {
5419 Value *Token = Bundle->Inputs[0].get();
5420 SDValue ConvControlToken = getValue(Token);
5421 assert(Ops.back().getValueType() != MVT::Glue &&
5422 "Did not expect another glue node here.");
5423 ConvControlToken =
5424 DAG.getNode(ISD::CONVERGENCECTRL_GLUE, {}, MVT::Glue, ConvControlToken);
5425 Ops.push_back(ConvControlToken);
5426 }
5427
5428 return Ops;
5429}
5430
5431SDVTList SelectionDAGBuilder::getTargetIntrinsicVTList(const CallBase &I,
5432 bool HasChain) {
5433 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5434
5435 SmallVector<EVT, 4> ValueVTs;
5436 ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);
5437
5438 if (HasChain)
5439 ValueVTs.push_back(MVT::Other);
5440
5441 return DAG.getVTList(ValueVTs);
5442}
5443
5444/// Get an INTRINSIC node for a target intrinsic which does not touch memory.
5445SDValue SelectionDAGBuilder::getTargetNonMemIntrinsicNode(
5446 const Type &IntrinsicVT, bool HasChain, ArrayRef<SDValue> Ops,
5447 const SDVTList &VTs) {
5448 if (!HasChain)
5449 return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, getCurSDLoc(), VTs, Ops);
5450 if (!IntrinsicVT.isVoidTy())
5451 return DAG.getNode(ISD::INTRINSIC_W_CHAIN, getCurSDLoc(), VTs, Ops);
5452 return DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops);
5453}
5454
5455/// Set root, convert return type if necessary and check alignment.
5456SDValue SelectionDAGBuilder::handleTargetIntrinsicRet(const CallBase &I,
5457 bool HasChain,
5458 bool OnlyLoad,
5459 SDValue Result) {
5460 if (HasChain) {
5461 SDValue Chain = Result.getValue(Result.getNode()->getNumValues() - 1);
5462 if (OnlyLoad)
5463 PendingLoads.push_back(Chain);
5464 else
5465 DAG.setRoot(Chain);
5466 }
5467
5468 if (I.getType()->isVoidTy())
5469 return Result;
5470
5471 if (MaybeAlign Alignment = I.getRetAlign(); InsertAssertAlign && Alignment) {
5472 // Insert `assertalign` node if there's an alignment.
5473 Result = DAG.getAssertAlign(getCurSDLoc(), Result, Alignment.valueOrOne());
5474 } else if (!isa<VectorType>(I.getType())) {
5475 Result = lowerRangeToAssertZExt(DAG, I, Result);
5476 }
5477
5478 return Result;
5479}
5480
5481/// visitTargetIntrinsic - Lower a call of a target intrinsic to an INTRINSIC
5482/// node.
5483void SelectionDAGBuilder::visitTargetIntrinsic(const CallInst &I,
5484 unsigned Intrinsic) {
5485 auto [HasChain, OnlyLoad] = getTargetIntrinsicCallProperties(I);
5486
5487 // Info is set by getTgtMemIntrinsic
5488 TargetLowering::IntrinsicInfo Info;
5489 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5490 bool IsTgtMemIntrinsic =
5491 TLI.getTgtMemIntrinsic(Info, I, DAG.getMachineFunction(), Intrinsic);
5492
5493 SmallVector<SDValue, 8> Ops = getTargetIntrinsicOperands(
5494 I, HasChain, OnlyLoad, IsTgtMemIntrinsic ? &Info : nullptr);
5495 SDVTList VTs = getTargetIntrinsicVTList(I, HasChain);
5496
5497 // Propagate fast-math-flags from IR to node(s).
5498 SDNodeFlags Flags;
5499 if (auto *FPMO = dyn_cast<FPMathOperator>(&I))
5500 Flags.copyFMF(*FPMO);
5501 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
5502
5503 // Create the node.
5505
5506 // In some cases, custom collection of operands from CallInst I may be needed.
5508 if (IsTgtMemIntrinsic) {
5509 // This is target intrinsic that touches memory
5510 //
5511 // TODO: We currently just fallback to address space 0 if getTgtMemIntrinsic
5512 // didn't yield anything useful.
5513 MachinePointerInfo MPI;
5514 if (Info.ptrVal)
5515 MPI = MachinePointerInfo(Info.ptrVal, Info.offset);
5516 else if (Info.fallbackAddressSpace)
5517 MPI = MachinePointerInfo(*Info.fallbackAddressSpace);
5518 EVT MemVT = Info.memVT;
5519 LocationSize Size = LocationSize::precise(Info.size);
5520 if (Size.hasValue() && !Size.getValue())
5522 Align Alignment = Info.align.value_or(DAG.getEVTAlign(MemVT));
5523 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5524 MPI, Info.flags, Size, Alignment, I.getAAMetadata(), /*Ranges=*/nullptr,
5525 Info.ssid, Info.order, Info.failureOrder);
5526 Result =
5527 DAG.getMemIntrinsicNode(Info.opc, getCurSDLoc(), VTs, Ops, MemVT, MMO);
5528 } else {
5529 Result = getTargetNonMemIntrinsicNode(*I.getType(), HasChain, Ops, VTs);
5530 }
5531
5532 Result = handleTargetIntrinsicRet(I, HasChain, OnlyLoad, Result);
5533
5534 setValue(&I, Result);
5535}
5536
5537/// GetSignificand - Get the significand and build it into a floating-point
5538/// number with exponent of 1:
5539///
5540/// Op = (Op & 0x007fffff) | 0x3f800000;
5541///
5542/// where Op is the hexadecimal representation of floating point value.
5544 SDValue t1 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
5545 DAG.getConstant(0x007fffff, dl, MVT::i32));
5546 SDValue t2 = DAG.getNode(ISD::OR, dl, MVT::i32, t1,
5547 DAG.getConstant(0x3f800000, dl, MVT::i32));
5548 return DAG.getNode(ISD::BITCAST, dl, MVT::f32, t2);
5549}
5550
5551/// GetExponent - Get the exponent:
5552///
5553/// (float)(int)(((Op & 0x7f800000) >> 23) - 127);
5554///
5555/// where Op is the hexadecimal representation of floating point value.
5557 const TargetLowering &TLI, const SDLoc &dl) {
5558 SDValue t0 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
5559 DAG.getConstant(0x7f800000, dl, MVT::i32));
5560 SDValue t1 = DAG.getNode(ISD::SRL, dl, MVT::i32, t0,
5561 DAG.getShiftAmountConstant(23, MVT::i32, dl));
5562 SDValue t2 = DAG.getNode(ISD::SUB, dl, MVT::i32, t1,
5563 DAG.getConstant(127, dl, MVT::i32));
5564 return DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, t2);
5565}
5566
5567/// getF32Constant - Get 32-bit floating point constant.
5568static SDValue getF32Constant(SelectionDAG &DAG, unsigned Flt,
5569 const SDLoc &dl) {
5570 return DAG.getConstantFP(APFloat(APFloat::IEEEsingle(), APInt(32, Flt)), dl,
5571 MVT::f32);
5572}
5573
5575 SelectionDAG &DAG) {
5576 // TODO: What fast-math-flags should be set on the floating-point nodes?
5577
5578 // IntegerPartOfX = ((int32_t)(t0);
5579 SDValue IntegerPartOfX = DAG.getNode(ISD::FP_TO_SINT, dl, MVT::i32, t0);
5580
5581 // FractionalPartOfX = t0 - (float)IntegerPartOfX;
5582 SDValue t1 = DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, IntegerPartOfX);
5583 SDValue X = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0, t1);
5584
5585 // IntegerPartOfX <<= 23;
5586 IntegerPartOfX = DAG.getNode(ISD::SHL, dl, MVT::i32, IntegerPartOfX,
5587 DAG.getShiftAmountConstant(23, MVT::i32, dl));
5588
5589 SDValue TwoToFractionalPartOfX;
5590 if (LimitFloatPrecision <= 6) {
5591 // For floating-point precision of 6:
5592 //
5593 // TwoToFractionalPartOfX =
5594 // 0.997535578f +
5595 // (0.735607626f + 0.252464424f * x) * x;
5596 //
5597 // error 0.0144103317, which is 6 bits
5598 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5599 getF32Constant(DAG, 0x3e814304, dl));
5600 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5601 getF32Constant(DAG, 0x3f3c50c8, dl));
5602 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5603 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5604 getF32Constant(DAG, 0x3f7f5e7e, dl));
5605 } else if (LimitFloatPrecision <= 12) {
5606 // For floating-point precision of 12:
5607 //
5608 // TwoToFractionalPartOfX =
5609 // 0.999892986f +
5610 // (0.696457318f +
5611 // (0.224338339f + 0.792043434e-1f * x) * x) * x;
5612 //
5613 // error 0.000107046256, which is 13 to 14 bits
5614 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5615 getF32Constant(DAG, 0x3da235e3, dl));
5616 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5617 getF32Constant(DAG, 0x3e65b8f3, dl));
5618 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5619 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5620 getF32Constant(DAG, 0x3f324b07, dl));
5621 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5622 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5623 getF32Constant(DAG, 0x3f7ff8fd, dl));
5624 } else { // LimitFloatPrecision <= 18
5625 // For floating-point precision of 18:
5626 //
5627 // TwoToFractionalPartOfX =
5628 // 0.999999982f +
5629 // (0.693148872f +
5630 // (0.240227044f +
5631 // (0.554906021e-1f +
5632 // (0.961591928e-2f +
5633 // (0.136028312e-2f + 0.157059148e-3f *x)*x)*x)*x)*x)*x;
5634 // error 2.47208000*10^(-7), which is better than 18 bits
5635 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5636 getF32Constant(DAG, 0x3924b03e, dl));
5637 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5638 getF32Constant(DAG, 0x3ab24b87, dl));
5639 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5640 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5641 getF32Constant(DAG, 0x3c1d8c17, dl));
5642 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5643 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5644 getF32Constant(DAG, 0x3d634a1d, dl));
5645 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5646 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5647 getF32Constant(DAG, 0x3e75fe14, dl));
5648 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5649 SDValue t11 = DAG.getNode(ISD::FADD, dl, MVT::f32, t10,
5650 getF32Constant(DAG, 0x3f317234, dl));
5651 SDValue t12 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t11, X);
5652 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t12,
5653 getF32Constant(DAG, 0x3f800000, dl));
5654 }
5655
5656 // Add the exponent into the result in integer domain.
5657 SDValue t13 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, TwoToFractionalPartOfX);
5658 return DAG.getNode(ISD::BITCAST, dl, MVT::f32,
5659 DAG.getNode(ISD::ADD, dl, MVT::i32, t13, IntegerPartOfX));
5660}
5661
5662/// expandExp - Lower an exp intrinsic. Handles the special sequences for
5663/// limited-precision mode.
5665 const TargetLowering &TLI, SDNodeFlags Flags) {
5666 if (Op.getValueType() == MVT::f32 &&
5668
5669 // Put the exponent in the right bit position for later addition to the
5670 // final result:
5671 //
5672 // t0 = Op * log2(e)
5673
5674 // TODO: What fast-math-flags should be set here?
5675 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, Op,
5676 DAG.getConstantFP(numbers::log2ef, dl, MVT::f32));
5677 return getLimitedPrecisionExp2(t0, dl, DAG);
5678 }
5679
5680 // No special expansion.
5681 return DAG.getNode(ISD::FEXP, dl, Op.getValueType(), Op, Flags);
5682}
5683
5684/// expandLog - Lower a log intrinsic. Handles the special sequences for
5685/// limited-precision mode.
5687 const TargetLowering &TLI, SDNodeFlags Flags) {
5688 // TODO: What fast-math-flags should be set on the floating-point nodes?
5689
5690 if (Op.getValueType() == MVT::f32 &&
5692 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5693
5694 // Scale the exponent by log(2).
5695 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5696 SDValue LogOfExponent =
5697 DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5698 DAG.getConstantFP(numbers::ln2f, dl, MVT::f32));
5699
5700 // Get the significand and build it into a floating-point number with
5701 // exponent of 1.
5702 SDValue X = GetSignificand(DAG, Op1, dl);
5703
5704 SDValue LogOfMantissa;
5705 if (LimitFloatPrecision <= 6) {
5706 // For floating-point precision of 6:
5707 //
5708 // LogofMantissa =
5709 // -1.1609546f +
5710 // (1.4034025f - 0.23903021f * x) * x;
5711 //
5712 // error 0.0034276066, which is better than 8 bits
5713 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5714 getF32Constant(DAG, 0xbe74c456, dl));
5715 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5716 getF32Constant(DAG, 0x3fb3a2b1, dl));
5717 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5718 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5719 getF32Constant(DAG, 0x3f949a29, dl));
5720 } else if (LimitFloatPrecision <= 12) {
5721 // For floating-point precision of 12:
5722 //
5723 // LogOfMantissa =
5724 // -1.7417939f +
5725 // (2.8212026f +
5726 // (-1.4699568f +
5727 // (0.44717955f - 0.56570851e-1f * x) * x) * x) * x;
5728 //
5729 // error 0.000061011436, which is 14 bits
5730 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5731 getF32Constant(DAG, 0xbd67b6d6, dl));
5732 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5733 getF32Constant(DAG, 0x3ee4f4b8, dl));
5734 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5735 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5736 getF32Constant(DAG, 0x3fbc278b, dl));
5737 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5738 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5739 getF32Constant(DAG, 0x40348e95, dl));
5740 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5741 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5742 getF32Constant(DAG, 0x3fdef31a, dl));
5743 } else { // LimitFloatPrecision <= 18
5744 // For floating-point precision of 18:
5745 //
5746 // LogOfMantissa =
5747 // -2.1072184f +
5748 // (4.2372794f +
5749 // (-3.7029485f +
5750 // (2.2781945f +
5751 // (-0.87823314f +
5752 // (0.19073739f - 0.17809712e-1f * x) * x) * x) * x) * x)*x;
5753 //
5754 // error 0.0000023660568, which is better than 18 bits
5755 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5756 getF32Constant(DAG, 0xbc91e5ac, dl));
5757 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5758 getF32Constant(DAG, 0x3e4350aa, dl));
5759 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5760 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5761 getF32Constant(DAG, 0x3f60d3e3, dl));
5762 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5763 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5764 getF32Constant(DAG, 0x4011cdf0, dl));
5765 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5766 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5767 getF32Constant(DAG, 0x406cfd1c, dl));
5768 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5769 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5770 getF32Constant(DAG, 0x408797cb, dl));
5771 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5772 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t10,
5773 getF32Constant(DAG, 0x4006dcab, dl));
5774 }
5775
5776 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, LogOfMantissa);
5777 }
5778
5779 // No special expansion.
5780 return DAG.getNode(ISD::FLOG, dl, Op.getValueType(), Op, Flags);
5781}
5782
5783/// expandLog2 - Lower a log2 intrinsic. Handles the special sequences for
5784/// limited-precision mode.
5786 const TargetLowering &TLI, SDNodeFlags Flags) {
5787 // TODO: What fast-math-flags should be set on the floating-point nodes?
5788
5789 if (Op.getValueType() == MVT::f32 &&
5791 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5792
5793 // Get the exponent.
5794 SDValue LogOfExponent = GetExponent(DAG, Op1, TLI, dl);
5795
5796 // Get the significand and build it into a floating-point number with
5797 // exponent of 1.
5798 SDValue X = GetSignificand(DAG, Op1, dl);
5799
5800 // Different possible minimax approximations of significand in
5801 // floating-point for various degrees of accuracy over [1,2].
5802 SDValue Log2ofMantissa;
5803 if (LimitFloatPrecision <= 6) {
5804 // For floating-point precision of 6:
5805 //
5806 // Log2ofMantissa = -1.6749035f + (2.0246817f - .34484768f * x) * x;
5807 //
5808 // error 0.0049451742, which is more than 7 bits
5809 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5810 getF32Constant(DAG, 0xbeb08fe0, dl));
5811 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5812 getF32Constant(DAG, 0x40019463, dl));
5813 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5814 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5815 getF32Constant(DAG, 0x3fd6633d, dl));
5816 } else if (LimitFloatPrecision <= 12) {
5817 // For floating-point precision of 12:
5818 //
5819 // Log2ofMantissa =
5820 // -2.51285454f +
5821 // (4.07009056f +
5822 // (-2.12067489f +
5823 // (.645142248f - 0.816157886e-1f * x) * x) * x) * x;
5824 //
5825 // error 0.0000876136000, which is better than 13 bits
5826 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5827 getF32Constant(DAG, 0xbda7262e, dl));
5828 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5829 getF32Constant(DAG, 0x3f25280b, dl));
5830 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5831 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5832 getF32Constant(DAG, 0x4007b923, dl));
5833 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5834 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5835 getF32Constant(DAG, 0x40823e2f, dl));
5836 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5837 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5838 getF32Constant(DAG, 0x4020d29c, dl));
5839 } else { // LimitFloatPrecision <= 18
5840 // For floating-point precision of 18:
5841 //
5842 // Log2ofMantissa =
5843 // -3.0400495f +
5844 // (6.1129976f +
5845 // (-5.3420409f +
5846 // (3.2865683f +
5847 // (-1.2669343f +
5848 // (0.27515199f -
5849 // 0.25691327e-1f * x) * x) * x) * x) * x) * x;
5850 //
5851 // error 0.0000018516, which is better than 18 bits
5852 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5853 getF32Constant(DAG, 0xbcd2769e, dl));
5854 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5855 getF32Constant(DAG, 0x3e8ce0b9, dl));
5856 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5857 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5858 getF32Constant(DAG, 0x3fa22ae7, dl));
5859 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5860 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5861 getF32Constant(DAG, 0x40525723, dl));
5862 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5863 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5864 getF32Constant(DAG, 0x40aaf200, dl));
5865 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5866 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5867 getF32Constant(DAG, 0x40c39dad, dl));
5868 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5869 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t10,
5870 getF32Constant(DAG, 0x4042902c, dl));
5871 }
5872
5873 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, Log2ofMantissa);
5874 }
5875
5876 // No special expansion.
5877 return DAG.getNode(ISD::FLOG2, dl, Op.getValueType(), Op, Flags);
5878}
5879
5880/// expandLog10 - Lower a log10 intrinsic. Handles the special sequences for
5881/// limited-precision mode.
5883 const TargetLowering &TLI, SDNodeFlags Flags) {
5884 // TODO: What fast-math-flags should be set on the floating-point nodes?
5885
5886 if (Op.getValueType() == MVT::f32 &&
5888 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5889
5890 // Scale the exponent by log10(2) [0.30102999f].
5891 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5892 SDValue LogOfExponent = DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5893 getF32Constant(DAG, 0x3e9a209a, dl));
5894
5895 // Get the significand and build it into a floating-point number with
5896 // exponent of 1.
5897 SDValue X = GetSignificand(DAG, Op1, dl);
5898
5899 SDValue Log10ofMantissa;
5900 if (LimitFloatPrecision <= 6) {
5901 // For floating-point precision of 6:
5902 //
5903 // Log10ofMantissa =
5904 // -0.50419619f +
5905 // (0.60948995f - 0.10380950f * x) * x;
5906 //
5907 // error 0.0014886165, which is 6 bits
5908 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5909 getF32Constant(DAG, 0xbdd49a13, dl));
5910 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5911 getF32Constant(DAG, 0x3f1c0789, dl));
5912 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5913 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5914 getF32Constant(DAG, 0x3f011300, dl));
5915 } else if (LimitFloatPrecision <= 12) {
5916 // For floating-point precision of 12:
5917 //
5918 // Log10ofMantissa =
5919 // -0.64831180f +
5920 // (0.91751397f +
5921 // (-0.31664806f + 0.47637168e-1f * x) * x) * x;
5922 //
5923 // error 0.00019228036, which is better than 12 bits
5924 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5925 getF32Constant(DAG, 0x3d431f31, dl));
5926 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
5927 getF32Constant(DAG, 0x3ea21fb2, dl));
5928 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5929 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5930 getF32Constant(DAG, 0x3f6ae232, dl));
5931 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5932 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
5933 getF32Constant(DAG, 0x3f25f7c3, dl));
5934 } else { // LimitFloatPrecision <= 18
5935 // For floating-point precision of 18:
5936 //
5937 // Log10ofMantissa =
5938 // -0.84299375f +
5939 // (1.5327582f +
5940 // (-1.0688956f +
5941 // (0.49102474f +
5942 // (-0.12539807f + 0.13508273e-1f * x) * x) * x) * x) * x;
5943 //
5944 // error 0.0000037995730, which is better than 18 bits
5945 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5946 getF32Constant(DAG, 0x3c5d51ce, dl));
5947 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
5948 getF32Constant(DAG, 0x3e00685a, dl));
5949 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5950 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5951 getF32Constant(DAG, 0x3efb6798, dl));
5952 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5953 SDValue t5 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
5954 getF32Constant(DAG, 0x3f88d192, dl));
5955 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5956 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5957 getF32Constant(DAG, 0x3fc4316c, dl));
5958 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5959 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t8,
5960 getF32Constant(DAG, 0x3f57ce70, dl));
5961 }
5962
5963 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, Log10ofMantissa);
5964 }
5965
5966 // No special expansion.
5967 return DAG.getNode(ISD::FLOG10, dl, Op.getValueType(), Op, Flags);
5968}
5969
5970/// expandExp2 - Lower an exp2 intrinsic. Handles the special sequences for
5971/// limited-precision mode.
5973 const TargetLowering &TLI, SDNodeFlags Flags) {
5974 if (Op.getValueType() == MVT::f32 &&
5976 return getLimitedPrecisionExp2(Op, dl, DAG);
5977
5978 // No special expansion.
5979 return DAG.getNode(ISD::FEXP2, dl, Op.getValueType(), Op, Flags);
5980}
5981
5982/// visitPow - Lower a pow intrinsic. Handles the special sequences for
5983/// limited-precision mode with x == 10.0f.
5985 SelectionDAG &DAG, const TargetLowering &TLI,
5986 SDNodeFlags Flags) {
5987 bool IsExp10 = false;
5988 if (LHS.getValueType() == MVT::f32 && RHS.getValueType() == MVT::f32 &&
5991 APFloat Ten(10.0f);
5992 IsExp10 = LHSC->isExactlyValue(Ten);
5993 }
5994 }
5995
5996 // TODO: What fast-math-flags should be set on the FMUL node?
5997 if (IsExp10) {
5998 // Put the exponent in the right bit position for later addition to the
5999 // final result:
6000 //
6001 // #define LOG2OF10 3.3219281f
6002 // t0 = Op * LOG2OF10;
6003 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, RHS,
6004 getF32Constant(DAG, 0x40549a78, dl));
6005 return getLimitedPrecisionExp2(t0, dl, DAG);
6006 }
6007
6008 // No special expansion.
6009 return DAG.getNode(ISD::FPOW, dl, LHS.getValueType(), LHS, RHS, Flags);
6010}
6011
6012/// ExpandPowI - Expand a llvm.powi intrinsic.
6014 SelectionDAG &DAG) {
6015 // If RHS is a constant, we can expand this out to a multiplication tree if
6016 // it's beneficial on the target, otherwise we end up lowering to a call to
6017 // __powidf2 (for example).
6019 unsigned Val = RHSC->getSExtValue();
6020
6021 // powi(x, 0) -> 1.0
6022 if (Val == 0)
6023 return DAG.getConstantFP(1.0, DL, LHS.getValueType());
6024
6026 Val, DAG.shouldOptForSize())) {
6027 // Get the exponent as a positive value.
6028 if ((int)Val < 0)
6029 Val = -Val;
6030 // We use the simple binary decomposition method to generate the multiply
6031 // sequence. There are more optimal ways to do this (for example,
6032 // powi(x,15) generates one more multiply than it should), but this has
6033 // the benefit of being both really simple and much better than a libcall.
6034 SDValue Res; // Logically starts equal to 1.0
6035 SDValue CurSquare = LHS;
6036 // TODO: Intrinsics should have fast-math-flags that propagate to these
6037 // nodes.
6038 while (Val) {
6039 if (Val & 1) {
6040 if (Res.getNode())
6041 Res =
6042 DAG.getNode(ISD::FMUL, DL, Res.getValueType(), Res, CurSquare);
6043 else
6044 Res = CurSquare; // 1.0*CurSquare.
6045 }
6046
6047 CurSquare = DAG.getNode(ISD::FMUL, DL, CurSquare.getValueType(),
6048 CurSquare, CurSquare);
6049 Val >>= 1;
6050 }
6051
6052 // If the original was negative, invert the result, producing 1/(x*x*x).
6053 if (RHSC->getSExtValue() < 0)
6054 Res = DAG.getNode(ISD::FDIV, DL, LHS.getValueType(),
6055 DAG.getConstantFP(1.0, DL, LHS.getValueType()), Res);
6056 return Res;
6057 }
6058 }
6059
6060 // Otherwise, expand to a libcall.
6061 return DAG.getNode(ISD::FPOWI, DL, LHS.getValueType(), LHS, RHS);
6062}
6063
6064static SDValue expandDivFix(unsigned Opcode, const SDLoc &DL,
6065 SDValue LHS, SDValue RHS, SDValue Scale,
6066 SelectionDAG &DAG, const TargetLowering &TLI) {
6067 EVT VT = LHS.getValueType();
6068 bool Signed = Opcode == ISD::SDIVFIX || Opcode == ISD::SDIVFIXSAT;
6069 bool Saturating = Opcode == ISD::SDIVFIXSAT || Opcode == ISD::UDIVFIXSAT;
6070 LLVMContext &Ctx = *DAG.getContext();
6071
6072 // If the type is legal but the operation isn't, this node might survive all
6073 // the way to operation legalization. If we end up there and we do not have
6074 // the ability to widen the type (if VT*2 is not legal), we cannot expand the
6075 // node.
6076
6077 // Coax the legalizer into expanding the node during type legalization instead
6078 // by bumping the size by one bit. This will force it to Promote, enabling the
6079 // early expansion and avoiding the need to expand later.
6080
6081 // We don't have to do this if Scale is 0; that can always be expanded, unless
6082 // it's a saturating signed operation. Those can experience true integer
6083 // division overflow, a case which we must avoid.
6084
6085 // FIXME: We wouldn't have to do this (or any of the early
6086 // expansion/promotion) if it was possible to expand a libcall of an
6087 // illegal type during operation legalization. But it's not, so things
6088 // get a bit hacky.
6089 unsigned ScaleInt = Scale->getAsZExtVal();
6090 if ((ScaleInt > 0 || (Saturating && Signed)) &&
6091 (TLI.isTypeLegal(VT) ||
6092 (VT.isVector() && TLI.isTypeLegal(VT.getVectorElementType())))) {
6094 Opcode, VT, ScaleInt);
6095 if (Action != TargetLowering::Legal && Action != TargetLowering::Custom) {
6096 EVT PromVT;
6097 if (VT.isScalarInteger())
6098 PromVT = EVT::getIntegerVT(Ctx, VT.getSizeInBits() + 1);
6099 else if (VT.isVector()) {
6100 PromVT = VT.getVectorElementType();
6101 PromVT = EVT::getIntegerVT(Ctx, PromVT.getSizeInBits() + 1);
6102 PromVT = EVT::getVectorVT(Ctx, PromVT, VT.getVectorElementCount());
6103 } else
6104 llvm_unreachable("Wrong VT for DIVFIX?");
6105 LHS = DAG.getExtOrTrunc(Signed, LHS, DL, PromVT);
6106 RHS = DAG.getExtOrTrunc(Signed, RHS, DL, PromVT);
6107 EVT ShiftTy = TLI.getShiftAmountTy(PromVT, DAG.getDataLayout());
6108 // For saturating operations, we need to shift up the LHS to get the
6109 // proper saturation width, and then shift down again afterwards.
6110 if (Saturating)
6111 LHS = DAG.getNode(ISD::SHL, DL, PromVT, LHS,
6112 DAG.getConstant(1, DL, ShiftTy));
6113 SDValue Res = DAG.getNode(Opcode, DL, PromVT, LHS, RHS, Scale);
6114 if (Saturating)
6115 Res = DAG.getNode(Signed ? ISD::SRA : ISD::SRL, DL, PromVT, Res,
6116 DAG.getConstant(1, DL, ShiftTy));
6117 return DAG.getZExtOrTrunc(Res, DL, VT);
6118 }
6119 }
6120
6121 return DAG.getNode(Opcode, DL, VT, LHS, RHS, Scale);
6122}
6123
6124// getUnderlyingArgRegs - Find underlying registers used for a truncated,
6125// bitcasted, or split argument. Returns a list of <Register, size in bits>
6126static void
6127getUnderlyingArgRegs(SmallVectorImpl<std::pair<Register, TypeSize>> &Regs,
6128 const SDValue &N) {
6129 switch (N.getOpcode()) {
6130 case ISD::CopyFromReg: {
6131 SDValue Op = N.getOperand(1);
6132 Regs.emplace_back(cast<RegisterSDNode>(Op)->getReg(),
6133 Op.getValueType().getSizeInBits());
6134 return;
6135 }
6136 case ISD::BITCAST:
6137 case ISD::AssertZext:
6138 case ISD::AssertSext:
6139 case ISD::TRUNCATE:
6140 getUnderlyingArgRegs(Regs, N.getOperand(0));
6141 return;
6142 case ISD::BUILD_PAIR:
6143 case ISD::BUILD_VECTOR:
6145 for (SDValue Op : N->op_values())
6146 getUnderlyingArgRegs(Regs, Op);
6147 return;
6148 default:
6149 return;
6150 }
6151}
6152
6153/// If the DbgValueInst is a dbg_value of a function argument, create the
6154/// corresponding DBG_VALUE machine instruction for it now. At the end of
6155/// instruction selection, they will be inserted to the entry BB.
6156/// We don't currently support this for variadic dbg_values, as they shouldn't
6157/// appear for function arguments or in the prologue.
6158bool SelectionDAGBuilder::EmitFuncArgumentDbgValue(
6159 const Value *V, DILocalVariable *Variable, DIExpression *Expr,
6160 DILocation *DL, FuncArgumentDbgValueKind Kind, const SDValue &N) {
6161 const Argument *Arg = dyn_cast<Argument>(V);
6162 if (!Arg)
6163 return false;
6164
6165 MachineFunction &MF = DAG.getMachineFunction();
6166 const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo();
6167
6168 // Helper to create DBG_INSTR_REFs or DBG_VALUEs, depending on what kind
6169 // we've been asked to pursue.
6170 auto MakeVRegDbgValue = [&](Register Reg, DIExpression *FragExpr,
6171 bool Indirect) {
6172 if (Reg.isVirtual() && MF.useDebugInstrRef()) {
6173 // For VRegs, in instruction referencing mode, create a DBG_INSTR_REF
6174 // pointing at the VReg, which will be patched up later.
6175 auto &Inst = TII->get(TargetOpcode::DBG_INSTR_REF);
6177 /* Reg */ Reg, /* isDef */ false, /* isImp */ false,
6178 /* isKill */ false, /* isDead */ false,
6179 /* isUndef */ false, /* isEarlyClobber */ false,
6180 /* SubReg */ 0, /* isDebug */ true)});
6181
6182 auto *NewDIExpr = FragExpr;
6183 // We don't have an "Indirect" field in DBG_INSTR_REF, fold that into
6184 // the DIExpression.
6185 if (Indirect)
6186 NewDIExpr = DIExpression::prepend(FragExpr, DIExpression::DerefBefore);
6188 NewDIExpr = DIExpression::prependOpcodes(NewDIExpr, Ops);
6189 return BuildMI(MF, DL, Inst, false, MOs, Variable, NewDIExpr);
6190 } else {
6191 // Create a completely standard DBG_VALUE.
6192 auto &Inst = TII->get(TargetOpcode::DBG_VALUE);
6193 return BuildMI(MF, DL, Inst, Indirect, Reg, Variable, FragExpr);
6194 }
6195 };
6196
6197 if (Kind == FuncArgumentDbgValueKind::Value) {
6198 // ArgDbgValues are hoisted to the beginning of the entry block. So we
6199 // should only emit as ArgDbgValue if the dbg.value intrinsic is found in
6200 // the entry block.
6201 bool IsInEntryBlock = FuncInfo.MBB == &FuncInfo.MF->front();
6202 if (!IsInEntryBlock)
6203 return false;
6204
6205 // ArgDbgValues are hoisted to the beginning of the entry block. So we
6206 // should only emit as ArgDbgValue if the dbg.value intrinsic describes a
6207 // variable that also is a param.
6208 //
6209 // Although, if we are at the top of the entry block already, we can still
6210 // emit using ArgDbgValue. This might catch some situations when the
6211 // dbg.value refers to an argument that isn't used in the entry block, so
6212 // any CopyToReg node would be optimized out and the only way to express
6213 // this DBG_VALUE is by using the physical reg (or FI) as done in this
6214 // method. ArgDbgValues are hoisted to the beginning of the entry block. So
6215 // we should only emit as ArgDbgValue if the Variable is an argument to the
6216 // current function, and the dbg.value intrinsic is found in the entry
6217 // block.
6218 bool VariableIsFunctionInputArg = Variable->isParameter() &&
6219 !DL->getInlinedAt();
6220 bool IsInPrologue = SDNodeOrder == LowestSDNodeOrder;
6221 if (!IsInPrologue && !VariableIsFunctionInputArg)
6222 return false;
6223
6224 // Here we assume that a function argument on IR level only can be used to
6225 // describe one input parameter on source level. If we for example have
6226 // source code like this
6227 //
6228 // struct A { long x, y; };
6229 // void foo(struct A a, long b) {
6230 // ...
6231 // b = a.x;
6232 // ...
6233 // }
6234 //
6235 // and IR like this
6236 //
6237 // define void @foo(i32 %a1, i32 %a2, i32 %b) {
6238 // entry:
6239 // call void @llvm.dbg.value(metadata i32 %a1, "a", DW_OP_LLVM_fragment
6240 // call void @llvm.dbg.value(metadata i32 %a2, "a", DW_OP_LLVM_fragment
6241 // call void @llvm.dbg.value(metadata i32 %b, "b",
6242 // ...
6243 // call void @llvm.dbg.value(metadata i32 %a1, "b"
6244 // ...
6245 //
6246 // then the last dbg.value is describing a parameter "b" using a value that
6247 // is an argument. But since we already has used %a1 to describe a parameter
6248 // we should not handle that last dbg.value here (that would result in an
6249 // incorrect hoisting of the DBG_VALUE to the function entry).
6250 // Notice that we allow one dbg.value per IR level argument, to accommodate
6251 // for the situation with fragments above.
6252 // If there is no node for the value being handled, we return true to skip
6253 // the normal generation of debug info, as it would kill existing debug
6254 // info for the parameter in case of duplicates.
6255 if (VariableIsFunctionInputArg) {
6256 unsigned ArgNo = Arg->getArgNo();
6257 if (ArgNo >= FuncInfo.DescribedArgs.size())
6258 FuncInfo.DescribedArgs.resize(ArgNo + 1, false);
6259 else if (!IsInPrologue && FuncInfo.DescribedArgs.test(ArgNo))
6260 return !NodeMap[V].getNode();
6261 FuncInfo.DescribedArgs.set(ArgNo);
6262 }
6263 }
6264
6265 bool IsIndirect = false;
6266 std::optional<MachineOperand> Op;
6267 // Some arguments' frame index is recorded during argument lowering.
6268 int FI = FuncInfo.getArgumentFrameIndex(Arg);
6269 if (FI != std::numeric_limits<int>::max())
6271
6273 if (!Op && N.getNode()) {
6274 getUnderlyingArgRegs(ArgRegsAndSizes, N);
6275 Register Reg;
6276 if (ArgRegsAndSizes.size() == 1)
6277 Reg = ArgRegsAndSizes.front().first;
6278
6279 if (Reg && Reg.isVirtual()) {
6280 MachineRegisterInfo &RegInfo = MF.getRegInfo();
6281 Register PR = RegInfo.getLiveInPhysReg(Reg);
6282 if (PR)
6283 Reg = PR;
6284 }
6285 if (Reg) {
6287 IsIndirect = Kind != FuncArgumentDbgValueKind::Value;
6288 }
6289 }
6290
6291 if (!Op && N.getNode()) {
6292 // Check if frame index is available.
6293 SDValue LCandidate = peekThroughBitcasts(N);
6294 if (LoadSDNode *LNode = dyn_cast<LoadSDNode>(LCandidate.getNode()))
6295 if (FrameIndexSDNode *FINode =
6296 dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
6297 Op = MachineOperand::CreateFI(FINode->getIndex());
6298 }
6299
6300 if (!Op) {
6301 // Create a DBG_VALUE for each decomposed value in ArgRegs to cover Reg
6302 auto splitMultiRegDbgValue =
6303 [&](ArrayRef<std::pair<Register, TypeSize>> SplitRegs) -> bool {
6304 unsigned Offset = 0;
6305 for (const auto &[Reg, RegSizeInBits] : SplitRegs) {
6306 // FIXME: Scalable sizes are not supported in fragment expressions.
6307 if (RegSizeInBits.isScalable())
6308 return false;
6309
6310 // If the expression is already a fragment, the current register
6311 // offset+size might extend beyond the fragment. In this case, only
6312 // the register bits that are inside the fragment are relevant.
6313 int RegFragmentSizeInBits = RegSizeInBits.getFixedValue();
6314 if (auto ExprFragmentInfo = Expr->getFragmentInfo()) {
6315 uint64_t ExprFragmentSizeInBits = ExprFragmentInfo->SizeInBits;
6316 // The register is entirely outside the expression fragment,
6317 // so is irrelevant for debug info.
6318 if (Offset >= ExprFragmentSizeInBits)
6319 break;
6320 // The register is partially outside the expression fragment, only
6321 // the low bits within the fragment are relevant for debug info.
6322 if (Offset + RegFragmentSizeInBits > ExprFragmentSizeInBits) {
6323 RegFragmentSizeInBits = ExprFragmentSizeInBits - Offset;
6324 }
6325 }
6326
6327 auto FragmentExpr = DIExpression::createFragmentExpression(
6328 Expr, Offset, RegFragmentSizeInBits);
6329 Offset += RegSizeInBits.getFixedValue();
6330 // If a valid fragment expression cannot be created, the variable's
6331 // correct value cannot be determined and so it is set as poison.
6332 if (!FragmentExpr) {
6333 SDDbgValue *SDV = DAG.getConstantDbgValue(
6334 Variable, Expr, PoisonValue::get(V->getType()), DL, SDNodeOrder);
6335 DAG.AddDbgValue(SDV, false);
6336 continue;
6337 }
6338 MachineInstr *NewMI = MakeVRegDbgValue(
6339 Reg, *FragmentExpr, Kind != FuncArgumentDbgValueKind::Value);
6340 FuncInfo.ArgDbgValues.push_back(NewMI);
6341 }
6342
6343 return true;
6344 };
6345
6346 // Check if ValueMap has reg number.
6348 VMI = FuncInfo.ValueMap.find(V);
6349 if (VMI != FuncInfo.ValueMap.end()) {
6350 const auto &TLI = DAG.getTargetLoweringInfo();
6351 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), VMI->second,
6352 V->getType(), std::nullopt);
6353 if (RFV.occupiesMultipleRegs())
6354 return splitMultiRegDbgValue(RFV.getRegsAndSizes());
6355
6356 Op = MachineOperand::CreateReg(VMI->second, false);
6357 IsIndirect = Kind != FuncArgumentDbgValueKind::Value;
6358 } else if (ArgRegsAndSizes.size() > 1) {
6359 // This was split due to the calling convention, and no virtual register
6360 // mapping exists for the value.
6361 return splitMultiRegDbgValue(ArgRegsAndSizes);
6362 }
6363 }
6364
6365 if (!Op)
6366 return false;
6367
6368 assert(Variable->isValidLocationForIntrinsic(DL) &&
6369 "Expected inlined-at fields to agree");
6370 MachineInstr *NewMI = nullptr;
6371
6372 if (Op->isReg())
6373 NewMI = MakeVRegDbgValue(Op->getReg(), Expr, IsIndirect);
6374 else
6375 NewMI = BuildMI(MF, DL, TII->get(TargetOpcode::DBG_VALUE), true, *Op,
6376 Variable, Expr);
6377
6378 // Otherwise, use ArgDbgValues.
6379 FuncInfo.ArgDbgValues.push_back(NewMI);
6380 return true;
6381}
6382
6383/// Return the appropriate SDDbgValue based on N.
6384SDDbgValue *SelectionDAGBuilder::getDbgValue(SDValue N,
6385 DILocalVariable *Variable,
6386 DIExpression *Expr,
6387 const DebugLoc &dl,
6388 unsigned DbgSDNodeOrder) {
6389 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(N.getNode())) {
6390 // Construct a FrameIndexDbgValue for FrameIndexSDNodes so we can describe
6391 // stack slot locations.
6392 //
6393 // Consider "int x = 0; int *px = &x;". There are two kinds of interesting
6394 // debug values here after optimization:
6395 //
6396 // dbg.value(i32* %px, !"int *px", !DIExpression()), and
6397 // dbg.value(i32* %px, !"int x", !DIExpression(DW_OP_deref))
6398 //
6399 // Both describe the direct values of their associated variables.
6400 return DAG.getFrameIndexDbgValue(Variable, Expr, FISDN->getIndex(),
6401 /*IsIndirect*/ false, dl, DbgSDNodeOrder);
6402 }
6403 return DAG.getDbgValue(Variable, Expr, N.getNode(), N.getResNo(),
6404 /*IsIndirect*/ false, dl, DbgSDNodeOrder);
6405}
6406
6407static unsigned FixedPointIntrinsicToOpcode(unsigned Intrinsic) {
6408 switch (Intrinsic) {
6409 case Intrinsic::smul_fix:
6410 return ISD::SMULFIX;
6411 case Intrinsic::umul_fix:
6412 return ISD::UMULFIX;
6413 case Intrinsic::smul_fix_sat:
6414 return ISD::SMULFIXSAT;
6415 case Intrinsic::umul_fix_sat:
6416 return ISD::UMULFIXSAT;
6417 case Intrinsic::sdiv_fix:
6418 return ISD::SDIVFIX;
6419 case Intrinsic::udiv_fix:
6420 return ISD::UDIVFIX;
6421 case Intrinsic::sdiv_fix_sat:
6422 return ISD::SDIVFIXSAT;
6423 case Intrinsic::udiv_fix_sat:
6424 return ISD::UDIVFIXSAT;
6425 default:
6426 llvm_unreachable("Unhandled fixed point intrinsic");
6427 }
6428}
6429
6430/// Given a @llvm.call.preallocated.setup, return the corresponding
6431/// preallocated call.
6432static const CallBase *FindPreallocatedCall(const Value *PreallocatedSetup) {
6433 assert(cast<CallBase>(PreallocatedSetup)
6435 ->getIntrinsicID() == Intrinsic::call_preallocated_setup &&
6436 "expected call_preallocated_setup Value");
6437 for (const auto *U : PreallocatedSetup->users()) {
6438 auto *UseCall = cast<CallBase>(U);
6439 const Function *Fn = UseCall->getCalledFunction();
6440 if (!Fn || Fn->getIntrinsicID() != Intrinsic::call_preallocated_arg) {
6441 return UseCall;
6442 }
6443 }
6444 llvm_unreachable("expected corresponding call to preallocated setup/arg");
6445}
6446
6447/// If DI is a debug value with an EntryValue expression, lower it using the
6448/// corresponding physical register of the associated Argument value
6449/// (guaranteed to exist by the verifier).
6450bool SelectionDAGBuilder::visitEntryValueDbgValue(
6451 ArrayRef<const Value *> Values, DILocalVariable *Variable,
6452 DIExpression *Expr, DebugLoc DbgLoc) {
6453 if (!Expr->isEntryValue() || !hasSingleElement(Values))
6454 return false;
6455
6456 // These properties are guaranteed by the verifier.
6457 const Argument *Arg = cast<Argument>(Values[0]);
6458 assert(Arg->hasAttribute(Attribute::AttrKind::SwiftAsync));
6459
6460 auto ArgIt = FuncInfo.ValueMap.find(Arg);
6461 if (ArgIt == FuncInfo.ValueMap.end()) {
6462 LLVM_DEBUG(
6463 dbgs() << "Dropping dbg.value: expression is entry_value but "
6464 "couldn't find an associated register for the Argument\n");
6465 return true;
6466 }
6467 Register ArgVReg = ArgIt->getSecond();
6468
6469 for (auto [PhysReg, VirtReg] : FuncInfo.RegInfo->liveins())
6470 if (ArgVReg == VirtReg || ArgVReg == PhysReg) {
6471 SDDbgValue *SDV = DAG.getVRegDbgValue(
6472 Variable, Expr, PhysReg, false /*IsIndidrect*/, DbgLoc, SDNodeOrder);
6473 DAG.AddDbgValue(SDV, false /*treat as dbg.declare byval parameter*/);
6474 return true;
6475 }
6476 LLVM_DEBUG(dbgs() << "Dropping dbg.value: expression is entry_value but "
6477 "couldn't find a physical register\n");
6478 return true;
6479}
6480
6481/// Lower the call to the specified intrinsic function.
6482void SelectionDAGBuilder::visitConvergenceControl(const CallInst &I,
6483 unsigned Intrinsic) {
6484 SDLoc sdl = getCurSDLoc();
6485 switch (Intrinsic) {
6486 case Intrinsic::experimental_convergence_anchor:
6487 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_ANCHOR, sdl, MVT::Untyped));
6488 break;
6489 case Intrinsic::experimental_convergence_entry:
6490 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_ENTRY, sdl, MVT::Untyped));
6491 break;
6492 case Intrinsic::experimental_convergence_loop: {
6493 auto Bundle = I.getOperandBundle(LLVMContext::OB_convergencectrl);
6494 auto *Token = Bundle->Inputs[0].get();
6495 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_LOOP, sdl, MVT::Untyped,
6496 getValue(Token)));
6497 break;
6498 }
6499 }
6500}
6501
6502void SelectionDAGBuilder::visitVectorHistogram(const CallInst &I,
6503 unsigned IntrinsicID) {
6504 // For now, we're only lowering an 'add' histogram.
6505 // We can add others later, e.g. saturating adds, min/max.
6506 assert(IntrinsicID == Intrinsic::experimental_vector_histogram_add &&
6507 "Tried to lower unsupported histogram type");
6508 SDLoc sdl = getCurSDLoc();
6509 Value *Ptr = I.getOperand(0);
6510 SDValue Inc = getValue(I.getOperand(1));
6511 SDValue Mask = getValue(I.getOperand(2));
6512
6513 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6514 DataLayout TargetDL = DAG.getDataLayout();
6515 EVT VT = Inc.getValueType();
6516 Align Alignment = DAG.getEVTAlign(VT);
6517
6518 const MDNode *Ranges = getRangeMetadata(I);
6519
6520 SDValue Root = DAG.getRoot();
6521 SDValue Base;
6522 SDValue Index;
6523 SDValue Scale;
6524 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
6525 I.getParent(), VT.getScalarStoreSize());
6526
6527 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
6528
6529 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
6530 MachinePointerInfo(AS),
6532 MemoryLocation::UnknownSize, Alignment, I.getAAMetadata(), Ranges);
6533
6534 if (!UniformBase) {
6535 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
6536 Index = getValue(Ptr);
6537 Scale =
6538 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
6539 }
6540
6541 EVT IdxVT = Index.getValueType();
6542 EVT EltTy = IdxVT.getVectorElementType();
6543 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
6544 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
6545 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
6546 }
6547
6548 SDValue ID = DAG.getTargetConstant(IntrinsicID, sdl, MVT::i32);
6549
6550 SDValue Ops[] = {Root, Inc, Mask, Base, Index, Scale, ID};
6551 SDValue Histogram = DAG.getMaskedHistogram(DAG.getVTList(MVT::Other), VT, sdl,
6552 Ops, MMO, ISD::SIGNED_SCALED);
6553
6554 setValue(&I, Histogram);
6555 DAG.setRoot(Histogram);
6556}
6557
6558void SelectionDAGBuilder::visitVectorExtractLastActive(const CallInst &I,
6559 unsigned Intrinsic) {
6560 assert(Intrinsic == Intrinsic::experimental_vector_extract_last_active &&
6561 "Tried lowering invalid vector extract last");
6562 SDLoc sdl = getCurSDLoc();
6563 const DataLayout &Layout = DAG.getDataLayout();
6564 SDValue Data = getValue(I.getOperand(0));
6565 SDValue Mask = getValue(I.getOperand(1));
6566
6567 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6568 EVT ResVT = TLI.getValueType(Layout, I.getType());
6569
6570 EVT ExtVT = TLI.getVectorIdxTy(Layout);
6571 SDValue Idx = DAG.getNode(ISD::VECTOR_FIND_LAST_ACTIVE, sdl, ExtVT, Mask);
6572 SDValue Result = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, sdl, ResVT, Data, Idx);
6573
6574 Value *Default = I.getOperand(2);
6576 SDValue PassThru = getValue(Default);
6577 EVT BoolVT = Mask.getValueType().getScalarType();
6578 SDValue AnyActive = DAG.getNode(ISD::VECREDUCE_OR, sdl, BoolVT, Mask);
6579 Result = DAG.getSelect(sdl, ResVT, AnyActive, Result, PassThru);
6580 }
6581
6582 setValue(&I, Result);
6583}
6584
6585/// Lower the call to the specified intrinsic function.
6586void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
6587 unsigned Intrinsic) {
6588 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6589 SDLoc sdl = getCurSDLoc();
6590 DebugLoc dl = getCurDebugLoc();
6591 SDValue Res;
6592
6593 SDNodeFlags Flags;
6594 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
6595 Flags.copyFMF(*FPOp);
6596
6597 switch (Intrinsic) {
6598 default:
6599 // By default, turn this into a target intrinsic node.
6600 visitTargetIntrinsic(I, Intrinsic);
6601 return;
6602 case Intrinsic::vscale: {
6603 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6604 setValue(&I, DAG.getVScale(sdl, VT, APInt(VT.getSizeInBits(), 1)));
6605 return;
6606 }
6607 case Intrinsic::vastart: visitVAStart(I); return;
6608 case Intrinsic::vaend: visitVAEnd(I); return;
6609 case Intrinsic::vacopy: visitVACopy(I); return;
6610 case Intrinsic::returnaddress:
6611 setValue(&I, DAG.getNode(ISD::RETURNADDR, sdl,
6612 TLI.getValueType(DAG.getDataLayout(), I.getType()),
6613 getValue(I.getArgOperand(0))));
6614 return;
6615 case Intrinsic::addressofreturnaddress:
6616 setValue(&I,
6617 DAG.getNode(ISD::ADDROFRETURNADDR, sdl,
6618 TLI.getValueType(DAG.getDataLayout(), I.getType())));
6619 return;
6620 case Intrinsic::sponentry:
6621 setValue(&I,
6622 DAG.getNode(ISD::SPONENTRY, sdl,
6623 TLI.getValueType(DAG.getDataLayout(), I.getType())));
6624 return;
6625 case Intrinsic::frameaddress:
6626 setValue(&I, DAG.getNode(ISD::FRAMEADDR, sdl,
6627 TLI.getFrameIndexTy(DAG.getDataLayout()),
6628 getValue(I.getArgOperand(0))));
6629 return;
6630 case Intrinsic::read_volatile_register:
6631 case Intrinsic::read_register: {
6632 Value *Reg = I.getArgOperand(0);
6633 SDValue Chain = getRoot();
6635 DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
6636 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6637 Res = DAG.getNode(ISD::READ_REGISTER, sdl,
6638 DAG.getVTList(VT, MVT::Other), Chain, RegName);
6639 setValue(&I, Res);
6640 DAG.setRoot(Res.getValue(1));
6641 return;
6642 }
6643 case Intrinsic::write_register: {
6644 Value *Reg = I.getArgOperand(0);
6645 Value *RegValue = I.getArgOperand(1);
6646 SDValue Chain = getRoot();
6648 DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
6649 DAG.setRoot(DAG.getNode(ISD::WRITE_REGISTER, sdl, MVT::Other, Chain,
6650 RegName, getValue(RegValue)));
6651 return;
6652 }
6653 case Intrinsic::memcpy:
6654 case Intrinsic::memcpy_inline: {
6655 const auto &MCI = cast<MemCpyInst>(I);
6656 SDValue Dst = getValue(I.getArgOperand(0));
6657 SDValue Src = getValue(I.getArgOperand(1));
6658 SDValue Size = getValue(I.getArgOperand(2));
6659 assert((!MCI.isForceInlined() || isa<ConstantSDNode>(Size)) &&
6660 "memcpy_inline needs constant size");
6661 // @llvm.memcpy.inline defines 0 and 1 to both mean no alignment.
6662 Align DstAlign = MCI.getDestAlign().valueOrOne();
6663 Align SrcAlign = MCI.getSourceAlign().valueOrOne();
6664 Align Alignment = std::min(DstAlign, SrcAlign);
6665 bool isVol = MCI.isVolatile();
6666 // FIXME: Support passing different dest/src alignments to the memcpy DAG
6667 // node.
6668 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6669 SDValue MC = DAG.getMemcpy(Root, sdl, Dst, Src, Size, Alignment, isVol,
6670 MCI.isForceInlined(), &I, std::nullopt,
6671 MachinePointerInfo(I.getArgOperand(0)),
6672 MachinePointerInfo(I.getArgOperand(1)),
6673 I.getAAMetadata(), BatchAA);
6674 updateDAGForMaybeTailCall(MC);
6675 return;
6676 }
6677 case Intrinsic::memset:
6678 case Intrinsic::memset_inline: {
6679 const auto &MSII = cast<MemSetInst>(I);
6680 SDValue Dst = getValue(I.getArgOperand(0));
6681 SDValue Value = getValue(I.getArgOperand(1));
6682 SDValue Size = getValue(I.getArgOperand(2));
6683 assert((!MSII.isForceInlined() || isa<ConstantSDNode>(Size)) &&
6684 "memset_inline needs constant size");
6685 // @llvm.memset defines 0 and 1 to both mean no alignment.
6686 Align DstAlign = MSII.getDestAlign().valueOrOne();
6687 bool isVol = MSII.isVolatile();
6688 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6689 SDValue MC = DAG.getMemset(
6690 Root, sdl, Dst, Value, Size, DstAlign, isVol, MSII.isForceInlined(),
6691 &I, MachinePointerInfo(I.getArgOperand(0)), I.getAAMetadata());
6692 updateDAGForMaybeTailCall(MC);
6693 return;
6694 }
6695 case Intrinsic::memmove: {
6696 const auto &MMI = cast<MemMoveInst>(I);
6697 SDValue Op1 = getValue(I.getArgOperand(0));
6698 SDValue Op2 = getValue(I.getArgOperand(1));
6699 SDValue Op3 = getValue(I.getArgOperand(2));
6700 // @llvm.memmove defines 0 and 1 to both mean no alignment.
6701 Align DstAlign = MMI.getDestAlign().valueOrOne();
6702 Align SrcAlign = MMI.getSourceAlign().valueOrOne();
6703 Align Alignment = std::min(DstAlign, SrcAlign);
6704 bool isVol = MMI.isVolatile();
6705 // FIXME: Support passing different dest/src alignments to the memmove DAG
6706 // node.
6707 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6708 SDValue MM = DAG.getMemmove(Root, sdl, Op1, Op2, Op3, Alignment, isVol, &I,
6709 /* OverrideTailCall */ std::nullopt,
6710 MachinePointerInfo(I.getArgOperand(0)),
6711 MachinePointerInfo(I.getArgOperand(1)),
6712 I.getAAMetadata(), BatchAA);
6713 updateDAGForMaybeTailCall(MM);
6714 return;
6715 }
6716 case Intrinsic::memcpy_element_unordered_atomic: {
6717 auto &MI = cast<AnyMemCpyInst>(I);
6718 SDValue Dst = getValue(MI.getRawDest());
6719 SDValue Src = getValue(MI.getRawSource());
6720 SDValue Length = getValue(MI.getLength());
6721
6722 Type *LengthTy = MI.getLength()->getType();
6723 unsigned ElemSz = MI.getElementSizeInBytes();
6724 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6725 SDValue MC =
6726 DAG.getAtomicMemcpy(getRoot(), sdl, Dst, Src, Length, LengthTy, ElemSz,
6727 isTC, MachinePointerInfo(MI.getRawDest()),
6728 MachinePointerInfo(MI.getRawSource()));
6729 updateDAGForMaybeTailCall(MC);
6730 return;
6731 }
6732 case Intrinsic::memmove_element_unordered_atomic: {
6733 auto &MI = cast<AnyMemMoveInst>(I);
6734 SDValue Dst = getValue(MI.getRawDest());
6735 SDValue Src = getValue(MI.getRawSource());
6736 SDValue Length = getValue(MI.getLength());
6737
6738 Type *LengthTy = MI.getLength()->getType();
6739 unsigned ElemSz = MI.getElementSizeInBytes();
6740 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6741 SDValue MC =
6742 DAG.getAtomicMemmove(getRoot(), sdl, Dst, Src, Length, LengthTy, ElemSz,
6743 isTC, MachinePointerInfo(MI.getRawDest()),
6744 MachinePointerInfo(MI.getRawSource()));
6745 updateDAGForMaybeTailCall(MC);
6746 return;
6747 }
6748 case Intrinsic::memset_element_unordered_atomic: {
6749 auto &MI = cast<AnyMemSetInst>(I);
6750 SDValue Dst = getValue(MI.getRawDest());
6751 SDValue Val = getValue(MI.getValue());
6752 SDValue Length = getValue(MI.getLength());
6753
6754 Type *LengthTy = MI.getLength()->getType();
6755 unsigned ElemSz = MI.getElementSizeInBytes();
6756 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6757 SDValue MC =
6758 DAG.getAtomicMemset(getRoot(), sdl, Dst, Val, Length, LengthTy, ElemSz,
6759 isTC, MachinePointerInfo(MI.getRawDest()));
6760 updateDAGForMaybeTailCall(MC);
6761 return;
6762 }
6763 case Intrinsic::call_preallocated_setup: {
6764 const CallBase *PreallocatedCall = FindPreallocatedCall(&I);
6765 SDValue SrcValue = DAG.getSrcValue(PreallocatedCall);
6766 SDValue Res = DAG.getNode(ISD::PREALLOCATED_SETUP, sdl, MVT::Other,
6767 getRoot(), SrcValue);
6768 setValue(&I, Res);
6769 DAG.setRoot(Res);
6770 return;
6771 }
6772 case Intrinsic::call_preallocated_arg: {
6773 const CallBase *PreallocatedCall = FindPreallocatedCall(I.getOperand(0));
6774 SDValue SrcValue = DAG.getSrcValue(PreallocatedCall);
6775 SDValue Ops[3];
6776 Ops[0] = getRoot();
6777 Ops[1] = SrcValue;
6778 Ops[2] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(1)), sdl,
6779 MVT::i32); // arg index
6780 SDValue Res = DAG.getNode(
6782 DAG.getVTList(TLI.getPointerTy(DAG.getDataLayout()), MVT::Other), Ops);
6783 setValue(&I, Res);
6784 DAG.setRoot(Res.getValue(1));
6785 return;
6786 }
6787
6788 case Intrinsic::eh_typeid_for: {
6789 // Find the type id for the given typeinfo.
6790 GlobalValue *GV = ExtractTypeInfo(I.getArgOperand(0));
6791 unsigned TypeID = DAG.getMachineFunction().getTypeIDFor(GV);
6792 Res = DAG.getConstant(TypeID, sdl, MVT::i32);
6793 setValue(&I, Res);
6794 return;
6795 }
6796
6797 case Intrinsic::eh_return_i32:
6798 case Intrinsic::eh_return_i64:
6799 DAG.getMachineFunction().setCallsEHReturn(true);
6800 DAG.setRoot(DAG.getNode(ISD::EH_RETURN, sdl,
6801 MVT::Other,
6803 getValue(I.getArgOperand(0)),
6804 getValue(I.getArgOperand(1))));
6805 return;
6806 case Intrinsic::eh_unwind_init:
6807 DAG.getMachineFunction().setCallsUnwindInit(true);
6808 return;
6809 case Intrinsic::eh_dwarf_cfa:
6810 setValue(&I, DAG.getNode(ISD::EH_DWARF_CFA, sdl,
6811 TLI.getPointerTy(DAG.getDataLayout()),
6812 getValue(I.getArgOperand(0))));
6813 return;
6814 case Intrinsic::eh_sjlj_callsite: {
6815 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(0));
6816 assert(FuncInfo.getCurrentCallSite() == 0 && "Overlapping call sites!");
6817
6818 FuncInfo.setCurrentCallSite(CI->getZExtValue());
6819 return;
6820 }
6821 case Intrinsic::eh_sjlj_functioncontext: {
6822 // Get and store the index of the function context.
6823 MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo();
6824 AllocaInst *FnCtx =
6825 cast<AllocaInst>(I.getArgOperand(0)->stripPointerCasts());
6826 int FI = FuncInfo.StaticAllocaMap[FnCtx];
6828 return;
6829 }
6830 case Intrinsic::eh_sjlj_setjmp: {
6831 SDValue Ops[2];
6832 Ops[0] = getRoot();
6833 Ops[1] = getValue(I.getArgOperand(0));
6834 SDValue Op = DAG.getNode(ISD::EH_SJLJ_SETJMP, sdl,
6835 DAG.getVTList(MVT::i32, MVT::Other), Ops);
6836 setValue(&I, Op.getValue(0));
6837 DAG.setRoot(Op.getValue(1));
6838 return;
6839 }
6840 case Intrinsic::eh_sjlj_longjmp:
6841 DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_LONGJMP, sdl, MVT::Other,
6842 getRoot(), getValue(I.getArgOperand(0))));
6843 return;
6844 case Intrinsic::eh_sjlj_setup_dispatch:
6845 DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_SETUP_DISPATCH, sdl, MVT::Other,
6846 getRoot()));
6847 return;
6848 case Intrinsic::masked_gather:
6849 visitMaskedGather(I);
6850 return;
6851 case Intrinsic::masked_load:
6852 visitMaskedLoad(I);
6853 return;
6854 case Intrinsic::masked_scatter:
6855 visitMaskedScatter(I);
6856 return;
6857 case Intrinsic::masked_store:
6858 visitMaskedStore(I);
6859 return;
6860 case Intrinsic::masked_expandload:
6861 visitMaskedLoad(I, true /* IsExpanding */);
6862 return;
6863 case Intrinsic::masked_compressstore:
6864 visitMaskedStore(I, true /* IsCompressing */);
6865 return;
6866 case Intrinsic::powi:
6867 setValue(&I, ExpandPowI(sdl, getValue(I.getArgOperand(0)),
6868 getValue(I.getArgOperand(1)), DAG));
6869 return;
6870 case Intrinsic::log:
6871 setValue(&I, expandLog(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6872 return;
6873 case Intrinsic::log2:
6874 setValue(&I,
6875 expandLog2(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6876 return;
6877 case Intrinsic::log10:
6878 setValue(&I,
6879 expandLog10(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6880 return;
6881 case Intrinsic::exp:
6882 setValue(&I, expandExp(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6883 return;
6884 case Intrinsic::exp2:
6885 setValue(&I,
6886 expandExp2(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6887 return;
6888 case Intrinsic::pow:
6889 setValue(&I, expandPow(sdl, getValue(I.getArgOperand(0)),
6890 getValue(I.getArgOperand(1)), DAG, TLI, Flags));
6891 return;
6892 case Intrinsic::sqrt:
6893 case Intrinsic::fabs:
6894 case Intrinsic::sin:
6895 case Intrinsic::cos:
6896 case Intrinsic::tan:
6897 case Intrinsic::asin:
6898 case Intrinsic::acos:
6899 case Intrinsic::atan:
6900 case Intrinsic::sinh:
6901 case Intrinsic::cosh:
6902 case Intrinsic::tanh:
6903 case Intrinsic::exp10:
6904 case Intrinsic::floor:
6905 case Intrinsic::ceil:
6906 case Intrinsic::trunc:
6907 case Intrinsic::rint:
6908 case Intrinsic::nearbyint:
6909 case Intrinsic::round:
6910 case Intrinsic::roundeven:
6911 case Intrinsic::canonicalize: {
6912 unsigned Opcode;
6913 // clang-format off
6914 switch (Intrinsic) {
6915 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
6916 case Intrinsic::sqrt: Opcode = ISD::FSQRT; break;
6917 case Intrinsic::fabs: Opcode = ISD::FABS; break;
6918 case Intrinsic::sin: Opcode = ISD::FSIN; break;
6919 case Intrinsic::cos: Opcode = ISD::FCOS; break;
6920 case Intrinsic::tan: Opcode = ISD::FTAN; break;
6921 case Intrinsic::asin: Opcode = ISD::FASIN; break;
6922 case Intrinsic::acos: Opcode = ISD::FACOS; break;
6923 case Intrinsic::atan: Opcode = ISD::FATAN; break;
6924 case Intrinsic::sinh: Opcode = ISD::FSINH; break;
6925 case Intrinsic::cosh: Opcode = ISD::FCOSH; break;
6926 case Intrinsic::tanh: Opcode = ISD::FTANH; break;
6927 case Intrinsic::exp10: Opcode = ISD::FEXP10; break;
6928 case Intrinsic::floor: Opcode = ISD::FFLOOR; break;
6929 case Intrinsic::ceil: Opcode = ISD::FCEIL; break;
6930 case Intrinsic::trunc: Opcode = ISD::FTRUNC; break;
6931 case Intrinsic::rint: Opcode = ISD::FRINT; break;
6932 case Intrinsic::nearbyint: Opcode = ISD::FNEARBYINT; break;
6933 case Intrinsic::round: Opcode = ISD::FROUND; break;
6934 case Intrinsic::roundeven: Opcode = ISD::FROUNDEVEN; break;
6935 case Intrinsic::canonicalize: Opcode = ISD::FCANONICALIZE; break;
6936 }
6937 // clang-format on
6938
6939 setValue(&I, DAG.getNode(Opcode, sdl,
6940 getValue(I.getArgOperand(0)).getValueType(),
6941 getValue(I.getArgOperand(0)), Flags));
6942 return;
6943 }
6944 case Intrinsic::atan2:
6945 setValue(&I, DAG.getNode(ISD::FATAN2, sdl,
6946 getValue(I.getArgOperand(0)).getValueType(),
6947 getValue(I.getArgOperand(0)),
6948 getValue(I.getArgOperand(1)), Flags));
6949 return;
6950 case Intrinsic::lround:
6951 case Intrinsic::llround:
6952 case Intrinsic::lrint:
6953 case Intrinsic::llrint: {
6954 unsigned Opcode;
6955 // clang-format off
6956 switch (Intrinsic) {
6957 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
6958 case Intrinsic::lround: Opcode = ISD::LROUND; break;
6959 case Intrinsic::llround: Opcode = ISD::LLROUND; break;
6960 case Intrinsic::lrint: Opcode = ISD::LRINT; break;
6961 case Intrinsic::llrint: Opcode = ISD::LLRINT; break;
6962 }
6963 // clang-format on
6964
6965 EVT RetVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6966 setValue(&I, DAG.getNode(Opcode, sdl, RetVT,
6967 getValue(I.getArgOperand(0))));
6968 return;
6969 }
6970 case Intrinsic::minnum:
6971 setValue(&I, DAG.getNode(ISD::FMINNUM, sdl,
6972 getValue(I.getArgOperand(0)).getValueType(),
6973 getValue(I.getArgOperand(0)),
6974 getValue(I.getArgOperand(1)), Flags));
6975 return;
6976 case Intrinsic::maxnum:
6977 setValue(&I, DAG.getNode(ISD::FMAXNUM, sdl,
6978 getValue(I.getArgOperand(0)).getValueType(),
6979 getValue(I.getArgOperand(0)),
6980 getValue(I.getArgOperand(1)), Flags));
6981 return;
6982 case Intrinsic::minimum:
6983 setValue(&I, DAG.getNode(ISD::FMINIMUM, sdl,
6984 getValue(I.getArgOperand(0)).getValueType(),
6985 getValue(I.getArgOperand(0)),
6986 getValue(I.getArgOperand(1)), Flags));
6987 return;
6988 case Intrinsic::maximum:
6989 setValue(&I, DAG.getNode(ISD::FMAXIMUM, sdl,
6990 getValue(I.getArgOperand(0)).getValueType(),
6991 getValue(I.getArgOperand(0)),
6992 getValue(I.getArgOperand(1)), Flags));
6993 return;
6994 case Intrinsic::minimumnum:
6995 setValue(&I, DAG.getNode(ISD::FMINIMUMNUM, sdl,
6996 getValue(I.getArgOperand(0)).getValueType(),
6997 getValue(I.getArgOperand(0)),
6998 getValue(I.getArgOperand(1)), Flags));
6999 return;
7000 case Intrinsic::maximumnum:
7001 setValue(&I, DAG.getNode(ISD::FMAXIMUMNUM, sdl,
7002 getValue(I.getArgOperand(0)).getValueType(),
7003 getValue(I.getArgOperand(0)),
7004 getValue(I.getArgOperand(1)), Flags));
7005 return;
7006 case Intrinsic::copysign:
7007 setValue(&I, DAG.getNode(ISD::FCOPYSIGN, sdl,
7008 getValue(I.getArgOperand(0)).getValueType(),
7009 getValue(I.getArgOperand(0)),
7010 getValue(I.getArgOperand(1)), Flags));
7011 return;
7012 case Intrinsic::ldexp:
7013 setValue(&I, DAG.getNode(ISD::FLDEXP, sdl,
7014 getValue(I.getArgOperand(0)).getValueType(),
7015 getValue(I.getArgOperand(0)),
7016 getValue(I.getArgOperand(1)), Flags));
7017 return;
7018 case Intrinsic::modf:
7019 case Intrinsic::sincos:
7020 case Intrinsic::sincospi:
7021 case Intrinsic::frexp: {
7022 unsigned Opcode;
7023 switch (Intrinsic) {
7024 default:
7025 llvm_unreachable("unexpected intrinsic");
7026 case Intrinsic::sincos:
7027 Opcode = ISD::FSINCOS;
7028 break;
7029 case Intrinsic::sincospi:
7030 Opcode = ISD::FSINCOSPI;
7031 break;
7032 case Intrinsic::modf:
7033 Opcode = ISD::FMODF;
7034 break;
7035 case Intrinsic::frexp:
7036 Opcode = ISD::FFREXP;
7037 break;
7038 }
7039 SmallVector<EVT, 2> ValueVTs;
7040 ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);
7041 SDVTList VTs = DAG.getVTList(ValueVTs);
7042 setValue(
7043 &I, DAG.getNode(Opcode, sdl, VTs, getValue(I.getArgOperand(0)), Flags));
7044 return;
7045 }
7046 case Intrinsic::arithmetic_fence: {
7047 setValue(&I, DAG.getNode(ISD::ARITH_FENCE, sdl,
7048 getValue(I.getArgOperand(0)).getValueType(),
7049 getValue(I.getArgOperand(0)), Flags));
7050 return;
7051 }
7052 case Intrinsic::fma:
7053 setValue(&I, DAG.getNode(
7054 ISD::FMA, sdl, getValue(I.getArgOperand(0)).getValueType(),
7055 getValue(I.getArgOperand(0)), getValue(I.getArgOperand(1)),
7056 getValue(I.getArgOperand(2)), Flags));
7057 return;
7058#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
7059 case Intrinsic::INTRINSIC:
7060#include "llvm/IR/ConstrainedOps.def"
7061 visitConstrainedFPIntrinsic(cast<ConstrainedFPIntrinsic>(I));
7062 return;
7063#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID:
7064#include "llvm/IR/VPIntrinsics.def"
7065 visitVectorPredicationIntrinsic(cast<VPIntrinsic>(I));
7066 return;
7067 case Intrinsic::fptrunc_round: {
7068 // Get the last argument, the metadata and convert it to an integer in the
7069 // call
7070 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(1))->getMetadata();
7071 std::optional<RoundingMode> RoundMode =
7072 convertStrToRoundingMode(cast<MDString>(MD)->getString());
7073
7074 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7075
7076 // Propagate fast-math-flags from IR to node(s).
7077 SDNodeFlags Flags;
7078 Flags.copyFMF(*cast<FPMathOperator>(&I));
7079 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
7080
7082 Result = DAG.getNode(
7083 ISD::FPTRUNC_ROUND, sdl, VT, getValue(I.getArgOperand(0)),
7084 DAG.getTargetConstant((int)*RoundMode, sdl, MVT::i32));
7085 setValue(&I, Result);
7086
7087 return;
7088 }
7089 case Intrinsic::fmuladd: {
7090 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7091 if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
7092 TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), VT)) {
7093 setValue(&I, DAG.getNode(ISD::FMA, sdl,
7094 getValue(I.getArgOperand(0)).getValueType(),
7095 getValue(I.getArgOperand(0)),
7096 getValue(I.getArgOperand(1)),
7097 getValue(I.getArgOperand(2)), Flags));
7098 } else if (TLI.isOperationLegalOrCustom(ISD::FMULADD, VT)) {
7099 // TODO: Support splitting the vector.
7100 setValue(&I, DAG.getNode(ISD::FMULADD, sdl,
7101 getValue(I.getArgOperand(0)).getValueType(),
7102 getValue(I.getArgOperand(0)),
7103 getValue(I.getArgOperand(1)),
7104 getValue(I.getArgOperand(2)), Flags));
7105 } else {
7106 // TODO: Intrinsic calls should have fast-math-flags.
7107 SDValue Mul = DAG.getNode(
7108 ISD::FMUL, sdl, getValue(I.getArgOperand(0)).getValueType(),
7109 getValue(I.getArgOperand(0)), getValue(I.getArgOperand(1)), Flags);
7110 SDValue Add = DAG.getNode(ISD::FADD, sdl,
7111 getValue(I.getArgOperand(0)).getValueType(),
7112 Mul, getValue(I.getArgOperand(2)), Flags);
7113 setValue(&I, Add);
7114 }
7115 return;
7116 }
7117 case Intrinsic::convert_to_fp16:
7118 setValue(&I, DAG.getNode(ISD::BITCAST, sdl, MVT::i16,
7119 DAG.getNode(ISD::FP_ROUND, sdl, MVT::f16,
7120 getValue(I.getArgOperand(0)),
7121 DAG.getTargetConstant(0, sdl,
7122 MVT::i32))));
7123 return;
7124 case Intrinsic::convert_from_fp16:
7125 setValue(&I, DAG.getNode(ISD::FP_EXTEND, sdl,
7126 TLI.getValueType(DAG.getDataLayout(), I.getType()),
7127 DAG.getNode(ISD::BITCAST, sdl, MVT::f16,
7128 getValue(I.getArgOperand(0)))));
7129 return;
7130 case Intrinsic::fptosi_sat: {
7131 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7132 setValue(&I, DAG.getNode(ISD::FP_TO_SINT_SAT, sdl, VT,
7133 getValue(I.getArgOperand(0)),
7134 DAG.getValueType(VT.getScalarType())));
7135 return;
7136 }
7137 case Intrinsic::fptoui_sat: {
7138 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7139 setValue(&I, DAG.getNode(ISD::FP_TO_UINT_SAT, sdl, VT,
7140 getValue(I.getArgOperand(0)),
7141 DAG.getValueType(VT.getScalarType())));
7142 return;
7143 }
7144 case Intrinsic::set_rounding:
7145 Res = DAG.getNode(ISD::SET_ROUNDING, sdl, MVT::Other,
7146 {getRoot(), getValue(I.getArgOperand(0))});
7147 setValue(&I, Res);
7148 DAG.setRoot(Res.getValue(0));
7149 return;
7150 case Intrinsic::is_fpclass: {
7151 const DataLayout DLayout = DAG.getDataLayout();
7152 EVT DestVT = TLI.getValueType(DLayout, I.getType());
7153 EVT ArgVT = TLI.getValueType(DLayout, I.getArgOperand(0)->getType());
7154 FPClassTest Test = static_cast<FPClassTest>(
7155 cast<ConstantInt>(I.getArgOperand(1))->getZExtValue());
7156 MachineFunction &MF = DAG.getMachineFunction();
7157 const Function &F = MF.getFunction();
7158 SDValue Op = getValue(I.getArgOperand(0));
7159 SDNodeFlags Flags;
7160 Flags.setNoFPExcept(
7161 !F.getAttributes().hasFnAttr(llvm::Attribute::StrictFP));
7162 // If ISD::IS_FPCLASS should be expanded, do it right now, because the
7163 // expansion can use illegal types. Making expansion early allows
7164 // legalizing these types prior to selection.
7165 if (!TLI.isOperationLegal(ISD::IS_FPCLASS, ArgVT) &&
7166 !TLI.isOperationCustom(ISD::IS_FPCLASS, ArgVT)) {
7167 SDValue Result = TLI.expandIS_FPCLASS(DestVT, Op, Test, Flags, sdl, DAG);
7168 setValue(&I, Result);
7169 return;
7170 }
7171
7172 SDValue Check = DAG.getTargetConstant(Test, sdl, MVT::i32);
7173 SDValue V = DAG.getNode(ISD::IS_FPCLASS, sdl, DestVT, {Op, Check}, Flags);
7174 setValue(&I, V);
7175 return;
7176 }
7177 case Intrinsic::get_fpenv: {
7178 const DataLayout DLayout = DAG.getDataLayout();
7179 EVT EnvVT = TLI.getValueType(DLayout, I.getType());
7180 Align TempAlign = DAG.getEVTAlign(EnvVT);
7181 SDValue Chain = getRoot();
7182 // Use GET_FPENV if it is legal or custom. Otherwise use memory-based node
7183 // and temporary storage in stack.
7184 if (TLI.isOperationLegalOrCustom(ISD::GET_FPENV, EnvVT)) {
7185 Res = DAG.getNode(
7186 ISD::GET_FPENV, sdl,
7187 DAG.getVTList(TLI.getValueType(DAG.getDataLayout(), I.getType()),
7188 MVT::Other),
7189 Chain);
7190 } else {
7191 SDValue Temp = DAG.CreateStackTemporary(EnvVT, TempAlign.value());
7192 int SPFI = cast<FrameIndexSDNode>(Temp.getNode())->getIndex();
7193 auto MPI =
7194 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI);
7195 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
7197 TempAlign);
7198 Chain = DAG.getGetFPEnv(Chain, sdl, Temp, EnvVT, MMO);
7199 Res = DAG.getLoad(EnvVT, sdl, Chain, Temp, MPI);
7200 }
7201 setValue(&I, Res);
7202 DAG.setRoot(Res.getValue(1));
7203 return;
7204 }
7205 case Intrinsic::set_fpenv: {
7206 const DataLayout DLayout = DAG.getDataLayout();
7207 SDValue Env = getValue(I.getArgOperand(0));
7208 EVT EnvVT = Env.getValueType();
7209 Align TempAlign = DAG.getEVTAlign(EnvVT);
7210 SDValue Chain = getRoot();
7211 // If SET_FPENV is custom or legal, use it. Otherwise use loading
7212 // environment from memory.
7213 if (TLI.isOperationLegalOrCustom(ISD::SET_FPENV, EnvVT)) {
7214 Chain = DAG.getNode(ISD::SET_FPENV, sdl, MVT::Other, Chain, Env);
7215 } else {
7216 // Allocate space in stack, copy environment bits into it and use this
7217 // memory in SET_FPENV_MEM.
7218 SDValue Temp = DAG.CreateStackTemporary(EnvVT, TempAlign.value());
7219 int SPFI = cast<FrameIndexSDNode>(Temp.getNode())->getIndex();
7220 auto MPI =
7221 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI);
7222 Chain = DAG.getStore(Chain, sdl, Env, Temp, MPI, TempAlign,
7224 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
7226 TempAlign);
7227 Chain = DAG.getSetFPEnv(Chain, sdl, Temp, EnvVT, MMO);
7228 }
7229 DAG.setRoot(Chain);
7230 return;
7231 }
7232 case Intrinsic::reset_fpenv:
7233 DAG.setRoot(DAG.getNode(ISD::RESET_FPENV, sdl, MVT::Other, getRoot()));
7234 return;
7235 case Intrinsic::get_fpmode:
7236 Res = DAG.getNode(
7237 ISD::GET_FPMODE, sdl,
7238 DAG.getVTList(TLI.getValueType(DAG.getDataLayout(), I.getType()),
7239 MVT::Other),
7240 DAG.getRoot());
7241 setValue(&I, Res);
7242 DAG.setRoot(Res.getValue(1));
7243 return;
7244 case Intrinsic::set_fpmode:
7245 Res = DAG.getNode(ISD::SET_FPMODE, sdl, MVT::Other, {DAG.getRoot()},
7246 getValue(I.getArgOperand(0)));
7247 DAG.setRoot(Res);
7248 return;
7249 case Intrinsic::reset_fpmode: {
7250 Res = DAG.getNode(ISD::RESET_FPMODE, sdl, MVT::Other, getRoot());
7251 DAG.setRoot(Res);
7252 return;
7253 }
7254 case Intrinsic::pcmarker: {
7255 SDValue Tmp = getValue(I.getArgOperand(0));
7256 DAG.setRoot(DAG.getNode(ISD::PCMARKER, sdl, MVT::Other, getRoot(), Tmp));
7257 return;
7258 }
7259 case Intrinsic::readcyclecounter: {
7260 SDValue Op = getRoot();
7261 Res = DAG.getNode(ISD::READCYCLECOUNTER, sdl,
7262 DAG.getVTList(MVT::i64, MVT::Other), Op);
7263 setValue(&I, Res);
7264 DAG.setRoot(Res.getValue(1));
7265 return;
7266 }
7267 case Intrinsic::readsteadycounter: {
7268 SDValue Op = getRoot();
7269 Res = DAG.getNode(ISD::READSTEADYCOUNTER, sdl,
7270 DAG.getVTList(MVT::i64, MVT::Other), Op);
7271 setValue(&I, Res);
7272 DAG.setRoot(Res.getValue(1));
7273 return;
7274 }
7275 case Intrinsic::bitreverse:
7276 setValue(&I, DAG.getNode(ISD::BITREVERSE, sdl,
7277 getValue(I.getArgOperand(0)).getValueType(),
7278 getValue(I.getArgOperand(0))));
7279 return;
7280 case Intrinsic::bswap:
7281 setValue(&I, DAG.getNode(ISD::BSWAP, sdl,
7282 getValue(I.getArgOperand(0)).getValueType(),
7283 getValue(I.getArgOperand(0))));
7284 return;
7285 case Intrinsic::cttz: {
7286 SDValue Arg = getValue(I.getArgOperand(0));
7287 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
7288 EVT Ty = Arg.getValueType();
7289 setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTTZ : ISD::CTTZ_ZERO_UNDEF,
7290 sdl, Ty, Arg));
7291 return;
7292 }
7293 case Intrinsic::ctlz: {
7294 SDValue Arg = getValue(I.getArgOperand(0));
7295 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
7296 EVT Ty = Arg.getValueType();
7297 setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTLZ : ISD::CTLZ_ZERO_UNDEF,
7298 sdl, Ty, Arg));
7299 return;
7300 }
7301 case Intrinsic::ctpop: {
7302 SDValue Arg = getValue(I.getArgOperand(0));
7303 EVT Ty = Arg.getValueType();
7304 setValue(&I, DAG.getNode(ISD::CTPOP, sdl, Ty, Arg));
7305 return;
7306 }
7307 case Intrinsic::fshl:
7308 case Intrinsic::fshr: {
7309 bool IsFSHL = Intrinsic == Intrinsic::fshl;
7310 SDValue X = getValue(I.getArgOperand(0));
7311 SDValue Y = getValue(I.getArgOperand(1));
7312 SDValue Z = getValue(I.getArgOperand(2));
7313 EVT VT = X.getValueType();
7314
7315 if (X == Y) {
7316 auto RotateOpcode = IsFSHL ? ISD::ROTL : ISD::ROTR;
7317 setValue(&I, DAG.getNode(RotateOpcode, sdl, VT, X, Z));
7318 } else {
7319 auto FunnelOpcode = IsFSHL ? ISD::FSHL : ISD::FSHR;
7320 setValue(&I, DAG.getNode(FunnelOpcode, sdl, VT, X, Y, Z));
7321 }
7322 return;
7323 }
7324 case Intrinsic::clmul: {
7325 SDValue X = getValue(I.getArgOperand(0));
7326 SDValue Y = getValue(I.getArgOperand(1));
7327 setValue(&I, DAG.getNode(ISD::CLMUL, sdl, X.getValueType(), X, Y));
7328 return;
7329 }
7330 case Intrinsic::sadd_sat: {
7331 SDValue Op1 = getValue(I.getArgOperand(0));
7332 SDValue Op2 = getValue(I.getArgOperand(1));
7333 setValue(&I, DAG.getNode(ISD::SADDSAT, sdl, Op1.getValueType(), Op1, Op2));
7334 return;
7335 }
7336 case Intrinsic::uadd_sat: {
7337 SDValue Op1 = getValue(I.getArgOperand(0));
7338 SDValue Op2 = getValue(I.getArgOperand(1));
7339 setValue(&I, DAG.getNode(ISD::UADDSAT, sdl, Op1.getValueType(), Op1, Op2));
7340 return;
7341 }
7342 case Intrinsic::ssub_sat: {
7343 SDValue Op1 = getValue(I.getArgOperand(0));
7344 SDValue Op2 = getValue(I.getArgOperand(1));
7345 setValue(&I, DAG.getNode(ISD::SSUBSAT, sdl, Op1.getValueType(), Op1, Op2));
7346 return;
7347 }
7348 case Intrinsic::usub_sat: {
7349 SDValue Op1 = getValue(I.getArgOperand(0));
7350 SDValue Op2 = getValue(I.getArgOperand(1));
7351 setValue(&I, DAG.getNode(ISD::USUBSAT, sdl, Op1.getValueType(), Op1, Op2));
7352 return;
7353 }
7354 case Intrinsic::sshl_sat:
7355 case Intrinsic::ushl_sat: {
7356 SDValue Op1 = getValue(I.getArgOperand(0));
7357 SDValue Op2 = getValue(I.getArgOperand(1));
7358
7359 EVT ShiftTy = DAG.getTargetLoweringInfo().getShiftAmountTy(
7360 Op1.getValueType(), DAG.getDataLayout());
7361
7362 // Coerce the shift amount to the right type if we can. This exposes the
7363 // truncate or zext to optimization early.
7364 if (!I.getType()->isVectorTy() && Op2.getValueType() != ShiftTy) {
7365 assert(ShiftTy.getSizeInBits() >=
7367 "Unexpected shift type");
7368 Op2 = DAG.getZExtOrTrunc(Op2, getCurSDLoc(), ShiftTy);
7369 }
7370
7371 unsigned Opc =
7372 Intrinsic == Intrinsic::sshl_sat ? ISD::SSHLSAT : ISD::USHLSAT;
7373 setValue(&I, DAG.getNode(Opc, sdl, Op1.getValueType(), Op1, Op2));
7374 return;
7375 }
7376 case Intrinsic::smul_fix:
7377 case Intrinsic::umul_fix:
7378 case Intrinsic::smul_fix_sat:
7379 case Intrinsic::umul_fix_sat: {
7380 SDValue Op1 = getValue(I.getArgOperand(0));
7381 SDValue Op2 = getValue(I.getArgOperand(1));
7382 SDValue Op3 = getValue(I.getArgOperand(2));
7383 setValue(&I, DAG.getNode(FixedPointIntrinsicToOpcode(Intrinsic), sdl,
7384 Op1.getValueType(), Op1, Op2, Op3));
7385 return;
7386 }
7387 case Intrinsic::sdiv_fix:
7388 case Intrinsic::udiv_fix:
7389 case Intrinsic::sdiv_fix_sat:
7390 case Intrinsic::udiv_fix_sat: {
7391 SDValue Op1 = getValue(I.getArgOperand(0));
7392 SDValue Op2 = getValue(I.getArgOperand(1));
7393 SDValue Op3 = getValue(I.getArgOperand(2));
7395 Op1, Op2, Op3, DAG, TLI));
7396 return;
7397 }
7398 case Intrinsic::smax: {
7399 SDValue Op1 = getValue(I.getArgOperand(0));
7400 SDValue Op2 = getValue(I.getArgOperand(1));
7401 setValue(&I, DAG.getNode(ISD::SMAX, sdl, Op1.getValueType(), Op1, Op2));
7402 return;
7403 }
7404 case Intrinsic::smin: {
7405 SDValue Op1 = getValue(I.getArgOperand(0));
7406 SDValue Op2 = getValue(I.getArgOperand(1));
7407 setValue(&I, DAG.getNode(ISD::SMIN, sdl, Op1.getValueType(), Op1, Op2));
7408 return;
7409 }
7410 case Intrinsic::umax: {
7411 SDValue Op1 = getValue(I.getArgOperand(0));
7412 SDValue Op2 = getValue(I.getArgOperand(1));
7413 setValue(&I, DAG.getNode(ISD::UMAX, sdl, Op1.getValueType(), Op1, Op2));
7414 return;
7415 }
7416 case Intrinsic::umin: {
7417 SDValue Op1 = getValue(I.getArgOperand(0));
7418 SDValue Op2 = getValue(I.getArgOperand(1));
7419 setValue(&I, DAG.getNode(ISD::UMIN, sdl, Op1.getValueType(), Op1, Op2));
7420 return;
7421 }
7422 case Intrinsic::abs: {
7423 // TODO: Preserve "int min is poison" arg in SDAG?
7424 SDValue Op1 = getValue(I.getArgOperand(0));
7425 setValue(&I, DAG.getNode(ISD::ABS, sdl, Op1.getValueType(), Op1));
7426 return;
7427 }
7428 case Intrinsic::scmp: {
7429 SDValue Op1 = getValue(I.getArgOperand(0));
7430 SDValue Op2 = getValue(I.getArgOperand(1));
7431 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7432 setValue(&I, DAG.getNode(ISD::SCMP, sdl, DestVT, Op1, Op2));
7433 break;
7434 }
7435 case Intrinsic::ucmp: {
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::UCMP, sdl, DestVT, Op1, Op2));
7440 break;
7441 }
7442 case Intrinsic::stackaddress:
7443 case Intrinsic::stacksave: {
7444 unsigned SDOpcode = Intrinsic == Intrinsic::stackaddress ? ISD::STACKADDRESS
7446 SDValue Op = getRoot();
7447 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7448 Res = DAG.getNode(SDOpcode, sdl, DAG.getVTList(VT, MVT::Other), Op);
7449 setValue(&I, Res);
7450 DAG.setRoot(Res.getValue(1));
7451 return;
7452 }
7453 case Intrinsic::stackrestore:
7454 Res = getValue(I.getArgOperand(0));
7455 DAG.setRoot(DAG.getNode(ISD::STACKRESTORE, sdl, MVT::Other, getRoot(), Res));
7456 return;
7457 case Intrinsic::get_dynamic_area_offset: {
7458 SDValue Op = getRoot();
7459 EVT ResTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
7460 Res = DAG.getNode(ISD::GET_DYNAMIC_AREA_OFFSET, sdl, DAG.getVTList(ResTy),
7461 Op);
7462 DAG.setRoot(Op);
7463 setValue(&I, Res);
7464 return;
7465 }
7466 case Intrinsic::stackguard: {
7467 MachineFunction &MF = DAG.getMachineFunction();
7468 const Module &M = *MF.getFunction().getParent();
7469 EVT PtrTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
7470 SDValue Chain = getRoot();
7471 if (TLI.useLoadStackGuardNode(M)) {
7472 Res = getLoadStackGuard(DAG, sdl, Chain);
7473 Res = DAG.getPtrExtOrTrunc(Res, sdl, PtrTy);
7474 } else {
7475 const Value *Global = TLI.getSDagStackGuard(M);
7476 if (!Global) {
7477 LLVMContext &Ctx = *DAG.getContext();
7478 Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
7479 setValue(&I, DAG.getPOISON(PtrTy));
7480 return;
7481 }
7482
7483 Align Align = DAG.getDataLayout().getPrefTypeAlign(Global->getType());
7484 Res = DAG.getLoad(PtrTy, sdl, Chain, getValue(Global),
7485 MachinePointerInfo(Global, 0), Align,
7487 }
7488 if (TLI.useStackGuardXorFP())
7489 Res = TLI.emitStackGuardXorFP(DAG, Res, sdl);
7490 DAG.setRoot(Chain);
7491 setValue(&I, Res);
7492 return;
7493 }
7494 case Intrinsic::stackprotector: {
7495 // Emit code into the DAG to store the stack guard onto the stack.
7496 MachineFunction &MF = DAG.getMachineFunction();
7497 MachineFrameInfo &MFI = MF.getFrameInfo();
7498 const Module &M = *MF.getFunction().getParent();
7499 SDValue Src, Chain = getRoot();
7500
7501 if (TLI.useLoadStackGuardNode(M))
7502 Src = getLoadStackGuard(DAG, sdl, Chain);
7503 else
7504 Src = getValue(I.getArgOperand(0)); // The guard's value.
7505
7506 AllocaInst *Slot = cast<AllocaInst>(I.getArgOperand(1));
7507
7508 int FI = FuncInfo.StaticAllocaMap[Slot];
7509 MFI.setStackProtectorIndex(FI);
7510 EVT PtrTy = TLI.getFrameIndexTy(DAG.getDataLayout());
7511
7512 SDValue FIN = DAG.getFrameIndex(FI, PtrTy);
7513
7514 // Store the stack protector onto the stack.
7515 Res = DAG.getStore(
7516 Chain, sdl, Src, FIN,
7517 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI),
7518 MaybeAlign(), MachineMemOperand::MOVolatile);
7519 setValue(&I, Res);
7520 DAG.setRoot(Res);
7521 return;
7522 }
7523 case Intrinsic::objectsize:
7524 llvm_unreachable("llvm.objectsize.* should have been lowered already");
7525
7526 case Intrinsic::is_constant:
7527 llvm_unreachable("llvm.is.constant.* should have been lowered already");
7528
7529 case Intrinsic::annotation:
7530 case Intrinsic::ptr_annotation:
7531 case Intrinsic::launder_invariant_group:
7532 case Intrinsic::strip_invariant_group:
7533 // Drop the intrinsic, but forward the value
7534 setValue(&I, getValue(I.getOperand(0)));
7535 return;
7536
7537 case Intrinsic::type_test:
7538 case Intrinsic::public_type_test:
7539 setValue(&I, getValue(ConstantInt::getTrue(I.getType())));
7540 return;
7541
7542 case Intrinsic::assume:
7543 case Intrinsic::experimental_noalias_scope_decl:
7544 case Intrinsic::var_annotation:
7545 case Intrinsic::sideeffect:
7546 // Discard annotate attributes, noalias scope declarations, assumptions, and
7547 // artificial side-effects.
7548 return;
7549
7550 case Intrinsic::codeview_annotation: {
7551 // Emit a label associated with this metadata.
7552 MachineFunction &MF = DAG.getMachineFunction();
7553 MCSymbol *Label = MF.getContext().createTempSymbol("annotation", true);
7554 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(0))->getMetadata();
7555 MF.addCodeViewAnnotation(Label, cast<MDNode>(MD));
7556 Res = DAG.getLabelNode(ISD::ANNOTATION_LABEL, sdl, getRoot(), Label);
7557 DAG.setRoot(Res);
7558 return;
7559 }
7560
7561 case Intrinsic::init_trampoline: {
7562 const Function *F = cast<Function>(I.getArgOperand(1)->stripPointerCasts());
7563
7564 SDValue Ops[6];
7565 Ops[0] = getRoot();
7566 Ops[1] = getValue(I.getArgOperand(0));
7567 Ops[2] = getValue(I.getArgOperand(1));
7568 Ops[3] = getValue(I.getArgOperand(2));
7569 Ops[4] = DAG.getSrcValue(I.getArgOperand(0));
7570 Ops[5] = DAG.getSrcValue(F);
7571
7572 Res = DAG.getNode(ISD::INIT_TRAMPOLINE, sdl, MVT::Other, Ops);
7573
7574 DAG.setRoot(Res);
7575 return;
7576 }
7577 case Intrinsic::adjust_trampoline:
7578 setValue(&I, DAG.getNode(ISD::ADJUST_TRAMPOLINE, sdl,
7579 TLI.getPointerTy(DAG.getDataLayout()),
7580 getValue(I.getArgOperand(0))));
7581 return;
7582 case Intrinsic::gcroot: {
7583 assert(DAG.getMachineFunction().getFunction().hasGC() &&
7584 "only valid in functions with gc specified, enforced by Verifier");
7585 assert(GFI && "implied by previous");
7586 const Value *Alloca = I.getArgOperand(0)->stripPointerCasts();
7587 const Constant *TypeMap = cast<Constant>(I.getArgOperand(1));
7588
7589 FrameIndexSDNode *FI = cast<FrameIndexSDNode>(getValue(Alloca).getNode());
7590 GFI->addStackRoot(FI->getIndex(), TypeMap);
7591 return;
7592 }
7593 case Intrinsic::gcread:
7594 case Intrinsic::gcwrite:
7595 llvm_unreachable("GC failed to lower gcread/gcwrite intrinsics!");
7596 case Intrinsic::get_rounding:
7597 Res = DAG.getNode(ISD::GET_ROUNDING, sdl, {MVT::i32, MVT::Other}, getRoot());
7598 setValue(&I, Res);
7599 DAG.setRoot(Res.getValue(1));
7600 return;
7601
7602 case Intrinsic::expect:
7603 case Intrinsic::expect_with_probability:
7604 // Just replace __builtin_expect(exp, c) and
7605 // __builtin_expect_with_probability(exp, c, p) with EXP.
7606 setValue(&I, getValue(I.getArgOperand(0)));
7607 return;
7608
7609 case Intrinsic::ubsantrap:
7610 case Intrinsic::debugtrap:
7611 case Intrinsic::trap: {
7612 StringRef TrapFuncName =
7613 I.getAttributes().getFnAttr("trap-func-name").getValueAsString();
7614 if (TrapFuncName.empty()) {
7615 switch (Intrinsic) {
7616 case Intrinsic::trap:
7617 DAG.setRoot(DAG.getNode(ISD::TRAP, sdl, MVT::Other, getRoot()));
7618 break;
7619 case Intrinsic::debugtrap:
7620 DAG.setRoot(DAG.getNode(ISD::DEBUGTRAP, sdl, MVT::Other, getRoot()));
7621 break;
7622 case Intrinsic::ubsantrap:
7623 DAG.setRoot(DAG.getNode(
7624 ISD::UBSANTRAP, sdl, MVT::Other, getRoot(),
7625 DAG.getTargetConstant(
7626 cast<ConstantInt>(I.getArgOperand(0))->getZExtValue(), sdl,
7627 MVT::i32)));
7628 break;
7629 default: llvm_unreachable("unknown trap intrinsic");
7630 }
7631 DAG.addNoMergeSiteInfo(DAG.getRoot().getNode(),
7632 I.hasFnAttr(Attribute::NoMerge));
7633 return;
7634 }
7636 if (Intrinsic == Intrinsic::ubsantrap) {
7637 Value *Arg = I.getArgOperand(0);
7638 Args.emplace_back(Arg, getValue(Arg));
7639 }
7640
7641 TargetLowering::CallLoweringInfo CLI(DAG);
7642 CLI.setDebugLoc(sdl).setChain(getRoot()).setLibCallee(
7643 CallingConv::C, I.getType(),
7644 DAG.getExternalSymbol(TrapFuncName.data(),
7645 TLI.getPointerTy(DAG.getDataLayout())),
7646 std::move(Args));
7647 CLI.NoMerge = I.hasFnAttr(Attribute::NoMerge);
7648 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
7649 DAG.setRoot(Result.second);
7650 return;
7651 }
7652
7653 case Intrinsic::allow_runtime_check:
7654 case Intrinsic::allow_ubsan_check:
7655 setValue(&I, getValue(ConstantInt::getTrue(I.getType())));
7656 return;
7657
7658 case Intrinsic::uadd_with_overflow:
7659 case Intrinsic::sadd_with_overflow:
7660 case Intrinsic::usub_with_overflow:
7661 case Intrinsic::ssub_with_overflow:
7662 case Intrinsic::umul_with_overflow:
7663 case Intrinsic::smul_with_overflow: {
7665 switch (Intrinsic) {
7666 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
7667 case Intrinsic::uadd_with_overflow: Op = ISD::UADDO; break;
7668 case Intrinsic::sadd_with_overflow: Op = ISD::SADDO; break;
7669 case Intrinsic::usub_with_overflow: Op = ISD::USUBO; break;
7670 case Intrinsic::ssub_with_overflow: Op = ISD::SSUBO; break;
7671 case Intrinsic::umul_with_overflow: Op = ISD::UMULO; break;
7672 case Intrinsic::smul_with_overflow: Op = ISD::SMULO; break;
7673 }
7674 SDValue Op1 = getValue(I.getArgOperand(0));
7675 SDValue Op2 = getValue(I.getArgOperand(1));
7676
7677 EVT ResultVT = Op1.getValueType();
7678 EVT OverflowVT = ResultVT.changeElementType(*Context, MVT::i1);
7679
7680 SDVTList VTs = DAG.getVTList(ResultVT, OverflowVT);
7681 setValue(&I, DAG.getNode(Op, sdl, VTs, Op1, Op2));
7682 return;
7683 }
7684 case Intrinsic::prefetch: {
7685 SDValue Ops[5];
7686 unsigned rw = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
7688 Ops[0] = DAG.getRoot();
7689 Ops[1] = getValue(I.getArgOperand(0));
7690 Ops[2] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(1)), sdl,
7691 MVT::i32);
7692 Ops[3] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(2)), sdl,
7693 MVT::i32);
7694 Ops[4] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(3)), sdl,
7695 MVT::i32);
7696 SDValue Result = DAG.getMemIntrinsicNode(
7697 ISD::PREFETCH, sdl, DAG.getVTList(MVT::Other), Ops,
7698 EVT::getIntegerVT(*Context, 8), MachinePointerInfo(I.getArgOperand(0)),
7699 /* align */ std::nullopt, Flags);
7700
7701 // Chain the prefetch in parallel with any pending loads, to stay out of
7702 // the way of later optimizations.
7703 PendingLoads.push_back(Result);
7704 Result = getRoot();
7705 DAG.setRoot(Result);
7706 return;
7707 }
7708 case Intrinsic::lifetime_start:
7709 case Intrinsic::lifetime_end: {
7710 bool IsStart = (Intrinsic == Intrinsic::lifetime_start);
7711 // Stack coloring is not enabled in O0, discard region information.
7712 if (TM.getOptLevel() == CodeGenOptLevel::None)
7713 return;
7714
7715 const AllocaInst *LifetimeObject = dyn_cast<AllocaInst>(I.getArgOperand(0));
7716 if (!LifetimeObject)
7717 return;
7718
7719 // First check that the Alloca is static, otherwise it won't have a
7720 // valid frame index.
7721 auto SI = FuncInfo.StaticAllocaMap.find(LifetimeObject);
7722 if (SI == FuncInfo.StaticAllocaMap.end())
7723 return;
7724
7725 const int FrameIndex = SI->second;
7726 Res = DAG.getLifetimeNode(IsStart, sdl, getRoot(), FrameIndex);
7727 DAG.setRoot(Res);
7728 return;
7729 }
7730 case Intrinsic::pseudoprobe: {
7731 auto Guid = cast<ConstantInt>(I.getArgOperand(0))->getZExtValue();
7732 auto Index = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
7733 auto Attr = cast<ConstantInt>(I.getArgOperand(2))->getZExtValue();
7734 Res = DAG.getPseudoProbeNode(sdl, getRoot(), Guid, Index, Attr);
7735 DAG.setRoot(Res);
7736 return;
7737 }
7738 case Intrinsic::invariant_start:
7739 // Discard region information.
7740 setValue(&I,
7741 DAG.getUNDEF(TLI.getValueType(DAG.getDataLayout(), I.getType())));
7742 return;
7743 case Intrinsic::invariant_end:
7744 // Discard region information.
7745 return;
7746 case Intrinsic::clear_cache: {
7747 SDValue InputChain = DAG.getRoot();
7748 SDValue StartVal = getValue(I.getArgOperand(0));
7749 SDValue EndVal = getValue(I.getArgOperand(1));
7750 Res = DAG.getNode(ISD::CLEAR_CACHE, sdl, DAG.getVTList(MVT::Other),
7751 {InputChain, StartVal, EndVal});
7752 setValue(&I, Res);
7753 DAG.setRoot(Res);
7754 return;
7755 }
7756 case Intrinsic::donothing:
7757 case Intrinsic::seh_try_begin:
7758 case Intrinsic::seh_scope_begin:
7759 case Intrinsic::seh_try_end:
7760 case Intrinsic::seh_scope_end:
7761 // ignore
7762 return;
7763 case Intrinsic::experimental_stackmap:
7764 visitStackmap(I);
7765 return;
7766 case Intrinsic::experimental_patchpoint_void:
7767 case Intrinsic::experimental_patchpoint:
7768 visitPatchpoint(I);
7769 return;
7770 case Intrinsic::experimental_gc_statepoint:
7772 return;
7773 case Intrinsic::experimental_gc_result:
7774 visitGCResult(cast<GCResultInst>(I));
7775 return;
7776 case Intrinsic::experimental_gc_relocate:
7777 visitGCRelocate(cast<GCRelocateInst>(I));
7778 return;
7779 case Intrinsic::instrprof_cover:
7780 llvm_unreachable("instrprof failed to lower a cover");
7781 case Intrinsic::instrprof_increment:
7782 llvm_unreachable("instrprof failed to lower an increment");
7783 case Intrinsic::instrprof_timestamp:
7784 llvm_unreachable("instrprof failed to lower a timestamp");
7785 case Intrinsic::instrprof_value_profile:
7786 llvm_unreachable("instrprof failed to lower a value profiling call");
7787 case Intrinsic::instrprof_mcdc_parameters:
7788 llvm_unreachable("instrprof failed to lower mcdc parameters");
7789 case Intrinsic::instrprof_mcdc_tvbitmap_update:
7790 llvm_unreachable("instrprof failed to lower an mcdc tvbitmap update");
7791 case Intrinsic::localescape: {
7792 MachineFunction &MF = DAG.getMachineFunction();
7793 const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo();
7794
7795 // Directly emit some LOCAL_ESCAPE machine instrs. Label assignment emission
7796 // is the same on all targets.
7797 for (unsigned Idx = 0, E = I.arg_size(); Idx < E; ++Idx) {
7798 Value *Arg = I.getArgOperand(Idx)->stripPointerCasts();
7799 if (isa<ConstantPointerNull>(Arg))
7800 continue; // Skip null pointers. They represent a hole in index space.
7801 AllocaInst *Slot = cast<AllocaInst>(Arg);
7802 assert(FuncInfo.StaticAllocaMap.count(Slot) &&
7803 "can only escape static allocas");
7804 int FI = FuncInfo.StaticAllocaMap[Slot];
7805 MCSymbol *FrameAllocSym = MF.getContext().getOrCreateFrameAllocSymbol(
7807 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, dl,
7808 TII->get(TargetOpcode::LOCAL_ESCAPE))
7809 .addSym(FrameAllocSym)
7810 .addFrameIndex(FI);
7811 }
7812
7813 return;
7814 }
7815
7816 case Intrinsic::localrecover: {
7817 // i8* @llvm.localrecover(i8* %fn, i8* %fp, i32 %idx)
7818 MachineFunction &MF = DAG.getMachineFunction();
7819
7820 // Get the symbol that defines the frame offset.
7821 auto *Fn = cast<Function>(I.getArgOperand(0)->stripPointerCasts());
7822 auto *Idx = cast<ConstantInt>(I.getArgOperand(2));
7823 unsigned IdxVal =
7824 unsigned(Idx->getLimitedValue(std::numeric_limits<int>::max()));
7825 MCSymbol *FrameAllocSym = MF.getContext().getOrCreateFrameAllocSymbol(
7827
7828 Value *FP = I.getArgOperand(1);
7829 SDValue FPVal = getValue(FP);
7830 EVT PtrVT = FPVal.getValueType();
7831
7832 // Create a MCSymbol for the label to avoid any target lowering
7833 // that would make this PC relative.
7834 SDValue OffsetSym = DAG.getMCSymbol(FrameAllocSym, PtrVT);
7835 SDValue OffsetVal =
7836 DAG.getNode(ISD::LOCAL_RECOVER, sdl, PtrVT, OffsetSym);
7837
7838 // Add the offset to the FP.
7839 SDValue Add = DAG.getMemBasePlusOffset(FPVal, OffsetVal, sdl);
7840 setValue(&I, Add);
7841
7842 return;
7843 }
7844
7845 case Intrinsic::fake_use: {
7846 Value *V = I.getArgOperand(0);
7847 SDValue Ops[2];
7848 // For Values not declared or previously used in this basic block, the
7849 // NodeMap will not have an entry, and `getValue` will assert if V has no
7850 // valid register value.
7851 auto FakeUseValue = [&]() -> SDValue {
7852 SDValue &N = NodeMap[V];
7853 if (N.getNode())
7854 return N;
7855
7856 // If there's a virtual register allocated and initialized for this
7857 // value, use it.
7858 if (SDValue copyFromReg = getCopyFromRegs(V, V->getType()))
7859 return copyFromReg;
7860 // FIXME: Do we want to preserve constants? It seems pointless.
7861 if (isa<Constant>(V))
7862 return getValue(V);
7863 return SDValue();
7864 }();
7865 if (!FakeUseValue || FakeUseValue.isUndef())
7866 return;
7867 Ops[0] = getRoot();
7868 Ops[1] = FakeUseValue;
7869 // Also, do not translate a fake use with an undef operand, or any other
7870 // empty SDValues.
7871 if (!Ops[1] || Ops[1].isUndef())
7872 return;
7873 DAG.setRoot(DAG.getNode(ISD::FAKE_USE, sdl, MVT::Other, Ops));
7874 return;
7875 }
7876
7877 case Intrinsic::reloc_none: {
7878 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(0))->getMetadata();
7879 StringRef SymbolName = cast<MDString>(MD)->getString();
7880 SDValue Ops[2] = {
7881 getRoot(),
7882 DAG.getTargetExternalSymbol(
7883 SymbolName.data(), TLI.getProgramPointerTy(DAG.getDataLayout()))};
7884 DAG.setRoot(DAG.getNode(ISD::RELOC_NONE, sdl, MVT::Other, Ops));
7885 return;
7886 }
7887
7888 case Intrinsic::eh_exceptionpointer:
7889 case Intrinsic::eh_exceptioncode: {
7890 // Get the exception pointer vreg, copy from it, and resize it to fit.
7891 const auto *CPI = cast<CatchPadInst>(I.getArgOperand(0));
7892 MVT PtrVT = TLI.getPointerTy(DAG.getDataLayout());
7893 const TargetRegisterClass *PtrRC = TLI.getRegClassFor(PtrVT);
7894 Register VReg = FuncInfo.getCatchPadExceptionPointerVReg(CPI, PtrRC);
7895 SDValue N = DAG.getCopyFromReg(DAG.getEntryNode(), sdl, VReg, PtrVT);
7896 if (Intrinsic == Intrinsic::eh_exceptioncode)
7897 N = DAG.getZExtOrTrunc(N, sdl, MVT::i32);
7898 setValue(&I, N);
7899 return;
7900 }
7901 case Intrinsic::xray_customevent: {
7902 // Here we want to make sure that the intrinsic behaves as if it has a
7903 // specific calling convention.
7904 const auto &Triple = DAG.getTarget().getTargetTriple();
7905 if (!Triple.isAArch64(64) && Triple.getArch() != Triple::x86_64)
7906 return;
7907
7909
7910 // We want to say that we always want the arguments in registers.
7911 SDValue LogEntryVal = getValue(I.getArgOperand(0));
7912 SDValue StrSizeVal = getValue(I.getArgOperand(1));
7913 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
7914 SDValue Chain = getRoot();
7915 Ops.push_back(LogEntryVal);
7916 Ops.push_back(StrSizeVal);
7917 Ops.push_back(Chain);
7918
7919 // We need to enforce the calling convention for the callsite, so that
7920 // argument ordering is enforced correctly, and that register allocation can
7921 // see that some registers may be assumed clobbered and have to preserve
7922 // them across calls to the intrinsic.
7923 MachineSDNode *MN = DAG.getMachineNode(TargetOpcode::PATCHABLE_EVENT_CALL,
7924 sdl, NodeTys, Ops);
7925 SDValue patchableNode = SDValue(MN, 0);
7926 DAG.setRoot(patchableNode);
7927 setValue(&I, patchableNode);
7928 return;
7929 }
7930 case Intrinsic::xray_typedevent: {
7931 // Here we want to make sure that the intrinsic behaves as if it has a
7932 // specific calling convention.
7933 const auto &Triple = DAG.getTarget().getTargetTriple();
7934 if (!Triple.isAArch64(64) && Triple.getArch() != Triple::x86_64)
7935 return;
7936
7938
7939 // We want to say that we always want the arguments in registers.
7940 // It's unclear to me how manipulating the selection DAG here forces callers
7941 // to provide arguments in registers instead of on the stack.
7942 SDValue LogTypeId = getValue(I.getArgOperand(0));
7943 SDValue LogEntryVal = getValue(I.getArgOperand(1));
7944 SDValue StrSizeVal = getValue(I.getArgOperand(2));
7945 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
7946 SDValue Chain = getRoot();
7947 Ops.push_back(LogTypeId);
7948 Ops.push_back(LogEntryVal);
7949 Ops.push_back(StrSizeVal);
7950 Ops.push_back(Chain);
7951
7952 // We need to enforce the calling convention for the callsite, so that
7953 // argument ordering is enforced correctly, and that register allocation can
7954 // see that some registers may be assumed clobbered and have to preserve
7955 // them across calls to the intrinsic.
7956 MachineSDNode *MN = DAG.getMachineNode(
7957 TargetOpcode::PATCHABLE_TYPED_EVENT_CALL, sdl, NodeTys, Ops);
7958 SDValue patchableNode = SDValue(MN, 0);
7959 DAG.setRoot(patchableNode);
7960 setValue(&I, patchableNode);
7961 return;
7962 }
7963 case Intrinsic::experimental_deoptimize:
7965 return;
7966 case Intrinsic::stepvector:
7967 visitStepVector(I);
7968 return;
7969 case Intrinsic::vector_reduce_fadd:
7970 case Intrinsic::vector_reduce_fmul:
7971 case Intrinsic::vector_reduce_add:
7972 case Intrinsic::vector_reduce_mul:
7973 case Intrinsic::vector_reduce_and:
7974 case Intrinsic::vector_reduce_or:
7975 case Intrinsic::vector_reduce_xor:
7976 case Intrinsic::vector_reduce_smax:
7977 case Intrinsic::vector_reduce_smin:
7978 case Intrinsic::vector_reduce_umax:
7979 case Intrinsic::vector_reduce_umin:
7980 case Intrinsic::vector_reduce_fmax:
7981 case Intrinsic::vector_reduce_fmin:
7982 case Intrinsic::vector_reduce_fmaximum:
7983 case Intrinsic::vector_reduce_fminimum:
7984 visitVectorReduce(I, Intrinsic);
7985 return;
7986
7987 case Intrinsic::icall_branch_funnel: {
7989 Ops.push_back(getValue(I.getArgOperand(0)));
7990
7991 int64_t Offset;
7993 I.getArgOperand(1), Offset, DAG.getDataLayout()));
7994 if (!Base)
7996 "llvm.icall.branch.funnel operand must be a GlobalValue");
7997 Ops.push_back(DAG.getTargetGlobalAddress(Base, sdl, MVT::i64, 0));
7998
7999 struct BranchFunnelTarget {
8000 int64_t Offset;
8002 };
8004
8005 for (unsigned Op = 1, N = I.arg_size(); Op != N; Op += 2) {
8007 I.getArgOperand(Op), Offset, DAG.getDataLayout()));
8008 if (ElemBase != Base)
8009 report_fatal_error("all llvm.icall.branch.funnel operands must refer "
8010 "to the same GlobalValue");
8011
8012 SDValue Val = getValue(I.getArgOperand(Op + 1));
8013 auto *GA = dyn_cast<GlobalAddressSDNode>(Val);
8014 if (!GA)
8016 "llvm.icall.branch.funnel operand must be a GlobalValue");
8017 Targets.push_back({Offset, DAG.getTargetGlobalAddress(
8018 GA->getGlobal(), sdl, Val.getValueType(),
8019 GA->getOffset())});
8020 }
8021 llvm::sort(Targets,
8022 [](const BranchFunnelTarget &T1, const BranchFunnelTarget &T2) {
8023 return T1.Offset < T2.Offset;
8024 });
8025
8026 for (auto &T : Targets) {
8027 Ops.push_back(DAG.getTargetConstant(T.Offset, sdl, MVT::i32));
8028 Ops.push_back(T.Target);
8029 }
8030
8031 Ops.push_back(DAG.getRoot()); // Chain
8032 SDValue N(DAG.getMachineNode(TargetOpcode::ICALL_BRANCH_FUNNEL, sdl,
8033 MVT::Other, Ops),
8034 0);
8035 DAG.setRoot(N);
8036 setValue(&I, N);
8037 HasTailCall = true;
8038 return;
8039 }
8040
8041 case Intrinsic::wasm_landingpad_index:
8042 // Information this intrinsic contained has been transferred to
8043 // MachineFunction in SelectionDAGISel::PrepareEHLandingPad. We can safely
8044 // delete it now.
8045 return;
8046
8047 case Intrinsic::aarch64_settag:
8048 case Intrinsic::aarch64_settag_zero: {
8049 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
8050 bool ZeroMemory = Intrinsic == Intrinsic::aarch64_settag_zero;
8052 DAG, sdl, getRoot(), getValue(I.getArgOperand(0)),
8053 getValue(I.getArgOperand(1)), MachinePointerInfo(I.getArgOperand(0)),
8054 ZeroMemory);
8055 DAG.setRoot(Val);
8056 setValue(&I, Val);
8057 return;
8058 }
8059 case Intrinsic::amdgcn_cs_chain: {
8060 // At this point we don't care if it's amdgpu_cs_chain or
8061 // amdgpu_cs_chain_preserve.
8063
8064 Type *RetTy = I.getType();
8065 assert(RetTy->isVoidTy() && "Should not return");
8066
8067 SDValue Callee = getValue(I.getOperand(0));
8068
8069 // We only have 2 actual args: one for the SGPRs and one for the VGPRs.
8070 // We'll also tack the value of the EXEC mask at the end.
8072 Args.reserve(3);
8073
8074 for (unsigned Idx : {2, 3, 1}) {
8075 TargetLowering::ArgListEntry Arg(getValue(I.getOperand(Idx)),
8076 I.getOperand(Idx)->getType());
8077 Arg.setAttributes(&I, Idx);
8078 Args.push_back(Arg);
8079 }
8080
8081 assert(Args[0].IsInReg && "SGPR args should be marked inreg");
8082 assert(!Args[1].IsInReg && "VGPR args should not be marked inreg");
8083 Args[2].IsInReg = true; // EXEC should be inreg
8084
8085 // Forward the flags and any additional arguments.
8086 for (unsigned Idx = 4; Idx < I.arg_size(); ++Idx) {
8087 TargetLowering::ArgListEntry Arg(getValue(I.getOperand(Idx)),
8088 I.getOperand(Idx)->getType());
8089 Arg.setAttributes(&I, Idx);
8090 Args.push_back(Arg);
8091 }
8092
8093 TargetLowering::CallLoweringInfo CLI(DAG);
8094 CLI.setDebugLoc(getCurSDLoc())
8095 .setChain(getRoot())
8096 .setCallee(CC, RetTy, Callee, std::move(Args))
8097 .setNoReturn(true)
8098 .setTailCall(true)
8099 .setConvergent(I.isConvergent());
8100 CLI.CB = &I;
8101 std::pair<SDValue, SDValue> Result =
8102 lowerInvokable(CLI, /*EHPadBB*/ nullptr);
8103 (void)Result;
8104 assert(!Result.first.getNode() && !Result.second.getNode() &&
8105 "Should've lowered as tail call");
8106
8107 HasTailCall = true;
8108 return;
8109 }
8110 case Intrinsic::amdgcn_call_whole_wave: {
8112 bool isTailCall = I.isTailCall();
8113
8114 // The first argument is the callee. Skip it when assembling the call args.
8115 for (unsigned Idx = 1; Idx < I.arg_size(); ++Idx) {
8116 TargetLowering::ArgListEntry Arg(getValue(I.getArgOperand(Idx)),
8117 I.getArgOperand(Idx)->getType());
8118 Arg.setAttributes(&I, Idx);
8119
8120 // If we have an explicit sret argument that is an Instruction, (i.e., it
8121 // might point to function-local memory), we can't meaningfully tail-call.
8122 if (Arg.IsSRet && isa<Instruction>(I.getArgOperand(Idx)))
8123 isTailCall = false;
8124
8125 Args.push_back(Arg);
8126 }
8127
8128 SDValue ConvControlToken;
8129 if (auto Bundle = I.getOperandBundle(LLVMContext::OB_convergencectrl)) {
8130 auto *Token = Bundle->Inputs[0].get();
8131 ConvControlToken = getValue(Token);
8132 }
8133
8134 TargetLowering::CallLoweringInfo CLI(DAG);
8135 CLI.setDebugLoc(getCurSDLoc())
8136 .setChain(getRoot())
8137 .setCallee(CallingConv::AMDGPU_Gfx_WholeWave, I.getType(),
8138 getValue(I.getArgOperand(0)), std::move(Args))
8139 .setTailCall(isTailCall && canTailCall(I))
8140 .setIsPreallocated(
8141 I.countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0)
8142 .setConvergent(I.isConvergent())
8143 .setConvergenceControlToken(ConvControlToken);
8144 CLI.CB = &I;
8145
8146 std::pair<SDValue, SDValue> Result =
8147 lowerInvokable(CLI, /*EHPadBB=*/nullptr);
8148
8149 if (Result.first.getNode())
8150 setValue(&I, Result.first);
8151 return;
8152 }
8153 case Intrinsic::ptrmask: {
8154 SDValue Ptr = getValue(I.getOperand(0));
8155 SDValue Mask = getValue(I.getOperand(1));
8156
8157 // On arm64_32, pointers are 32 bits when stored in memory, but
8158 // zero-extended to 64 bits when in registers. Thus the mask is 32 bits to
8159 // match the index type, but the pointer is 64 bits, so the mask must be
8160 // zero-extended up to 64 bits to match the pointer.
8161 EVT PtrVT =
8162 TLI.getValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
8163 EVT MemVT =
8164 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
8165 assert(PtrVT == Ptr.getValueType());
8166 if (Mask.getValueType().getFixedSizeInBits() < MemVT.getFixedSizeInBits()) {
8167 // For AMDGPU buffer descriptors the mask is 48 bits, but the pointer is
8168 // 128-bit, so we have to pad the mask with ones for unused bits.
8169 auto HighOnes = DAG.getNode(
8170 ISD::SHL, sdl, PtrVT, DAG.getAllOnesConstant(sdl, PtrVT),
8171 DAG.getShiftAmountConstant(Mask.getValueType().getFixedSizeInBits(),
8172 PtrVT, sdl));
8173 Mask = DAG.getNode(ISD::OR, sdl, PtrVT,
8174 DAG.getZExtOrTrunc(Mask, sdl, PtrVT), HighOnes);
8175 } else if (Mask.getValueType() != PtrVT)
8176 Mask = DAG.getPtrExtOrTrunc(Mask, sdl, PtrVT);
8177
8178 assert(Mask.getValueType() == PtrVT);
8179 setValue(&I, DAG.getNode(ISD::AND, sdl, PtrVT, Ptr, Mask));
8180 return;
8181 }
8182 case Intrinsic::threadlocal_address: {
8183 setValue(&I, getValue(I.getOperand(0)));
8184 return;
8185 }
8186 case Intrinsic::get_active_lane_mask: {
8187 EVT CCVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8188 SDValue Index = getValue(I.getOperand(0));
8189 SDValue TripCount = getValue(I.getOperand(1));
8190 EVT ElementVT = Index.getValueType();
8191
8192 if (!TLI.shouldExpandGetActiveLaneMask(CCVT, ElementVT)) {
8193 setValue(&I, DAG.getNode(ISD::GET_ACTIVE_LANE_MASK, sdl, CCVT, Index,
8194 TripCount));
8195 return;
8196 }
8197
8198 EVT VecTy = EVT::getVectorVT(*DAG.getContext(), ElementVT,
8199 CCVT.getVectorElementCount());
8200
8201 SDValue VectorIndex = DAG.getSplat(VecTy, sdl, Index);
8202 SDValue VectorTripCount = DAG.getSplat(VecTy, sdl, TripCount);
8203 SDValue VectorStep = DAG.getStepVector(sdl, VecTy);
8204 SDValue VectorInduction = DAG.getNode(
8205 ISD::UADDSAT, sdl, VecTy, VectorIndex, VectorStep);
8206 SDValue SetCC = DAG.getSetCC(sdl, CCVT, VectorInduction,
8207 VectorTripCount, ISD::CondCode::SETULT);
8208 setValue(&I, SetCC);
8209 return;
8210 }
8211 case Intrinsic::experimental_get_vector_length: {
8212 assert(cast<ConstantInt>(I.getOperand(1))->getSExtValue() > 0 &&
8213 "Expected positive VF");
8214 unsigned VF = cast<ConstantInt>(I.getOperand(1))->getZExtValue();
8215 bool IsScalable = cast<ConstantInt>(I.getOperand(2))->isOne();
8216
8217 SDValue Count = getValue(I.getOperand(0));
8218 EVT CountVT = Count.getValueType();
8219
8220 if (!TLI.shouldExpandGetVectorLength(CountVT, VF, IsScalable)) {
8221 visitTargetIntrinsic(I, Intrinsic);
8222 return;
8223 }
8224
8225 // Expand to a umin between the trip count and the maximum elements the type
8226 // can hold.
8227 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8228
8229 // Extend the trip count to at least the result VT.
8230 if (CountVT.bitsLT(VT)) {
8231 Count = DAG.getNode(ISD::ZERO_EXTEND, sdl, VT, Count);
8232 CountVT = VT;
8233 }
8234
8235 SDValue MaxEVL = DAG.getElementCount(sdl, CountVT,
8236 ElementCount::get(VF, IsScalable));
8237
8238 SDValue UMin = DAG.getNode(ISD::UMIN, sdl, CountVT, Count, MaxEVL);
8239 // Clip to the result type if needed.
8240 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, sdl, VT, UMin);
8241
8242 setValue(&I, Trunc);
8243 return;
8244 }
8245 case Intrinsic::vector_partial_reduce_add: {
8246 SDValue Acc = getValue(I.getOperand(0));
8247 SDValue Input = getValue(I.getOperand(1));
8248 setValue(&I,
8249 DAG.getNode(ISD::PARTIAL_REDUCE_UMLA, sdl, Acc.getValueType(), Acc,
8250 Input, DAG.getConstant(1, sdl, Input.getValueType())));
8251 return;
8252 }
8253 case Intrinsic::vector_partial_reduce_fadd: {
8254 SDValue Acc = getValue(I.getOperand(0));
8255 SDValue Input = getValue(I.getOperand(1));
8256 setValue(&I, DAG.getNode(
8257 ISD::PARTIAL_REDUCE_FMLA, sdl, Acc.getValueType(), Acc,
8258 Input, DAG.getConstantFP(1.0, sdl, Input.getValueType())));
8259 return;
8260 }
8261 case Intrinsic::experimental_cttz_elts: {
8262 auto DL = getCurSDLoc();
8263 SDValue Op = getValue(I.getOperand(0));
8264 EVT OpVT = Op.getValueType();
8265
8266 if (!TLI.shouldExpandCttzElements(OpVT)) {
8267 visitTargetIntrinsic(I, Intrinsic);
8268 return;
8269 }
8270
8271 if (OpVT.getScalarType() != MVT::i1) {
8272 // Compare the input vector elements to zero & use to count trailing zeros
8273 SDValue AllZero = DAG.getConstant(0, DL, OpVT);
8274 OpVT = EVT::getVectorVT(*DAG.getContext(), MVT::i1,
8275 OpVT.getVectorElementCount());
8276 Op = DAG.getSetCC(DL, OpVT, Op, AllZero, ISD::SETNE);
8277 }
8278
8279 // If the zero-is-poison flag is set, we can assume the upper limit
8280 // of the result is VF-1.
8281 bool ZeroIsPoison =
8282 !cast<ConstantSDNode>(getValue(I.getOperand(1)))->isZero();
8283 ConstantRange VScaleRange(1, true); // Dummy value.
8284 if (isa<ScalableVectorType>(I.getOperand(0)->getType()))
8285 VScaleRange = getVScaleRange(I.getCaller(), 64);
8286 unsigned EltWidth = TLI.getBitWidthForCttzElements(
8287 I.getType(), OpVT.getVectorElementCount(), ZeroIsPoison, &VScaleRange);
8288
8289 MVT NewEltTy = MVT::getIntegerVT(EltWidth);
8290
8291 // Create the new vector type & get the vector length
8292 EVT NewVT = EVT::getVectorVT(*DAG.getContext(), NewEltTy,
8293 OpVT.getVectorElementCount());
8294
8295 SDValue VL =
8296 DAG.getElementCount(DL, NewEltTy, OpVT.getVectorElementCount());
8297
8298 SDValue StepVec = DAG.getStepVector(DL, NewVT);
8299 SDValue SplatVL = DAG.getSplat(NewVT, DL, VL);
8300 SDValue StepVL = DAG.getNode(ISD::SUB, DL, NewVT, SplatVL, StepVec);
8301 SDValue Ext = DAG.getNode(ISD::SIGN_EXTEND, DL, NewVT, Op);
8302 SDValue And = DAG.getNode(ISD::AND, DL, NewVT, StepVL, Ext);
8303 SDValue Max = DAG.getNode(ISD::VECREDUCE_UMAX, DL, NewEltTy, And);
8304 SDValue Sub = DAG.getNode(ISD::SUB, DL, NewEltTy, VL, Max);
8305
8306 EVT RetTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
8307 SDValue Ret = DAG.getZExtOrTrunc(Sub, DL, RetTy);
8308
8309 setValue(&I, Ret);
8310 return;
8311 }
8312 case Intrinsic::vector_insert: {
8313 SDValue Vec = getValue(I.getOperand(0));
8314 SDValue SubVec = getValue(I.getOperand(1));
8315 SDValue Index = getValue(I.getOperand(2));
8316
8317 // The intrinsic's index type is i64, but the SDNode requires an index type
8318 // suitable for the target. Convert the index as required.
8319 MVT VectorIdxTy = TLI.getVectorIdxTy(DAG.getDataLayout());
8320 if (Index.getValueType() != VectorIdxTy)
8321 Index = DAG.getVectorIdxConstant(Index->getAsZExtVal(), sdl);
8322
8323 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8324 setValue(&I, DAG.getNode(ISD::INSERT_SUBVECTOR, sdl, ResultVT, Vec, SubVec,
8325 Index));
8326 return;
8327 }
8328 case Intrinsic::vector_extract: {
8329 SDValue Vec = getValue(I.getOperand(0));
8330 SDValue Index = getValue(I.getOperand(1));
8331 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8332
8333 // The intrinsic's index type is i64, but the SDNode requires an index type
8334 // suitable for the target. Convert the index as required.
8335 MVT VectorIdxTy = TLI.getVectorIdxTy(DAG.getDataLayout());
8336 if (Index.getValueType() != VectorIdxTy)
8337 Index = DAG.getVectorIdxConstant(Index->getAsZExtVal(), sdl);
8338
8339 setValue(&I,
8340 DAG.getNode(ISD::EXTRACT_SUBVECTOR, sdl, ResultVT, Vec, Index));
8341 return;
8342 }
8343 case Intrinsic::experimental_vector_match: {
8344 SDValue Op1 = getValue(I.getOperand(0));
8345 SDValue Op2 = getValue(I.getOperand(1));
8346 SDValue Mask = getValue(I.getOperand(2));
8347 EVT Op1VT = Op1.getValueType();
8348 EVT Op2VT = Op2.getValueType();
8349 EVT ResVT = Mask.getValueType();
8350 unsigned SearchSize = Op2VT.getVectorNumElements();
8351
8352 // If the target has native support for this vector match operation, lower
8353 // the intrinsic untouched; otherwise, expand it below.
8354 if (!TLI.shouldExpandVectorMatch(Op1VT, SearchSize)) {
8355 visitTargetIntrinsic(I, Intrinsic);
8356 return;
8357 }
8358
8359 SDValue Ret = DAG.getConstant(0, sdl, ResVT);
8360
8361 for (unsigned i = 0; i < SearchSize; ++i) {
8362 SDValue Op2Elem = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, sdl,
8363 Op2VT.getVectorElementType(), Op2,
8364 DAG.getVectorIdxConstant(i, sdl));
8365 SDValue Splat = DAG.getNode(ISD::SPLAT_VECTOR, sdl, Op1VT, Op2Elem);
8366 SDValue Cmp = DAG.getSetCC(sdl, ResVT, Op1, Splat, ISD::SETEQ);
8367 Ret = DAG.getNode(ISD::OR, sdl, ResVT, Ret, Cmp);
8368 }
8369
8370 setValue(&I, DAG.getNode(ISD::AND, sdl, ResVT, Ret, Mask));
8371 return;
8372 }
8373 case Intrinsic::vector_reverse:
8374 visitVectorReverse(I);
8375 return;
8376 case Intrinsic::vector_splice_left:
8377 case Intrinsic::vector_splice_right:
8378 visitVectorSplice(I);
8379 return;
8380 case Intrinsic::callbr_landingpad:
8381 visitCallBrLandingPad(I);
8382 return;
8383 case Intrinsic::vector_interleave2:
8384 visitVectorInterleave(I, 2);
8385 return;
8386 case Intrinsic::vector_interleave3:
8387 visitVectorInterleave(I, 3);
8388 return;
8389 case Intrinsic::vector_interleave4:
8390 visitVectorInterleave(I, 4);
8391 return;
8392 case Intrinsic::vector_interleave5:
8393 visitVectorInterleave(I, 5);
8394 return;
8395 case Intrinsic::vector_interleave6:
8396 visitVectorInterleave(I, 6);
8397 return;
8398 case Intrinsic::vector_interleave7:
8399 visitVectorInterleave(I, 7);
8400 return;
8401 case Intrinsic::vector_interleave8:
8402 visitVectorInterleave(I, 8);
8403 return;
8404 case Intrinsic::vector_deinterleave2:
8405 visitVectorDeinterleave(I, 2);
8406 return;
8407 case Intrinsic::vector_deinterleave3:
8408 visitVectorDeinterleave(I, 3);
8409 return;
8410 case Intrinsic::vector_deinterleave4:
8411 visitVectorDeinterleave(I, 4);
8412 return;
8413 case Intrinsic::vector_deinterleave5:
8414 visitVectorDeinterleave(I, 5);
8415 return;
8416 case Intrinsic::vector_deinterleave6:
8417 visitVectorDeinterleave(I, 6);
8418 return;
8419 case Intrinsic::vector_deinterleave7:
8420 visitVectorDeinterleave(I, 7);
8421 return;
8422 case Intrinsic::vector_deinterleave8:
8423 visitVectorDeinterleave(I, 8);
8424 return;
8425 case Intrinsic::experimental_vector_compress:
8426 setValue(&I, DAG.getNode(ISD::VECTOR_COMPRESS, sdl,
8427 getValue(I.getArgOperand(0)).getValueType(),
8428 getValue(I.getArgOperand(0)),
8429 getValue(I.getArgOperand(1)),
8430 getValue(I.getArgOperand(2)), Flags));
8431 return;
8432 case Intrinsic::experimental_convergence_anchor:
8433 case Intrinsic::experimental_convergence_entry:
8434 case Intrinsic::experimental_convergence_loop:
8435 visitConvergenceControl(I, Intrinsic);
8436 return;
8437 case Intrinsic::experimental_vector_histogram_add: {
8438 visitVectorHistogram(I, Intrinsic);
8439 return;
8440 }
8441 case Intrinsic::experimental_vector_extract_last_active: {
8442 visitVectorExtractLastActive(I, Intrinsic);
8443 return;
8444 }
8445 case Intrinsic::loop_dependence_war_mask:
8446 setValue(&I,
8448 EVT::getEVT(I.getType()), getValue(I.getOperand(0)),
8449 getValue(I.getOperand(1)), getValue(I.getOperand(2)),
8450 DAG.getConstant(0, sdl, MVT::i64)));
8451 return;
8452 case Intrinsic::loop_dependence_raw_mask:
8453 setValue(&I,
8455 EVT::getEVT(I.getType()), getValue(I.getOperand(0)),
8456 getValue(I.getOperand(1)), getValue(I.getOperand(2)),
8457 DAG.getConstant(0, sdl, MVT::i64)));
8458 return;
8459 }
8460}
8461
8462void SelectionDAGBuilder::pushFPOpOutChain(SDValue Result,
8464 assert(Result.getNode()->getNumValues() == 2);
8465 SDValue OutChain = Result.getValue(1);
8466 assert(OutChain.getValueType() == MVT::Other);
8467
8468 // Instead of updating the root immediately, push the produced chain to the
8469 // appropriate list, deferring the update until the root is requested. In this
8470 // case, the nodes from the lists are chained using TokenFactor, indicating
8471 // that the operations are independent.
8472 //
8473 // In particular, the root is updated before any call that might access the
8474 // floating-point environment, except for constrained intrinsics.
8475 switch (EB) {
8478 PendingConstrainedFP.push_back(OutChain);
8479 break;
8481 PendingConstrainedFPStrict.push_back(OutChain);
8482 break;
8483 }
8484}
8485
8486void SelectionDAGBuilder::visitConstrainedFPIntrinsic(
8487 const ConstrainedFPIntrinsic &FPI) {
8488 SDLoc sdl = getCurSDLoc();
8489
8490 // We do not need to serialize constrained FP intrinsics against
8491 // each other or against (nonvolatile) loads, so they can be
8492 // chained like loads.
8494 SDValue Chain = getFPOperationRoot(EB);
8496 Opers.push_back(Chain);
8497 for (unsigned I = 0, E = FPI.getNonMetadataArgCount(); I != E; ++I)
8498 Opers.push_back(getValue(FPI.getArgOperand(I)));
8499
8500 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8501 EVT VT = TLI.getValueType(DAG.getDataLayout(), FPI.getType());
8502 SDVTList VTs = DAG.getVTList(VT, MVT::Other);
8503
8504 SDNodeFlags Flags;
8506 Flags.setNoFPExcept(true);
8507
8508 if (auto *FPOp = dyn_cast<FPMathOperator>(&FPI))
8509 Flags.copyFMF(*FPOp);
8510
8511 unsigned Opcode;
8512 switch (FPI.getIntrinsicID()) {
8513 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
8514#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
8515 case Intrinsic::INTRINSIC: \
8516 Opcode = ISD::STRICT_##DAGN; \
8517 break;
8518#include "llvm/IR/ConstrainedOps.def"
8519 case Intrinsic::experimental_constrained_fmuladd: {
8520 Opcode = ISD::STRICT_FMA;
8521 // Break fmuladd into fmul and fadd.
8522 if (TM.Options.AllowFPOpFusion == FPOpFusion::Strict ||
8523 !TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), VT)) {
8524 Opers.pop_back();
8525 SDValue Mul = DAG.getNode(ISD::STRICT_FMUL, sdl, VTs, Opers, Flags);
8526 pushFPOpOutChain(Mul, EB);
8527 Opcode = ISD::STRICT_FADD;
8528 Opers.clear();
8529 Opers.push_back(Mul.getValue(1));
8530 Opers.push_back(Mul.getValue(0));
8531 Opers.push_back(getValue(FPI.getArgOperand(2)));
8532 }
8533 break;
8534 }
8535 }
8536
8537 // A few strict DAG nodes carry additional operands that are not
8538 // set up by the default code above.
8539 switch (Opcode) {
8540 default: break;
8542 Opers.push_back(
8543 DAG.getTargetConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout())));
8544 break;
8545 case ISD::STRICT_FSETCC:
8546 case ISD::STRICT_FSETCCS: {
8547 auto *FPCmp = dyn_cast<ConstrainedFPCmpIntrinsic>(&FPI);
8548 ISD::CondCode Condition = getFCmpCondCode(FPCmp->getPredicate());
8549 if (TM.Options.NoNaNsFPMath)
8550 Condition = getFCmpCodeWithoutNaN(Condition);
8551 Opers.push_back(DAG.getCondCode(Condition));
8552 break;
8553 }
8554 }
8555
8556 SDValue Result = DAG.getNode(Opcode, sdl, VTs, Opers, Flags);
8557 pushFPOpOutChain(Result, EB);
8558
8559 SDValue FPResult = Result.getValue(0);
8560 setValue(&FPI, FPResult);
8561}
8562
8563static unsigned getISDForVPIntrinsic(const VPIntrinsic &VPIntrin) {
8564 std::optional<unsigned> ResOPC;
8565 switch (VPIntrin.getIntrinsicID()) {
8566 case Intrinsic::vp_ctlz: {
8567 bool IsZeroUndef = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8568 ResOPC = IsZeroUndef ? ISD::VP_CTLZ_ZERO_UNDEF : ISD::VP_CTLZ;
8569 break;
8570 }
8571 case Intrinsic::vp_cttz: {
8572 bool IsZeroUndef = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8573 ResOPC = IsZeroUndef ? ISD::VP_CTTZ_ZERO_UNDEF : ISD::VP_CTTZ;
8574 break;
8575 }
8576 case Intrinsic::vp_cttz_elts: {
8577 bool IsZeroPoison = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8578 ResOPC = IsZeroPoison ? ISD::VP_CTTZ_ELTS_ZERO_UNDEF : ISD::VP_CTTZ_ELTS;
8579 break;
8580 }
8581#define HELPER_MAP_VPID_TO_VPSD(VPID, VPSD) \
8582 case Intrinsic::VPID: \
8583 ResOPC = ISD::VPSD; \
8584 break;
8585#include "llvm/IR/VPIntrinsics.def"
8586 }
8587
8588 if (!ResOPC)
8590 "Inconsistency: no SDNode available for this VPIntrinsic!");
8591
8592 if (*ResOPC == ISD::VP_REDUCE_SEQ_FADD ||
8593 *ResOPC == ISD::VP_REDUCE_SEQ_FMUL) {
8594 if (VPIntrin.getFastMathFlags().allowReassoc())
8595 return *ResOPC == ISD::VP_REDUCE_SEQ_FADD ? ISD::VP_REDUCE_FADD
8596 : ISD::VP_REDUCE_FMUL;
8597 }
8598
8599 return *ResOPC;
8600}
8601
8602void SelectionDAGBuilder::visitVPLoad(
8603 const VPIntrinsic &VPIntrin, EVT VT,
8604 const SmallVectorImpl<SDValue> &OpValues) {
8605 SDLoc DL = getCurSDLoc();
8606 Value *PtrOperand = VPIntrin.getArgOperand(0);
8607 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8608 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8609 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8610 SDValue LD;
8611 // Do not serialize variable-length loads of constant memory with
8612 // anything.
8613 if (!Alignment)
8614 Alignment = DAG.getEVTAlign(VT);
8615 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8616 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8617 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8618 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8619 MachineMemOperand::Flags MMOFlags =
8620 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8621 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8622 MachinePointerInfo(PtrOperand), MMOFlags,
8623 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo, Ranges);
8624 LD = DAG.getLoadVP(VT, DL, InChain, OpValues[0], OpValues[1], OpValues[2],
8625 MMO, false /*IsExpanding */);
8626 if (AddToChain)
8627 PendingLoads.push_back(LD.getValue(1));
8628 setValue(&VPIntrin, LD);
8629}
8630
8631void SelectionDAGBuilder::visitVPLoadFF(
8632 const VPIntrinsic &VPIntrin, EVT VT, EVT EVLVT,
8633 const SmallVectorImpl<SDValue> &OpValues) {
8634 assert(OpValues.size() == 3 && "Unexpected number of operands");
8635 SDLoc DL = getCurSDLoc();
8636 Value *PtrOperand = VPIntrin.getArgOperand(0);
8637 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8638 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8639 const MDNode *Ranges = VPIntrin.getMetadata(LLVMContext::MD_range);
8640 SDValue LD;
8641 // Do not serialize variable-length loads of constant memory with
8642 // anything.
8643 if (!Alignment)
8644 Alignment = DAG.getEVTAlign(VT);
8645 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8646 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8647 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8648 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8649 MachinePointerInfo(PtrOperand), MachineMemOperand::MOLoad,
8650 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo, Ranges);
8651 LD = DAG.getLoadFFVP(VT, DL, InChain, OpValues[0], OpValues[1], OpValues[2],
8652 MMO);
8653 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, EVLVT, LD.getValue(1));
8654 if (AddToChain)
8655 PendingLoads.push_back(LD.getValue(2));
8656 setValue(&VPIntrin, DAG.getMergeValues({LD.getValue(0), Trunc}, DL));
8657}
8658
8659void SelectionDAGBuilder::visitVPGather(
8660 const VPIntrinsic &VPIntrin, EVT VT,
8661 const SmallVectorImpl<SDValue> &OpValues) {
8662 SDLoc DL = getCurSDLoc();
8663 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8664 Value *PtrOperand = VPIntrin.getArgOperand(0);
8665 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8666 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8667 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8668 SDValue LD;
8669 if (!Alignment)
8670 Alignment = DAG.getEVTAlign(VT.getScalarType());
8671 unsigned AS =
8672 PtrOperand->getType()->getScalarType()->getPointerAddressSpace();
8673 MachineMemOperand::Flags MMOFlags =
8674 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8675 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8676 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8677 *Alignment, AAInfo, Ranges);
8678 SDValue Base, Index, Scale;
8679 bool UniformBase =
8680 getUniformBase(PtrOperand, Base, Index, Scale, this, VPIntrin.getParent(),
8681 VT.getScalarStoreSize());
8682 if (!UniformBase) {
8683 Base = DAG.getConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout()));
8684 Index = getValue(PtrOperand);
8685 Scale = DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout()));
8686 }
8687 EVT IdxVT = Index.getValueType();
8688 EVT EltTy = IdxVT.getVectorElementType();
8689 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
8690 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
8691 Index = DAG.getNode(ISD::SIGN_EXTEND, DL, NewIdxVT, Index);
8692 }
8693 LD = DAG.getGatherVP(
8694 DAG.getVTList(VT, MVT::Other), VT, DL,
8695 {DAG.getRoot(), Base, Index, Scale, OpValues[1], OpValues[2]}, MMO,
8697 PendingLoads.push_back(LD.getValue(1));
8698 setValue(&VPIntrin, LD);
8699}
8700
8701void SelectionDAGBuilder::visitVPStore(
8702 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8703 SDLoc DL = getCurSDLoc();
8704 Value *PtrOperand = VPIntrin.getArgOperand(1);
8705 EVT VT = OpValues[0].getValueType();
8706 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8707 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8708 SDValue ST;
8709 if (!Alignment)
8710 Alignment = DAG.getEVTAlign(VT);
8711 SDValue Ptr = OpValues[1];
8712 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
8713 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8714 MachineMemOperand::Flags MMOFlags =
8715 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8716 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8717 MachinePointerInfo(PtrOperand), MMOFlags,
8718 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo);
8719 ST = DAG.getStoreVP(getMemoryRoot(), DL, OpValues[0], Ptr, Offset,
8720 OpValues[2], OpValues[3], VT, MMO, ISD::UNINDEXED,
8721 /* IsTruncating */ false, /*IsCompressing*/ false);
8722 DAG.setRoot(ST);
8723 setValue(&VPIntrin, ST);
8724}
8725
8726void SelectionDAGBuilder::visitVPScatter(
8727 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8728 SDLoc DL = getCurSDLoc();
8729 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8730 Value *PtrOperand = VPIntrin.getArgOperand(1);
8731 EVT VT = OpValues[0].getValueType();
8732 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8733 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8734 SDValue ST;
8735 if (!Alignment)
8736 Alignment = DAG.getEVTAlign(VT.getScalarType());
8737 unsigned AS =
8738 PtrOperand->getType()->getScalarType()->getPointerAddressSpace();
8739 MachineMemOperand::Flags MMOFlags =
8740 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8741 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8742 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8743 *Alignment, AAInfo);
8744 SDValue Base, Index, Scale;
8745 bool UniformBase =
8746 getUniformBase(PtrOperand, Base, Index, Scale, this, VPIntrin.getParent(),
8747 VT.getScalarStoreSize());
8748 if (!UniformBase) {
8749 Base = DAG.getConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout()));
8750 Index = getValue(PtrOperand);
8751 Scale = DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout()));
8752 }
8753 EVT IdxVT = Index.getValueType();
8754 EVT EltTy = IdxVT.getVectorElementType();
8755 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
8756 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
8757 Index = DAG.getNode(ISD::SIGN_EXTEND, DL, NewIdxVT, Index);
8758 }
8759 ST = DAG.getScatterVP(DAG.getVTList(MVT::Other), VT, DL,
8760 {getMemoryRoot(), OpValues[0], Base, Index, Scale,
8761 OpValues[2], OpValues[3]},
8762 MMO, ISD::SIGNED_SCALED);
8763 DAG.setRoot(ST);
8764 setValue(&VPIntrin, ST);
8765}
8766
8767void SelectionDAGBuilder::visitVPStridedLoad(
8768 const VPIntrinsic &VPIntrin, EVT VT,
8769 const SmallVectorImpl<SDValue> &OpValues) {
8770 SDLoc DL = getCurSDLoc();
8771 Value *PtrOperand = VPIntrin.getArgOperand(0);
8772 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8773 if (!Alignment)
8774 Alignment = DAG.getEVTAlign(VT.getScalarType());
8775 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8776 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8777 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8778 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8779 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8780 unsigned AS = PtrOperand->getType()->getPointerAddressSpace();
8781 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8782 MachineMemOperand::Flags MMOFlags =
8783 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8784 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8785 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8786 *Alignment, AAInfo, Ranges);
8787
8788 SDValue LD = DAG.getStridedLoadVP(VT, DL, InChain, OpValues[0], OpValues[1],
8789 OpValues[2], OpValues[3], MMO,
8790 false /*IsExpanding*/);
8791
8792 if (AddToChain)
8793 PendingLoads.push_back(LD.getValue(1));
8794 setValue(&VPIntrin, LD);
8795}
8796
8797void SelectionDAGBuilder::visitVPStridedStore(
8798 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8799 SDLoc DL = getCurSDLoc();
8800 Value *PtrOperand = VPIntrin.getArgOperand(1);
8801 EVT VT = OpValues[0].getValueType();
8802 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8803 if (!Alignment)
8804 Alignment = DAG.getEVTAlign(VT.getScalarType());
8805 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8806 unsigned AS = PtrOperand->getType()->getPointerAddressSpace();
8807 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8808 MachineMemOperand::Flags MMOFlags =
8809 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8810 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8811 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8812 *Alignment, AAInfo);
8813
8814 SDValue ST = DAG.getStridedStoreVP(
8815 getMemoryRoot(), DL, OpValues[0], OpValues[1],
8816 DAG.getUNDEF(OpValues[1].getValueType()), OpValues[2], OpValues[3],
8817 OpValues[4], VT, MMO, ISD::UNINDEXED, /*IsTruncating*/ false,
8818 /*IsCompressing*/ false);
8819
8820 DAG.setRoot(ST);
8821 setValue(&VPIntrin, ST);
8822}
8823
8824void SelectionDAGBuilder::visitVPCmp(const VPCmpIntrinsic &VPIntrin) {
8825 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8826 SDLoc DL = getCurSDLoc();
8827
8828 ISD::CondCode Condition;
8830 bool IsFP = VPIntrin.getOperand(0)->getType()->isFPOrFPVectorTy();
8831 if (IsFP) {
8832 // FIXME: Regular fcmps are FPMathOperators which may have fast-math (nnan)
8833 // flags, but calls that don't return floating-point types can't be
8834 // FPMathOperators, like vp.fcmp. This affects constrained fcmp too.
8835 Condition = getFCmpCondCode(CondCode);
8836 if (TM.Options.NoNaNsFPMath)
8837 Condition = getFCmpCodeWithoutNaN(Condition);
8838 } else {
8839 Condition = getICmpCondCode(CondCode);
8840 }
8841
8842 SDValue Op1 = getValue(VPIntrin.getOperand(0));
8843 SDValue Op2 = getValue(VPIntrin.getOperand(1));
8844 // #2 is the condition code
8845 SDValue MaskOp = getValue(VPIntrin.getOperand(3));
8846 SDValue EVL = getValue(VPIntrin.getOperand(4));
8847 MVT EVLParamVT = TLI.getVPExplicitVectorLengthTy();
8848 assert(EVLParamVT.isScalarInteger() && EVLParamVT.bitsGE(MVT::i32) &&
8849 "Unexpected target EVL type");
8850 EVL = DAG.getNode(ISD::ZERO_EXTEND, DL, EVLParamVT, EVL);
8851
8852 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
8853 VPIntrin.getType());
8854 setValue(&VPIntrin,
8855 DAG.getSetCCVP(DL, DestVT, Op1, Op2, Condition, MaskOp, EVL));
8856}
8857
8858void SelectionDAGBuilder::visitVectorPredicationIntrinsic(
8859 const VPIntrinsic &VPIntrin) {
8860 SDLoc DL = getCurSDLoc();
8861 unsigned Opcode = getISDForVPIntrinsic(VPIntrin);
8862
8863 auto IID = VPIntrin.getIntrinsicID();
8864
8865 if (const auto *CmpI = dyn_cast<VPCmpIntrinsic>(&VPIntrin))
8866 return visitVPCmp(*CmpI);
8867
8868 SmallVector<EVT, 4> ValueVTs;
8869 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8870 ComputeValueVTs(TLI, DAG.getDataLayout(), VPIntrin.getType(), ValueVTs);
8871 SDVTList VTs = DAG.getVTList(ValueVTs);
8872
8873 auto EVLParamPos = VPIntrinsic::getVectorLengthParamPos(IID);
8874
8875 MVT EVLParamVT = TLI.getVPExplicitVectorLengthTy();
8876 assert(EVLParamVT.isScalarInteger() && EVLParamVT.bitsGE(MVT::i32) &&
8877 "Unexpected target EVL type");
8878
8879 // Request operands.
8880 SmallVector<SDValue, 7> OpValues;
8881 for (unsigned I = 0; I < VPIntrin.arg_size(); ++I) {
8882 auto Op = getValue(VPIntrin.getArgOperand(I));
8883 if (I == EVLParamPos)
8884 Op = DAG.getNode(ISD::ZERO_EXTEND, DL, EVLParamVT, Op);
8885 OpValues.push_back(Op);
8886 }
8887
8888 switch (Opcode) {
8889 default: {
8890 SDNodeFlags SDFlags;
8891 if (auto *FPMO = dyn_cast<FPMathOperator>(&VPIntrin))
8892 SDFlags.copyFMF(*FPMO);
8893 SDValue Result = DAG.getNode(Opcode, DL, VTs, OpValues, SDFlags);
8894 setValue(&VPIntrin, Result);
8895 break;
8896 }
8897 case ISD::VP_LOAD:
8898 visitVPLoad(VPIntrin, ValueVTs[0], OpValues);
8899 break;
8900 case ISD::VP_LOAD_FF:
8901 visitVPLoadFF(VPIntrin, ValueVTs[0], ValueVTs[1], OpValues);
8902 break;
8903 case ISD::VP_GATHER:
8904 visitVPGather(VPIntrin, ValueVTs[0], OpValues);
8905 break;
8906 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
8907 visitVPStridedLoad(VPIntrin, ValueVTs[0], OpValues);
8908 break;
8909 case ISD::VP_STORE:
8910 visitVPStore(VPIntrin, OpValues);
8911 break;
8912 case ISD::VP_SCATTER:
8913 visitVPScatter(VPIntrin, OpValues);
8914 break;
8915 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
8916 visitVPStridedStore(VPIntrin, OpValues);
8917 break;
8918 case ISD::VP_FMULADD: {
8919 assert(OpValues.size() == 5 && "Unexpected number of operands");
8920 SDNodeFlags SDFlags;
8921 if (auto *FPMO = dyn_cast<FPMathOperator>(&VPIntrin))
8922 SDFlags.copyFMF(*FPMO);
8923 if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
8924 TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), ValueVTs[0])) {
8925 setValue(&VPIntrin, DAG.getNode(ISD::VP_FMA, DL, VTs, OpValues, SDFlags));
8926 } else {
8927 SDValue Mul = DAG.getNode(
8928 ISD::VP_FMUL, DL, VTs,
8929 {OpValues[0], OpValues[1], OpValues[3], OpValues[4]}, SDFlags);
8930 SDValue Add =
8931 DAG.getNode(ISD::VP_FADD, DL, VTs,
8932 {Mul, OpValues[2], OpValues[3], OpValues[4]}, SDFlags);
8933 setValue(&VPIntrin, Add);
8934 }
8935 break;
8936 }
8937 case ISD::VP_IS_FPCLASS: {
8938 const DataLayout DLayout = DAG.getDataLayout();
8939 EVT DestVT = TLI.getValueType(DLayout, VPIntrin.getType());
8940 auto Constant = OpValues[1]->getAsZExtVal();
8941 SDValue Check = DAG.getTargetConstant(Constant, DL, MVT::i32);
8942 SDValue V = DAG.getNode(ISD::VP_IS_FPCLASS, DL, DestVT,
8943 {OpValues[0], Check, OpValues[2], OpValues[3]});
8944 setValue(&VPIntrin, V);
8945 return;
8946 }
8947 case ISD::VP_INTTOPTR: {
8948 SDValue N = OpValues[0];
8949 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), VPIntrin.getType());
8950 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(), VPIntrin.getType());
8951 N = DAG.getVPPtrExtOrTrunc(getCurSDLoc(), DestVT, N, OpValues[1],
8952 OpValues[2]);
8953 N = DAG.getVPZExtOrTrunc(getCurSDLoc(), PtrMemVT, N, OpValues[1],
8954 OpValues[2]);
8955 setValue(&VPIntrin, N);
8956 break;
8957 }
8958 case ISD::VP_PTRTOINT: {
8959 SDValue N = OpValues[0];
8960 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
8961 VPIntrin.getType());
8962 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(),
8963 VPIntrin.getOperand(0)->getType());
8964 N = DAG.getVPPtrExtOrTrunc(getCurSDLoc(), PtrMemVT, N, OpValues[1],
8965 OpValues[2]);
8966 N = DAG.getVPZExtOrTrunc(getCurSDLoc(), DestVT, N, OpValues[1],
8967 OpValues[2]);
8968 setValue(&VPIntrin, N);
8969 break;
8970 }
8971 case ISD::VP_ABS:
8972 case ISD::VP_CTLZ:
8973 case ISD::VP_CTLZ_ZERO_UNDEF:
8974 case ISD::VP_CTTZ:
8975 case ISD::VP_CTTZ_ZERO_UNDEF:
8976 case ISD::VP_CTTZ_ELTS_ZERO_UNDEF:
8977 case ISD::VP_CTTZ_ELTS: {
8978 SDValue Result =
8979 DAG.getNode(Opcode, DL, VTs, {OpValues[0], OpValues[2], OpValues[3]});
8980 setValue(&VPIntrin, Result);
8981 break;
8982 }
8983 }
8984}
8985
8986SDValue SelectionDAGBuilder::lowerStartEH(SDValue Chain,
8987 const BasicBlock *EHPadBB,
8988 MCSymbol *&BeginLabel) {
8989 MachineFunction &MF = DAG.getMachineFunction();
8990
8991 // Insert a label before the invoke call to mark the try range. This can be
8992 // used to detect deletion of the invoke via the MachineModuleInfo.
8993 BeginLabel = MF.getContext().createTempSymbol();
8994
8995 // For SjLj, keep track of which landing pads go with which invokes
8996 // so as to maintain the ordering of pads in the LSDA.
8997 unsigned CallSiteIndex = FuncInfo.getCurrentCallSite();
8998 if (CallSiteIndex) {
8999 MF.setCallSiteBeginLabel(BeginLabel, CallSiteIndex);
9000 LPadToCallSiteMap[FuncInfo.getMBB(EHPadBB)].push_back(CallSiteIndex);
9001
9002 // Now that the call site is handled, stop tracking it.
9003 FuncInfo.setCurrentCallSite(0);
9004 }
9005
9006 return DAG.getEHLabel(getCurSDLoc(), Chain, BeginLabel);
9007}
9008
9009SDValue SelectionDAGBuilder::lowerEndEH(SDValue Chain, const InvokeInst *II,
9010 const BasicBlock *EHPadBB,
9011 MCSymbol *BeginLabel) {
9012 assert(BeginLabel && "BeginLabel should've been set");
9013
9014 MachineFunction &MF = DAG.getMachineFunction();
9015
9016 // Insert a label at the end of the invoke call to mark the try range. This
9017 // can be used to detect deletion of the invoke via the MachineModuleInfo.
9018 MCSymbol *EndLabel = MF.getContext().createTempSymbol();
9019 Chain = DAG.getEHLabel(getCurSDLoc(), Chain, EndLabel);
9020
9021 // Inform MachineModuleInfo of range.
9022 auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn());
9023 // There is a platform (e.g. wasm) that uses funclet style IR but does not
9024 // actually use outlined funclets and their LSDA info style.
9025 if (MF.hasEHFunclets() && isFuncletEHPersonality(Pers)) {
9026 assert(II && "II should've been set");
9027 WinEHFuncInfo *EHInfo = MF.getWinEHFuncInfo();
9028 EHInfo->addIPToStateRange(II, BeginLabel, EndLabel);
9029 } else if (!isScopedEHPersonality(Pers)) {
9030 assert(EHPadBB);
9031 MF.addInvoke(FuncInfo.getMBB(EHPadBB), BeginLabel, EndLabel);
9032 }
9033
9034 return Chain;
9035}
9036
9037std::pair<SDValue, SDValue>
9039 const BasicBlock *EHPadBB) {
9040 MCSymbol *BeginLabel = nullptr;
9041
9042 if (EHPadBB) {
9043 // Both PendingLoads and PendingExports must be flushed here;
9044 // this call might not return.
9045 (void)getRoot();
9046 DAG.setRoot(lowerStartEH(getControlRoot(), EHPadBB, BeginLabel));
9047 CLI.setChain(getRoot());
9048 }
9049
9050 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9051 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
9052
9053 assert((CLI.IsTailCall || Result.second.getNode()) &&
9054 "Non-null chain expected with non-tail call!");
9055 assert((Result.second.getNode() || !Result.first.getNode()) &&
9056 "Null value expected with tail call!");
9057
9058 if (!Result.second.getNode()) {
9059 // As a special case, a null chain means that a tail call has been emitted
9060 // and the DAG root is already updated.
9061 HasTailCall = true;
9062
9063 // Since there's no actual continuation from this block, nothing can be
9064 // relying on us setting vregs for them.
9065 PendingExports.clear();
9066 } else {
9067 DAG.setRoot(Result.second);
9068 }
9069
9070 if (EHPadBB) {
9071 DAG.setRoot(lowerEndEH(getRoot(), cast_or_null<InvokeInst>(CLI.CB), EHPadBB,
9072 BeginLabel));
9073 Result.second = getRoot();
9074 }
9075
9076 return Result;
9077}
9078
9080 bool isMustTailCall = CB.isMustTailCall();
9081
9082 // Avoid emitting tail calls in functions with the disable-tail-calls
9083 // attribute.
9084 const Function *Caller = CB.getParent()->getParent();
9085 if (!isMustTailCall &&
9086 Caller->getFnAttribute("disable-tail-calls").getValueAsBool())
9087 return false;
9088
9089 // We can't tail call inside a function with a swifterror argument. Lowering
9090 // does not support this yet. It would have to move into the swifterror
9091 // register before the call.
9092 if (DAG.getTargetLoweringInfo().supportSwiftError() &&
9093 Caller->getAttributes().hasAttrSomewhere(Attribute::SwiftError))
9094 return false;
9095
9096 // Check if target-independent constraints permit a tail call here.
9097 // Target-dependent constraints are checked within TLI->LowerCallTo.
9098 return isInTailCallPosition(CB, DAG.getTarget());
9099}
9100
9102 bool isTailCall, bool isMustTailCall,
9103 const BasicBlock *EHPadBB,
9104 const TargetLowering::PtrAuthInfo *PAI) {
9105 auto &DL = DAG.getDataLayout();
9106 FunctionType *FTy = CB.getFunctionType();
9107 Type *RetTy = CB.getType();
9108
9110 Args.reserve(CB.arg_size());
9111
9112 const Value *SwiftErrorVal = nullptr;
9113 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9114
9115 if (isTailCall)
9116 isTailCall = canTailCall(CB);
9117
9118 for (auto I = CB.arg_begin(), E = CB.arg_end(); I != E; ++I) {
9119 const Value *V = *I;
9120
9121 // Skip empty types
9122 if (V->getType()->isEmptyTy())
9123 continue;
9124
9125 SDValue ArgNode = getValue(V);
9126 TargetLowering::ArgListEntry Entry(ArgNode, V->getType());
9127 Entry.setAttributes(&CB, I - CB.arg_begin());
9128
9129 // Use swifterror virtual register as input to the call.
9130 if (Entry.IsSwiftError && TLI.supportSwiftError()) {
9131 SwiftErrorVal = V;
9132 // We find the virtual register for the actual swifterror argument.
9133 // Instead of using the Value, we use the virtual register instead.
9134 Entry.Node =
9135 DAG.getRegister(SwiftError.getOrCreateVRegUseAt(&CB, FuncInfo.MBB, V),
9136 EVT(TLI.getPointerTy(DL)));
9137 }
9138
9139 Args.push_back(Entry);
9140
9141 // If we have an explicit sret argument that is an Instruction, (i.e., it
9142 // might point to function-local memory), we can't meaningfully tail-call.
9143 if (Entry.IsSRet && isa<Instruction>(V))
9144 isTailCall = false;
9145 }
9146
9147 // If call site has a cfguardtarget operand bundle, create and add an
9148 // additional ArgListEntry.
9149 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_cfguardtarget)) {
9150 Value *V = Bundle->Inputs[0];
9152 Entry.IsCFGuardTarget = true;
9153 Args.push_back(Entry);
9154 }
9155
9156 // Disable tail calls if there is an swifterror argument. Targets have not
9157 // been updated to support tail calls.
9158 if (TLI.supportSwiftError() && SwiftErrorVal)
9159 isTailCall = false;
9160
9161 ConstantInt *CFIType = nullptr;
9162 if (CB.isIndirectCall()) {
9163 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_kcfi)) {
9164 if (!TLI.supportKCFIBundles())
9166 "Target doesn't support calls with kcfi operand bundles.");
9167 CFIType = cast<ConstantInt>(Bundle->Inputs[0]);
9168 assert(CFIType->getType()->isIntegerTy(32) && "Invalid CFI type");
9169 }
9170 }
9171
9172 SDValue ConvControlToken;
9173 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_convergencectrl)) {
9174 auto *Token = Bundle->Inputs[0].get();
9175 ConvControlToken = getValue(Token);
9176 }
9177
9178 GlobalValue *DeactivationSymbol = nullptr;
9180 DeactivationSymbol = cast<GlobalValue>(Bundle->Inputs[0].get());
9181 }
9182
9185 .setChain(getRoot())
9186 .setCallee(RetTy, FTy, Callee, std::move(Args), CB)
9187 .setTailCall(isTailCall)
9191 .setCFIType(CFIType)
9192 .setConvergenceControlToken(ConvControlToken)
9193 .setDeactivationSymbol(DeactivationSymbol);
9194
9195 // Set the pointer authentication info if we have it.
9196 if (PAI) {
9197 if (!TLI.supportPtrAuthBundles())
9199 "This target doesn't support calls with ptrauth operand bundles.");
9200 CLI.setPtrAuth(*PAI);
9201 }
9202
9203 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
9204
9205 if (Result.first.getNode()) {
9206 Result.first = lowerRangeToAssertZExt(DAG, CB, Result.first);
9207 Result.first = lowerNoFPClassToAssertNoFPClass(DAG, CB, Result.first);
9208 setValue(&CB, Result.first);
9209 }
9210
9211 // The last element of CLI.InVals has the SDValue for swifterror return.
9212 // Here we copy it to a virtual register and update SwiftErrorMap for
9213 // book-keeping.
9214 if (SwiftErrorVal && TLI.supportSwiftError()) {
9215 // Get the last element of InVals.
9216 SDValue Src = CLI.InVals.back();
9217 Register VReg =
9218 SwiftError.getOrCreateVRegDefAt(&CB, FuncInfo.MBB, SwiftErrorVal);
9219 SDValue CopyNode = CLI.DAG.getCopyToReg(Result.second, CLI.DL, VReg, Src);
9220 DAG.setRoot(CopyNode);
9221 }
9222}
9223
9224static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT,
9225 SelectionDAGBuilder &Builder) {
9226 // Check to see if this load can be trivially constant folded, e.g. if the
9227 // input is from a string literal.
9228 if (const Constant *LoadInput = dyn_cast<Constant>(PtrVal)) {
9229 // Cast pointer to the type we really want to load.
9230 Type *LoadTy =
9231 Type::getIntNTy(PtrVal->getContext(), LoadVT.getScalarSizeInBits());
9232 if (LoadVT.isVector())
9233 LoadTy = FixedVectorType::get(LoadTy, LoadVT.getVectorNumElements());
9234 if (const Constant *LoadCst =
9235 ConstantFoldLoadFromConstPtr(const_cast<Constant *>(LoadInput),
9236 LoadTy, Builder.DAG.getDataLayout()))
9237 return Builder.getValue(LoadCst);
9238 }
9239
9240 // Otherwise, we have to emit the load. If the pointer is to unfoldable but
9241 // still constant memory, the input chain can be the entry node.
9242 SDValue Root;
9243 bool ConstantMemory = false;
9244
9245 // Do not serialize (non-volatile) loads of constant memory with anything.
9246 if (Builder.BatchAA && Builder.BatchAA->pointsToConstantMemory(PtrVal)) {
9247 Root = Builder.DAG.getEntryNode();
9248 ConstantMemory = true;
9249 } else {
9250 // Do not serialize non-volatile loads against each other.
9251 Root = Builder.DAG.getRoot();
9252 }
9253
9254 SDValue Ptr = Builder.getValue(PtrVal);
9255 SDValue LoadVal =
9256 Builder.DAG.getLoad(LoadVT, Builder.getCurSDLoc(), Root, Ptr,
9257 MachinePointerInfo(PtrVal), Align(1));
9258
9259 if (!ConstantMemory)
9260 Builder.PendingLoads.push_back(LoadVal.getValue(1));
9261 return LoadVal;
9262}
9263
9264/// Record the value for an instruction that produces an integer result,
9265/// converting the type where necessary.
9266void SelectionDAGBuilder::processIntegerCallValue(const Instruction &I,
9267 SDValue Value,
9268 bool IsSigned) {
9269 EVT VT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9270 I.getType(), true);
9271 Value = DAG.getExtOrTrunc(IsSigned, Value, getCurSDLoc(), VT);
9272 setValue(&I, Value);
9273}
9274
9275/// See if we can lower a memcmp/bcmp call into an optimized form. If so, return
9276/// true and lower it. Otherwise return false, and it will be lowered like a
9277/// normal call.
9278/// The caller already checked that \p I calls the appropriate LibFunc with a
9279/// correct prototype.
9280bool SelectionDAGBuilder::visitMemCmpBCmpCall(const CallInst &I) {
9281 const Value *LHS = I.getArgOperand(0), *RHS = I.getArgOperand(1);
9282 const Value *Size = I.getArgOperand(2);
9283 const ConstantSDNode *CSize = dyn_cast<ConstantSDNode>(getValue(Size));
9284 if (CSize && CSize->getZExtValue() == 0) {
9285 EVT CallVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9286 I.getType(), true);
9287 setValue(&I, DAG.getConstant(0, getCurSDLoc(), CallVT));
9288 return true;
9289 }
9290
9291 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9292 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForMemcmp(
9293 DAG, getCurSDLoc(), DAG.getRoot(), getValue(LHS), getValue(RHS),
9294 getValue(Size), &I);
9295 if (Res.first.getNode()) {
9296 processIntegerCallValue(I, Res.first, true);
9297 PendingLoads.push_back(Res.second);
9298 return true;
9299 }
9300
9301 // memcmp(S1,S2,2) != 0 -> (*(short*)LHS != *(short*)RHS) != 0
9302 // memcmp(S1,S2,4) != 0 -> (*(int*)LHS != *(int*)RHS) != 0
9303 if (!CSize || !isOnlyUsedInZeroEqualityComparison(&I))
9304 return false;
9305
9306 // If the target has a fast compare for the given size, it will return a
9307 // preferred load type for that size. Require that the load VT is legal and
9308 // that the target supports unaligned loads of that type. Otherwise, return
9309 // INVALID.
9310 auto hasFastLoadsAndCompare = [&](unsigned NumBits) {
9311 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9312 MVT LVT = TLI.hasFastEqualityCompare(NumBits);
9313 if (LVT != MVT::INVALID_SIMPLE_VALUE_TYPE) {
9314 // TODO: Handle 5 byte compare as 4-byte + 1 byte.
9315 // TODO: Handle 8 byte compare on x86-32 as two 32-bit loads.
9316 // TODO: Check alignment of src and dest ptrs.
9317 unsigned DstAS = LHS->getType()->getPointerAddressSpace();
9318 unsigned SrcAS = RHS->getType()->getPointerAddressSpace();
9319 if (!TLI.isTypeLegal(LVT) ||
9320 !TLI.allowsMisalignedMemoryAccesses(LVT, SrcAS) ||
9321 !TLI.allowsMisalignedMemoryAccesses(LVT, DstAS))
9323 }
9324
9325 return LVT;
9326 };
9327
9328 // This turns into unaligned loads. We only do this if the target natively
9329 // supports the MVT we'll be loading or if it is small enough (<= 4) that
9330 // we'll only produce a small number of byte loads.
9331 MVT LoadVT;
9332 unsigned NumBitsToCompare = CSize->getZExtValue() * 8;
9333 switch (NumBitsToCompare) {
9334 default:
9335 return false;
9336 case 16:
9337 LoadVT = MVT::i16;
9338 break;
9339 case 32:
9340 LoadVT = MVT::i32;
9341 break;
9342 case 64:
9343 case 128:
9344 case 256:
9345 LoadVT = hasFastLoadsAndCompare(NumBitsToCompare);
9346 break;
9347 }
9348
9349 if (LoadVT == MVT::INVALID_SIMPLE_VALUE_TYPE)
9350 return false;
9351
9352 SDValue LoadL = getMemCmpLoad(LHS, LoadVT, *this);
9353 SDValue LoadR = getMemCmpLoad(RHS, LoadVT, *this);
9354
9355 // Bitcast to a wide integer type if the loads are vectors.
9356 if (LoadVT.isVector()) {
9357 EVT CmpVT = EVT::getIntegerVT(LHS->getContext(), LoadVT.getSizeInBits());
9358 LoadL = DAG.getBitcast(CmpVT, LoadL);
9359 LoadR = DAG.getBitcast(CmpVT, LoadR);
9360 }
9361
9362 SDValue Cmp = DAG.getSetCC(getCurSDLoc(), MVT::i1, LoadL, LoadR, ISD::SETNE);
9363 processIntegerCallValue(I, Cmp, false);
9364 return true;
9365}
9366
9367/// See if we can lower a memchr call into an optimized form. If so, return
9368/// true and lower it. Otherwise return false, and it will be lowered like a
9369/// normal call.
9370/// The caller already checked that \p I calls the appropriate LibFunc with a
9371/// correct prototype.
9372bool SelectionDAGBuilder::visitMemChrCall(const CallInst &I) {
9373 const Value *Src = I.getArgOperand(0);
9374 const Value *Char = I.getArgOperand(1);
9375 const Value *Length = I.getArgOperand(2);
9376
9377 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9378 std::pair<SDValue, SDValue> Res =
9379 TSI.EmitTargetCodeForMemchr(DAG, getCurSDLoc(), DAG.getRoot(),
9380 getValue(Src), getValue(Char), getValue(Length),
9381 MachinePointerInfo(Src));
9382 if (Res.first.getNode()) {
9383 setValue(&I, Res.first);
9384 PendingLoads.push_back(Res.second);
9385 return true;
9386 }
9387
9388 return false;
9389}
9390
9391/// See if we can lower a mempcpy call into an optimized form. If so, return
9392/// true and lower it. Otherwise return false, and it will be lowered like a
9393/// normal call.
9394/// The caller already checked that \p I calls the appropriate LibFunc with a
9395/// correct prototype.
9396bool SelectionDAGBuilder::visitMemPCpyCall(const CallInst &I) {
9397 SDValue Dst = getValue(I.getArgOperand(0));
9398 SDValue Src = getValue(I.getArgOperand(1));
9399 SDValue Size = getValue(I.getArgOperand(2));
9400
9401 Align DstAlign = DAG.InferPtrAlign(Dst).valueOrOne();
9402 Align SrcAlign = DAG.InferPtrAlign(Src).valueOrOne();
9403 // DAG::getMemcpy needs Alignment to be defined.
9404 Align Alignment = std::min(DstAlign, SrcAlign);
9405
9406 SDLoc sdl = getCurSDLoc();
9407
9408 // In the mempcpy context we need to pass in a false value for isTailCall
9409 // because the return pointer needs to be adjusted by the size of
9410 // the copied memory.
9411 SDValue Root = getMemoryRoot();
9412 SDValue MC = DAG.getMemcpy(
9413 Root, sdl, Dst, Src, Size, Alignment, false, false, /*CI=*/nullptr,
9414 std::nullopt, MachinePointerInfo(I.getArgOperand(0)),
9415 MachinePointerInfo(I.getArgOperand(1)), I.getAAMetadata());
9416 assert(MC.getNode() != nullptr &&
9417 "** memcpy should not be lowered as TailCall in mempcpy context **");
9418 DAG.setRoot(MC);
9419
9420 // Check if Size needs to be truncated or extended.
9421 Size = DAG.getSExtOrTrunc(Size, sdl, Dst.getValueType());
9422
9423 // Adjust return pointer to point just past the last dst byte.
9424 SDValue DstPlusSize = DAG.getMemBasePlusOffset(Dst, Size, sdl);
9425 setValue(&I, DstPlusSize);
9426 return true;
9427}
9428
9429/// See if we can lower a strcpy call into an optimized form. If so, return
9430/// true and lower it, otherwise return false and it will be lowered like a
9431/// normal call.
9432/// The caller already checked that \p I calls the appropriate LibFunc with a
9433/// correct prototype.
9434bool SelectionDAGBuilder::visitStrCpyCall(const CallInst &I, bool isStpcpy) {
9435 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9436
9437 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9438 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrcpy(
9439 DAG, getCurSDLoc(), getRoot(), getValue(Arg0), getValue(Arg1),
9440 MachinePointerInfo(Arg0), MachinePointerInfo(Arg1), isStpcpy, &I);
9441 if (Res.first.getNode()) {
9442 setValue(&I, Res.first);
9443 DAG.setRoot(Res.second);
9444 return true;
9445 }
9446
9447 return false;
9448}
9449
9450/// See if we can lower a strcmp call into an optimized form. If so, return
9451/// true and lower it, otherwise return false and it will be lowered like a
9452/// normal call.
9453/// The caller already checked that \p I calls the appropriate LibFunc with a
9454/// correct prototype.
9455bool SelectionDAGBuilder::visitStrCmpCall(const CallInst &I) {
9456 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9457
9458 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9459 std::pair<SDValue, SDValue> Res =
9460 TSI.EmitTargetCodeForStrcmp(DAG, getCurSDLoc(), DAG.getRoot(),
9461 getValue(Arg0), getValue(Arg1),
9462 MachinePointerInfo(Arg0),
9463 MachinePointerInfo(Arg1));
9464 if (Res.first.getNode()) {
9465 processIntegerCallValue(I, Res.first, true);
9466 PendingLoads.push_back(Res.second);
9467 return true;
9468 }
9469
9470 return false;
9471}
9472
9473/// See if we can lower a strlen call into an optimized form. If so, return
9474/// true and lower it, otherwise return false and it will be lowered like a
9475/// normal call.
9476/// The caller already checked that \p I calls the appropriate LibFunc with a
9477/// correct prototype.
9478bool SelectionDAGBuilder::visitStrLenCall(const CallInst &I) {
9479 const Value *Arg0 = I.getArgOperand(0);
9480
9481 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9482 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrlen(
9483 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), &I);
9484 if (Res.first.getNode()) {
9485 processIntegerCallValue(I, Res.first, false);
9486 PendingLoads.push_back(Res.second);
9487 return true;
9488 }
9489
9490 return false;
9491}
9492
9493/// See if we can lower a strnlen call into an optimized form. If so, return
9494/// true and lower it, otherwise return false and it will be lowered like a
9495/// normal call.
9496/// The caller already checked that \p I calls the appropriate LibFunc with a
9497/// correct prototype.
9498bool SelectionDAGBuilder::visitStrNLenCall(const CallInst &I) {
9499 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9500
9501 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9502 std::pair<SDValue, SDValue> Res =
9503 TSI.EmitTargetCodeForStrnlen(DAG, getCurSDLoc(), DAG.getRoot(),
9504 getValue(Arg0), getValue(Arg1),
9505 MachinePointerInfo(Arg0));
9506 if (Res.first.getNode()) {
9507 processIntegerCallValue(I, Res.first, false);
9508 PendingLoads.push_back(Res.second);
9509 return true;
9510 }
9511
9512 return false;
9513}
9514
9515/// See if we can lower a unary floating-point operation into an SDNode with
9516/// the specified Opcode. If so, return true and lower it, otherwise return
9517/// false and it will be lowered like a normal call.
9518/// The caller already checked that \p I calls the appropriate LibFunc with a
9519/// correct prototype.
9520bool SelectionDAGBuilder::visitUnaryFloatCall(const CallInst &I,
9521 unsigned Opcode) {
9522 // We already checked this call's prototype; verify it doesn't modify errno.
9523 // Do not perform optimizations for call sites that require strict
9524 // floating-point semantics.
9525 if (!I.onlyReadsMemory() || I.isStrictFP())
9526 return false;
9527
9528 SDNodeFlags Flags;
9529 Flags.copyFMF(cast<FPMathOperator>(I));
9530
9531 SDValue Tmp = getValue(I.getArgOperand(0));
9532 setValue(&I,
9533 DAG.getNode(Opcode, getCurSDLoc(), Tmp.getValueType(), Tmp, Flags));
9534 return true;
9535}
9536
9537/// See if we can lower a binary floating-point operation into an SDNode with
9538/// the specified Opcode. If so, return true and lower it. Otherwise return
9539/// false, and it will be lowered like a normal call.
9540/// The caller already checked that \p I calls the appropriate LibFunc with a
9541/// correct prototype.
9542bool SelectionDAGBuilder::visitBinaryFloatCall(const CallInst &I,
9543 unsigned Opcode) {
9544 // We already checked this call's prototype; verify it doesn't modify errno.
9545 // Do not perform optimizations for call sites that require strict
9546 // floating-point semantics.
9547 if (!I.onlyReadsMemory() || I.isStrictFP())
9548 return false;
9549
9550 SDNodeFlags Flags;
9551 Flags.copyFMF(cast<FPMathOperator>(I));
9552
9553 SDValue Tmp0 = getValue(I.getArgOperand(0));
9554 SDValue Tmp1 = getValue(I.getArgOperand(1));
9555 EVT VT = Tmp0.getValueType();
9556 setValue(&I, DAG.getNode(Opcode, getCurSDLoc(), VT, Tmp0, Tmp1, Flags));
9557 return true;
9558}
9559
9560void SelectionDAGBuilder::visitCall(const CallInst &I) {
9561 // Handle inline assembly differently.
9562 if (I.isInlineAsm()) {
9563 visitInlineAsm(I);
9564 return;
9565 }
9566
9568
9569 if (Function *F = I.getCalledFunction()) {
9570 if (F->isDeclaration()) {
9571 // Is this an LLVM intrinsic?
9572 if (unsigned IID = F->getIntrinsicID()) {
9573 visitIntrinsicCall(I, IID);
9574 return;
9575 }
9576 }
9577
9578 // Check for well-known libc/libm calls. If the function is internal, it
9579 // can't be a library call. Don't do the check if marked as nobuiltin for
9580 // some reason.
9581 // This code should not handle libcalls that are already canonicalized to
9582 // intrinsics by the middle-end.
9583 LibFunc Func;
9584 if (!I.isNoBuiltin() && !F->hasLocalLinkage() && F->hasName() &&
9585 LibInfo->getLibFunc(*F, Func) && LibInfo->hasOptimizedCodeGen(Func)) {
9586 switch (Func) {
9587 default: break;
9588 case LibFunc_bcmp:
9589 if (visitMemCmpBCmpCall(I))
9590 return;
9591 break;
9592 case LibFunc_copysign:
9593 case LibFunc_copysignf:
9594 case LibFunc_copysignl:
9595 // We already checked this call's prototype; verify it doesn't modify
9596 // errno.
9597 if (I.onlyReadsMemory()) {
9598 SDValue LHS = getValue(I.getArgOperand(0));
9599 SDValue RHS = getValue(I.getArgOperand(1));
9601 LHS.getValueType(), LHS, RHS));
9602 return;
9603 }
9604 break;
9605 case LibFunc_fabs:
9606 case LibFunc_fabsf:
9607 case LibFunc_fabsl:
9608 // TODO: Remove this, already canonicalized by the middle-end.
9609 if (visitUnaryFloatCall(I, ISD::FABS))
9610 return;
9611 break;
9612 case LibFunc_sin:
9613 case LibFunc_sinf:
9614 case LibFunc_sinl:
9615 if (visitUnaryFloatCall(I, ISD::FSIN))
9616 return;
9617 break;
9618 case LibFunc_cos:
9619 case LibFunc_cosf:
9620 case LibFunc_cosl:
9621 if (visitUnaryFloatCall(I, ISD::FCOS))
9622 return;
9623 break;
9624 case LibFunc_tan:
9625 case LibFunc_tanf:
9626 case LibFunc_tanl:
9627 if (visitUnaryFloatCall(I, ISD::FTAN))
9628 return;
9629 break;
9630 case LibFunc_asin:
9631 case LibFunc_asinf:
9632 case LibFunc_asinl:
9633 if (visitUnaryFloatCall(I, ISD::FASIN))
9634 return;
9635 break;
9636 case LibFunc_acos:
9637 case LibFunc_acosf:
9638 case LibFunc_acosl:
9639 if (visitUnaryFloatCall(I, ISD::FACOS))
9640 return;
9641 break;
9642 case LibFunc_atan:
9643 case LibFunc_atanf:
9644 case LibFunc_atanl:
9645 if (visitUnaryFloatCall(I, ISD::FATAN))
9646 return;
9647 break;
9648 case LibFunc_atan2:
9649 case LibFunc_atan2f:
9650 case LibFunc_atan2l:
9651 if (visitBinaryFloatCall(I, ISD::FATAN2))
9652 return;
9653 break;
9654 case LibFunc_sinh:
9655 case LibFunc_sinhf:
9656 case LibFunc_sinhl:
9657 if (visitUnaryFloatCall(I, ISD::FSINH))
9658 return;
9659 break;
9660 case LibFunc_cosh:
9661 case LibFunc_coshf:
9662 case LibFunc_coshl:
9663 if (visitUnaryFloatCall(I, ISD::FCOSH))
9664 return;
9665 break;
9666 case LibFunc_tanh:
9667 case LibFunc_tanhf:
9668 case LibFunc_tanhl:
9669 if (visitUnaryFloatCall(I, ISD::FTANH))
9670 return;
9671 break;
9672 case LibFunc_sqrt:
9673 case LibFunc_sqrtf:
9674 case LibFunc_sqrtl:
9675 case LibFunc_sqrt_finite:
9676 case LibFunc_sqrtf_finite:
9677 case LibFunc_sqrtl_finite:
9678 if (visitUnaryFloatCall(I, ISD::FSQRT))
9679 return;
9680 break;
9681 case LibFunc_log2:
9682 case LibFunc_log2f:
9683 case LibFunc_log2l:
9684 if (visitUnaryFloatCall(I, ISD::FLOG2))
9685 return;
9686 break;
9687 case LibFunc_exp2:
9688 case LibFunc_exp2f:
9689 case LibFunc_exp2l:
9690 if (visitUnaryFloatCall(I, ISD::FEXP2))
9691 return;
9692 break;
9693 case LibFunc_exp10:
9694 case LibFunc_exp10f:
9695 case LibFunc_exp10l:
9696 if (visitUnaryFloatCall(I, ISD::FEXP10))
9697 return;
9698 break;
9699 case LibFunc_ldexp:
9700 case LibFunc_ldexpf:
9701 case LibFunc_ldexpl:
9702 if (visitBinaryFloatCall(I, ISD::FLDEXP))
9703 return;
9704 break;
9705 case LibFunc_memcmp:
9706 if (visitMemCmpBCmpCall(I))
9707 return;
9708 break;
9709 case LibFunc_mempcpy:
9710 if (visitMemPCpyCall(I))
9711 return;
9712 break;
9713 case LibFunc_memchr:
9714 if (visitMemChrCall(I))
9715 return;
9716 break;
9717 case LibFunc_strcpy:
9718 if (visitStrCpyCall(I, false))
9719 return;
9720 break;
9721 case LibFunc_stpcpy:
9722 if (visitStrCpyCall(I, true))
9723 return;
9724 break;
9725 case LibFunc_strcmp:
9726 if (visitStrCmpCall(I))
9727 return;
9728 break;
9729 case LibFunc_strlen:
9730 if (visitStrLenCall(I))
9731 return;
9732 break;
9733 case LibFunc_strnlen:
9734 if (visitStrNLenCall(I))
9735 return;
9736 break;
9737 }
9738 }
9739 }
9740
9741 if (I.countOperandBundlesOfType(LLVMContext::OB_ptrauth)) {
9742 LowerCallSiteWithPtrAuthBundle(cast<CallBase>(I), /*EHPadBB=*/nullptr);
9743 return;
9744 }
9745
9746 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
9747 // have to do anything here to lower funclet bundles.
9748 // CFGuardTarget bundles are lowered in LowerCallTo.
9750 I, "calls",
9755
9756 SDValue Callee = getValue(I.getCalledOperand());
9757
9758 if (I.hasDeoptState())
9759 LowerCallSiteWithDeoptBundle(&I, Callee, nullptr);
9760 else
9761 // Check if we can potentially perform a tail call. More detailed checking
9762 // is be done within LowerCallTo, after more information about the call is
9763 // known.
9764 LowerCallTo(I, Callee, I.isTailCall(), I.isMustTailCall());
9765}
9766
9768 const CallBase &CB, const BasicBlock *EHPadBB) {
9769 auto PAB = CB.getOperandBundle("ptrauth");
9770 const Value *CalleeV = CB.getCalledOperand();
9771
9772 // Gather the call ptrauth data from the operand bundle:
9773 // [ i32 <key>, i64 <discriminator> ]
9774 const auto *Key = cast<ConstantInt>(PAB->Inputs[0]);
9775 const Value *Discriminator = PAB->Inputs[1];
9776
9777 assert(Key->getType()->isIntegerTy(32) && "Invalid ptrauth key");
9778 assert(Discriminator->getType()->isIntegerTy(64) &&
9779 "Invalid ptrauth discriminator");
9780
9781 // Look through ptrauth constants to find the raw callee.
9782 // Do a direct unauthenticated call if we found it and everything matches.
9783 if (const auto *CalleeCPA = dyn_cast<ConstantPtrAuth>(CalleeV))
9784 if (CalleeCPA->isKnownCompatibleWith(Key, Discriminator,
9785 DAG.getDataLayout()))
9786 return LowerCallTo(CB, getValue(CalleeCPA->getPointer()), CB.isTailCall(),
9787 CB.isMustTailCall(), EHPadBB);
9788
9789 // Functions should never be ptrauth-called directly.
9790 assert(!isa<Function>(CalleeV) && "invalid direct ptrauth call");
9791
9792 // Otherwise, do an authenticated indirect call.
9793 TargetLowering::PtrAuthInfo PAI = {Key->getZExtValue(),
9794 getValue(Discriminator)};
9795
9796 LowerCallTo(CB, getValue(CalleeV), CB.isTailCall(), CB.isMustTailCall(),
9797 EHPadBB, &PAI);
9798}
9799
9800namespace {
9801
9802/// AsmOperandInfo - This contains information for each constraint that we are
9803/// lowering.
9804class SDISelAsmOperandInfo : public TargetLowering::AsmOperandInfo {
9805public:
9806 /// CallOperand - If this is the result output operand or a clobber
9807 /// this is null, otherwise it is the incoming operand to the CallInst.
9808 /// This gets modified as the asm is processed.
9809 SDValue CallOperand;
9810
9811 /// AssignedRegs - If this is a register or register class operand, this
9812 /// contains the set of register corresponding to the operand.
9813 RegsForValue AssignedRegs;
9814
9815 explicit SDISelAsmOperandInfo(const TargetLowering::AsmOperandInfo &info)
9816 : TargetLowering::AsmOperandInfo(info), CallOperand(nullptr, 0) {
9817 }
9818
9819 /// Whether or not this operand accesses memory
9820 bool hasMemory(const TargetLowering &TLI) const {
9821 // Indirect operand accesses access memory.
9822 if (isIndirect)
9823 return true;
9824
9825 for (const auto &Code : Codes)
9827 return true;
9828
9829 return false;
9830 }
9831};
9832
9833
9834} // end anonymous namespace
9835
9836/// Make sure that the output operand \p OpInfo and its corresponding input
9837/// operand \p MatchingOpInfo have compatible constraint types (otherwise error
9838/// out).
9839static void patchMatchingInput(const SDISelAsmOperandInfo &OpInfo,
9840 SDISelAsmOperandInfo &MatchingOpInfo,
9841 SelectionDAG &DAG) {
9842 if (OpInfo.ConstraintVT == MatchingOpInfo.ConstraintVT)
9843 return;
9844
9846 const auto &TLI = DAG.getTargetLoweringInfo();
9847
9848 std::pair<unsigned, const TargetRegisterClass *> MatchRC =
9849 TLI.getRegForInlineAsmConstraint(TRI, OpInfo.ConstraintCode,
9850 OpInfo.ConstraintVT);
9851 std::pair<unsigned, const TargetRegisterClass *> InputRC =
9852 TLI.getRegForInlineAsmConstraint(TRI, MatchingOpInfo.ConstraintCode,
9853 MatchingOpInfo.ConstraintVT);
9854 const bool OutOpIsIntOrFP =
9855 OpInfo.ConstraintVT.isInteger() || OpInfo.ConstraintVT.isFloatingPoint();
9856 const bool InOpIsIntOrFP = MatchingOpInfo.ConstraintVT.isInteger() ||
9857 MatchingOpInfo.ConstraintVT.isFloatingPoint();
9858 if ((OutOpIsIntOrFP != InOpIsIntOrFP) || (MatchRC.second != InputRC.second)) {
9859 // FIXME: error out in a more elegant fashion
9860 report_fatal_error("Unsupported asm: input constraint"
9861 " with a matching output constraint of"
9862 " incompatible type!");
9863 }
9864 MatchingOpInfo.ConstraintVT = OpInfo.ConstraintVT;
9865}
9866
9867/// Get a direct memory input to behave well as an indirect operand.
9868/// This may introduce stores, hence the need for a \p Chain.
9869/// \return The (possibly updated) chain.
9870static SDValue getAddressForMemoryInput(SDValue Chain, const SDLoc &Location,
9871 SDISelAsmOperandInfo &OpInfo,
9872 SelectionDAG &DAG) {
9873 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9874
9875 // If we don't have an indirect input, put it in the constpool if we can,
9876 // otherwise spill it to a stack slot.
9877 // TODO: This isn't quite right. We need to handle these according to
9878 // the addressing mode that the constraint wants. Also, this may take
9879 // an additional register for the computation and we don't want that
9880 // either.
9881
9882 // If the operand is a float, integer, or vector constant, spill to a
9883 // constant pool entry to get its address.
9884 const Value *OpVal = OpInfo.CallOperandVal;
9885 if (isa<ConstantFP>(OpVal) || isa<ConstantInt>(OpVal) ||
9887 OpInfo.CallOperand = DAG.getConstantPool(
9888 cast<Constant>(OpVal), TLI.getPointerTy(DAG.getDataLayout()));
9889 return Chain;
9890 }
9891
9892 // Otherwise, create a stack slot and emit a store to it before the asm.
9893 Type *Ty = OpVal->getType();
9894 auto &DL = DAG.getDataLayout();
9895 TypeSize TySize = DL.getTypeAllocSize(Ty);
9898 int StackID = 0;
9899 if (TySize.isScalable())
9900 StackID = TFI->getStackIDForScalableVectors();
9901 int SSFI = MF.getFrameInfo().CreateStackObject(TySize.getKnownMinValue(),
9902 DL.getPrefTypeAlign(Ty), false,
9903 nullptr, StackID);
9904 SDValue StackSlot = DAG.getFrameIndex(SSFI, TLI.getFrameIndexTy(DL));
9905 Chain = DAG.getTruncStore(Chain, Location, OpInfo.CallOperand, StackSlot,
9907 TLI.getMemValueType(DL, Ty));
9908 OpInfo.CallOperand = StackSlot;
9909
9910 return Chain;
9911}
9912
9913/// GetRegistersForValue - Assign registers (virtual or physical) for the
9914/// specified operand. We prefer to assign virtual registers, to allow the
9915/// register allocator to handle the assignment process. However, if the asm
9916/// uses features that we can't model on machineinstrs, we have SDISel do the
9917/// allocation. This produces generally horrible, but correct, code.
9918///
9919/// OpInfo describes the operand
9920/// RefOpInfo describes the matching operand if any, the operand otherwise
9921static std::optional<unsigned>
9923 SDISelAsmOperandInfo &OpInfo,
9924 SDISelAsmOperandInfo &RefOpInfo) {
9925 LLVMContext &Context = *DAG.getContext();
9926 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9927
9931
9932 // No work to do for memory/address operands.
9933 if (OpInfo.ConstraintType == TargetLowering::C_Memory ||
9934 OpInfo.ConstraintType == TargetLowering::C_Address)
9935 return std::nullopt;
9936
9937 // If this is a constraint for a single physreg, or a constraint for a
9938 // register class, find it.
9939 unsigned AssignedReg;
9940 const TargetRegisterClass *RC;
9941 std::tie(AssignedReg, RC) = TLI.getRegForInlineAsmConstraint(
9942 &TRI, RefOpInfo.ConstraintCode, RefOpInfo.ConstraintVT);
9943 // RC is unset only on failure. Return immediately.
9944 if (!RC)
9945 return std::nullopt;
9946
9947 // Get the actual register value type. This is important, because the user
9948 // may have asked for (e.g.) the AX register in i32 type. We need to
9949 // remember that AX is actually i16 to get the right extension.
9950 const MVT RegVT = *TRI.legalclasstypes_begin(*RC);
9951
9952 if (OpInfo.ConstraintVT != MVT::Other && RegVT != MVT::Untyped) {
9953 // If this is an FP operand in an integer register (or visa versa), or more
9954 // generally if the operand value disagrees with the register class we plan
9955 // to stick it in, fix the operand type.
9956 //
9957 // If this is an input value, the bitcast to the new type is done now.
9958 // Bitcast for output value is done at the end of visitInlineAsm().
9959 if ((OpInfo.Type == InlineAsm::isOutput ||
9960 OpInfo.Type == InlineAsm::isInput) &&
9961 !TRI.isTypeLegalForClass(*RC, OpInfo.ConstraintVT)) {
9962 // Try to convert to the first EVT that the reg class contains. If the
9963 // types are identical size, use a bitcast to convert (e.g. two differing
9964 // vector types). Note: output bitcast is done at the end of
9965 // visitInlineAsm().
9966 if (RegVT.getSizeInBits() == OpInfo.ConstraintVT.getSizeInBits()) {
9967 // Exclude indirect inputs while they are unsupported because the code
9968 // to perform the load is missing and thus OpInfo.CallOperand still
9969 // refers to the input address rather than the pointed-to value.
9970 if (OpInfo.Type == InlineAsm::isInput && !OpInfo.isIndirect)
9971 OpInfo.CallOperand =
9972 DAG.getNode(ISD::BITCAST, DL, RegVT, OpInfo.CallOperand);
9973 OpInfo.ConstraintVT = RegVT;
9974 // If the operand is an FP value and we want it in integer registers,
9975 // use the corresponding integer type. This turns an f64 value into
9976 // i64, which can be passed with two i32 values on a 32-bit machine.
9977 } else if (RegVT.isInteger() && OpInfo.ConstraintVT.isFloatingPoint()) {
9978 MVT VT = MVT::getIntegerVT(OpInfo.ConstraintVT.getSizeInBits());
9979 if (OpInfo.Type == InlineAsm::isInput)
9980 OpInfo.CallOperand =
9981 DAG.getNode(ISD::BITCAST, DL, VT, OpInfo.CallOperand);
9982 OpInfo.ConstraintVT = VT;
9983 }
9984 }
9985 }
9986
9987 // No need to allocate a matching input constraint since the constraint it's
9988 // matching to has already been allocated.
9989 if (OpInfo.isMatchingInputConstraint())
9990 return std::nullopt;
9991
9992 EVT ValueVT = OpInfo.ConstraintVT;
9993 if (OpInfo.ConstraintVT == MVT::Other)
9994 ValueVT = RegVT;
9995
9996 // Initialize NumRegs.
9997 unsigned NumRegs = 1;
9998 if (OpInfo.ConstraintVT != MVT::Other)
9999 NumRegs = TLI.getNumRegisters(Context, OpInfo.ConstraintVT, RegVT);
10000
10001 // If this is a constraint for a specific physical register, like {r17},
10002 // assign it now.
10003
10004 // If this associated to a specific register, initialize iterator to correct
10005 // place. If virtual, make sure we have enough registers
10006
10007 // Initialize iterator if necessary
10010
10011 // Do not check for single registers.
10012 if (AssignedReg) {
10013 I = std::find(I, RC->end(), AssignedReg);
10014 if (I == RC->end()) {
10015 // RC does not contain the selected register, which indicates a
10016 // mismatch between the register and the required type/bitwidth.
10017 return {AssignedReg};
10018 }
10019 }
10020
10021 for (; NumRegs; --NumRegs, ++I) {
10022 assert(I != RC->end() && "Ran out of registers to allocate!");
10023 Register R = AssignedReg ? Register(*I) : RegInfo.createVirtualRegister(RC);
10024 Regs.push_back(R);
10025 }
10026
10027 OpInfo.AssignedRegs = RegsForValue(Regs, RegVT, ValueVT);
10028 return std::nullopt;
10029}
10030
10031static unsigned
10033 const std::vector<SDValue> &AsmNodeOperands) {
10034 // Scan until we find the definition we already emitted of this operand.
10035 unsigned CurOp = InlineAsm::Op_FirstOperand;
10036 for (; OperandNo; --OperandNo) {
10037 // Advance to the next operand.
10038 unsigned OpFlag = AsmNodeOperands[CurOp]->getAsZExtVal();
10039 const InlineAsm::Flag F(OpFlag);
10040 assert(
10041 (F.isRegDefKind() || F.isRegDefEarlyClobberKind() || F.isMemKind()) &&
10042 "Skipped past definitions?");
10043 CurOp += F.getNumOperandRegisters() + 1;
10044 }
10045 return CurOp;
10046}
10047
10048namespace {
10049
10050class ExtraFlags {
10051 unsigned Flags = 0;
10052
10053public:
10054 explicit ExtraFlags(const CallBase &Call) {
10055 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
10056 if (IA->hasSideEffects())
10058 if (IA->isAlignStack())
10060 if (Call.isConvergent())
10062 Flags |= IA->getDialect() * InlineAsm::Extra_AsmDialect;
10063 }
10064
10065 void update(const TargetLowering::AsmOperandInfo &OpInfo) {
10066 // Ideally, we would only check against memory constraints. However, the
10067 // meaning of an Other constraint can be target-specific and we can't easily
10068 // reason about it. Therefore, be conservative and set MayLoad/MayStore
10069 // for Other constraints as well.
10072 if (OpInfo.Type == InlineAsm::isInput)
10074 else if (OpInfo.Type == InlineAsm::isOutput)
10076 else if (OpInfo.Type == InlineAsm::isClobber)
10078 }
10079 }
10080
10081 unsigned get() const { return Flags; }
10082};
10083
10084} // end anonymous namespace
10085
10086static bool isFunction(SDValue Op) {
10087 if (Op && Op.getOpcode() == ISD::GlobalAddress) {
10088 if (auto *GA = dyn_cast<GlobalAddressSDNode>(Op)) {
10089 auto Fn = dyn_cast_or_null<Function>(GA->getGlobal());
10090
10091 // In normal "call dllimport func" instruction (non-inlineasm) it force
10092 // indirect access by specifing call opcode. And usually specially print
10093 // asm with indirect symbol (i.g: "*") according to opcode. Inline asm can
10094 // not do in this way now. (In fact, this is similar with "Data Access"
10095 // action). So here we ignore dllimport function.
10096 if (Fn && !Fn->hasDLLImportStorageClass())
10097 return true;
10098 }
10099 }
10100 return false;
10101}
10102
10103/// visitInlineAsm - Handle a call to an InlineAsm object.
10104void SelectionDAGBuilder::visitInlineAsm(const CallBase &Call,
10105 const BasicBlock *EHPadBB) {
10106 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
10107
10108 /// ConstraintOperands - Information about all of the constraints.
10109 SmallVector<SDISelAsmOperandInfo, 16> ConstraintOperands;
10110
10111 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10113 DAG.getDataLayout(), DAG.getSubtarget().getRegisterInfo(), Call);
10114
10115 // First Pass: Calculate HasSideEffects and ExtraFlags (AlignStack,
10116 // AsmDialect, MayLoad, MayStore).
10117 bool HasSideEffect = IA->hasSideEffects();
10118 ExtraFlags ExtraInfo(Call);
10119
10120 for (auto &T : TargetConstraints) {
10121 ConstraintOperands.push_back(SDISelAsmOperandInfo(T));
10122 SDISelAsmOperandInfo &OpInfo = ConstraintOperands.back();
10123
10124 if (OpInfo.CallOperandVal)
10125 OpInfo.CallOperand = getValue(OpInfo.CallOperandVal);
10126
10127 if (!HasSideEffect)
10128 HasSideEffect = OpInfo.hasMemory(TLI);
10129
10130 // Determine if this InlineAsm MayLoad or MayStore based on the constraints.
10131 // FIXME: Could we compute this on OpInfo rather than T?
10132
10133 // Compute the constraint code and ConstraintType to use.
10135
10136 if (T.ConstraintType == TargetLowering::C_Immediate &&
10137 OpInfo.CallOperand && !isa<ConstantSDNode>(OpInfo.CallOperand))
10138 // We've delayed emitting a diagnostic like the "n" constraint because
10139 // inlining could cause an integer showing up.
10140 return emitInlineAsmError(Call, "constraint '" + Twine(T.ConstraintCode) +
10141 "' expects an integer constant "
10142 "expression");
10143
10144 ExtraInfo.update(T);
10145 }
10146
10147 // We won't need to flush pending loads if this asm doesn't touch
10148 // memory and is nonvolatile.
10149 SDValue Glue, Chain = (HasSideEffect) ? getRoot() : DAG.getRoot();
10150
10151 bool EmitEHLabels = isa<InvokeInst>(Call);
10152 if (EmitEHLabels) {
10153 assert(EHPadBB && "InvokeInst must have an EHPadBB");
10154 }
10155 bool IsCallBr = isa<CallBrInst>(Call);
10156
10157 if (IsCallBr || EmitEHLabels) {
10158 // If this is a callbr or invoke we need to flush pending exports since
10159 // inlineasm_br and invoke are terminators.
10160 // We need to do this before nodes are glued to the inlineasm_br node.
10161 Chain = getControlRoot();
10162 }
10163
10164 MCSymbol *BeginLabel = nullptr;
10165 if (EmitEHLabels) {
10166 Chain = lowerStartEH(Chain, EHPadBB, BeginLabel);
10167 }
10168
10169 int OpNo = -1;
10170 SmallVector<StringRef> AsmStrs;
10171 IA->collectAsmStrs(AsmStrs);
10172
10173 // Second pass over the constraints: compute which constraint option to use.
10174 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
10175 if (OpInfo.hasArg() || OpInfo.Type == InlineAsm::isOutput)
10176 OpNo++;
10177
10178 // If this is an output operand with a matching input operand, look up the
10179 // matching input. If their types mismatch, e.g. one is an integer, the
10180 // other is floating point, or their sizes are different, flag it as an
10181 // error.
10182 if (OpInfo.hasMatchingInput()) {
10183 SDISelAsmOperandInfo &Input = ConstraintOperands[OpInfo.MatchingInput];
10184 patchMatchingInput(OpInfo, Input, DAG);
10185 }
10186
10187 // Compute the constraint code and ConstraintType to use.
10188 TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
10189
10190 if ((OpInfo.ConstraintType == TargetLowering::C_Memory &&
10191 OpInfo.Type == InlineAsm::isClobber) ||
10192 OpInfo.ConstraintType == TargetLowering::C_Address)
10193 continue;
10194
10195 // In Linux PIC model, there are 4 cases about value/label addressing:
10196 //
10197 // 1: Function call or Label jmp inside the module.
10198 // 2: Data access (such as global variable, static variable) inside module.
10199 // 3: Function call or Label jmp outside the module.
10200 // 4: Data access (such as global variable) outside the module.
10201 //
10202 // Due to current llvm inline asm architecture designed to not "recognize"
10203 // the asm code, there are quite troubles for us to treat mem addressing
10204 // differently for same value/adress used in different instuctions.
10205 // For example, in pic model, call a func may in plt way or direclty
10206 // pc-related, but lea/mov a function adress may use got.
10207 //
10208 // Here we try to "recognize" function call for the case 1 and case 3 in
10209 // inline asm. And try to adjust the constraint for them.
10210 //
10211 // TODO: Due to current inline asm didn't encourage to jmp to the outsider
10212 // label, so here we don't handle jmp function label now, but we need to
10213 // enhance it (especilly in PIC model) if we meet meaningful requirements.
10214 if (OpInfo.isIndirect && isFunction(OpInfo.CallOperand) &&
10215 TLI.isInlineAsmTargetBranch(AsmStrs, OpNo) &&
10216 TM.getCodeModel() != CodeModel::Large) {
10217 OpInfo.isIndirect = false;
10218 OpInfo.ConstraintType = TargetLowering::C_Address;
10219 }
10220
10221 // If this is a memory input, and if the operand is not indirect, do what we
10222 // need to provide an address for the memory input.
10223 if (OpInfo.ConstraintType == TargetLowering::C_Memory &&
10224 !OpInfo.isIndirect) {
10225 assert((OpInfo.isMultipleAlternative ||
10226 (OpInfo.Type == InlineAsm::isInput)) &&
10227 "Can only indirectify direct input operands!");
10228
10229 // Memory operands really want the address of the value.
10230 Chain = getAddressForMemoryInput(Chain, getCurSDLoc(), OpInfo, DAG);
10231
10232 // There is no longer a Value* corresponding to this operand.
10233 OpInfo.CallOperandVal = nullptr;
10234
10235 // It is now an indirect operand.
10236 OpInfo.isIndirect = true;
10237 }
10238
10239 }
10240
10241 // AsmNodeOperands - The operands for the ISD::INLINEASM node.
10242 std::vector<SDValue> AsmNodeOperands;
10243 AsmNodeOperands.push_back(SDValue()); // reserve space for input chain
10244 AsmNodeOperands.push_back(DAG.getTargetExternalSymbol(
10245 IA->getAsmString().data(), TLI.getProgramPointerTy(DAG.getDataLayout())));
10246
10247 // If we have a !srcloc metadata node associated with it, we want to attach
10248 // this to the ultimately generated inline asm machineinstr. To do this, we
10249 // pass in the third operand as this (potentially null) inline asm MDNode.
10250 const MDNode *SrcLoc = Call.getMetadata("srcloc");
10251 AsmNodeOperands.push_back(DAG.getMDNode(SrcLoc));
10252
10253 // Remember the HasSideEffect, AlignStack, AsmDialect, MayLoad and MayStore
10254 // bits as operand 3.
10255 AsmNodeOperands.push_back(DAG.getTargetConstant(
10256 ExtraInfo.get(), getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10257
10258 // Third pass: Loop over operands to prepare DAG-level operands.. As part of
10259 // this, assign virtual and physical registers for inputs and otput.
10260 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
10261 // Assign Registers.
10262 SDISelAsmOperandInfo &RefOpInfo =
10263 OpInfo.isMatchingInputConstraint()
10264 ? ConstraintOperands[OpInfo.getMatchedOperand()]
10265 : OpInfo;
10266 const auto RegError =
10267 getRegistersForValue(DAG, getCurSDLoc(), OpInfo, RefOpInfo);
10268 if (RegError) {
10269 const MachineFunction &MF = DAG.getMachineFunction();
10270 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
10271 const char *RegName = TRI.getName(*RegError);
10272 emitInlineAsmError(Call, "register '" + Twine(RegName) +
10273 "' allocated for constraint '" +
10274 Twine(OpInfo.ConstraintCode) +
10275 "' does not match required type");
10276 return;
10277 }
10278
10279 auto DetectWriteToReservedRegister = [&]() {
10280 const MachineFunction &MF = DAG.getMachineFunction();
10281 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
10282 for (Register Reg : OpInfo.AssignedRegs.Regs) {
10283 if (Reg.isPhysical() && TRI.isInlineAsmReadOnlyReg(MF, Reg)) {
10284 const char *RegName = TRI.getName(Reg);
10285 emitInlineAsmError(Call, "write to reserved register '" +
10286 Twine(RegName) + "'");
10287 return true;
10288 }
10289 }
10290 return false;
10291 };
10292 assert((OpInfo.ConstraintType != TargetLowering::C_Address ||
10293 (OpInfo.Type == InlineAsm::isInput &&
10294 !OpInfo.isMatchingInputConstraint())) &&
10295 "Only address as input operand is allowed.");
10296
10297 switch (OpInfo.Type) {
10299 if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
10300 const InlineAsm::ConstraintCode ConstraintID =
10301 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10303 "Failed to convert memory constraint code to constraint id.");
10304
10305 // Add information to the INLINEASM node to know about this output.
10306 InlineAsm::Flag OpFlags(InlineAsm::Kind::Mem, 1);
10307 OpFlags.setMemConstraint(ConstraintID);
10308 AsmNodeOperands.push_back(DAG.getTargetConstant(OpFlags, getCurSDLoc(),
10309 MVT::i32));
10310 AsmNodeOperands.push_back(OpInfo.CallOperand);
10311 } else {
10312 // Otherwise, this outputs to a register (directly for C_Register /
10313 // C_RegisterClass, and a target-defined fashion for
10314 // C_Immediate/C_Other). Find a register that we can use.
10315 if (OpInfo.AssignedRegs.Regs.empty()) {
10316 emitInlineAsmError(
10317 Call, "couldn't allocate output register for constraint '" +
10318 Twine(OpInfo.ConstraintCode) + "'");
10319 return;
10320 }
10321
10322 if (DetectWriteToReservedRegister())
10323 return;
10324
10325 // Add information to the INLINEASM node to know that this register is
10326 // set.
10327 OpInfo.AssignedRegs.AddInlineAsmOperands(
10328 OpInfo.isEarlyClobber ? InlineAsm::Kind::RegDefEarlyClobber
10330 false, 0, getCurSDLoc(), DAG, AsmNodeOperands);
10331 }
10332 break;
10333
10334 case InlineAsm::isInput:
10335 case InlineAsm::isLabel: {
10336 SDValue InOperandVal = OpInfo.CallOperand;
10337
10338 if (OpInfo.isMatchingInputConstraint()) {
10339 // If this is required to match an output register we have already set,
10340 // just use its register.
10341 auto CurOp = findMatchingInlineAsmOperand(OpInfo.getMatchedOperand(),
10342 AsmNodeOperands);
10343 InlineAsm::Flag Flag(AsmNodeOperands[CurOp]->getAsZExtVal());
10344 if (Flag.isRegDefKind() || Flag.isRegDefEarlyClobberKind()) {
10345 if (OpInfo.isIndirect) {
10346 // This happens on gcc/testsuite/gcc.dg/pr8788-1.c
10347 emitInlineAsmError(Call, "inline asm not supported yet: "
10348 "don't know how to handle tied "
10349 "indirect register inputs");
10350 return;
10351 }
10352
10354 MachineFunction &MF = DAG.getMachineFunction();
10355 MachineRegisterInfo &MRI = MF.getRegInfo();
10356 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
10357 auto *R = cast<RegisterSDNode>(AsmNodeOperands[CurOp+1]);
10358 Register TiedReg = R->getReg();
10359 MVT RegVT = R->getSimpleValueType(0);
10360 const TargetRegisterClass *RC =
10361 TiedReg.isVirtual() ? MRI.getRegClass(TiedReg)
10362 : RegVT != MVT::Untyped ? TLI.getRegClassFor(RegVT)
10363 : TRI.getMinimalPhysRegClass(TiedReg);
10364 for (unsigned i = 0, e = Flag.getNumOperandRegisters(); i != e; ++i)
10365 Regs.push_back(MRI.createVirtualRegister(RC));
10366
10367 RegsForValue MatchedRegs(Regs, RegVT, InOperandVal.getValueType());
10368
10369 SDLoc dl = getCurSDLoc();
10370 // Use the produced MatchedRegs object to
10371 MatchedRegs.getCopyToRegs(InOperandVal, DAG, dl, Chain, &Glue, &Call);
10372 MatchedRegs.AddInlineAsmOperands(InlineAsm::Kind::RegUse, true,
10373 OpInfo.getMatchedOperand(), dl, DAG,
10374 AsmNodeOperands);
10375 break;
10376 }
10377
10378 assert(Flag.isMemKind() && "Unknown matching constraint!");
10379 assert(Flag.getNumOperandRegisters() == 1 &&
10380 "Unexpected number of operands");
10381 // Add information to the INLINEASM node to know about this input.
10382 // See InlineAsm.h isUseOperandTiedToDef.
10383 Flag.clearMemConstraint();
10384 Flag.setMatchingOp(OpInfo.getMatchedOperand());
10385 AsmNodeOperands.push_back(DAG.getTargetConstant(
10386 Flag, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10387 AsmNodeOperands.push_back(AsmNodeOperands[CurOp+1]);
10388 break;
10389 }
10390
10391 // Treat indirect 'X' constraint as memory.
10392 if (OpInfo.ConstraintType == TargetLowering::C_Other &&
10393 OpInfo.isIndirect)
10394 OpInfo.ConstraintType = TargetLowering::C_Memory;
10395
10396 if (OpInfo.ConstraintType == TargetLowering::C_Immediate ||
10397 OpInfo.ConstraintType == TargetLowering::C_Other) {
10398 std::vector<SDValue> Ops;
10399 TLI.LowerAsmOperandForConstraint(InOperandVal, OpInfo.ConstraintCode,
10400 Ops, DAG);
10401 if (Ops.empty()) {
10402 if (OpInfo.ConstraintType == TargetLowering::C_Immediate)
10403 if (isa<ConstantSDNode>(InOperandVal)) {
10404 emitInlineAsmError(Call, "value out of range for constraint '" +
10405 Twine(OpInfo.ConstraintCode) + "'");
10406 return;
10407 }
10408
10409 emitInlineAsmError(Call,
10410 "invalid operand for inline asm constraint '" +
10411 Twine(OpInfo.ConstraintCode) + "'");
10412 return;
10413 }
10414
10415 // Add information to the INLINEASM node to know about this input.
10416 InlineAsm::Flag ResOpType(InlineAsm::Kind::Imm, Ops.size());
10417 AsmNodeOperands.push_back(DAG.getTargetConstant(
10418 ResOpType, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10419 llvm::append_range(AsmNodeOperands, Ops);
10420 break;
10421 }
10422
10423 if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
10424 assert((OpInfo.isIndirect ||
10425 OpInfo.ConstraintType != TargetLowering::C_Memory) &&
10426 "Operand must be indirect to be a mem!");
10427 assert(InOperandVal.getValueType() ==
10428 TLI.getPointerTy(DAG.getDataLayout()) &&
10429 "Memory operands expect pointer values");
10430
10431 const InlineAsm::ConstraintCode ConstraintID =
10432 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10434 "Failed to convert memory constraint code to constraint id.");
10435
10436 // Add information to the INLINEASM node to know about this input.
10437 InlineAsm::Flag ResOpType(InlineAsm::Kind::Mem, 1);
10438 ResOpType.setMemConstraint(ConstraintID);
10439 AsmNodeOperands.push_back(DAG.getTargetConstant(ResOpType,
10440 getCurSDLoc(),
10441 MVT::i32));
10442 AsmNodeOperands.push_back(InOperandVal);
10443 break;
10444 }
10445
10446 if (OpInfo.ConstraintType == TargetLowering::C_Address) {
10447 const InlineAsm::ConstraintCode ConstraintID =
10448 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10450 "Failed to convert memory constraint code to constraint id.");
10451
10452 InlineAsm::Flag ResOpType(InlineAsm::Kind::Mem, 1);
10453
10454 SDValue AsmOp = InOperandVal;
10455 if (isFunction(InOperandVal)) {
10456 auto *GA = cast<GlobalAddressSDNode>(InOperandVal);
10457 ResOpType = InlineAsm::Flag(InlineAsm::Kind::Func, 1);
10458 AsmOp = DAG.getTargetGlobalAddress(GA->getGlobal(), getCurSDLoc(),
10459 InOperandVal.getValueType(),
10460 GA->getOffset());
10461 }
10462
10463 // Add information to the INLINEASM node to know about this input.
10464 ResOpType.setMemConstraint(ConstraintID);
10465
10466 AsmNodeOperands.push_back(
10467 DAG.getTargetConstant(ResOpType, getCurSDLoc(), MVT::i32));
10468
10469 AsmNodeOperands.push_back(AsmOp);
10470 break;
10471 }
10472
10473 if (OpInfo.ConstraintType != TargetLowering::C_RegisterClass &&
10474 OpInfo.ConstraintType != TargetLowering::C_Register) {
10475 emitInlineAsmError(Call, "unknown asm constraint '" +
10476 Twine(OpInfo.ConstraintCode) + "'");
10477 return;
10478 }
10479
10480 // TODO: Support this.
10481 if (OpInfo.isIndirect) {
10482 emitInlineAsmError(
10483 Call, "Don't know how to handle indirect register inputs yet "
10484 "for constraint '" +
10485 Twine(OpInfo.ConstraintCode) + "'");
10486 return;
10487 }
10488
10489 // Copy the input into the appropriate registers.
10490 if (OpInfo.AssignedRegs.Regs.empty()) {
10491 emitInlineAsmError(Call,
10492 "couldn't allocate input reg for constraint '" +
10493 Twine(OpInfo.ConstraintCode) + "'");
10494 return;
10495 }
10496
10497 if (DetectWriteToReservedRegister())
10498 return;
10499
10500 SDLoc dl = getCurSDLoc();
10501
10502 OpInfo.AssignedRegs.getCopyToRegs(InOperandVal, DAG, dl, Chain, &Glue,
10503 &Call);
10504
10505 OpInfo.AssignedRegs.AddInlineAsmOperands(InlineAsm::Kind::RegUse, false,
10506 0, dl, DAG, AsmNodeOperands);
10507 break;
10508 }
10510 // Add the clobbered value to the operand list, so that the register
10511 // allocator is aware that the physreg got clobbered.
10512 if (!OpInfo.AssignedRegs.Regs.empty())
10514 false, 0, getCurSDLoc(), DAG,
10515 AsmNodeOperands);
10516 break;
10517 }
10518 }
10519
10520 // Finish up input operands. Set the input chain and add the flag last.
10521 AsmNodeOperands[InlineAsm::Op_InputChain] = Chain;
10522 if (Glue.getNode()) AsmNodeOperands.push_back(Glue);
10523
10524 unsigned ISDOpc = IsCallBr ? ISD::INLINEASM_BR : ISD::INLINEASM;
10525 Chain = DAG.getNode(ISDOpc, getCurSDLoc(),
10526 DAG.getVTList(MVT::Other, MVT::Glue), AsmNodeOperands);
10527 Glue = Chain.getValue(1);
10528
10529 // Do additional work to generate outputs.
10530
10531 SmallVector<EVT, 1> ResultVTs;
10532 SmallVector<SDValue, 1> ResultValues;
10533 SmallVector<SDValue, 8> OutChains;
10534
10535 llvm::Type *CallResultType = Call.getType();
10536 ArrayRef<Type *> ResultTypes;
10537 if (StructType *StructResult = dyn_cast<StructType>(CallResultType))
10538 ResultTypes = StructResult->elements();
10539 else if (!CallResultType->isVoidTy())
10540 ResultTypes = ArrayRef(CallResultType);
10541
10542 auto CurResultType = ResultTypes.begin();
10543 auto handleRegAssign = [&](SDValue V) {
10544 assert(CurResultType != ResultTypes.end() && "Unexpected value");
10545 assert((*CurResultType)->isSized() && "Unexpected unsized type");
10546 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), *CurResultType);
10547 ++CurResultType;
10548 // If the type of the inline asm call site return value is different but has
10549 // same size as the type of the asm output bitcast it. One example of this
10550 // is for vectors with different width / number of elements. This can
10551 // happen for register classes that can contain multiple different value
10552 // types. The preg or vreg allocated may not have the same VT as was
10553 // expected.
10554 //
10555 // This can also happen for a return value that disagrees with the register
10556 // class it is put in, eg. a double in a general-purpose register on a
10557 // 32-bit machine.
10558 if (ResultVT != V.getValueType() &&
10559 ResultVT.getSizeInBits() == V.getValueSizeInBits())
10560 V = DAG.getNode(ISD::BITCAST, getCurSDLoc(), ResultVT, V);
10561 else if (ResultVT != V.getValueType() && ResultVT.isInteger() &&
10562 V.getValueType().isInteger()) {
10563 // If a result value was tied to an input value, the computed result
10564 // may have a wider width than the expected result. Extract the
10565 // relevant portion.
10566 V = DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), ResultVT, V);
10567 }
10568 assert(ResultVT == V.getValueType() && "Asm result value mismatch!");
10569 ResultVTs.push_back(ResultVT);
10570 ResultValues.push_back(V);
10571 };
10572
10573 // Deal with output operands.
10574 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
10575 if (OpInfo.Type == InlineAsm::isOutput) {
10576 SDValue Val;
10577 // Skip trivial output operands.
10578 if (OpInfo.AssignedRegs.Regs.empty())
10579 continue;
10580
10581 switch (OpInfo.ConstraintType) {
10584 Val = OpInfo.AssignedRegs.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(),
10585 Chain, &Glue, &Call);
10586 break;
10589 Val = TLI.LowerAsmOutputForConstraint(Chain, Glue, getCurSDLoc(),
10590 OpInfo, DAG);
10591 break;
10593 break; // Already handled.
10595 break; // Silence warning.
10597 assert(false && "Unexpected unknown constraint");
10598 }
10599
10600 // Indirect output manifest as stores. Record output chains.
10601 if (OpInfo.isIndirect) {
10602 const Value *Ptr = OpInfo.CallOperandVal;
10603 assert(Ptr && "Expected value CallOperandVal for indirect asm operand");
10604 SDValue Store = DAG.getStore(Chain, getCurSDLoc(), Val, getValue(Ptr),
10605 MachinePointerInfo(Ptr));
10606 OutChains.push_back(Store);
10607 } else {
10608 // generate CopyFromRegs to associated registers.
10609 assert(!Call.getType()->isVoidTy() && "Bad inline asm!");
10610 if (Val.getOpcode() == ISD::MERGE_VALUES) {
10611 for (const SDValue &V : Val->op_values())
10612 handleRegAssign(V);
10613 } else
10614 handleRegAssign(Val);
10615 }
10616 }
10617 }
10618
10619 // Set results.
10620 if (!ResultValues.empty()) {
10621 assert(CurResultType == ResultTypes.end() &&
10622 "Mismatch in number of ResultTypes");
10623 assert(ResultValues.size() == ResultTypes.size() &&
10624 "Mismatch in number of output operands in asm result");
10625
10627 DAG.getVTList(ResultVTs), ResultValues);
10628 setValue(&Call, V);
10629 }
10630
10631 // Collect store chains.
10632 if (!OutChains.empty())
10633 Chain = DAG.getNode(ISD::TokenFactor, getCurSDLoc(), MVT::Other, OutChains);
10634
10635 if (EmitEHLabels) {
10636 Chain = lowerEndEH(Chain, cast<InvokeInst>(&Call), EHPadBB, BeginLabel);
10637 }
10638
10639 // Only Update Root if inline assembly has a memory effect.
10640 if (ResultValues.empty() || HasSideEffect || !OutChains.empty() || IsCallBr ||
10641 EmitEHLabels)
10642 DAG.setRoot(Chain);
10643}
10644
10645void SelectionDAGBuilder::emitInlineAsmError(const CallBase &Call,
10646 const Twine &Message) {
10647 LLVMContext &Ctx = *DAG.getContext();
10648 Ctx.diagnose(DiagnosticInfoInlineAsm(Call, Message));
10649
10650 // Make sure we leave the DAG in a valid state
10651 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10652 SmallVector<EVT, 1> ValueVTs;
10653 ComputeValueVTs(TLI, DAG.getDataLayout(), Call.getType(), ValueVTs);
10654
10655 if (ValueVTs.empty())
10656 return;
10657
10659 for (const EVT &VT : ValueVTs)
10660 Ops.push_back(DAG.getUNDEF(VT));
10661
10662 setValue(&Call, DAG.getMergeValues(Ops, getCurSDLoc()));
10663}
10664
10665void SelectionDAGBuilder::visitVAStart(const CallInst &I) {
10666 DAG.setRoot(DAG.getNode(ISD::VASTART, getCurSDLoc(),
10667 MVT::Other, getRoot(),
10668 getValue(I.getArgOperand(0)),
10669 DAG.getSrcValue(I.getArgOperand(0))));
10670}
10671
10672void SelectionDAGBuilder::visitVAArg(const VAArgInst &I) {
10673 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10674 const DataLayout &DL = DAG.getDataLayout();
10675 SDValue V = DAG.getVAArg(
10676 TLI.getMemValueType(DAG.getDataLayout(), I.getType()), getCurSDLoc(),
10677 getRoot(), getValue(I.getOperand(0)), DAG.getSrcValue(I.getOperand(0)),
10678 DL.getABITypeAlign(I.getType()).value());
10679 DAG.setRoot(V.getValue(1));
10680
10681 if (I.getType()->isPointerTy())
10682 V = DAG.getPtrExtOrTrunc(
10683 V, getCurSDLoc(), TLI.getValueType(DAG.getDataLayout(), I.getType()));
10684 setValue(&I, V);
10685}
10686
10687void SelectionDAGBuilder::visitVAEnd(const CallInst &I) {
10688 DAG.setRoot(DAG.getNode(ISD::VAEND, getCurSDLoc(),
10689 MVT::Other, getRoot(),
10690 getValue(I.getArgOperand(0)),
10691 DAG.getSrcValue(I.getArgOperand(0))));
10692}
10693
10694void SelectionDAGBuilder::visitVACopy(const CallInst &I) {
10695 DAG.setRoot(DAG.getNode(ISD::VACOPY, getCurSDLoc(),
10696 MVT::Other, getRoot(),
10697 getValue(I.getArgOperand(0)),
10698 getValue(I.getArgOperand(1)),
10699 DAG.getSrcValue(I.getArgOperand(0)),
10700 DAG.getSrcValue(I.getArgOperand(1))));
10701}
10702
10704 const Instruction &I,
10705 SDValue Op) {
10706 std::optional<ConstantRange> CR = getRange(I);
10707
10708 if (!CR || CR->isFullSet() || CR->isEmptySet() || CR->isUpperWrapped())
10709 return Op;
10710
10711 APInt Lo = CR->getUnsignedMin();
10712 if (!Lo.isMinValue())
10713 return Op;
10714
10715 APInt Hi = CR->getUnsignedMax();
10716 unsigned Bits = std::max(Hi.getActiveBits(),
10717 static_cast<unsigned>(IntegerType::MIN_INT_BITS));
10718
10719 EVT SmallVT = EVT::getIntegerVT(*DAG.getContext(), Bits);
10720
10721 SDLoc SL = getCurSDLoc();
10722
10723 SDValue ZExt = DAG.getNode(ISD::AssertZext, SL, Op.getValueType(), Op,
10724 DAG.getValueType(SmallVT));
10725 unsigned NumVals = Op.getNode()->getNumValues();
10726 if (NumVals == 1)
10727 return ZExt;
10728
10730
10731 Ops.push_back(ZExt);
10732 for (unsigned I = 1; I != NumVals; ++I)
10733 Ops.push_back(Op.getValue(I));
10734
10735 return DAG.getMergeValues(Ops, SL);
10736}
10737
10739 SelectionDAG &DAG, const Instruction &I, SDValue Op) {
10740 FPClassTest Classes = getNoFPClass(I);
10741 if (Classes == fcNone)
10742 return Op;
10743
10744 SDLoc SL = getCurSDLoc();
10745 SDValue TestConst = DAG.getTargetConstant(Classes, SDLoc(), MVT::i32);
10746
10747 if (Op.getOpcode() != ISD::MERGE_VALUES) {
10748 return DAG.getNode(ISD::AssertNoFPClass, SL, Op.getValueType(), Op,
10749 TestConst);
10750 }
10751
10752 SmallVector<SDValue, 8> Ops(Op.getNumOperands());
10753 for (unsigned I = 0, E = Ops.size(); I != E; ++I) {
10754 SDValue MergeOp = Op.getOperand(I);
10755 Ops[I] = DAG.getNode(ISD::AssertNoFPClass, SL, MergeOp.getValueType(),
10756 MergeOp, TestConst);
10757 }
10758
10759 return DAG.getMergeValues(Ops, SL);
10760}
10761
10762/// Populate a CallLowerinInfo (into \p CLI) based on the properties of
10763/// the call being lowered.
10764///
10765/// This is a helper for lowering intrinsics that follow a target calling
10766/// convention or require stack pointer adjustment. Only a subset of the
10767/// intrinsic's operands need to participate in the calling convention.
10770 unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy,
10771 AttributeSet RetAttrs, bool IsPatchPoint) {
10773 Args.reserve(NumArgs);
10774
10775 // Populate the argument list.
10776 // Attributes for args start at offset 1, after the return attribute.
10777 for (unsigned ArgI = ArgIdx, ArgE = ArgIdx + NumArgs;
10778 ArgI != ArgE; ++ArgI) {
10779 const Value *V = Call->getOperand(ArgI);
10780
10781 assert(!V->getType()->isEmptyTy() && "Empty type passed to intrinsic.");
10782
10783 TargetLowering::ArgListEntry Entry(getValue(V), V->getType());
10784 Entry.setAttributes(Call, ArgI);
10785 Args.push_back(Entry);
10786 }
10787
10789 .setChain(getRoot())
10790 .setCallee(Call->getCallingConv(), ReturnTy, Callee, std::move(Args),
10791 RetAttrs)
10792 .setDiscardResult(Call->use_empty())
10793 .setIsPatchPoint(IsPatchPoint)
10795 Call->countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0);
10796}
10797
10798/// Add a stack map intrinsic call's live variable operands to a stackmap
10799/// or patchpoint target node's operand list.
10800///
10801/// Constants are converted to TargetConstants purely as an optimization to
10802/// avoid constant materialization and register allocation.
10803///
10804/// FrameIndex operands are converted to TargetFrameIndex so that ISEL does not
10805/// generate addess computation nodes, and so FinalizeISel can convert the
10806/// TargetFrameIndex into a DirectMemRefOp StackMap location. This avoids
10807/// address materialization and register allocation, but may also be required
10808/// for correctness. If a StackMap (or PatchPoint) intrinsic directly uses an
10809/// alloca in the entry block, then the runtime may assume that the alloca's
10810/// StackMap location can be read immediately after compilation and that the
10811/// location is valid at any point during execution (this is similar to the
10812/// assumption made by the llvm.gcroot intrinsic). If the alloca's location were
10813/// only available in a register, then the runtime would need to trap when
10814/// execution reaches the StackMap in order to read the alloca's location.
10815static void addStackMapLiveVars(const CallBase &Call, unsigned StartIdx,
10817 SelectionDAGBuilder &Builder) {
10818 SelectionDAG &DAG = Builder.DAG;
10819 for (unsigned I = StartIdx; I < Call.arg_size(); I++) {
10820 SDValue Op = Builder.getValue(Call.getArgOperand(I));
10821
10822 // Things on the stack are pointer-typed, meaning that they are already
10823 // legal and can be emitted directly to target nodes.
10825 Ops.push_back(DAG.getTargetFrameIndex(FI->getIndex(), Op.getValueType()));
10826 } else {
10827 // Otherwise emit a target independent node to be legalised.
10828 Ops.push_back(Builder.getValue(Call.getArgOperand(I)));
10829 }
10830 }
10831}
10832
10833/// Lower llvm.experimental.stackmap.
10834void SelectionDAGBuilder::visitStackmap(const CallInst &CI) {
10835 // void @llvm.experimental.stackmap(i64 <id>, i32 <numShadowBytes>,
10836 // [live variables...])
10837
10838 assert(CI.getType()->isVoidTy() && "Stackmap cannot return a value.");
10839
10840 SDValue Chain, InGlue, Callee;
10842
10843 SDLoc DL = getCurSDLoc();
10845
10846 // The stackmap intrinsic only records the live variables (the arguments
10847 // passed to it) and emits NOPS (if requested). Unlike the patchpoint
10848 // intrinsic, this won't be lowered to a function call. This means we don't
10849 // have to worry about calling conventions and target specific lowering code.
10850 // Instead we perform the call lowering right here.
10851 //
10852 // chain, flag = CALLSEQ_START(chain, 0, 0)
10853 // chain, flag = STACKMAP(id, nbytes, ..., chain, flag)
10854 // chain, flag = CALLSEQ_END(chain, 0, 0, flag)
10855 //
10856 Chain = DAG.getCALLSEQ_START(getRoot(), 0, 0, DL);
10857 InGlue = Chain.getValue(1);
10858
10859 // Add the STACKMAP operands, starting with DAG house-keeping.
10860 Ops.push_back(Chain);
10861 Ops.push_back(InGlue);
10862
10863 // Add the <id>, <numShadowBytes> operands.
10864 //
10865 // These do not require legalisation, and can be emitted directly to target
10866 // constant nodes.
10868 assert(ID.getValueType() == MVT::i64);
10869 SDValue IDConst =
10870 DAG.getTargetConstant(ID->getAsZExtVal(), DL, ID.getValueType());
10871 Ops.push_back(IDConst);
10872
10873 SDValue Shad = getValue(CI.getArgOperand(1));
10874 assert(Shad.getValueType() == MVT::i32);
10875 SDValue ShadConst =
10876 DAG.getTargetConstant(Shad->getAsZExtVal(), DL, Shad.getValueType());
10877 Ops.push_back(ShadConst);
10878
10879 // Add the live variables.
10880 addStackMapLiveVars(CI, 2, DL, Ops, *this);
10881
10882 // Create the STACKMAP node.
10883 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
10884 Chain = DAG.getNode(ISD::STACKMAP, DL, NodeTys, Ops);
10885 InGlue = Chain.getValue(1);
10886
10887 Chain = DAG.getCALLSEQ_END(Chain, 0, 0, InGlue, DL);
10888
10889 // Stackmaps don't generate values, so nothing goes into the NodeMap.
10890
10891 // Set the root to the target-lowered call chain.
10892 DAG.setRoot(Chain);
10893
10894 // Inform the Frame Information that we have a stackmap in this function.
10895 FuncInfo.MF->getFrameInfo().setHasStackMap();
10896}
10897
10898/// Lower llvm.experimental.patchpoint directly to its target opcode.
10899void SelectionDAGBuilder::visitPatchpoint(const CallBase &CB,
10900 const BasicBlock *EHPadBB) {
10901 // <ty> @llvm.experimental.patchpoint.<ty>(i64 <id>,
10902 // i32 <numBytes>,
10903 // i8* <target>,
10904 // i32 <numArgs>,
10905 // [Args...],
10906 // [live variables...])
10907
10909 bool IsAnyRegCC = CC == CallingConv::AnyReg;
10910 bool HasDef = !CB.getType()->isVoidTy();
10911 SDLoc dl = getCurSDLoc();
10913
10914 // Handle immediate and symbolic callees.
10915 if (auto* ConstCallee = dyn_cast<ConstantSDNode>(Callee))
10916 Callee = DAG.getIntPtrConstant(ConstCallee->getZExtValue(), dl,
10917 /*isTarget=*/true);
10918 else if (auto* SymbolicCallee = dyn_cast<GlobalAddressSDNode>(Callee))
10919 Callee = DAG.getTargetGlobalAddress(SymbolicCallee->getGlobal(),
10920 SDLoc(SymbolicCallee),
10921 SymbolicCallee->getValueType(0));
10922
10923 // Get the real number of arguments participating in the call <numArgs>
10925 unsigned NumArgs = NArgVal->getAsZExtVal();
10926
10927 // Skip the four meta args: <id>, <numNopBytes>, <target>, <numArgs>
10928 // Intrinsics include all meta-operands up to but not including CC.
10929 unsigned NumMetaOpers = PatchPointOpers::CCPos;
10930 assert(CB.arg_size() >= NumMetaOpers + NumArgs &&
10931 "Not enough arguments provided to the patchpoint intrinsic");
10932
10933 // For AnyRegCC the arguments are lowered later on manually.
10934 unsigned NumCallArgs = IsAnyRegCC ? 0 : NumArgs;
10935 Type *ReturnTy =
10936 IsAnyRegCC ? Type::getVoidTy(*DAG.getContext()) : CB.getType();
10937
10938 TargetLowering::CallLoweringInfo CLI(DAG);
10939 populateCallLoweringInfo(CLI, &CB, NumMetaOpers, NumCallArgs, Callee,
10940 ReturnTy, CB.getAttributes().getRetAttrs(), true);
10941 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
10942
10943 SDNode *CallEnd = Result.second.getNode();
10944 if (CallEnd->getOpcode() == ISD::EH_LABEL)
10945 CallEnd = CallEnd->getOperand(0).getNode();
10946 if (HasDef && (CallEnd->getOpcode() == ISD::CopyFromReg))
10947 CallEnd = CallEnd->getOperand(0).getNode();
10948
10949 /// Get a call instruction from the call sequence chain.
10950 /// Tail calls are not allowed.
10951 assert(CallEnd->getOpcode() == ISD::CALLSEQ_END &&
10952 "Expected a callseq node.");
10953 SDNode *Call = CallEnd->getOperand(0).getNode();
10954 bool HasGlue = Call->getGluedNode();
10955
10956 // Replace the target specific call node with the patchable intrinsic.
10958
10959 // Push the chain.
10960 Ops.push_back(*(Call->op_begin()));
10961
10962 // Optionally, push the glue (if any).
10963 if (HasGlue)
10964 Ops.push_back(*(Call->op_end() - 1));
10965
10966 // Push the register mask info.
10967 if (HasGlue)
10968 Ops.push_back(*(Call->op_end() - 2));
10969 else
10970 Ops.push_back(*(Call->op_end() - 1));
10971
10972 // Add the <id> and <numBytes> constants.
10974 Ops.push_back(DAG.getTargetConstant(IDVal->getAsZExtVal(), dl, MVT::i64));
10976 Ops.push_back(DAG.getTargetConstant(NBytesVal->getAsZExtVal(), dl, MVT::i32));
10977
10978 // Add the callee.
10979 Ops.push_back(Callee);
10980
10981 // Adjust <numArgs> to account for any arguments that have been passed on the
10982 // stack instead.
10983 // Call Node: Chain, Target, {Args}, RegMask, [Glue]
10984 unsigned NumCallRegArgs = Call->getNumOperands() - (HasGlue ? 4 : 3);
10985 NumCallRegArgs = IsAnyRegCC ? NumArgs : NumCallRegArgs;
10986 Ops.push_back(DAG.getTargetConstant(NumCallRegArgs, dl, MVT::i32));
10987
10988 // Add the calling convention
10989 Ops.push_back(DAG.getTargetConstant((unsigned)CC, dl, MVT::i32));
10990
10991 // Add the arguments we omitted previously. The register allocator should
10992 // place these in any free register.
10993 if (IsAnyRegCC)
10994 for (unsigned i = NumMetaOpers, e = NumMetaOpers + NumArgs; i != e; ++i)
10995 Ops.push_back(getValue(CB.getArgOperand(i)));
10996
10997 // Push the arguments from the call instruction.
10998 SDNode::op_iterator e = HasGlue ? Call->op_end()-2 : Call->op_end()-1;
10999 Ops.append(Call->op_begin() + 2, e);
11000
11001 // Push live variables for the stack map.
11002 addStackMapLiveVars(CB, NumMetaOpers + NumArgs, dl, Ops, *this);
11003
11004 SDVTList NodeTys;
11005 if (IsAnyRegCC && HasDef) {
11006 // Create the return types based on the intrinsic definition
11007 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11008 SmallVector<EVT, 3> ValueVTs;
11009 ComputeValueVTs(TLI, DAG.getDataLayout(), CB.getType(), ValueVTs);
11010 assert(ValueVTs.size() == 1 && "Expected only one return value type.");
11011
11012 // There is always a chain and a glue type at the end
11013 ValueVTs.push_back(MVT::Other);
11014 ValueVTs.push_back(MVT::Glue);
11015 NodeTys = DAG.getVTList(ValueVTs);
11016 } else
11017 NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
11018
11019 // Replace the target specific call node with a PATCHPOINT node.
11020 SDValue PPV = DAG.getNode(ISD::PATCHPOINT, dl, NodeTys, Ops);
11021
11022 // Update the NodeMap.
11023 if (HasDef) {
11024 if (IsAnyRegCC)
11025 setValue(&CB, SDValue(PPV.getNode(), 0));
11026 else
11027 setValue(&CB, Result.first);
11028 }
11029
11030 // Fixup the consumers of the intrinsic. The chain and glue may be used in the
11031 // call sequence. Furthermore the location of the chain and glue can change
11032 // when the AnyReg calling convention is used and the intrinsic returns a
11033 // value.
11034 if (IsAnyRegCC && HasDef) {
11035 SDValue From[] = {SDValue(Call, 0), SDValue(Call, 1)};
11036 SDValue To[] = {PPV.getValue(1), PPV.getValue(2)};
11037 DAG.ReplaceAllUsesOfValuesWith(From, To, 2);
11038 } else
11039 DAG.ReplaceAllUsesWith(Call, PPV.getNode());
11040 DAG.DeleteNode(Call);
11041
11042 // Inform the Frame Information that we have a patchpoint in this function.
11043 FuncInfo.MF->getFrameInfo().setHasPatchPoint();
11044}
11045
11046void SelectionDAGBuilder::visitVectorReduce(const CallInst &I,
11047 unsigned Intrinsic) {
11048 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11049 SDValue Op1 = getValue(I.getArgOperand(0));
11050 SDValue Op2;
11051 if (I.arg_size() > 1)
11052 Op2 = getValue(I.getArgOperand(1));
11053 SDLoc dl = getCurSDLoc();
11054 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
11055 SDValue Res;
11056 SDNodeFlags SDFlags;
11057 if (auto *FPMO = dyn_cast<FPMathOperator>(&I))
11058 SDFlags.copyFMF(*FPMO);
11059
11060 switch (Intrinsic) {
11061 case Intrinsic::vector_reduce_fadd:
11062 if (SDFlags.hasAllowReassociation())
11063 Res = DAG.getNode(ISD::FADD, dl, VT, Op1,
11064 DAG.getNode(ISD::VECREDUCE_FADD, dl, VT, Op2, SDFlags),
11065 SDFlags);
11066 else
11067 Res = DAG.getNode(ISD::VECREDUCE_SEQ_FADD, dl, VT, Op1, Op2, SDFlags);
11068 break;
11069 case Intrinsic::vector_reduce_fmul:
11070 if (SDFlags.hasAllowReassociation())
11071 Res = DAG.getNode(ISD::FMUL, dl, VT, Op1,
11072 DAG.getNode(ISD::VECREDUCE_FMUL, dl, VT, Op2, SDFlags),
11073 SDFlags);
11074 else
11075 Res = DAG.getNode(ISD::VECREDUCE_SEQ_FMUL, dl, VT, Op1, Op2, SDFlags);
11076 break;
11077 case Intrinsic::vector_reduce_add:
11078 Res = DAG.getNode(ISD::VECREDUCE_ADD, dl, VT, Op1);
11079 break;
11080 case Intrinsic::vector_reduce_mul:
11081 Res = DAG.getNode(ISD::VECREDUCE_MUL, dl, VT, Op1);
11082 break;
11083 case Intrinsic::vector_reduce_and:
11084 Res = DAG.getNode(ISD::VECREDUCE_AND, dl, VT, Op1);
11085 break;
11086 case Intrinsic::vector_reduce_or:
11087 Res = DAG.getNode(ISD::VECREDUCE_OR, dl, VT, Op1);
11088 break;
11089 case Intrinsic::vector_reduce_xor:
11090 Res = DAG.getNode(ISD::VECREDUCE_XOR, dl, VT, Op1);
11091 break;
11092 case Intrinsic::vector_reduce_smax:
11093 Res = DAG.getNode(ISD::VECREDUCE_SMAX, dl, VT, Op1);
11094 break;
11095 case Intrinsic::vector_reduce_smin:
11096 Res = DAG.getNode(ISD::VECREDUCE_SMIN, dl, VT, Op1);
11097 break;
11098 case Intrinsic::vector_reduce_umax:
11099 Res = DAG.getNode(ISD::VECREDUCE_UMAX, dl, VT, Op1);
11100 break;
11101 case Intrinsic::vector_reduce_umin:
11102 Res = DAG.getNode(ISD::VECREDUCE_UMIN, dl, VT, Op1);
11103 break;
11104 case Intrinsic::vector_reduce_fmax:
11105 Res = DAG.getNode(ISD::VECREDUCE_FMAX, dl, VT, Op1, SDFlags);
11106 break;
11107 case Intrinsic::vector_reduce_fmin:
11108 Res = DAG.getNode(ISD::VECREDUCE_FMIN, dl, VT, Op1, SDFlags);
11109 break;
11110 case Intrinsic::vector_reduce_fmaximum:
11111 Res = DAG.getNode(ISD::VECREDUCE_FMAXIMUM, dl, VT, Op1, SDFlags);
11112 break;
11113 case Intrinsic::vector_reduce_fminimum:
11114 Res = DAG.getNode(ISD::VECREDUCE_FMINIMUM, dl, VT, Op1, SDFlags);
11115 break;
11116 default:
11117 llvm_unreachable("Unhandled vector reduce intrinsic");
11118 }
11119 setValue(&I, Res);
11120}
11121
11122/// Returns an AttributeList representing the attributes applied to the return
11123/// value of the given call.
11126 if (CLI.RetSExt)
11127 Attrs.push_back(Attribute::SExt);
11128 if (CLI.RetZExt)
11129 Attrs.push_back(Attribute::ZExt);
11130 if (CLI.IsInReg)
11131 Attrs.push_back(Attribute::InReg);
11132
11133 return AttributeList::get(CLI.RetTy->getContext(), AttributeList::ReturnIndex,
11134 Attrs);
11135}
11136
11137/// TargetLowering::LowerCallTo - This is the default LowerCallTo
11138/// implementation, which just calls LowerCall.
11139/// FIXME: When all targets are
11140/// migrated to using LowerCall, this hook should be integrated into SDISel.
11141std::pair<SDValue, SDValue>
11143 LLVMContext &Context = CLI.RetTy->getContext();
11144
11145 // Handle the incoming return values from the call.
11146 CLI.Ins.clear();
11147 SmallVector<Type *, 4> RetOrigTys;
11149 auto &DL = CLI.DAG.getDataLayout();
11150 ComputeValueTypes(DL, CLI.OrigRetTy, RetOrigTys, &Offsets);
11151
11152 SmallVector<EVT, 4> RetVTs;
11153 if (CLI.RetTy != CLI.OrigRetTy) {
11154 assert(RetOrigTys.size() == 1 &&
11155 "Only supported for non-aggregate returns");
11156 RetVTs.push_back(getValueType(DL, CLI.RetTy));
11157 } else {
11158 for (Type *Ty : RetOrigTys)
11159 RetVTs.push_back(getValueType(DL, Ty));
11160 }
11161
11162 if (CLI.IsPostTypeLegalization) {
11163 // If we are lowering a libcall after legalization, split the return type.
11164 SmallVector<Type *, 4> OldRetOrigTys;
11165 SmallVector<EVT, 4> OldRetVTs;
11166 SmallVector<TypeSize, 4> OldOffsets;
11167 RetOrigTys.swap(OldRetOrigTys);
11168 RetVTs.swap(OldRetVTs);
11169 Offsets.swap(OldOffsets);
11170
11171 for (size_t i = 0, e = OldRetVTs.size(); i != e; ++i) {
11172 EVT RetVT = OldRetVTs[i];
11173 uint64_t Offset = OldOffsets[i];
11174 MVT RegisterVT = getRegisterType(Context, RetVT);
11175 unsigned NumRegs = getNumRegisters(Context, RetVT);
11176 unsigned RegisterVTByteSZ = RegisterVT.getSizeInBits() / 8;
11177 RetOrigTys.append(NumRegs, OldRetOrigTys[i]);
11178 RetVTs.append(NumRegs, RegisterVT);
11179 for (unsigned j = 0; j != NumRegs; ++j)
11180 Offsets.push_back(TypeSize::getFixed(Offset + j * RegisterVTByteSZ));
11181 }
11182 }
11183
11185 GetReturnInfo(CLI.CallConv, CLI.RetTy, getReturnAttrs(CLI), Outs, *this, DL);
11186
11187 bool CanLowerReturn =
11189 CLI.IsVarArg, Outs, Context, CLI.RetTy);
11190
11191 SDValue DemoteStackSlot;
11192 int DemoteStackIdx = -100;
11193 if (!CanLowerReturn) {
11194 // FIXME: equivalent assert?
11195 // assert(!CS.hasInAllocaArgument() &&
11196 // "sret demotion is incompatible with inalloca");
11197 uint64_t TySize = DL.getTypeAllocSize(CLI.RetTy);
11198 Align Alignment = DL.getPrefTypeAlign(CLI.RetTy);
11200 DemoteStackIdx =
11201 MF.getFrameInfo().CreateStackObject(TySize, Alignment, false);
11202 Type *StackSlotPtrType = PointerType::get(Context, DL.getAllocaAddrSpace());
11203
11204 DemoteStackSlot = CLI.DAG.getFrameIndex(DemoteStackIdx, getFrameIndexTy(DL));
11205 ArgListEntry Entry(DemoteStackSlot, StackSlotPtrType);
11206 Entry.IsSRet = true;
11207 Entry.Alignment = Alignment;
11208 CLI.getArgs().insert(CLI.getArgs().begin(), Entry);
11209 CLI.NumFixedArgs += 1;
11210 CLI.getArgs()[0].IndirectType = CLI.RetTy;
11211 CLI.RetTy = CLI.OrigRetTy = Type::getVoidTy(Context);
11212
11213 // sret demotion isn't compatible with tail-calls, since the sret argument
11214 // points into the callers stack frame.
11215 CLI.IsTailCall = false;
11216 } else {
11217 bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
11218 CLI.RetTy, CLI.CallConv, CLI.IsVarArg, DL);
11219 for (unsigned I = 0, E = RetVTs.size(); I != E; ++I) {
11220 ISD::ArgFlagsTy Flags;
11221 if (NeedsRegBlock) {
11222 Flags.setInConsecutiveRegs();
11223 if (I == RetVTs.size() - 1)
11224 Flags.setInConsecutiveRegsLast();
11225 }
11226 EVT VT = RetVTs[I];
11227 MVT RegisterVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11228 unsigned NumRegs =
11229 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11230 for (unsigned i = 0; i != NumRegs; ++i) {
11231 ISD::InputArg Ret(Flags, RegisterVT, VT, RetOrigTys[I],
11233 if (CLI.RetTy->isPointerTy()) {
11234 Ret.Flags.setPointer();
11236 cast<PointerType>(CLI.RetTy)->getAddressSpace());
11237 }
11238 if (CLI.RetSExt)
11239 Ret.Flags.setSExt();
11240 if (CLI.RetZExt)
11241 Ret.Flags.setZExt();
11242 if (CLI.IsInReg)
11243 Ret.Flags.setInReg();
11244 CLI.Ins.push_back(Ret);
11245 }
11246 }
11247 }
11248
11249 // We push in swifterror return as the last element of CLI.Ins.
11250 ArgListTy &Args = CLI.getArgs();
11251 if (supportSwiftError()) {
11252 for (const ArgListEntry &Arg : Args) {
11253 if (Arg.IsSwiftError) {
11254 ISD::ArgFlagsTy Flags;
11255 Flags.setSwiftError();
11257 PointerType::getUnqual(Context),
11258 /*Used=*/true, ISD::InputArg::NoArgIndex, 0);
11259 CLI.Ins.push_back(Ret);
11260 }
11261 }
11262 }
11263
11264 // Handle all of the outgoing arguments.
11265 CLI.Outs.clear();
11266 CLI.OutVals.clear();
11267 for (unsigned i = 0, e = Args.size(); i != e; ++i) {
11268 SmallVector<Type *, 4> OrigArgTys;
11269 ComputeValueTypes(DL, Args[i].OrigTy, OrigArgTys);
11270 // FIXME: Split arguments if CLI.IsPostTypeLegalization
11271 Type *FinalType = Args[i].Ty;
11272 if (Args[i].IsByVal)
11273 FinalType = Args[i].IndirectType;
11274 bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
11275 FinalType, CLI.CallConv, CLI.IsVarArg, DL);
11276 for (unsigned Value = 0, NumValues = OrigArgTys.size(); Value != NumValues;
11277 ++Value) {
11278 Type *OrigArgTy = OrigArgTys[Value];
11279 Type *ArgTy = OrigArgTy;
11280 if (Args[i].Ty != Args[i].OrigTy) {
11281 assert(Value == 0 && "Only supported for non-aggregate arguments");
11282 ArgTy = Args[i].Ty;
11283 }
11284
11285 EVT VT = getValueType(DL, ArgTy);
11286 SDValue Op = SDValue(Args[i].Node.getNode(),
11287 Args[i].Node.getResNo() + Value);
11288 ISD::ArgFlagsTy Flags;
11289
11290 // Certain targets (such as MIPS), may have a different ABI alignment
11291 // for a type depending on the context. Give the target a chance to
11292 // specify the alignment it wants.
11293 const Align OriginalAlignment(getABIAlignmentForCallingConv(ArgTy, DL));
11294 Flags.setOrigAlign(OriginalAlignment);
11295
11296 if (i >= CLI.NumFixedArgs)
11297 Flags.setVarArg();
11298 if (ArgTy->isPointerTy()) {
11299 Flags.setPointer();
11300 Flags.setPointerAddrSpace(cast<PointerType>(ArgTy)->getAddressSpace());
11301 }
11302 if (Args[i].IsZExt)
11303 Flags.setZExt();
11304 if (Args[i].IsSExt)
11305 Flags.setSExt();
11306 if (Args[i].IsNoExt)
11307 Flags.setNoExt();
11308 if (Args[i].IsInReg) {
11309 // If we are using vectorcall calling convention, a structure that is
11310 // passed InReg - is surely an HVA
11312 isa<StructType>(FinalType)) {
11313 // The first value of a structure is marked
11314 if (0 == Value)
11315 Flags.setHvaStart();
11316 Flags.setHva();
11317 }
11318 // Set InReg Flag
11319 Flags.setInReg();
11320 }
11321 if (Args[i].IsSRet)
11322 Flags.setSRet();
11323 if (Args[i].IsSwiftSelf)
11324 Flags.setSwiftSelf();
11325 if (Args[i].IsSwiftAsync)
11326 Flags.setSwiftAsync();
11327 if (Args[i].IsSwiftError)
11328 Flags.setSwiftError();
11329 if (Args[i].IsCFGuardTarget)
11330 Flags.setCFGuardTarget();
11331 if (Args[i].IsByVal)
11332 Flags.setByVal();
11333 if (Args[i].IsByRef)
11334 Flags.setByRef();
11335 if (Args[i].IsPreallocated) {
11336 Flags.setPreallocated();
11337 // Set the byval flag for CCAssignFn callbacks that don't know about
11338 // preallocated. This way we can know how many bytes we should've
11339 // allocated and how many bytes a callee cleanup function will pop. If
11340 // we port preallocated to more targets, we'll have to add custom
11341 // preallocated handling in the various CC lowering callbacks.
11342 Flags.setByVal();
11343 }
11344 if (Args[i].IsInAlloca) {
11345 Flags.setInAlloca();
11346 // Set the byval flag for CCAssignFn callbacks that don't know about
11347 // inalloca. This way we can know how many bytes we should've allocated
11348 // and how many bytes a callee cleanup function will pop. If we port
11349 // inalloca to more targets, we'll have to add custom inalloca handling
11350 // in the various CC lowering callbacks.
11351 Flags.setByVal();
11352 }
11353 Align MemAlign;
11354 if (Args[i].IsByVal || Args[i].IsInAlloca || Args[i].IsPreallocated) {
11355 unsigned FrameSize = DL.getTypeAllocSize(Args[i].IndirectType);
11356 Flags.setByValSize(FrameSize);
11357
11358 // info is not there but there are cases it cannot get right.
11359 if (auto MA = Args[i].Alignment)
11360 MemAlign = *MA;
11361 else
11362 MemAlign = getByValTypeAlignment(Args[i].IndirectType, DL);
11363 } else if (auto MA = Args[i].Alignment) {
11364 MemAlign = *MA;
11365 } else {
11366 MemAlign = OriginalAlignment;
11367 }
11368 Flags.setMemAlign(MemAlign);
11369 if (Args[i].IsNest)
11370 Flags.setNest();
11371 if (NeedsRegBlock)
11372 Flags.setInConsecutiveRegs();
11373
11374 MVT PartVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11375 unsigned NumParts =
11376 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11377 SmallVector<SDValue, 4> Parts(NumParts);
11378 ISD::NodeType ExtendKind = ISD::ANY_EXTEND;
11379
11380 if (Args[i].IsSExt)
11381 ExtendKind = ISD::SIGN_EXTEND;
11382 else if (Args[i].IsZExt)
11383 ExtendKind = ISD::ZERO_EXTEND;
11384
11385 // Conservatively only handle 'returned' on non-vectors that can be lowered,
11386 // for now.
11387 if (Args[i].IsReturned && !Op.getValueType().isVector() &&
11389 assert((CLI.RetTy == Args[i].Ty ||
11390 (CLI.RetTy->isPointerTy() && Args[i].Ty->isPointerTy() &&
11392 Args[i].Ty->getPointerAddressSpace())) &&
11393 RetVTs.size() == NumValues && "unexpected use of 'returned'");
11394 // Before passing 'returned' to the target lowering code, ensure that
11395 // either the register MVT and the actual EVT are the same size or that
11396 // the return value and argument are extended in the same way; in these
11397 // cases it's safe to pass the argument register value unchanged as the
11398 // return register value (although it's at the target's option whether
11399 // to do so)
11400 // TODO: allow code generation to take advantage of partially preserved
11401 // registers rather than clobbering the entire register when the
11402 // parameter extension method is not compatible with the return
11403 // extension method
11404 if ((NumParts * PartVT.getSizeInBits() == VT.getSizeInBits()) ||
11405 (ExtendKind != ISD::ANY_EXTEND && CLI.RetSExt == Args[i].IsSExt &&
11406 CLI.RetZExt == Args[i].IsZExt))
11407 Flags.setReturned();
11408 }
11409
11410 getCopyToParts(CLI.DAG, CLI.DL, Op, &Parts[0], NumParts, PartVT, CLI.CB,
11411 CLI.CallConv, ExtendKind);
11412
11413 for (unsigned j = 0; j != NumParts; ++j) {
11414 // if it isn't first piece, alignment must be 1
11415 // For scalable vectors the scalable part is currently handled
11416 // by individual targets, so we just use the known minimum size here.
11417 ISD::OutputArg MyFlags(
11418 Flags, Parts[j].getValueType().getSimpleVT(), VT, OrigArgTy, i,
11419 j * Parts[j].getValueType().getStoreSize().getKnownMinValue());
11420 if (NumParts > 1 && j == 0)
11421 MyFlags.Flags.setSplit();
11422 else if (j != 0) {
11423 MyFlags.Flags.setOrigAlign(Align(1));
11424 if (j == NumParts - 1)
11425 MyFlags.Flags.setSplitEnd();
11426 }
11427
11428 CLI.Outs.push_back(MyFlags);
11429 CLI.OutVals.push_back(Parts[j]);
11430 }
11431
11432 if (NeedsRegBlock && Value == NumValues - 1)
11433 CLI.Outs[CLI.Outs.size() - 1].Flags.setInConsecutiveRegsLast();
11434 }
11435 }
11436
11438 CLI.Chain = LowerCall(CLI, InVals);
11439
11440 // Update CLI.InVals to use outside of this function.
11441 CLI.InVals = InVals;
11442
11443 // Verify that the target's LowerCall behaved as expected.
11444 assert(CLI.Chain.getNode() && CLI.Chain.getValueType() == MVT::Other &&
11445 "LowerCall didn't return a valid chain!");
11446 assert((!CLI.IsTailCall || InVals.empty()) &&
11447 "LowerCall emitted a return value for a tail call!");
11448 assert((CLI.IsTailCall || InVals.size() == CLI.Ins.size()) &&
11449 "LowerCall didn't emit the correct number of values!");
11450
11451 // For a tail call, the return value is merely live-out and there aren't
11452 // any nodes in the DAG representing it. Return a special value to
11453 // indicate that a tail call has been emitted and no more Instructions
11454 // should be processed in the current block.
11455 if (CLI.IsTailCall) {
11456 CLI.DAG.setRoot(CLI.Chain);
11457 return std::make_pair(SDValue(), SDValue());
11458 }
11459
11460#ifndef NDEBUG
11461 for (unsigned i = 0, e = CLI.Ins.size(); i != e; ++i) {
11462 assert(InVals[i].getNode() && "LowerCall emitted a null value!");
11463 assert(EVT(CLI.Ins[i].VT) == InVals[i].getValueType() &&
11464 "LowerCall emitted a value with the wrong type!");
11465 }
11466#endif
11467
11468 SmallVector<SDValue, 4> ReturnValues;
11469 if (!CanLowerReturn) {
11470 // The instruction result is the result of loading from the
11471 // hidden sret parameter.
11472 MVT PtrVT = getPointerTy(DL, DL.getAllocaAddrSpace());
11473
11474 unsigned NumValues = RetVTs.size();
11475 ReturnValues.resize(NumValues);
11476 SmallVector<SDValue, 4> Chains(NumValues);
11477
11478 // An aggregate return value cannot wrap around the address space, so
11479 // offsets to its parts don't wrap either.
11481 Align HiddenSRetAlign = MF.getFrameInfo().getObjectAlign(DemoteStackIdx);
11482 for (unsigned i = 0; i < NumValues; ++i) {
11484 DemoteStackSlot, CLI.DAG.getConstant(Offsets[i], CLI.DL, PtrVT),
11486 SDValue L = CLI.DAG.getLoad(
11487 RetVTs[i], CLI.DL, CLI.Chain, Add,
11489 DemoteStackIdx, Offsets[i]),
11490 HiddenSRetAlign);
11491 ReturnValues[i] = L;
11492 Chains[i] = L.getValue(1);
11493 }
11494
11495 CLI.Chain = CLI.DAG.getNode(ISD::TokenFactor, CLI.DL, MVT::Other, Chains);
11496 } else {
11497 // Collect the legal value parts into potentially illegal values
11498 // that correspond to the original function's return values.
11499 std::optional<ISD::NodeType> AssertOp;
11500 if (CLI.RetSExt)
11501 AssertOp = ISD::AssertSext;
11502 else if (CLI.RetZExt)
11503 AssertOp = ISD::AssertZext;
11504 unsigned CurReg = 0;
11505 for (EVT VT : RetVTs) {
11506 MVT RegisterVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11507 unsigned NumRegs =
11508 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11509
11510 ReturnValues.push_back(getCopyFromParts(
11511 CLI.DAG, CLI.DL, &InVals[CurReg], NumRegs, RegisterVT, VT, nullptr,
11512 CLI.Chain, CLI.CallConv, AssertOp));
11513 CurReg += NumRegs;
11514 }
11515
11516 // For a function returning void, there is no return value. We can't create
11517 // such a node, so we just return a null return value in that case. In
11518 // that case, nothing will actually look at the value.
11519 if (ReturnValues.empty())
11520 return std::make_pair(SDValue(), CLI.Chain);
11521 }
11522
11523 SDValue Res = CLI.DAG.getNode(ISD::MERGE_VALUES, CLI.DL,
11524 CLI.DAG.getVTList(RetVTs), ReturnValues);
11525 return std::make_pair(Res, CLI.Chain);
11526}
11527
11528/// Places new result values for the node in Results (their number
11529/// and types must exactly match those of the original return values of
11530/// the node), or leaves Results empty, which indicates that the node is not
11531/// to be custom lowered after all.
11534 SelectionDAG &DAG) const {
11535 SDValue Res = LowerOperation(SDValue(N, 0), DAG);
11536
11537 if (!Res.getNode())
11538 return;
11539
11540 // If the original node has one result, take the return value from
11541 // LowerOperation as is. It might not be result number 0.
11542 if (N->getNumValues() == 1) {
11543 Results.push_back(Res);
11544 return;
11545 }
11546
11547 // If the original node has multiple results, then the return node should
11548 // have the same number of results.
11549 assert((N->getNumValues() == Res->getNumValues()) &&
11550 "Lowering returned the wrong number of results!");
11551
11552 // Places new result values base on N result number.
11553 for (unsigned I = 0, E = N->getNumValues(); I != E; ++I)
11554 Results.push_back(Res.getValue(I));
11555}
11556
11558 llvm_unreachable("LowerOperation not implemented for this target!");
11559}
11560
11562 Register Reg,
11563 ISD::NodeType ExtendType) {
11565 assert((Op.getOpcode() != ISD::CopyFromReg ||
11566 cast<RegisterSDNode>(Op.getOperand(1))->getReg() != Reg) &&
11567 "Copy from a reg to the same reg!");
11568 assert(!Reg.isPhysical() && "Is a physreg");
11569
11570 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11571 // If this is an InlineAsm we have to match the registers required, not the
11572 // notional registers required by the type.
11573
11574 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), Reg, V->getType(),
11575 std::nullopt); // This is not an ABI copy.
11576 SDValue Chain = DAG.getEntryNode();
11577
11578 if (ExtendType == ISD::ANY_EXTEND) {
11579 auto PreferredExtendIt = FuncInfo.PreferredExtendType.find(V);
11580 if (PreferredExtendIt != FuncInfo.PreferredExtendType.end())
11581 ExtendType = PreferredExtendIt->second;
11582 }
11583 RFV.getCopyToRegs(Op, DAG, getCurSDLoc(), Chain, nullptr, V, ExtendType);
11584 PendingExports.push_back(Chain);
11585}
11586
11588
11589/// isOnlyUsedInEntryBlock - If the specified argument is only used in the
11590/// entry block, return true. This includes arguments used by switches, since
11591/// the switch may expand into multiple basic blocks.
11592static bool isOnlyUsedInEntryBlock(const Argument *A, bool FastISel) {
11593 // With FastISel active, we may be splitting blocks, so force creation
11594 // of virtual registers for all non-dead arguments.
11595 if (FastISel)
11596 return A->use_empty();
11597
11598 const BasicBlock &Entry = A->getParent()->front();
11599 for (const User *U : A->users())
11600 if (cast<Instruction>(U)->getParent() != &Entry || isa<SwitchInst>(U))
11601 return false; // Use not in entry block.
11602
11603 return true;
11604}
11605
11607 DenseMap<const Argument *,
11608 std::pair<const AllocaInst *, const StoreInst *>>;
11609
11610/// Scan the entry block of the function in FuncInfo for arguments that look
11611/// like copies into a local alloca. Record any copied arguments in
11612/// ArgCopyElisionCandidates.
11613static void
11615 FunctionLoweringInfo *FuncInfo,
11616 ArgCopyElisionMapTy &ArgCopyElisionCandidates) {
11617 // Record the state of every static alloca used in the entry block. Argument
11618 // allocas are all used in the entry block, so we need approximately as many
11619 // entries as we have arguments.
11620 enum StaticAllocaInfo { Unknown, Clobbered, Elidable };
11622 unsigned NumArgs = FuncInfo->Fn->arg_size();
11623 StaticAllocas.reserve(NumArgs * 2);
11624
11625 auto GetInfoIfStaticAlloca = [&](const Value *V) -> StaticAllocaInfo * {
11626 if (!V)
11627 return nullptr;
11628 V = V->stripPointerCasts();
11629 const auto *AI = dyn_cast<AllocaInst>(V);
11630 if (!AI || !AI->isStaticAlloca() || !FuncInfo->StaticAllocaMap.count(AI))
11631 return nullptr;
11632 auto Iter = StaticAllocas.insert({AI, Unknown});
11633 return &Iter.first->second;
11634 };
11635
11636 // Look for stores of arguments to static allocas. Look through bitcasts and
11637 // GEPs to handle type coercions, as long as the alloca is fully initialized
11638 // by the store. Any non-store use of an alloca escapes it and any subsequent
11639 // unanalyzed store might write it.
11640 // FIXME: Handle structs initialized with multiple stores.
11641 for (const Instruction &I : FuncInfo->Fn->getEntryBlock()) {
11642 // Look for stores, and handle non-store uses conservatively.
11643 const auto *SI = dyn_cast<StoreInst>(&I);
11644 if (!SI) {
11645 // We will look through cast uses, so ignore them completely.
11646 if (I.isCast())
11647 continue;
11648 // Ignore debug info and pseudo op intrinsics, they don't escape or store
11649 // to allocas.
11650 if (I.isDebugOrPseudoInst())
11651 continue;
11652 // This is an unknown instruction. Assume it escapes or writes to all
11653 // static alloca operands.
11654 for (const Use &U : I.operands()) {
11655 if (StaticAllocaInfo *Info = GetInfoIfStaticAlloca(U))
11656 *Info = StaticAllocaInfo::Clobbered;
11657 }
11658 continue;
11659 }
11660
11661 // If the stored value is a static alloca, mark it as escaped.
11662 if (StaticAllocaInfo *Info = GetInfoIfStaticAlloca(SI->getValueOperand()))
11663 *Info = StaticAllocaInfo::Clobbered;
11664
11665 // Check if the destination is a static alloca.
11666 const Value *Dst = SI->getPointerOperand()->stripPointerCasts();
11667 StaticAllocaInfo *Info = GetInfoIfStaticAlloca(Dst);
11668 if (!Info)
11669 continue;
11670 const AllocaInst *AI = cast<AllocaInst>(Dst);
11671
11672 // Skip allocas that have been initialized or clobbered.
11673 if (*Info != StaticAllocaInfo::Unknown)
11674 continue;
11675
11676 // Check if the stored value is an argument, and that this store fully
11677 // initializes the alloca.
11678 // If the argument type has padding bits we can't directly forward a pointer
11679 // as the upper bits may contain garbage.
11680 // Don't elide copies from the same argument twice.
11681 const Value *Val = SI->getValueOperand()->stripPointerCasts();
11682 const auto *Arg = dyn_cast<Argument>(Val);
11683 if (!Arg || Arg->hasPassPointeeByValueCopyAttr() ||
11684 Arg->getType()->isEmptyTy() ||
11685 DL.getTypeStoreSize(Arg->getType()) !=
11686 DL.getTypeAllocSize(AI->getAllocatedType()) ||
11687 !DL.typeSizeEqualsStoreSize(Arg->getType()) ||
11688 ArgCopyElisionCandidates.count(Arg)) {
11689 *Info = StaticAllocaInfo::Clobbered;
11690 continue;
11691 }
11692
11693 LLVM_DEBUG(dbgs() << "Found argument copy elision candidate: " << *AI
11694 << '\n');
11695
11696 // Mark this alloca and store for argument copy elision.
11697 *Info = StaticAllocaInfo::Elidable;
11698 ArgCopyElisionCandidates.insert({Arg, {AI, SI}});
11699
11700 // Stop scanning if we've seen all arguments. This will happen early in -O0
11701 // builds, which is useful, because -O0 builds have large entry blocks and
11702 // many allocas.
11703 if (ArgCopyElisionCandidates.size() == NumArgs)
11704 break;
11705 }
11706}
11707
11708/// Try to elide argument copies from memory into a local alloca. Succeeds if
11709/// ArgVal is a load from a suitable fixed stack object.
11712 DenseMap<int, int> &ArgCopyElisionFrameIndexMap,
11713 SmallPtrSetImpl<const Instruction *> &ElidedArgCopyInstrs,
11714 ArgCopyElisionMapTy &ArgCopyElisionCandidates, const Argument &Arg,
11715 ArrayRef<SDValue> ArgVals, bool &ArgHasUses) {
11716 // Check if this is a load from a fixed stack object.
11717 auto *LNode = dyn_cast<LoadSDNode>(ArgVals[0]);
11718 if (!LNode)
11719 return;
11720 auto *FINode = dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode());
11721 if (!FINode)
11722 return;
11723
11724 // Check that the fixed stack object is the right size and alignment.
11725 // Look at the alignment that the user wrote on the alloca instead of looking
11726 // at the stack object.
11727 auto ArgCopyIter = ArgCopyElisionCandidates.find(&Arg);
11728 assert(ArgCopyIter != ArgCopyElisionCandidates.end());
11729 const AllocaInst *AI = ArgCopyIter->second.first;
11730 int FixedIndex = FINode->getIndex();
11731 int &AllocaIndex = FuncInfo.StaticAllocaMap[AI];
11732 int OldIndex = AllocaIndex;
11733 MachineFrameInfo &MFI = FuncInfo.MF->getFrameInfo();
11734 if (MFI.getObjectSize(FixedIndex) != MFI.getObjectSize(OldIndex)) {
11735 LLVM_DEBUG(
11736 dbgs() << " argument copy elision failed due to bad fixed stack "
11737 "object size\n");
11738 return;
11739 }
11740 Align RequiredAlignment = AI->getAlign();
11741 if (MFI.getObjectAlign(FixedIndex) < RequiredAlignment) {
11742 LLVM_DEBUG(dbgs() << " argument copy elision failed: alignment of alloca "
11743 "greater than stack argument alignment ("
11744 << DebugStr(RequiredAlignment) << " vs "
11745 << DebugStr(MFI.getObjectAlign(FixedIndex)) << ")\n");
11746 return;
11747 }
11748
11749 // Perform the elision. Delete the old stack object and replace its only use
11750 // in the variable info map. Mark the stack object as mutable and aliased.
11751 LLVM_DEBUG({
11752 dbgs() << "Eliding argument copy from " << Arg << " to " << *AI << '\n'
11753 << " Replacing frame index " << OldIndex << " with " << FixedIndex
11754 << '\n';
11755 });
11756 MFI.RemoveStackObject(OldIndex);
11757 MFI.setIsImmutableObjectIndex(FixedIndex, false);
11758 MFI.setIsAliasedObjectIndex(FixedIndex, true);
11759 AllocaIndex = FixedIndex;
11760 ArgCopyElisionFrameIndexMap.insert({OldIndex, FixedIndex});
11761 for (SDValue ArgVal : ArgVals)
11762 Chains.push_back(ArgVal.getValue(1));
11763
11764 // Avoid emitting code for the store implementing the copy.
11765 const StoreInst *SI = ArgCopyIter->second.second;
11766 ElidedArgCopyInstrs.insert(SI);
11767
11768 // Check for uses of the argument again so that we can avoid exporting ArgVal
11769 // if it is't used by anything other than the store.
11770 for (const Value *U : Arg.users()) {
11771 if (U != SI) {
11772 ArgHasUses = true;
11773 break;
11774 }
11775 }
11776}
11777
11778void SelectionDAGISel::LowerArguments(const Function &F) {
11779 SelectionDAG &DAG = SDB->DAG;
11780 SDLoc dl = SDB->getCurSDLoc();
11781 const DataLayout &DL = DAG.getDataLayout();
11783
11784 // In Naked functions we aren't going to save any registers.
11785 if (F.hasFnAttribute(Attribute::Naked))
11786 return;
11787
11788 if (!FuncInfo->CanLowerReturn) {
11789 // Put in an sret pointer parameter before all the other parameters.
11790 MVT ValueVT = TLI->getPointerTy(DL, DL.getAllocaAddrSpace());
11791
11792 ISD::ArgFlagsTy Flags;
11793 Flags.setSRet();
11794 MVT RegisterVT = TLI->getRegisterType(*DAG.getContext(), ValueVT);
11795 ISD::InputArg RetArg(Flags, RegisterVT, ValueVT, F.getReturnType(), true,
11797 Ins.push_back(RetArg);
11798 }
11799
11800 // Look for stores of arguments to static allocas. Mark such arguments with a
11801 // flag to ask the target to give us the memory location of that argument if
11802 // available.
11803 ArgCopyElisionMapTy ArgCopyElisionCandidates;
11805 ArgCopyElisionCandidates);
11806
11807 // Set up the incoming argument description vector.
11808 for (const Argument &Arg : F.args()) {
11809 unsigned ArgNo = Arg.getArgNo();
11811 ComputeValueTypes(DAG.getDataLayout(), Arg.getType(), Types);
11812 bool isArgValueUsed = !Arg.use_empty();
11813 Type *FinalType = Arg.getType();
11814 if (Arg.hasAttribute(Attribute::ByVal))
11815 FinalType = Arg.getParamByValType();
11816 bool NeedsRegBlock = TLI->functionArgumentNeedsConsecutiveRegisters(
11817 FinalType, F.getCallingConv(), F.isVarArg(), DL);
11818 for (unsigned Value = 0, NumValues = Types.size(); Value != NumValues;
11819 ++Value) {
11820 Type *ArgTy = Types[Value];
11821 EVT VT = TLI->getValueType(DL, ArgTy);
11822 ISD::ArgFlagsTy Flags;
11823
11824 if (ArgTy->isPointerTy()) {
11825 Flags.setPointer();
11826 Flags.setPointerAddrSpace(cast<PointerType>(ArgTy)->getAddressSpace());
11827 }
11828 if (Arg.hasAttribute(Attribute::ZExt))
11829 Flags.setZExt();
11830 if (Arg.hasAttribute(Attribute::SExt))
11831 Flags.setSExt();
11832 if (Arg.hasAttribute(Attribute::InReg)) {
11833 // If we are using vectorcall calling convention, a structure that is
11834 // passed InReg - is surely an HVA
11835 if (F.getCallingConv() == CallingConv::X86_VectorCall &&
11836 isa<StructType>(Arg.getType())) {
11837 // The first value of a structure is marked
11838 if (0 == Value)
11839 Flags.setHvaStart();
11840 Flags.setHva();
11841 }
11842 // Set InReg Flag
11843 Flags.setInReg();
11844 }
11845 if (Arg.hasAttribute(Attribute::StructRet))
11846 Flags.setSRet();
11847 if (Arg.hasAttribute(Attribute::SwiftSelf))
11848 Flags.setSwiftSelf();
11849 if (Arg.hasAttribute(Attribute::SwiftAsync))
11850 Flags.setSwiftAsync();
11851 if (Arg.hasAttribute(Attribute::SwiftError))
11852 Flags.setSwiftError();
11853 if (Arg.hasAttribute(Attribute::ByVal))
11854 Flags.setByVal();
11855 if (Arg.hasAttribute(Attribute::ByRef))
11856 Flags.setByRef();
11857 if (Arg.hasAttribute(Attribute::InAlloca)) {
11858 Flags.setInAlloca();
11859 // Set the byval flag for CCAssignFn callbacks that don't know about
11860 // inalloca. This way we can know how many bytes we should've allocated
11861 // and how many bytes a callee cleanup function will pop. If we port
11862 // inalloca to more targets, we'll have to add custom inalloca handling
11863 // in the various CC lowering callbacks.
11864 Flags.setByVal();
11865 }
11866 if (Arg.hasAttribute(Attribute::Preallocated)) {
11867 Flags.setPreallocated();
11868 // Set the byval flag for CCAssignFn callbacks that don't know about
11869 // preallocated. This way we can know how many bytes we should've
11870 // allocated and how many bytes a callee cleanup function will pop. If
11871 // we port preallocated to more targets, we'll have to add custom
11872 // preallocated handling in the various CC lowering callbacks.
11873 Flags.setByVal();
11874 }
11875
11876 // Certain targets (such as MIPS), may have a different ABI alignment
11877 // for a type depending on the context. Give the target a chance to
11878 // specify the alignment it wants.
11879 const Align OriginalAlignment(
11880 TLI->getABIAlignmentForCallingConv(ArgTy, DL));
11881 Flags.setOrigAlign(OriginalAlignment);
11882
11883 Align MemAlign;
11884 Type *ArgMemTy = nullptr;
11885 if (Flags.isByVal() || Flags.isInAlloca() || Flags.isPreallocated() ||
11886 Flags.isByRef()) {
11887 if (!ArgMemTy)
11888 ArgMemTy = Arg.getPointeeInMemoryValueType();
11889
11890 uint64_t MemSize = DL.getTypeAllocSize(ArgMemTy);
11891
11892 // For in-memory arguments, size and alignment should be passed from FE.
11893 // BE will guess if this info is not there but there are cases it cannot
11894 // get right.
11895 if (auto ParamAlign = Arg.getParamStackAlign())
11896 MemAlign = *ParamAlign;
11897 else if ((ParamAlign = Arg.getParamAlign()))
11898 MemAlign = *ParamAlign;
11899 else
11900 MemAlign = TLI->getByValTypeAlignment(ArgMemTy, DL);
11901 if (Flags.isByRef())
11902 Flags.setByRefSize(MemSize);
11903 else
11904 Flags.setByValSize(MemSize);
11905 } else if (auto ParamAlign = Arg.getParamStackAlign()) {
11906 MemAlign = *ParamAlign;
11907 } else {
11908 MemAlign = OriginalAlignment;
11909 }
11910 Flags.setMemAlign(MemAlign);
11911
11912 if (Arg.hasAttribute(Attribute::Nest))
11913 Flags.setNest();
11914 if (NeedsRegBlock)
11915 Flags.setInConsecutiveRegs();
11916 if (ArgCopyElisionCandidates.count(&Arg))
11917 Flags.setCopyElisionCandidate();
11918 if (Arg.hasAttribute(Attribute::Returned))
11919 Flags.setReturned();
11920
11921 MVT RegisterVT = TLI->getRegisterTypeForCallingConv(
11922 *CurDAG->getContext(), F.getCallingConv(), VT);
11923 unsigned NumRegs = TLI->getNumRegistersForCallingConv(
11924 *CurDAG->getContext(), F.getCallingConv(), VT);
11925 for (unsigned i = 0; i != NumRegs; ++i) {
11926 // For scalable vectors, use the minimum size; individual targets
11927 // are responsible for handling scalable vector arguments and
11928 // return values.
11929 ISD::InputArg MyFlags(
11930 Flags, RegisterVT, VT, ArgTy, isArgValueUsed, ArgNo,
11931 i * RegisterVT.getStoreSize().getKnownMinValue());
11932 if (NumRegs > 1 && i == 0)
11933 MyFlags.Flags.setSplit();
11934 // if it isn't first piece, alignment must be 1
11935 else if (i > 0) {
11936 MyFlags.Flags.setOrigAlign(Align(1));
11937 if (i == NumRegs - 1)
11938 MyFlags.Flags.setSplitEnd();
11939 }
11940 Ins.push_back(MyFlags);
11941 }
11942 if (NeedsRegBlock && Value == NumValues - 1)
11943 Ins[Ins.size() - 1].Flags.setInConsecutiveRegsLast();
11944 }
11945 }
11946
11947 // Call the target to set up the argument values.
11949 SDValue NewRoot = TLI->LowerFormalArguments(
11950 DAG.getRoot(), F.getCallingConv(), F.isVarArg(), Ins, dl, DAG, InVals);
11951
11952 // Verify that the target's LowerFormalArguments behaved as expected.
11953 assert(NewRoot.getNode() && NewRoot.getValueType() == MVT::Other &&
11954 "LowerFormalArguments didn't return a valid chain!");
11955 assert(InVals.size() == Ins.size() &&
11956 "LowerFormalArguments didn't emit the correct number of values!");
11957 LLVM_DEBUG({
11958 for (unsigned i = 0, e = Ins.size(); i != e; ++i) {
11959 assert(InVals[i].getNode() &&
11960 "LowerFormalArguments emitted a null value!");
11961 assert(EVT(Ins[i].VT) == InVals[i].getValueType() &&
11962 "LowerFormalArguments emitted a value with the wrong type!");
11963 }
11964 });
11965
11966 // Update the DAG with the new chain value resulting from argument lowering.
11967 DAG.setRoot(NewRoot);
11968
11969 // Set up the argument values.
11970 unsigned i = 0;
11971 if (!FuncInfo->CanLowerReturn) {
11972 // Create a virtual register for the sret pointer, and put in a copy
11973 // from the sret argument into it.
11974 MVT VT = TLI->getPointerTy(DL, DL.getAllocaAddrSpace());
11975 MVT RegVT = TLI->getRegisterType(*CurDAG->getContext(), VT);
11976 std::optional<ISD::NodeType> AssertOp;
11977 SDValue ArgValue =
11978 getCopyFromParts(DAG, dl, &InVals[0], 1, RegVT, VT, nullptr, NewRoot,
11979 F.getCallingConv(), AssertOp);
11980
11981 MachineFunction& MF = SDB->DAG.getMachineFunction();
11982 MachineRegisterInfo& RegInfo = MF.getRegInfo();
11983 Register SRetReg =
11984 RegInfo.createVirtualRegister(TLI->getRegClassFor(RegVT));
11985 FuncInfo->DemoteRegister = SRetReg;
11986 NewRoot =
11987 SDB->DAG.getCopyToReg(NewRoot, SDB->getCurSDLoc(), SRetReg, ArgValue);
11988 DAG.setRoot(NewRoot);
11989
11990 // i indexes lowered arguments. Bump it past the hidden sret argument.
11991 ++i;
11992 }
11993
11995 DenseMap<int, int> ArgCopyElisionFrameIndexMap;
11996 for (const Argument &Arg : F.args()) {
11997 SmallVector<SDValue, 4> ArgValues;
11998 SmallVector<EVT, 4> ValueVTs;
11999 ComputeValueVTs(*TLI, DAG.getDataLayout(), Arg.getType(), ValueVTs);
12000 unsigned NumValues = ValueVTs.size();
12001 if (NumValues == 0)
12002 continue;
12003
12004 bool ArgHasUses = !Arg.use_empty();
12005
12006 // Elide the copying store if the target loaded this argument from a
12007 // suitable fixed stack object.
12008 if (Ins[i].Flags.isCopyElisionCandidate()) {
12009 unsigned NumParts = 0;
12010 for (EVT VT : ValueVTs)
12011 NumParts += TLI->getNumRegistersForCallingConv(*CurDAG->getContext(),
12012 F.getCallingConv(), VT);
12013
12014 tryToElideArgumentCopy(*FuncInfo, Chains, ArgCopyElisionFrameIndexMap,
12015 ElidedArgCopyInstrs, ArgCopyElisionCandidates, Arg,
12016 ArrayRef(&InVals[i], NumParts), ArgHasUses);
12017 }
12018
12019 // If this argument is unused then remember its value. It is used to generate
12020 // debugging information.
12021 bool isSwiftErrorArg =
12022 TLI->supportSwiftError() &&
12023 Arg.hasAttribute(Attribute::SwiftError);
12024 if (!ArgHasUses && !isSwiftErrorArg) {
12025 SDB->setUnusedArgValue(&Arg, InVals[i]);
12026
12027 // Also remember any frame index for use in FastISel.
12028 if (FrameIndexSDNode *FI =
12030 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12031 }
12032
12033 for (unsigned Val = 0; Val != NumValues; ++Val) {
12034 EVT VT = ValueVTs[Val];
12035 MVT PartVT = TLI->getRegisterTypeForCallingConv(*CurDAG->getContext(),
12036 F.getCallingConv(), VT);
12037 unsigned NumParts = TLI->getNumRegistersForCallingConv(
12038 *CurDAG->getContext(), F.getCallingConv(), VT);
12039
12040 // Even an apparent 'unused' swifterror argument needs to be returned. So
12041 // we do generate a copy for it that can be used on return from the
12042 // function.
12043 if (ArgHasUses || isSwiftErrorArg) {
12044 std::optional<ISD::NodeType> AssertOp;
12045 if (Arg.hasAttribute(Attribute::SExt))
12046 AssertOp = ISD::AssertSext;
12047 else if (Arg.hasAttribute(Attribute::ZExt))
12048 AssertOp = ISD::AssertZext;
12049
12050 SDValue OutVal =
12051 getCopyFromParts(DAG, dl, &InVals[i], NumParts, PartVT, VT, nullptr,
12052 NewRoot, F.getCallingConv(), AssertOp);
12053
12054 FPClassTest NoFPClass = Arg.getNoFPClass();
12055 if (NoFPClass != fcNone) {
12056 SDValue SDNoFPClass = DAG.getTargetConstant(
12057 static_cast<uint64_t>(NoFPClass), dl, MVT::i32);
12058 OutVal = DAG.getNode(ISD::AssertNoFPClass, dl, OutVal.getValueType(),
12059 OutVal, SDNoFPClass);
12060 }
12061 ArgValues.push_back(OutVal);
12062 }
12063
12064 i += NumParts;
12065 }
12066
12067 // We don't need to do anything else for unused arguments.
12068 if (ArgValues.empty())
12069 continue;
12070
12071 // Note down frame index.
12072 if (FrameIndexSDNode *FI =
12073 dyn_cast<FrameIndexSDNode>(ArgValues[0].getNode()))
12074 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12075
12076 SDValue Res = DAG.getMergeValues(ArrayRef(ArgValues.data(), NumValues),
12077 SDB->getCurSDLoc());
12078
12079 SDB->setValue(&Arg, Res);
12080 if (!TM.Options.EnableFastISel && Res.getOpcode() == ISD::BUILD_PAIR) {
12081 // We want to associate the argument with the frame index, among
12082 // involved operands, that correspond to the lowest address. The
12083 // getCopyFromParts function, called earlier, is swapping the order of
12084 // the operands to BUILD_PAIR depending on endianness. The result of
12085 // that swapping is that the least significant bits of the argument will
12086 // be in the first operand of the BUILD_PAIR node, and the most
12087 // significant bits will be in the second operand.
12088 unsigned LowAddressOp = DAG.getDataLayout().isBigEndian() ? 1 : 0;
12089 if (LoadSDNode *LNode =
12090 dyn_cast<LoadSDNode>(Res.getOperand(LowAddressOp).getNode()))
12091 if (FrameIndexSDNode *FI =
12092 dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
12093 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12094 }
12095
12096 // Analyses past this point are naive and don't expect an assertion.
12097 if (Res.getOpcode() == ISD::AssertZext)
12098 Res = Res.getOperand(0);
12099
12100 // Update the SwiftErrorVRegDefMap.
12101 if (Res.getOpcode() == ISD::CopyFromReg && isSwiftErrorArg) {
12102 Register Reg = cast<RegisterSDNode>(Res.getOperand(1))->getReg();
12103 if (Reg.isVirtual())
12104 SwiftError->setCurrentVReg(FuncInfo->MBB, SwiftError->getFunctionArg(),
12105 Reg);
12106 }
12107
12108 // If this argument is live outside of the entry block, insert a copy from
12109 // wherever we got it to the vreg that other BB's will reference it as.
12110 if (Res.getOpcode() == ISD::CopyFromReg) {
12111 // If we can, though, try to skip creating an unnecessary vreg.
12112 // FIXME: This isn't very clean... it would be nice to make this more
12113 // general.
12114 Register Reg = cast<RegisterSDNode>(Res.getOperand(1))->getReg();
12115 if (Reg.isVirtual()) {
12116 FuncInfo->ValueMap[&Arg] = Reg;
12117 continue;
12118 }
12119 }
12120 if (!isOnlyUsedInEntryBlock(&Arg, TM.Options.EnableFastISel)) {
12121 FuncInfo->InitializeRegForValue(&Arg);
12122 SDB->CopyToExportRegsIfNeeded(&Arg);
12123 }
12124 }
12125
12126 if (!Chains.empty()) {
12127 Chains.push_back(NewRoot);
12128 NewRoot = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chains);
12129 }
12130
12131 DAG.setRoot(NewRoot);
12132
12133 assert(i == InVals.size() && "Argument register count mismatch!");
12134
12135 // If any argument copy elisions occurred and we have debug info, update the
12136 // stale frame indices used in the dbg.declare variable info table.
12137 if (!ArgCopyElisionFrameIndexMap.empty()) {
12138 for (MachineFunction::VariableDbgInfo &VI :
12139 MF->getInStackSlotVariableDbgInfo()) {
12140 auto I = ArgCopyElisionFrameIndexMap.find(VI.getStackSlot());
12141 if (I != ArgCopyElisionFrameIndexMap.end())
12142 VI.updateStackSlot(I->second);
12143 }
12144 }
12145
12146 // Finally, if the target has anything special to do, allow it to do so.
12148}
12149
12150/// Handle PHI nodes in successor blocks. Emit code into the SelectionDAG to
12151/// ensure constants are generated when needed. Remember the virtual registers
12152/// that need to be added to the Machine PHI nodes as input. We cannot just
12153/// directly add them, because expansion might result in multiple MBB's for one
12154/// BB. As such, the start of the BB might correspond to a different MBB than
12155/// the end.
12156void
12157SelectionDAGBuilder::HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) {
12158 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12159
12160 SmallPtrSet<MachineBasicBlock *, 4> SuccsHandled;
12161
12162 // Check PHI nodes in successors that expect a value to be available from this
12163 // block.
12164 for (const BasicBlock *SuccBB : successors(LLVMBB->getTerminator())) {
12165 if (!isa<PHINode>(SuccBB->begin())) continue;
12166 MachineBasicBlock *SuccMBB = FuncInfo.getMBB(SuccBB);
12167
12168 // If this terminator has multiple identical successors (common for
12169 // switches), only handle each succ once.
12170 if (!SuccsHandled.insert(SuccMBB).second)
12171 continue;
12172
12174
12175 // At this point we know that there is a 1-1 correspondence between LLVM PHI
12176 // nodes and Machine PHI nodes, but the incoming operands have not been
12177 // emitted yet.
12178 for (const PHINode &PN : SuccBB->phis()) {
12179 // Ignore dead phi's.
12180 if (PN.use_empty())
12181 continue;
12182
12183 // Skip empty types
12184 if (PN.getType()->isEmptyTy())
12185 continue;
12186
12187 Register Reg;
12188 const Value *PHIOp = PN.getIncomingValueForBlock(LLVMBB);
12189
12190 if (const auto *C = dyn_cast<Constant>(PHIOp)) {
12191 Register &RegOut = ConstantsOut[C];
12192 if (!RegOut) {
12193 RegOut = FuncInfo.CreateRegs(&PN);
12194 // We need to zero/sign extend ConstantInt phi operands to match
12195 // assumptions in FunctionLoweringInfo::ComputePHILiveOutRegInfo.
12196 ISD::NodeType ExtendType = ISD::ANY_EXTEND;
12197 if (auto *CI = dyn_cast<ConstantInt>(C))
12198 ExtendType = TLI.signExtendConstant(CI) ? ISD::SIGN_EXTEND
12200 CopyValueToVirtualRegister(C, RegOut, ExtendType);
12201 }
12202 Reg = RegOut;
12203 } else {
12205 FuncInfo.ValueMap.find(PHIOp);
12206 if (I != FuncInfo.ValueMap.end())
12207 Reg = I->second;
12208 else {
12209 assert(isa<AllocaInst>(PHIOp) &&
12210 FuncInfo.StaticAllocaMap.count(cast<AllocaInst>(PHIOp)) &&
12211 "Didn't codegen value into a register!??");
12212 Reg = FuncInfo.CreateRegs(&PN);
12214 }
12215 }
12216
12217 // Remember that this register needs to added to the machine PHI node as
12218 // the input for this MBB.
12219 SmallVector<EVT, 4> ValueVTs;
12220 ComputeValueVTs(TLI, DAG.getDataLayout(), PN.getType(), ValueVTs);
12221 for (EVT VT : ValueVTs) {
12222 const unsigned NumRegisters = TLI.getNumRegisters(*DAG.getContext(), VT);
12223 for (unsigned i = 0; i != NumRegisters; ++i)
12224 FuncInfo.PHINodesToUpdate.emplace_back(&*MBBI++, Reg + i);
12225 Reg += NumRegisters;
12226 }
12227 }
12228 }
12229
12230 ConstantsOut.clear();
12231}
12232
12233MachineBasicBlock *SelectionDAGBuilder::NextBlock(MachineBasicBlock *MBB) {
12235 if (++I == FuncInfo.MF->end())
12236 return nullptr;
12237 return &*I;
12238}
12239
12240/// During lowering new call nodes can be created (such as memset, etc.).
12241/// Those will become new roots of the current DAG, but complications arise
12242/// when they are tail calls. In such cases, the call lowering will update
12243/// the root, but the builder still needs to know that a tail call has been
12244/// lowered in order to avoid generating an additional return.
12245void SelectionDAGBuilder::updateDAGForMaybeTailCall(SDValue MaybeTC) {
12246 // If the node is null, we do have a tail call.
12247 if (MaybeTC.getNode() != nullptr)
12248 DAG.setRoot(MaybeTC);
12249 else
12250 HasTailCall = true;
12251}
12252
12253void SelectionDAGBuilder::lowerWorkItem(SwitchWorkListItem W, Value *Cond,
12254 MachineBasicBlock *SwitchMBB,
12255 MachineBasicBlock *DefaultMBB) {
12256 MachineFunction *CurMF = FuncInfo.MF;
12257 MachineBasicBlock *NextMBB = nullptr;
12259 if (++BBI != FuncInfo.MF->end())
12260 NextMBB = &*BBI;
12261
12262 unsigned Size = W.LastCluster - W.FirstCluster + 1;
12263
12264 BranchProbabilityInfo *BPI = FuncInfo.BPI;
12265
12266 if (Size == 2 && W.MBB == SwitchMBB) {
12267 // If any two of the cases has the same destination, and if one value
12268 // is the same as the other, but has one bit unset that the other has set,
12269 // use bit manipulation to do two compares at once. For example:
12270 // "if (X == 6 || X == 4)" -> "if ((X|2) == 6)"
12271 // TODO: This could be extended to merge any 2 cases in switches with 3
12272 // cases.
12273 // TODO: Handle cases where W.CaseBB != SwitchBB.
12274 CaseCluster &Small = *W.FirstCluster;
12275 CaseCluster &Big = *W.LastCluster;
12276
12277 if (Small.Low == Small.High && Big.Low == Big.High &&
12278 Small.MBB == Big.MBB) {
12279 const APInt &SmallValue = Small.Low->getValue();
12280 const APInt &BigValue = Big.Low->getValue();
12281
12282 // Check that there is only one bit different.
12283 APInt CommonBit = BigValue ^ SmallValue;
12284 if (CommonBit.isPowerOf2()) {
12285 SDValue CondLHS = getValue(Cond);
12286 EVT VT = CondLHS.getValueType();
12287 SDLoc DL = getCurSDLoc();
12288
12289 SDValue Or = DAG.getNode(ISD::OR, DL, VT, CondLHS,
12290 DAG.getConstant(CommonBit, DL, VT));
12291 SDValue Cond = DAG.getSetCC(
12292 DL, MVT::i1, Or, DAG.getConstant(BigValue | SmallValue, DL, VT),
12293 ISD::SETEQ);
12294
12295 // Update successor info.
12296 // Both Small and Big will jump to Small.BB, so we sum up the
12297 // probabilities.
12298 addSuccessorWithProb(SwitchMBB, Small.MBB, Small.Prob + Big.Prob);
12299 if (BPI)
12300 addSuccessorWithProb(
12301 SwitchMBB, DefaultMBB,
12302 // The default destination is the first successor in IR.
12303 BPI->getEdgeProbability(SwitchMBB->getBasicBlock(), (unsigned)0));
12304 else
12305 addSuccessorWithProb(SwitchMBB, DefaultMBB);
12306
12307 // Insert the true branch.
12308 SDValue BrCond =
12309 DAG.getNode(ISD::BRCOND, DL, MVT::Other, getControlRoot(), Cond,
12310 DAG.getBasicBlock(Small.MBB));
12311 // Insert the false branch.
12312 BrCond = DAG.getNode(ISD::BR, DL, MVT::Other, BrCond,
12313 DAG.getBasicBlock(DefaultMBB));
12314
12315 DAG.setRoot(BrCond);
12316 return;
12317 }
12318 }
12319 }
12320
12321 if (TM.getOptLevel() != CodeGenOptLevel::None) {
12322 // Here, we order cases by probability so the most likely case will be
12323 // checked first. However, two clusters can have the same probability in
12324 // which case their relative ordering is non-deterministic. So we use Low
12325 // as a tie-breaker as clusters are guaranteed to never overlap.
12326 llvm::sort(W.FirstCluster, W.LastCluster + 1,
12327 [](const CaseCluster &a, const CaseCluster &b) {
12328 return a.Prob != b.Prob ?
12329 a.Prob > b.Prob :
12330 a.Low->getValue().slt(b.Low->getValue());
12331 });
12332
12333 // Rearrange the case blocks so that the last one falls through if possible
12334 // without changing the order of probabilities.
12335 for (CaseClusterIt I = W.LastCluster; I > W.FirstCluster; ) {
12336 --I;
12337 if (I->Prob > W.LastCluster->Prob)
12338 break;
12339 if (I->Kind == CC_Range && I->MBB == NextMBB) {
12340 std::swap(*I, *W.LastCluster);
12341 break;
12342 }
12343 }
12344 }
12345
12346 // Compute total probability.
12347 BranchProbability DefaultProb = W.DefaultProb;
12348 BranchProbability UnhandledProbs = DefaultProb;
12349 for (CaseClusterIt I = W.FirstCluster; I <= W.LastCluster; ++I)
12350 UnhandledProbs += I->Prob;
12351
12352 MachineBasicBlock *CurMBB = W.MBB;
12353 for (CaseClusterIt I = W.FirstCluster, E = W.LastCluster; I <= E; ++I) {
12354 bool FallthroughUnreachable = false;
12355 MachineBasicBlock *Fallthrough;
12356 if (I == W.LastCluster) {
12357 // For the last cluster, fall through to the default destination.
12358 Fallthrough = DefaultMBB;
12359 FallthroughUnreachable = isa<UnreachableInst>(
12360 DefaultMBB->getBasicBlock()->getFirstNonPHIOrDbg());
12361 } else {
12362 Fallthrough = CurMF->CreateMachineBasicBlock(CurMBB->getBasicBlock());
12363 CurMF->insert(BBI, Fallthrough);
12364 // Put Cond in a virtual register to make it available from the new blocks.
12366 }
12367 UnhandledProbs -= I->Prob;
12368
12369 switch (I->Kind) {
12370 case CC_JumpTable: {
12371 // FIXME: Optimize away range check based on pivot comparisons.
12372 JumpTableHeader *JTH = &SL->JTCases[I->JTCasesIndex].first;
12373 SwitchCG::JumpTable *JT = &SL->JTCases[I->JTCasesIndex].second;
12374
12375 // The jump block hasn't been inserted yet; insert it here.
12376 MachineBasicBlock *JumpMBB = JT->MBB;
12377 CurMF->insert(BBI, JumpMBB);
12378
12379 auto JumpProb = I->Prob;
12380 auto FallthroughProb = UnhandledProbs;
12381
12382 // If the default statement is a target of the jump table, we evenly
12383 // distribute the default probability to successors of CurMBB. Also
12384 // update the probability on the edge from JumpMBB to Fallthrough.
12385 for (MachineBasicBlock::succ_iterator SI = JumpMBB->succ_begin(),
12386 SE = JumpMBB->succ_end();
12387 SI != SE; ++SI) {
12388 if (*SI == DefaultMBB) {
12389 JumpProb += DefaultProb / 2;
12390 FallthroughProb -= DefaultProb / 2;
12391 JumpMBB->setSuccProbability(SI, DefaultProb / 2);
12392 JumpMBB->normalizeSuccProbs();
12393 break;
12394 }
12395 }
12396
12397 // If the default clause is unreachable, propagate that knowledge into
12398 // JTH->FallthroughUnreachable which will use it to suppress the range
12399 // check.
12400 //
12401 // However, don't do this if we're doing branch target enforcement,
12402 // because a table branch _without_ a range check can be a tempting JOP
12403 // gadget - out-of-bounds inputs that are impossible in correct
12404 // execution become possible again if an attacker can influence the
12405 // control flow. So if an attacker doesn't already have a BTI bypass
12406 // available, we don't want them to be able to get one out of this
12407 // table branch.
12408 if (FallthroughUnreachable) {
12409 Function &CurFunc = CurMF->getFunction();
12410 if (!CurFunc.hasFnAttribute("branch-target-enforcement"))
12411 JTH->FallthroughUnreachable = true;
12412 }
12413
12414 if (!JTH->FallthroughUnreachable)
12415 addSuccessorWithProb(CurMBB, Fallthrough, FallthroughProb);
12416 addSuccessorWithProb(CurMBB, JumpMBB, JumpProb);
12417 CurMBB->normalizeSuccProbs();
12418
12419 // The jump table header will be inserted in our current block, do the
12420 // range check, and fall through to our fallthrough block.
12421 JTH->HeaderBB = CurMBB;
12422 JT->Default = Fallthrough; // FIXME: Move Default to JumpTableHeader.
12423
12424 // If we're in the right place, emit the jump table header right now.
12425 if (CurMBB == SwitchMBB) {
12426 visitJumpTableHeader(*JT, *JTH, SwitchMBB);
12427 JTH->Emitted = true;
12428 }
12429 break;
12430 }
12431 case CC_BitTests: {
12432 // FIXME: Optimize away range check based on pivot comparisons.
12433 BitTestBlock *BTB = &SL->BitTestCases[I->BTCasesIndex];
12434
12435 // The bit test blocks haven't been inserted yet; insert them here.
12436 for (BitTestCase &BTC : BTB->Cases)
12437 CurMF->insert(BBI, BTC.ThisBB);
12438
12439 // Fill in fields of the BitTestBlock.
12440 BTB->Parent = CurMBB;
12441 BTB->Default = Fallthrough;
12442
12443 BTB->DefaultProb = UnhandledProbs;
12444 // If the cases in bit test don't form a contiguous range, we evenly
12445 // distribute the probability on the edge to Fallthrough to two
12446 // successors of CurMBB.
12447 if (!BTB->ContiguousRange) {
12448 BTB->Prob += DefaultProb / 2;
12449 BTB->DefaultProb -= DefaultProb / 2;
12450 }
12451
12452 if (FallthroughUnreachable)
12453 BTB->FallthroughUnreachable = true;
12454
12455 // If we're in the right place, emit the bit test header right now.
12456 if (CurMBB == SwitchMBB) {
12457 visitBitTestHeader(*BTB, SwitchMBB);
12458 BTB->Emitted = true;
12459 }
12460 break;
12461 }
12462 case CC_Range: {
12463 const Value *RHS, *LHS, *MHS;
12464 ISD::CondCode CC;
12465 if (I->Low == I->High) {
12466 // Check Cond == I->Low.
12467 CC = ISD::SETEQ;
12468 LHS = Cond;
12469 RHS=I->Low;
12470 MHS = nullptr;
12471 } else {
12472 // Check I->Low <= Cond <= I->High.
12473 CC = ISD::SETLE;
12474 LHS = I->Low;
12475 MHS = Cond;
12476 RHS = I->High;
12477 }
12478
12479 // If Fallthrough is unreachable, fold away the comparison.
12480 if (FallthroughUnreachable)
12481 CC = ISD::SETTRUE;
12482
12483 // The false probability is the sum of all unhandled cases.
12484 CaseBlock CB(CC, LHS, RHS, MHS, I->MBB, Fallthrough, CurMBB,
12485 getCurSDLoc(), I->Prob, UnhandledProbs);
12486
12487 if (CurMBB == SwitchMBB)
12488 visitSwitchCase(CB, SwitchMBB);
12489 else
12490 SL->SwitchCases.push_back(CB);
12491
12492 break;
12493 }
12494 }
12495 CurMBB = Fallthrough;
12496 }
12497}
12498
12499void SelectionDAGBuilder::splitWorkItem(SwitchWorkList &WorkList,
12500 const SwitchWorkListItem &W,
12501 Value *Cond,
12502 MachineBasicBlock *SwitchMBB) {
12503 assert(W.FirstCluster->Low->getValue().slt(W.LastCluster->Low->getValue()) &&
12504 "Clusters not sorted?");
12505 assert(W.LastCluster - W.FirstCluster + 1 >= 2 && "Too small to split!");
12506
12507 auto [LastLeft, FirstRight, LeftProb, RightProb] =
12508 SL->computeSplitWorkItemInfo(W);
12509
12510 // Use the first element on the right as pivot since we will make less-than
12511 // comparisons against it.
12512 CaseClusterIt PivotCluster = FirstRight;
12513 assert(PivotCluster > W.FirstCluster);
12514 assert(PivotCluster <= W.LastCluster);
12515
12516 CaseClusterIt FirstLeft = W.FirstCluster;
12517 CaseClusterIt LastRight = W.LastCluster;
12518
12519 const ConstantInt *Pivot = PivotCluster->Low;
12520
12521 // New blocks will be inserted immediately after the current one.
12523 ++BBI;
12524
12525 // We will branch to the LHS if Value < Pivot. If LHS is a single cluster,
12526 // we can branch to its destination directly if it's squeezed exactly in
12527 // between the known lower bound and Pivot - 1.
12528 MachineBasicBlock *LeftMBB;
12529 if (FirstLeft == LastLeft && FirstLeft->Kind == CC_Range &&
12530 FirstLeft->Low == W.GE &&
12531 (FirstLeft->High->getValue() + 1LL) == Pivot->getValue()) {
12532 LeftMBB = FirstLeft->MBB;
12533 } else {
12534 LeftMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
12535 FuncInfo.MF->insert(BBI, LeftMBB);
12536 WorkList.push_back(
12537 {LeftMBB, FirstLeft, LastLeft, W.GE, Pivot, W.DefaultProb / 2});
12538 // Put Cond in a virtual register to make it available from the new blocks.
12540 }
12541
12542 // Similarly, we will branch to the RHS if Value >= Pivot. If RHS is a
12543 // single cluster, RHS.Low == Pivot, and we can branch to its destination
12544 // directly if RHS.High equals the current upper bound.
12545 MachineBasicBlock *RightMBB;
12546 if (FirstRight == LastRight && FirstRight->Kind == CC_Range &&
12547 W.LT && (FirstRight->High->getValue() + 1ULL) == W.LT->getValue()) {
12548 RightMBB = FirstRight->MBB;
12549 } else {
12550 RightMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
12551 FuncInfo.MF->insert(BBI, RightMBB);
12552 WorkList.push_back(
12553 {RightMBB, FirstRight, LastRight, Pivot, W.LT, W.DefaultProb / 2});
12554 // Put Cond in a virtual register to make it available from the new blocks.
12556 }
12557
12558 // Create the CaseBlock record that will be used to lower the branch.
12559 CaseBlock CB(ISD::SETLT, Cond, Pivot, nullptr, LeftMBB, RightMBB, W.MBB,
12560 getCurSDLoc(), LeftProb, RightProb);
12561
12562 if (W.MBB == SwitchMBB)
12563 visitSwitchCase(CB, SwitchMBB);
12564 else
12565 SL->SwitchCases.push_back(CB);
12566}
12567
12568// Scale CaseProb after peeling a case with the probablity of PeeledCaseProb
12569// from the swith statement.
12571 BranchProbability PeeledCaseProb) {
12572 if (PeeledCaseProb == BranchProbability::getOne())
12574 BranchProbability SwitchProb = PeeledCaseProb.getCompl();
12575
12576 uint32_t Numerator = CaseProb.getNumerator();
12577 uint32_t Denominator = SwitchProb.scale(CaseProb.getDenominator());
12578 return BranchProbability(Numerator, std::max(Numerator, Denominator));
12579}
12580
12581// Try to peel the top probability case if it exceeds the threshold.
12582// Return current MachineBasicBlock for the switch statement if the peeling
12583// does not occur.
12584// If the peeling is performed, return the newly created MachineBasicBlock
12585// for the peeled switch statement. Also update Clusters to remove the peeled
12586// case. PeeledCaseProb is the BranchProbability for the peeled case.
12587MachineBasicBlock *SelectionDAGBuilder::peelDominantCaseCluster(
12588 const SwitchInst &SI, CaseClusterVector &Clusters,
12589 BranchProbability &PeeledCaseProb) {
12590 MachineBasicBlock *SwitchMBB = FuncInfo.MBB;
12591 // Don't perform if there is only one cluster or optimizing for size.
12592 if (SwitchPeelThreshold > 100 || !FuncInfo.BPI || Clusters.size() < 2 ||
12593 TM.getOptLevel() == CodeGenOptLevel::None ||
12594 SwitchMBB->getParent()->getFunction().hasMinSize())
12595 return SwitchMBB;
12596
12597 BranchProbability TopCaseProb = BranchProbability(SwitchPeelThreshold, 100);
12598 unsigned PeeledCaseIndex = 0;
12599 bool SwitchPeeled = false;
12600 for (unsigned Index = 0; Index < Clusters.size(); ++Index) {
12601 CaseCluster &CC = Clusters[Index];
12602 if (CC.Prob < TopCaseProb)
12603 continue;
12604 TopCaseProb = CC.Prob;
12605 PeeledCaseIndex = Index;
12606 SwitchPeeled = true;
12607 }
12608 if (!SwitchPeeled)
12609 return SwitchMBB;
12610
12611 LLVM_DEBUG(dbgs() << "Peeled one top case in switch stmt, prob: "
12612 << TopCaseProb << "\n");
12613
12614 // Record the MBB for the peeled switch statement.
12615 MachineFunction::iterator BBI(SwitchMBB);
12616 ++BBI;
12617 MachineBasicBlock *PeeledSwitchMBB =
12618 FuncInfo.MF->CreateMachineBasicBlock(SwitchMBB->getBasicBlock());
12619 FuncInfo.MF->insert(BBI, PeeledSwitchMBB);
12620
12621 ExportFromCurrentBlock(SI.getCondition());
12622 auto PeeledCaseIt = Clusters.begin() + PeeledCaseIndex;
12623 SwitchWorkListItem W = {SwitchMBB, PeeledCaseIt, PeeledCaseIt,
12624 nullptr, nullptr, TopCaseProb.getCompl()};
12625 lowerWorkItem(W, SI.getCondition(), SwitchMBB, PeeledSwitchMBB);
12626
12627 Clusters.erase(PeeledCaseIt);
12628 for (CaseCluster &CC : Clusters) {
12629 LLVM_DEBUG(
12630 dbgs() << "Scale the probablity for one cluster, before scaling: "
12631 << CC.Prob << "\n");
12632 CC.Prob = scaleCaseProbality(CC.Prob, TopCaseProb);
12633 LLVM_DEBUG(dbgs() << "After scaling: " << CC.Prob << "\n");
12634 }
12635 PeeledCaseProb = TopCaseProb;
12636 return PeeledSwitchMBB;
12637}
12638
12639void SelectionDAGBuilder::visitSwitch(const SwitchInst &SI) {
12640 // Extract cases from the switch.
12641 BranchProbabilityInfo *BPI = FuncInfo.BPI;
12642 CaseClusterVector Clusters;
12643 Clusters.reserve(SI.getNumCases());
12644 for (auto I : SI.cases()) {
12645 MachineBasicBlock *Succ = FuncInfo.getMBB(I.getCaseSuccessor());
12646 const ConstantInt *CaseVal = I.getCaseValue();
12647 BranchProbability Prob =
12648 BPI ? BPI->getEdgeProbability(SI.getParent(), I.getSuccessorIndex())
12649 : BranchProbability(1, SI.getNumCases() + 1);
12650 Clusters.push_back(CaseCluster::range(CaseVal, CaseVal, Succ, Prob));
12651 }
12652
12653 MachineBasicBlock *DefaultMBB = FuncInfo.getMBB(SI.getDefaultDest());
12654
12655 // Cluster adjacent cases with the same destination. We do this at all
12656 // optimization levels because it's cheap to do and will make codegen faster
12657 // if there are many clusters.
12658 sortAndRangeify(Clusters);
12659
12660 // The branch probablity of the peeled case.
12661 BranchProbability PeeledCaseProb = BranchProbability::getZero();
12662 MachineBasicBlock *PeeledSwitchMBB =
12663 peelDominantCaseCluster(SI, Clusters, PeeledCaseProb);
12664
12665 // If there is only the default destination, jump there directly.
12666 MachineBasicBlock *SwitchMBB = FuncInfo.MBB;
12667 if (Clusters.empty()) {
12668 assert(PeeledSwitchMBB == SwitchMBB);
12669 SwitchMBB->addSuccessor(DefaultMBB);
12670 if (DefaultMBB != NextBlock(SwitchMBB)) {
12671 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
12672 getControlRoot(), DAG.getBasicBlock(DefaultMBB)));
12673 }
12674 return;
12675 }
12676
12677 SL->findJumpTables(Clusters, &SI, getCurSDLoc(), DefaultMBB, DAG.getPSI(),
12678 DAG.getBFI());
12679 SL->findBitTestClusters(Clusters, &SI);
12680
12681 LLVM_DEBUG({
12682 dbgs() << "Case clusters: ";
12683 for (const CaseCluster &C : Clusters) {
12684 if (C.Kind == CC_JumpTable)
12685 dbgs() << "JT:";
12686 if (C.Kind == CC_BitTests)
12687 dbgs() << "BT:";
12688
12689 C.Low->getValue().print(dbgs(), true);
12690 if (C.Low != C.High) {
12691 dbgs() << '-';
12692 C.High->getValue().print(dbgs(), true);
12693 }
12694 dbgs() << ' ';
12695 }
12696 dbgs() << '\n';
12697 });
12698
12699 assert(!Clusters.empty());
12700 SwitchWorkList WorkList;
12701 CaseClusterIt First = Clusters.begin();
12702 CaseClusterIt Last = Clusters.end() - 1;
12703 auto DefaultProb = getEdgeProbability(PeeledSwitchMBB, DefaultMBB);
12704 // Scale the branchprobability for DefaultMBB if the peel occurs and
12705 // DefaultMBB is not replaced.
12706 if (PeeledCaseProb != BranchProbability::getZero() &&
12707 DefaultMBB == FuncInfo.getMBB(SI.getDefaultDest()))
12708 DefaultProb = scaleCaseProbality(DefaultProb, PeeledCaseProb);
12709 WorkList.push_back(
12710 {PeeledSwitchMBB, First, Last, nullptr, nullptr, DefaultProb});
12711
12712 while (!WorkList.empty()) {
12713 SwitchWorkListItem W = WorkList.pop_back_val();
12714 unsigned NumClusters = W.LastCluster - W.FirstCluster + 1;
12715
12716 if (NumClusters > 3 && TM.getOptLevel() != CodeGenOptLevel::None &&
12717 !DefaultMBB->getParent()->getFunction().hasMinSize()) {
12718 // For optimized builds, lower large range as a balanced binary tree.
12719 splitWorkItem(WorkList, W, SI.getCondition(), SwitchMBB);
12720 continue;
12721 }
12722
12723 lowerWorkItem(W, SI.getCondition(), SwitchMBB, DefaultMBB);
12724 }
12725}
12726
12727void SelectionDAGBuilder::visitStepVector(const CallInst &I) {
12728 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12729 auto DL = getCurSDLoc();
12730 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12731 setValue(&I, DAG.getStepVector(DL, ResultVT));
12732}
12733
12734void SelectionDAGBuilder::visitVectorReverse(const CallInst &I) {
12735 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12736 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12737
12738 SDLoc DL = getCurSDLoc();
12739 SDValue V = getValue(I.getOperand(0));
12740 assert(VT == V.getValueType() && "Malformed vector.reverse!");
12741
12742 if (VT.isScalableVector()) {
12743 setValue(&I, DAG.getNode(ISD::VECTOR_REVERSE, DL, VT, V));
12744 return;
12745 }
12746
12747 // Use VECTOR_SHUFFLE for the fixed-length vector
12748 // to maintain existing behavior.
12749 SmallVector<int, 8> Mask;
12750 unsigned NumElts = VT.getVectorMinNumElements();
12751 for (unsigned i = 0; i != NumElts; ++i)
12752 Mask.push_back(NumElts - 1 - i);
12753
12754 setValue(&I, DAG.getVectorShuffle(VT, DL, V, DAG.getUNDEF(VT), Mask));
12755}
12756
12757void SelectionDAGBuilder::visitVectorDeinterleave(const CallInst &I,
12758 unsigned Factor) {
12759 auto DL = getCurSDLoc();
12760 SDValue InVec = getValue(I.getOperand(0));
12761
12762 SmallVector<EVT, 4> ValueVTs;
12763 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
12764 ValueVTs);
12765
12766 EVT OutVT = ValueVTs[0];
12767 unsigned OutNumElts = OutVT.getVectorMinNumElements();
12768
12769 SmallVector<SDValue, 4> SubVecs(Factor);
12770 for (unsigned i = 0; i != Factor; ++i) {
12771 assert(ValueVTs[i] == OutVT && "Expected VTs to be the same");
12772 SubVecs[i] = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, OutVT, InVec,
12773 DAG.getVectorIdxConstant(OutNumElts * i, DL));
12774 }
12775
12776 // Use VECTOR_SHUFFLE for fixed-length vectors with factor of 2 to benefit
12777 // from existing legalisation and combines.
12778 if (OutVT.isFixedLengthVector() && Factor == 2) {
12779 SDValue Even = DAG.getVectorShuffle(OutVT, DL, SubVecs[0], SubVecs[1],
12780 createStrideMask(0, 2, OutNumElts));
12781 SDValue Odd = DAG.getVectorShuffle(OutVT, DL, SubVecs[0], SubVecs[1],
12782 createStrideMask(1, 2, OutNumElts));
12783 SDValue Res = DAG.getMergeValues({Even, Odd}, getCurSDLoc());
12784 setValue(&I, Res);
12785 return;
12786 }
12787
12788 SDValue Res = DAG.getNode(ISD::VECTOR_DEINTERLEAVE, DL,
12789 DAG.getVTList(ValueVTs), SubVecs);
12790 setValue(&I, Res);
12791}
12792
12793void SelectionDAGBuilder::visitVectorInterleave(const CallInst &I,
12794 unsigned Factor) {
12795 auto DL = getCurSDLoc();
12796 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12797 EVT InVT = getValue(I.getOperand(0)).getValueType();
12798 EVT OutVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12799
12800 SmallVector<SDValue, 8> InVecs(Factor);
12801 for (unsigned i = 0; i < Factor; ++i) {
12802 InVecs[i] = getValue(I.getOperand(i));
12803 assert(InVecs[i].getValueType() == InVecs[0].getValueType() &&
12804 "Expected VTs to be the same");
12805 }
12806
12807 // Use VECTOR_SHUFFLE for fixed-length vectors with factor of 2 to benefit
12808 // from existing legalisation and combines.
12809 if (OutVT.isFixedLengthVector() && Factor == 2) {
12810 unsigned NumElts = InVT.getVectorMinNumElements();
12811 SDValue V = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, InVecs);
12812 setValue(&I, DAG.getVectorShuffle(OutVT, DL, V, DAG.getUNDEF(OutVT),
12813 createInterleaveMask(NumElts, 2)));
12814 return;
12815 }
12816
12817 SmallVector<EVT, 8> ValueVTs(Factor, InVT);
12818 SDValue Res =
12819 DAG.getNode(ISD::VECTOR_INTERLEAVE, DL, DAG.getVTList(ValueVTs), InVecs);
12820
12822 for (unsigned i = 0; i < Factor; ++i)
12823 Results[i] = Res.getValue(i);
12824
12825 Res = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, Results);
12826 setValue(&I, Res);
12827}
12828
12829void SelectionDAGBuilder::visitFreeze(const FreezeInst &I) {
12830 SmallVector<EVT, 4> ValueVTs;
12831 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
12832 ValueVTs);
12833 unsigned NumValues = ValueVTs.size();
12834 if (NumValues == 0) return;
12835
12836 SmallVector<SDValue, 4> Values(NumValues);
12837 SDValue Op = getValue(I.getOperand(0));
12838
12839 for (unsigned i = 0; i != NumValues; ++i)
12840 Values[i] = DAG.getNode(ISD::FREEZE, getCurSDLoc(), ValueVTs[i],
12841 SDValue(Op.getNode(), Op.getResNo() + i));
12842
12844 DAG.getVTList(ValueVTs), Values));
12845}
12846
12847void SelectionDAGBuilder::visitVectorSplice(const CallInst &I) {
12848 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12849 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12850
12851 SDLoc DL = getCurSDLoc();
12852 SDValue V1 = getValue(I.getOperand(0));
12853 SDValue V2 = getValue(I.getOperand(1));
12854 uint64_t Imm = cast<ConstantInt>(I.getOperand(2))->getZExtValue();
12855 const bool IsLeft = I.getIntrinsicID() == Intrinsic::vector_splice_left;
12856
12857 // VECTOR_SHUFFLE doesn't support a scalable mask so use a dedicated node.
12858 if (VT.isScalableVector()) {
12859 setValue(
12860 &I,
12861 DAG.getNode(
12863 V1, V2,
12864 DAG.getConstant(Imm, DL, TLI.getVectorIdxTy(DAG.getDataLayout()))));
12865 return;
12866 }
12867
12868 unsigned NumElts = VT.getVectorNumElements();
12869
12870 uint64_t Idx = IsLeft ? Imm : NumElts - Imm;
12871
12872 // Use VECTOR_SHUFFLE to maintain original behaviour for fixed-length vectors.
12873 SmallVector<int, 8> Mask;
12874 for (unsigned i = 0; i < NumElts; ++i)
12875 Mask.push_back(Idx + i);
12876 setValue(&I, DAG.getVectorShuffle(VT, DL, V1, V2, Mask));
12877}
12878
12879// Consider the following MIR after SelectionDAG, which produces output in
12880// phyregs in the first case or virtregs in the second case.
12881//
12882// INLINEASM_BR ..., implicit-def $ebx, ..., implicit-def $edx
12883// %5:gr32 = COPY $ebx
12884// %6:gr32 = COPY $edx
12885// %1:gr32 = COPY %6:gr32
12886// %0:gr32 = COPY %5:gr32
12887//
12888// INLINEASM_BR ..., def %5:gr32, ..., def %6:gr32
12889// %1:gr32 = COPY %6:gr32
12890// %0:gr32 = COPY %5:gr32
12891//
12892// Given %0, we'd like to return $ebx in the first case and %5 in the second.
12893// Given %1, we'd like to return $edx in the first case and %6 in the second.
12894//
12895// If a callbr has outputs, it will have a single mapping in FuncInfo.ValueMap
12896// to a single virtreg (such as %0). The remaining outputs monotonically
12897// increase in virtreg number from there. If a callbr has no outputs, then it
12898// should not have a corresponding callbr landingpad; in fact, the callbr
12899// landingpad would not even be able to refer to such a callbr.
12901 MachineInstr *MI = MRI.def_begin(Reg)->getParent();
12902 // There is definitely at least one copy.
12903 assert(MI->getOpcode() == TargetOpcode::COPY &&
12904 "start of copy chain MUST be COPY");
12905 Reg = MI->getOperand(1).getReg();
12906
12907 // If the copied register in the first copy must be virtual.
12908 assert(Reg.isVirtual() && "expected COPY of virtual register");
12909 MI = MRI.def_begin(Reg)->getParent();
12910
12911 // There may be an optional second copy.
12912 if (MI->getOpcode() == TargetOpcode::COPY) {
12913 assert(Reg.isVirtual() && "expected COPY of virtual register");
12914 Reg = MI->getOperand(1).getReg();
12915 assert(Reg.isPhysical() && "expected COPY of physical register");
12916 } else {
12917 // The start of the chain must be an INLINEASM_BR.
12918 assert(MI->getOpcode() == TargetOpcode::INLINEASM_BR &&
12919 "end of copy chain MUST be INLINEASM_BR");
12920 }
12921
12922 return Reg;
12923}
12924
12925// We must do this walk rather than the simpler
12926// setValue(&I, getCopyFromRegs(CBR, CBR->getType()));
12927// otherwise we will end up with copies of virtregs only valid along direct
12928// edges.
12929void SelectionDAGBuilder::visitCallBrLandingPad(const CallInst &I) {
12930 SmallVector<EVT, 8> ResultVTs;
12931 SmallVector<SDValue, 8> ResultValues;
12932 const auto *CBR =
12933 cast<CallBrInst>(I.getParent()->getUniquePredecessor()->getTerminator());
12934
12935 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12936 const TargetRegisterInfo *TRI = DAG.getSubtarget().getRegisterInfo();
12937 MachineRegisterInfo &MRI = DAG.getMachineFunction().getRegInfo();
12938
12939 Register InitialDef = FuncInfo.ValueMap[CBR];
12940 SDValue Chain = DAG.getRoot();
12941
12942 // Re-parse the asm constraints string.
12943 TargetLowering::AsmOperandInfoVector TargetConstraints =
12944 TLI.ParseConstraints(DAG.getDataLayout(), TRI, *CBR);
12945 for (auto &T : TargetConstraints) {
12946 SDISelAsmOperandInfo OpInfo(T);
12947 if (OpInfo.Type != InlineAsm::isOutput)
12948 continue;
12949
12950 // Pencil in OpInfo.ConstraintType and OpInfo.ConstraintVT based on the
12951 // individual constraint.
12952 TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
12953
12954 switch (OpInfo.ConstraintType) {
12957 // Fill in OpInfo.AssignedRegs.Regs.
12958 getRegistersForValue(DAG, getCurSDLoc(), OpInfo, OpInfo);
12959
12960 // getRegistersForValue may produce 1 to many registers based on whether
12961 // the OpInfo.ConstraintVT is legal on the target or not.
12962 for (Register &Reg : OpInfo.AssignedRegs.Regs) {
12963 Register OriginalDef = FollowCopyChain(MRI, InitialDef++);
12964 if (OriginalDef.isPhysical())
12965 FuncInfo.MBB->addLiveIn(OriginalDef);
12966 // Update the assigned registers to use the original defs.
12967 Reg = OriginalDef;
12968 }
12969
12970 SDValue V = OpInfo.AssignedRegs.getCopyFromRegs(
12971 DAG, FuncInfo, getCurSDLoc(), Chain, nullptr, CBR);
12972 ResultValues.push_back(V);
12973 ResultVTs.push_back(OpInfo.ConstraintVT);
12974 break;
12975 }
12977 SDValue Flag;
12978 SDValue V = TLI.LowerAsmOutputForConstraint(Chain, Flag, getCurSDLoc(),
12979 OpInfo, DAG);
12980 ++InitialDef;
12981 ResultValues.push_back(V);
12982 ResultVTs.push_back(OpInfo.ConstraintVT);
12983 break;
12984 }
12985 default:
12986 break;
12987 }
12988 }
12990 DAG.getVTList(ResultVTs), ResultValues);
12991 setValue(&I, V);
12992}
unsigned const MachineRegisterInfo * MRI
return SDValue()
static unsigned getIntrinsicID(const SDNode *N)
unsigned RegSize
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static msgpack::DocNode getNode(msgpack::DocNode DN, msgpack::Type Type, MCValue Val)
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
Function Alias Analysis Results
Atomic ordering constants.
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
This file implements the BitVector class.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Analysis containing CSE Info
Definition CSEInfo.cpp:27
This file contains the declarations for the subclasses of Constant, which represent the different fla...
dxil translate DXIL Translate Metadata
static AttributeList getReturnAttrs(FastISel::CallLoweringInfo &CLI)
Returns an AttributeList representing the attributes applied to the return value of the given call.
Definition FastISel.cpp:942
#define Check(C,...)
static Value * getCondition(Instruction *I)
Hexagon Common GEP
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Module.h This file contains the declarations for the Module class.
static void getRegistersForValue(MachineFunction &MF, MachineIRBuilder &MIRBuilder, GISelAsmOperandInfo &OpInfo, GISelAsmOperandInfo &RefOpInfo)
Assign virtual/physical registers for the specified register operand.
This file defines an InstructionCost class that is used when calculating the cost of an instruction,...
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define RegName(no)
lazy value info
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Machine Check Debug Module
static bool isUndef(const MachineInstr &MI)
Register Reg
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
static const Function * getCalledFunction(const Value *V)
This file provides utility analysis objects describing memory locations.
This file provides utility for Memory Model Relaxation Annotations (MMRAs).
This file contains the declarations for metadata subclasses.
Type::TypeID TypeID
#define T
#define T1
static MCRegister getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
static unsigned getAddressSpace(const Value *V, unsigned MaxLookup)
MachineInstr unsigned OpIdx
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t High
uint64_t IntrinsicInst * II
OptimizedStructLayoutField Field
#define P(N)
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
static Type * getValueType(Value *V)
Returns the type of the given value/instruction V.
This file contains some templates that are useful if you are working with the STL at all.
static bool hasOnlySelectUsers(const Value *Cond)
static SDValue getLoadStackGuard(SelectionDAG &DAG, const SDLoc &DL, SDValue &Chain)
Create a LOAD_STACK_GUARD node, and let it carry the target specific global variable if there exists ...
static bool getUniformBase(const Value *Ptr, SDValue &Base, SDValue &Index, SDValue &Scale, SelectionDAGBuilder *SDB, const BasicBlock *CurBB, uint64_t ElemSize)
static void failForInvalidBundles(const CallBase &I, StringRef Name, ArrayRef< uint32_t > AllowedBundles)
static void addStackMapLiveVars(const CallBase &Call, unsigned StartIdx, const SDLoc &DL, SmallVectorImpl< SDValue > &Ops, SelectionDAGBuilder &Builder)
Add a stack map intrinsic call's live variable operands to a stackmap or patchpoint target node's ope...
static const unsigned MaxParallelChains
static SDValue expandPow(const SDLoc &dl, SDValue LHS, SDValue RHS, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
visitPow - Lower a pow intrinsic.
static const CallBase * FindPreallocatedCall(const Value *PreallocatedSetup)
Given a @llvm.call.preallocated.setup, return the corresponding preallocated call.
static cl::opt< unsigned > SwitchPeelThreshold("switch-peel-threshold", cl::Hidden, cl::init(66), cl::desc("Set the case probability threshold for peeling the case from a " "switch statement. A value greater than 100 will void this " "optimization"))
static cl::opt< bool > InsertAssertAlign("insert-assert-align", cl::init(true), cl::desc("Insert the experimental `assertalign` node."), cl::ReallyHidden)
static unsigned getISDForVPIntrinsic(const VPIntrinsic &VPIntrin)
static bool handleDanglingVariadicDebugInfo(SelectionDAG &DAG, DILocalVariable *Variable, DebugLoc DL, unsigned Order, SmallVectorImpl< Value * > &Values, DIExpression *Expression)
static unsigned findMatchingInlineAsmOperand(unsigned OperandNo, const std::vector< SDValue > &AsmNodeOperands)
static void patchMatchingInput(const SDISelAsmOperandInfo &OpInfo, SDISelAsmOperandInfo &MatchingOpInfo, SelectionDAG &DAG)
Make sure that the output operand OpInfo and its corresponding input operand MatchingOpInfo have comp...
static void findUnwindDestinations(FunctionLoweringInfo &FuncInfo, const BasicBlock *EHPadBB, BranchProbability Prob, SmallVectorImpl< std::pair< MachineBasicBlock *, BranchProbability > > &UnwindDests)
When an invoke or a cleanupret unwinds to the next EH pad, there are many places it could ultimately ...
static unsigned FixedPointIntrinsicToOpcode(unsigned Intrinsic)
static BranchProbability scaleCaseProbality(BranchProbability CaseProb, BranchProbability PeeledCaseProb)
static SDValue expandExp2(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandExp2 - Lower an exp2 intrinsic.
static SDValue expandDivFix(unsigned Opcode, const SDLoc &DL, SDValue LHS, SDValue RHS, SDValue Scale, SelectionDAG &DAG, const TargetLowering &TLI)
static SDValue getF32Constant(SelectionDAG &DAG, unsigned Flt, const SDLoc &dl)
getF32Constant - Get 32-bit floating point constant.
static SDValue widenVectorToPartType(SelectionDAG &DAG, SDValue Val, const SDLoc &DL, EVT PartVT)
static SDValue expandLog10(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandLog10 - Lower a log10 intrinsic.
DenseMap< const Argument *, std::pair< const AllocaInst *, const StoreInst * > > ArgCopyElisionMapTy
static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &dl, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, const Value *V, std::optional< CallingConv::ID > CallConv)
getCopyToPartsVector - Create a series of nodes that contain the specified value split into legal par...
static void getUnderlyingArgRegs(SmallVectorImpl< std::pair< Register, TypeSize > > &Regs, const SDValue &N)
static void getCopyToParts(SelectionDAG &DAG, const SDLoc &DL, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, const Value *V, std::optional< CallingConv::ID > CallConv=std::nullopt, ISD::NodeType ExtendKind=ISD::ANY_EXTEND)
getCopyToParts - Create a series of nodes that contain the specified value split into legal parts.
static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT, SelectionDAGBuilder &Builder)
static SDValue expandLog2(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandLog2 - Lower a log2 intrinsic.
static SDValue getAddressForMemoryInput(SDValue Chain, const SDLoc &Location, SDISelAsmOperandInfo &OpInfo, SelectionDAG &DAG)
Get a direct memory input to behave well as an indirect operand.
static bool isOnlyUsedInEntryBlock(const Argument *A, bool FastISel)
isOnlyUsedInEntryBlock - If the specified argument is only used in the entry block,...
static void diagnosePossiblyInvalidConstraint(LLVMContext &Ctx, const Value *V, const Twine &ErrMsg)
static bool collectInstructionDeps(SmallMapVector< const Instruction *, bool, 8 > *Deps, const Value *V, SmallMapVector< const Instruction *, bool, 8 > *Necessary=nullptr, unsigned Depth=0)
static void findArgumentCopyElisionCandidates(const DataLayout &DL, FunctionLoweringInfo *FuncInfo, ArgCopyElisionMapTy &ArgCopyElisionCandidates)
Scan the entry block of the function in FuncInfo for arguments that look like copies into a local all...
static bool isFunction(SDValue Op)
static SDValue GetExponent(SelectionDAG &DAG, SDValue Op, const TargetLowering &TLI, const SDLoc &dl)
GetExponent - Get the exponent:
static Register FollowCopyChain(MachineRegisterInfo &MRI, Register Reg)
static SDValue ExpandPowI(const SDLoc &DL, SDValue LHS, SDValue RHS, SelectionDAG &DAG)
ExpandPowI - Expand a llvm.powi intrinsic.
static SDValue expandLog(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandLog - Lower a log intrinsic.
static SDValue getCopyFromParts(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V, SDValue InChain, std::optional< CallingConv::ID > CC=std::nullopt, std::optional< ISD::NodeType > AssertOp=std::nullopt)
getCopyFromParts - Create a value that contains the specified legal parts combined into the value the...
static SDValue getLimitedPrecisionExp2(SDValue t0, const SDLoc &dl, SelectionDAG &DAG)
static SDValue GetSignificand(SelectionDAG &DAG, SDValue Op, const SDLoc &dl)
GetSignificand - Get the significand and build it into a floating-point number with exponent of 1:
static SDValue expandExp(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandExp - Lower an exp intrinsic.
static const MDNode * getRangeMetadata(const Instruction &I)
static cl::opt< unsigned, true > LimitFPPrecision("limit-float-precision", cl::desc("Generate low-precision inline sequences " "for some float libcalls"), cl::location(LimitFloatPrecision), cl::Hidden, cl::init(0))
static void tryToElideArgumentCopy(FunctionLoweringInfo &FuncInfo, SmallVectorImpl< SDValue > &Chains, DenseMap< int, int > &ArgCopyElisionFrameIndexMap, SmallPtrSetImpl< const Instruction * > &ElidedArgCopyInstrs, ArgCopyElisionMapTy &ArgCopyElisionCandidates, const Argument &Arg, ArrayRef< SDValue > ArgVals, bool &ArgHasUses)
Try to elide argument copies from memory into a local alloca.
static unsigned LimitFloatPrecision
LimitFloatPrecision - Generate low-precision inline sequences for some float libcalls (6,...
static SDValue getCopyFromPartsVector(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V, SDValue InChain, std::optional< CallingConv::ID > CC)
getCopyFromPartsVector - Create a value that contains the specified legal parts combined into the val...
static bool InBlock(const Value *V, const BasicBlock *BB)
static FPClassTest getNoFPClass(const Instruction &I)
static LLVM_ATTRIBUTE_ALWAYS_INLINE MVT::SimpleValueType getSimpleVT(const uint8_t *MatcherTable, unsigned &MatcherIndex)
getSimpleVT - Decode a value in MatcherTable, if it's a VBR encoded value, use GetVBR to decode it.
This file defines the SmallPtrSet class.
This file contains some functions that are useful when dealing with strings.
#define LLVM_DEBUG(...)
Definition Debug.h:114
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
This pass exposes codegen information to IR-level passes.
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.
Type * getAllocatedType() const
Return the type that is being allocated by the instruction.
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
LLVM_ABI bool hasAttribute(Attribute::AttrKind Kind) const
Check if an argument has a given attribute.
Definition Function.cpp:339
unsigned getArgNo() const
Return the index of this formal argument in its containing function.
Definition Argument.h:50
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator end() const
Definition ArrayRef.h:131
size_t size() const
size - Get the array size.
Definition ArrayRef.h:142
iterator begin() const
Definition ArrayRef.h:130
bool empty() const
empty - Check if the array is empty.
Definition ArrayRef.h:137
A cache of @llvm.assume calls within a function.
An instruction that atomically checks whether a specified value is in a memory location,...
an instruction that atomically reads a memory location, combines it with another value,...
@ Add
*p = old + v
@ FAdd
*p = old + v
@ USubCond
Subtract only if no unsigned overflow.
@ FMinimum
*p = minimum(old, v) minimum matches the behavior of llvm.minimum.
@ Min
*p = old <signed v ? old : v
@ Sub
*p = old - v
@ And
*p = old & v
@ Xor
*p = old ^ v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ FMaximum
*p = maximum(old, v) maximum matches the behavior of llvm.maximum.
@ FSub
*p = old - v
@ UIncWrap
Increment one up to a maximum value.
@ Max
*p = old >signed v ? old : v
@ UMin
*p = old <unsigned v ? old : v
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
@ UMax
*p = old >unsigned v ? old : v
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
@ Nand
*p = ~(old & v)
This class holds the attributes for a particular argument, parameter, function, or return value.
Definition Attributes.h:361
LLVM Basic Block Representation.
Definition BasicBlock.h:62
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
InstListType::const_iterator const_iterator
Definition BasicBlock.h:171
LLVM_ABI bool isEntryBlock() const
Return true if this is the entry block of the containing function.
LLVM_ABI InstListType::const_iterator getFirstNonPHIOrDbg(bool SkipPseudoOp=true) const
Returns a pointer to the first instruction in this block that is not a PHINode or a debug intrinsic,...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
Definition BasicBlock.h:233
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
This class represents a no-op cast from one type to another.
The address of a basic block.
Definition Constants.h: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:64
An instruction for ordering other memory operations.
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
Definition Type.cpp:802
This class represents a freeze function that returns random concrete value if an operand is either a ...
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
BranchProbabilityInfo * BPI
MachineBasicBlock * getMBB(const BasicBlock *BB) const
DenseMap< const AllocaInst *, int > StaticAllocaMap
StaticAllocaMap - Keep track of frame indices for fixed sized allocas in the entry block.
const LiveOutInfo * GetLiveOutRegInfo(Register Reg)
GetLiveOutRegInfo - Gets LiveOutInfo for a register, returning NULL if the register is a PHI destinat...
MachineBasicBlock * MBB
MBB - The current block.
Class to represent function types.
unsigned getNumParams() const
Return the number of fixed parameters this function type requires.
Type * getParamType(unsigned i) const
Parameter type accessors.
Type * getReturnType() const
Data structure describing the variable locations in a function.
const BasicBlock & getEntryBlock() const
Definition Function.h:807
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Definition Function.h:209
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
Definition Function.h:244
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition Function.h:703
bool hasParamAttribute(unsigned ArgNo, Attribute::AttrKind Kind) const
check if an attributes is in the list of attributes.
Definition Function.cpp:742
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
Definition Function.h:270
Constant * getPersonalityFn() const
Get the personality function associated with this function.
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:352
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
Definition Function.h:249
size_t arg_size() const
Definition Function.h:899
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:730
Garbage collection metadata for a single function.
Definition GCMetadata.h:80
bool hasNoUnsignedSignedWrap() const
bool hasNoUnsignedWrap() const
bool isInBounds() const
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
bool hasDLLImportStorageClass() const
Module * getParent()
Get the module that this global value is contained inside of...
This instruction compares its operands according to the predicate given to the constructor.
Indirect Branch Instruction.
This instruction inserts a struct field of array element value into an aggregate value.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
LLVM_ABI FastMathFlags getFastMathFlags() const LLVM_READONLY
Convenience function for getting all the fast-math flags, which must be an operator which supports th...
LLVM_ABI AAMDNodes getAAMetadata() const
Returns the AA metadata for this instruction.
@ MIN_INT_BITS
Minimum number of bits that can be specified.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
Invoke instruction.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
LLVM_ABI void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
The landingpad instruction holds all of the information necessary to generate correct exception handl...
A helper class to return the specified delimiter string after the first invocation of operator String...
An instruction for reading from memory.
static LocationSize precise(uint64_t Value)
static constexpr LocationSize beforeOrAfterPointer()
Any location before or after the base pointer (but still within the underlying object).
LLVM_ABI MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
LLVM_ABI MCSymbol * getOrCreateFrameAllocSymbol(const Twine &FuncName, unsigned Idx)
Gets a symbol that will be defined to the final stack offset of a local variable after codegen.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
Metadata node.
Definition Metadata.h:1078
Machine Value Type.
@ INVALID_SIMPLE_VALUE_TYPE
uint64_t getScalarSizeInBits() const
unsigned getVectorNumElements() const
bool isVector() const
Return true if this is a vector value type.
bool isInteger() const
Return true if this is an integer or a vector integer type.
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
ElementCount getVectorElementCount() const
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
bool bitsGE(MVT VT) const
Return true if this has no less bits than VT.
bool isScalarInteger() const
Return true if this is an integer, not including vectors.
static MVT getVectorVT(MVT VT, unsigned NumElements)
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
static MVT getIntegerVT(unsigned BitWidth)
void normalizeSuccProbs()
Normalize probabilities of all successors so that the sum of them becomes one.
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
LLVM_ABI void setSuccProbability(succ_iterator I, BranchProbability Prob)
Set successor probability of a given iterator.
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
SmallVectorImpl< MachineBasicBlock * >::iterator succ_iterator
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
void setIsEHContTarget(bool V=true)
Indicates if this is a target of Windows EH Continuation Guard.
void setIsEHFuncletEntry(bool V=true)
Indicates if this is the entry block of an EH funclet.
MachineInstrBundleIterator< MachineInstr > iterator
void setIsEHScopeEntry(bool V=true)
Indicates if this is the entry block of an EH scope, i.e., the block that that used to have a catchpa...
void setMachineBlockAddressTaken()
Set this block to indicate that its address is used as something other than the target of a terminato...
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
void setIsImmutableObjectIndex(int ObjectIdx, bool IsImmutable)
Marks the immutability of an object.
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
bool hasOpaqueSPAdjustment() const
Returns true if the function contains opaque dynamic stack adjustments.
int getStackProtectorIndex() const
Return the index for the stack protector object.
void setIsAliasedObjectIndex(int ObjectIdx, bool IsAliased)
Set "maybe pointed to by an LLVM IR value" for an object.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
void RemoveStackObject(int ObjectIdx)
Remove or mark dead a statically sized stack object.
void setFunctionContextIndex(int I)
const WinEHFuncInfo * getWinEHFuncInfo() const
getWinEHFuncInfo - Return information about how the current function uses Windows exception handling.
bool useDebugInstrRef() const
Returns true if the function's variable locations are tracked with instruction referencing.
void setCallSiteBeginLabel(MCSymbol *BeginLabel, unsigned Site)
Map the begin label for a call site.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, Align base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MCContext & getContext() const
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
void addCodeViewAnnotation(MCSymbol *Label, MDNode *MD)
Record annotations associated with a particular label.
Function & getFunction()
Return the LLVM function that this machine code represents.
BasicBlockListType::iterator iterator
void setHasEHContTarget(bool V)
void addInvoke(MachineBasicBlock *LandingPad, MCSymbol *BeginLabel, MCSymbol *EndLabel)
Provide the begin and end labels of an invoke style call and associate it with a try landing pad bloc...
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineInstr - Allocate a new MachineInstr.
void insert(iterator MBBI, MachineBasicBlock *MBB)
const MachineInstrBuilder & addSym(MCSymbol *Sym, unsigned char TargetFlags=0) const
const MachineInstrBuilder & addFrameIndex(int Idx) const
Representation of each machine instruction.
A description of a memory reference used in the backend.
Flags
Flags values. These may be or'd together.
@ MOVolatile
The memory access is volatile.
@ MODereferenceable
The memory access is dereferenceable (i.e., doesn't trap).
@ MOLoad
The memory access reads data.
@ MONonTemporal
The memory access is non-temporal.
@ MOInvariant
The memory access always returns the same value (or traps).
@ MOStore
The memory access writes data.
static MachineOperand CreateReg(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false, bool isRenamable=false)
static MachineOperand CreateFI(int Idx)
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLVM_ABI MCRegister getLiveInPhysReg(Register VReg) const
getLiveInPhysReg - If VReg is a live-in virtual register, return the corresponding live-in physical r...
An SDNode that represents everything that will be needed to construct a MachineInstr.
bool contains(const KeyT &Key) const
Definition MapVector.h:146
std::pair< iterator, bool > try_emplace(const KeyT &Key, Ts &&...Args)
Definition MapVector.h:116
static MemoryLocation getAfter(const Value *Ptr, const AAMDNodes &AATags=AAMDNodes())
Return a location that may access any location after Ptr, while remaining within the underlying objec...
Metadata wrapper in the Value hierarchy.
Definition Metadata.h:183
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:79
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Definition Register.h:83
Resume the propagation of an exception.
Return a value (possibly void), from a function.
Holds the information from a dbg_label node through SDISel.
static SDDbgOperand fromNode(SDNode *Node, unsigned ResNo)
static SDDbgOperand fromFrameIdx(unsigned FrameIdx)
static SDDbgOperand fromVReg(Register VReg)
static SDDbgOperand fromConst(const Value *Const)
Holds the information from a dbg_value node through SDISel.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
iterator_range< value_op_iterator > op_values() const
unsigned getIROrder() const
Return the node ordering.
uint64_t getAsZExtVal() const
Helper method returns the zero-extended integer value of a ConstantSDNode.
unsigned getNumValues() const
Return the number of values defined/returned by this operator.
const SDValue & getOperand(unsigned Num) const
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDNode * getNode() const
get the SDNode which holds the desired result
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
TypeSize getValueSizeInBits() const
Returns the size of the value in bits.
const SDValue & getOperand(unsigned i) const
unsigned getResNo() const
get the index which selects a specific result in the SDNode
MVT getSimpleValueType() const
Return the simple ValueType of the referenced return value.
unsigned getOpcode() const
SelectionDAGBuilder - This is the common target-independent lowering implementation that is parameter...
SDValue getValue(const Value *V)
getValue - Return an SDValue for the given Value.
DenseMap< const Constant *, Register > ConstantsOut
void addDanglingDebugInfo(SmallVectorImpl< Value * > &Values, DILocalVariable *Var, DIExpression *Expr, bool IsVariadic, DebugLoc DL, unsigned Order)
Register a dbg_value which relies on a Value which we have not yet seen.
void visitDbgInfo(const Instruction &I)
void clearDanglingDebugInfo()
Clear the dangling debug information map.
void LowerCallTo(const CallBase &CB, SDValue Callee, bool IsTailCall, bool IsMustTailCall, const BasicBlock *EHPadBB=nullptr, const TargetLowering::PtrAuthInfo *PAI=nullptr)
void clear()
Clear out the current SelectionDAG and the associated state and prepare this SelectionDAGBuilder obje...
void visitBitTestHeader(SwitchCG::BitTestBlock &B, MachineBasicBlock *SwitchBB)
visitBitTestHeader - This function emits necessary code to produce value suitable for "bit tests"
void LowerStatepoint(const GCStatepointInst &I, const BasicBlock *EHPadBB=nullptr)
std::unique_ptr< SDAGSwitchLowering > SL
SDValue lowerRangeToAssertZExt(SelectionDAG &DAG, const Instruction &I, SDValue Op)
bool HasTailCall
This is set to true if a call in the current block has been translated as a tail call.
bool ShouldEmitAsBranches(const std::vector< SwitchCG::CaseBlock > &Cases)
If the set of cases should be emitted as a series of branches, return true.
void EmitBranchForMergedCondition(const Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB, BranchProbability TProb, BranchProbability FProb, bool InvertCond)
EmitBranchForMergedCondition - Helper method for FindMergedConditions.
void LowerDeoptimizeCall(const CallInst *CI)
void LowerCallSiteWithDeoptBundle(const CallBase *Call, SDValue Callee, const BasicBlock *EHPadBB)
SwiftErrorValueTracking & SwiftError
Information about the swifterror values used throughout the function.
SDValue getNonRegisterValue(const Value *V)
getNonRegisterValue - Return an SDValue for the given Value, but don't look in FuncInfo....
const TargetTransformInfo * TTI
DenseMap< MachineBasicBlock *, SmallVector< unsigned, 4 > > LPadToCallSiteMap
Map a landing pad to the call site indexes.
SDValue lowerNoFPClassToAssertNoFPClass(SelectionDAG &DAG, const Instruction &I, SDValue Op)
void handleDebugDeclare(Value *Address, DILocalVariable *Variable, DIExpression *Expression, DebugLoc DL)
bool shouldKeepJumpConditionsTogether(const FunctionLoweringInfo &FuncInfo, const BranchInst &I, Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs, TargetLoweringBase::CondMergingParams Params) const
StatepointLoweringState StatepointLowering
State used while lowering a statepoint sequence (gc_statepoint, gc_relocate, and gc_result).
void visitBitTestCase(SwitchCG::BitTestBlock &BB, MachineBasicBlock *NextMBB, BranchProbability BranchProbToNext, Register Reg, SwitchCG::BitTestCase &B, MachineBasicBlock *SwitchBB)
visitBitTestCase - this function produces one "bit test"
bool canTailCall(const CallBase &CB) const
void populateCallLoweringInfo(TargetLowering::CallLoweringInfo &CLI, const CallBase *Call, unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy, AttributeSet RetAttrs, bool IsPatchPoint)
Populate a CallLowerinInfo (into CLI) based on the properties of the call being lowered.
void CopyValueToVirtualRegister(const Value *V, Register Reg, ISD::NodeType ExtendType=ISD::ANY_EXTEND)
void salvageUnresolvedDbgValue(const Value *V, DanglingDebugInfo &DDI)
For the given dangling debuginfo record, perform last-ditch efforts to resolve the debuginfo to somet...
SmallVector< SDValue, 8 > PendingLoads
Loads are not emitted to the program immediately.
GCFunctionInfo * GFI
Garbage collection metadata for the function.
void init(GCFunctionInfo *gfi, BatchAAResults *BatchAA, AssumptionCache *AC, const TargetLibraryInfo *li, const TargetTransformInfo &TTI)
SDValue getRoot()
Similar to getMemoryRoot, but also flushes PendingConstrainedFP(Strict) items.
void ExportFromCurrentBlock(const Value *V)
ExportFromCurrentBlock - If this condition isn't known to be exported from the current basic block,...
void resolveOrClearDbgInfo()
Evict any dangling debug information, attempting to salvage it first.
std::pair< SDValue, SDValue > lowerInvokable(TargetLowering::CallLoweringInfo &CLI, const BasicBlock *EHPadBB=nullptr)
SDValue getMemoryRoot()
Return the current virtual root of the Selection DAG, flushing any PendingLoad items.
void resolveDanglingDebugInfo(const Value *V, SDValue Val)
If we saw an earlier dbg_value referring to V, generate the debug data structures now that we've seen...
void visit(const Instruction &I)
void dropDanglingDebugInfo(const DILocalVariable *Variable, const DIExpression *Expr)
If we have dangling debug info that describes Variable, or an overlapping part of variable considerin...
SDValue getCopyFromRegs(const Value *V, Type *Ty)
If there was virtual register allocated for the value V emit CopyFromReg of the specified type Ty.
void CopyToExportRegsIfNeeded(const Value *V)
CopyToExportRegsIfNeeded - If the given value has virtual registers created for it,...
void handleKillDebugValue(DILocalVariable *Var, DIExpression *Expr, DebugLoc DbgLoc, unsigned Order)
Create a record for a kill location debug intrinsic.
void visitJumpTable(SwitchCG::JumpTable &JT)
visitJumpTable - Emit JumpTable node in the current MBB
SDValue getFPOperationRoot(fp::ExceptionBehavior EB)
Return the current virtual root of the Selection DAG, flushing PendingConstrainedFP or PendingConstra...
void visitJumpTableHeader(SwitchCG::JumpTable &JT, SwitchCG::JumpTableHeader &JTH, MachineBasicBlock *SwitchBB)
visitJumpTableHeader - This function emits necessary code to produce index in the JumpTable from swit...
void LowerCallSiteWithPtrAuthBundle(const CallBase &CB, const BasicBlock *EHPadBB)
static const unsigned LowestSDNodeOrder
Lowest valid SDNodeOrder.
FunctionLoweringInfo & FuncInfo
Information about the function as a whole.
void setValue(const Value *V, SDValue NewN)
void FindMergedConditions(const Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB, Instruction::BinaryOps Opc, BranchProbability TProb, BranchProbability FProb, bool InvertCond)
const TargetLibraryInfo * LibInfo
bool isExportableFromCurrentBlock(const Value *V, const BasicBlock *FromBB)
void visitSPDescriptorParent(StackProtectorDescriptor &SPD, MachineBasicBlock *ParentBB)
Codegen a new tail for a stack protector check ParentMBB which has had its tail spliced into a stack ...
bool handleDebugValue(ArrayRef< const Value * > Values, DILocalVariable *Var, DIExpression *Expr, DebugLoc DbgLoc, unsigned Order, bool IsVariadic)
For a given list of Values, attempt to create and record a SDDbgValue in the SelectionDAG.
SDValue getControlRoot()
Similar to getRoot, but instead of flushing all the PendingLoad items, flush all the PendingExports (...
void UpdateSplitBlock(MachineBasicBlock *First, MachineBasicBlock *Last)
When an MBB was split during scheduling, update the references that need to refer to the last resulti...
SDValue getValueImpl(const Value *V)
getValueImpl - Helper function for getValue and getNonRegisterValue.
void visitSwitchCase(SwitchCG::CaseBlock &CB, MachineBasicBlock *SwitchBB)
visitSwitchCase - Emits the necessary code to represent a single node in the binary search tree resul...
void visitSPDescriptorFailure(StackProtectorDescriptor &SPD)
Codegen the failure basic block for a stack protector check.
std::unique_ptr< FunctionLoweringInfo > FuncInfo
SmallPtrSet< const Instruction *, 4 > ElidedArgCopyInstrs
const TargetLowering * TLI
MachineRegisterInfo * RegInfo
std::unique_ptr< SwiftErrorValueTracking > SwiftError
virtual void emitFunctionEntryCode()
std::unique_ptr< SelectionDAGBuilder > SDB
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrnlen(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src, SDValue MaxLength, MachinePointerInfo SrcPtrInfo) const
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrlen(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src, const CallInst *CI) const
virtual std::pair< SDValue, SDValue > EmitTargetCodeForMemchr(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Src, SDValue Char, SDValue Length, MachinePointerInfo SrcPtrInfo) const
Emit target-specific code that performs a memchr, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForMemcmp(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, SDValue Op3, const CallInst *CI) const
Emit target-specific code that performs a memcmp/bcmp, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrcmp(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, MachinePointerInfo Op1PtrInfo, MachinePointerInfo Op2PtrInfo) const
Emit target-specific code that performs a strcmp, in cases where that is faster than a libcall.
virtual SDValue EmitTargetCodeForSetTag(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Addr, SDValue Size, MachinePointerInfo DstPtrInfo, bool ZeroData) const
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...
LLVM_ABI SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI SDValue getValueType(EVT)
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
LLVM_ABI SDValue getFPExtendOrRound(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of float type, to the float type VT, by either extending or rounding (by tr...
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
LLVM_ABI SDValue getVectorIdxConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
MachineFunction & getMachineFunction() const
LLVM_ABI SDValue getFrameIndex(int FI, EVT VT, bool isTarget=false)
LLVM_ABI SDValue getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either zero-extending or trunca...
LLVMContext * getContext() const
const SDValue & setRoot(SDValue N)
Set the current root tag of the SelectionDAG.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void swap(SmallVectorImpl &RHS)
void resize(size_type N)
void push_back(const T &Elt)
pointer data()
Return a pointer to the vector's buffer, even if empty().
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Encapsulates all of the information needed to generate a stack protector check, and signals to isel w...
MachineBasicBlock * getSuccessMBB()
MachineBasicBlock * getFailureMBB()
MachineBasicBlock * getParentMBB()
bool shouldEmitFunctionBasedCheckStackProtector() const
An instruction for storing to memory.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:143
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:140
Multiway switch.
Information about stack frame layout on the target.
virtual TargetStackID::Value getStackIDForScalableVectors() const
Returns the StackID that scalable vectors should be associated with.
Provides information about what library functions are available for the current target.
virtual Align getByValTypeAlignment(Type *Ty, const DataLayout &DL) const
Returns the desired alignment for ByVal or InAlloca aggregate function arguments in the caller parame...
virtual bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF, EVT) const
Return true if an FMA operation is faster than a pair of fmul and fadd instructions.
EVT getMemValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
EVT getValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Return the EVT corresponding to this LLVM type.
LegalizeAction
This enum indicates whether operations are valid for a target, and if not, what action should be used...
virtual bool useStackGuardXorFP() const
If this function returns true, stack protection checks should XOR the frame pointer (or whichever poi...
virtual const TargetRegisterClass * getRegClassFor(MVT VT, bool isDivergent=false) const
Return the register class that should be used for the specified value type.
virtual bool isLegalScaleForGatherScatter(uint64_t Scale, uint64_t ElemSize) const
virtual bool isSExtCheaperThanZExt(EVT FromTy, EVT ToTy) const
Return true if sign-extension from FromTy to ToTy is cheaper than zero-extension.
MVT getVectorIdxTy(const DataLayout &DL) const
Returns the type to be used for the index operand of: ISD::INSERT_VECTOR_ELT, ISD::EXTRACT_VECTOR_ELT...
virtual unsigned getNumRegistersForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain targets require unusual breakdowns of certain types.
virtual bool isZExtFree(Type *FromTy, Type *ToTy) const
Return true if any actual instruction that defines a value of type FromTy implicitly zero-extends the...
virtual MVT getRegisterTypeForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain combinations of ABIs, Targets and features require that types are legal for some operations a...
virtual Value * getSDagStackGuard(const Module &M) const
Return the variable that's previously inserted by insertSSPDeclarations, if any, otherwise return nul...
virtual unsigned getNumRegisters(LLVMContext &Context, EVT VT, std::optional< MVT > RegisterVT=std::nullopt) const
Return the number of registers that this ValueType will eventually require.
unsigned getBitWidthForCttzElements(Type *RetTy, ElementCount EC, bool ZeroIsPoison, const ConstantRange *VScaleRange) const
Return the minimum number of bits required to hold the maximum possible number of trailing zero vecto...
virtual bool shouldExtendGSIndex(EVT VT, EVT &EltTy) const
Returns true if the index type for a masked gather/scatter requires extending.
virtual unsigned getVectorTypeBreakdownForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const
Certain targets such as MIPS require that some types such as vectors are always broken down into scal...
Function * getSSPStackGuardCheck(const Module &M) const
If the target has a standard stack protection check function that performs validation and error handl...
Register getStackPointerRegisterToSaveRestore() const
If a physical register, this specifies the register that llvm.savestack/llvm.restorestack should save...
LegalizeAction getFixedPointOperationAction(unsigned Op, EVT VT, unsigned Scale) const
Some fixed point operations may be natively supported by the target but only for specific scales.
MachineMemOperand::Flags getAtomicMemOperandFlags(const Instruction &AI, const DataLayout &DL) const
virtual bool allowsMisalignedMemoryAccesses(EVT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *=nullptr) const
Determine if the target supports unaligned memory accesses.
bool isOperationCustom(unsigned Op, EVT VT) const
Return true if the operation uses custom lowering, regardless of whether the type is legal or not.
bool hasBigEndianPartOrdering(EVT VT, const DataLayout &DL) const
When splitting a value of the specified type into parts, does the Lo or Hi part come first?
EVT getShiftAmountTy(EVT LHSTy, const DataLayout &DL) const
Returns the type for the shift amount of a shift opcode.
virtual Align getABIAlignmentForCallingConv(Type *ArgTy, const DataLayout &DL) const
Certain targets have context sensitive alignment requirements, where one type has the alignment requi...
MachineMemOperand::Flags getVPIntrinsicMemOperandFlags(const VPIntrinsic &VPIntrin) const
virtual bool shouldExpandGetActiveLaneMask(EVT VT, EVT OpVT) const
Return true if the @llvm.get.active.lane.mask intrinsic should be expanded using generic code in Sele...
virtual bool getTgtMemIntrinsic(IntrinsicInfo &, const CallBase &, MachineFunction &, unsigned) const
Given an intrinsic, checks if on the target the intrinsic will need to map to a MemIntrinsicNode (tou...
virtual EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const
Return the ValueType of the result of SETCC operations.
MachineMemOperand::Flags getLoadMemOperandFlags(const LoadInst &LI, const DataLayout &DL, AssumptionCache *AC=nullptr, const TargetLibraryInfo *LibInfo=nullptr) const
virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
MVT getProgramPointerTy(const DataLayout &DL) const
Return the type for code pointers, which is determined by the program address space specified through...
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
bool isOperationLegal(unsigned Op, EVT VT) const
Return true if the specified operation is legal on this target.
virtual bool shouldExpandVectorMatch(EVT VT, unsigned SearchSize) const
Return true if the @llvm.experimental.vector.match intrinsic should be expanded for vector type ‘VT’ ...
virtual MVT getFenceOperandTy(const DataLayout &DL) const
Return the type for operands of fence.
virtual bool shouldExpandGetVectorLength(EVT CountVT, unsigned VF, bool IsScalable) const
bool isOperationLegalOrCustom(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal with custom lower...
virtual MVT hasFastEqualityCompare(unsigned NumBits) const
Return the preferred operand type if the target has a quick way to compare integer values of the give...
MachineMemOperand::Flags getStoreMemOperandFlags(const StoreInst &SI, const DataLayout &DL) const
virtual bool shouldExpandCttzElements(EVT VT) const
Return true if the @llvm.experimental.cttz.elts intrinsic should be expanded using generic code in Se...
virtual bool signExtendConstant(const ConstantInt *C) const
Return true if this constant should be sign extended when promoting to a larger type.
LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const
Return how we should legalize values of this type, either it is already legal (return 'Legal') or we ...
virtual Register getExceptionPointerRegister(const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception address on entry to an ...
bool supportsUnalignedAtomics() const
Whether the target supports unaligned atomic operations.
std::vector< ArgListEntry > ArgListTy
bool isBeneficialToExpandPowI(int64_t Exponent, bool OptForSize) const
Return true if it is beneficial to expand an @llvm.powi.
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:285
Value * getOperand(unsigned i) const
Definition User.h:233
unsigned getNumOperands() const
Definition User.h:255
op_iterator op_end()
Definition User.h:287
This class represents the va_arg llvm instruction, which returns an argument of the specified type gi...
LLVM_ABI CmpInst::Predicate getPredicate() const
This is the common base class for vector predication intrinsics.
static LLVM_ABI std::optional< unsigned > getVectorLengthParamPos(Intrinsic::ID IntrinsicID)
LLVM_ABI MaybeAlign getPointerAlignment() const
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:439
iterator_range< user_iterator > users()
Definition Value.h:426
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:708
bool use_empty() const
Definition Value.h:346
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.cpp:1106
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
Base class of all SIMD vector types.
Type * getElementType() const
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:230
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
const ParentTy * getParent() const
Definition ilist_node.h:34
A raw_ostream that writes to an std::string.
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char SymbolName[]
Key for Kernel::Metadata::mSymbolName.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
Definition CallingConv.h:60
@ AMDGPU_CS_Chain
Used on AMDGPUs to give the middle-end more control over argument placement.
@ X86_VectorCall
MSVC calling convention that passes vectors and vector aggregates in SSE registers.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:41
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition ISDOpcodes.h: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:787
@ 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.
@ 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:778
@ 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:852
@ 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:879
@ 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:746
@ ATOMIC_FENCE
OUTCHAIN = ATOMIC_FENCE(INCHAIN, ordering, scope) This corresponds to the fence instruction.
@ RESET_FPMODE
Sets default dynamic floating-point control modes.
@ FMULADD
FMULADD - Performs a * b + c, with, or without, intermediate rounding.
Definition ISDOpcodes.h: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:992
@ 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:773
@ 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:974
@ CONVERGENCECTRL_GLUE
This does not correspond to any convergence control intrinsic.
@ PARTIAL_REDUCE_UMLA
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:843
@ 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:786
@ 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:795
@ 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:671
@ VACOPY
VACOPY - VACOPY has 5 operands: an input chain, a destination pointer, a source pointer,...
@ GET_ACTIVE_LANE_MASK
GET_ACTIVE_LANE_MASK - this corrosponds to the llvm.get.active.lane.mask intrinsic.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition ISDOpcodes.h: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:969
@ CLEANUPRET
CLEANUPRET - Represents a return from a cleanup block funclet.
@ ATOMIC_LOAD_FMAXIMUM
@ GET_FPMODE
Reads the current dynamic floating-point control modes.
@ GET_FPENV
Gets the current floating-point environment.
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:764
@ AssertNoFPClass
AssertNoFPClass - These nodes record if a register contains a float value that is known to be not som...
Definition ISDOpcodes.h:78
@ PtrAuthGlobalAddress
A ptrauth constant.
Definition ISDOpcodes.h:100
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition ISDOpcodes.h: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:849
@ 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, IMM) - Shifts CONCAT_VECTORS(VEC1, VEC2) left by IMM elements and retu...
Definition ISDOpcodes.h:653
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:726
@ VECTOR_REVERSE
VECTOR_REVERSE(VECTOR) - Returns a vector, of the same type as VECTOR, whose elements are shuffled us...
Definition ISDOpcodes.h: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:977
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition ISDOpcodes.h:804
@ 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:925
@ READCYCLECOUNTER
READCYCLECOUNTER - This corresponds to the readcyclecounter intrinsic.
@ RELOC_NONE
Issue a no-op relocation against a given symbol at the current location.
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:738
@ TRAP
TRAP - Trapping instruction.
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition ISDOpcodes.h:205
@ SCMP
[US]CMP - 3-way comparison of signed or unsigned integers.
Definition ISDOpcodes.h:734
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, IMM) - Shifts CONCAT_VECTORS(VEC1, VEC2) right by IMM elements and re...
Definition ISDOpcodes.h:656
@ 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:958
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
Definition ISDOpcodes.h:698
@ SPONENTRY
SPONENTRY - Represents the llvm.sponentry intrinsic.
Definition ISDOpcodes.h:122
@ CLEAR_CACHE
llvm.clear_cache intrinsic Operands: Input Chain, Start Addres, End Address Outputs: Output Chain
@ CONVERGENCECTRL_LOOP
@ INLINEASM
INLINEASM - Represents an inline asm block.
@ FP_TO_SINT_SAT
FP_TO_[US]INT_SAT - Convert floating point value in operand 0 to a signed or unsigned scalar integer ...
Definition ISDOpcodes.h:944
@ 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:855
@ 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:1737
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
Definition STLExtras.h:1667
LLVM_ABI void GetReturnInfo(CallingConv::ID CC, Type *ReturnType, AttributeList attr, SmallVectorImpl< ISD::OutputArg > &Outs, const TargetLowering &TLI, const DataLayout &DL)
Given an LLVM IR type and return type attributes, compute the return value EVTs and flags,...
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
LLVM_ABI bool isOnlyUsedInZeroEqualityComparison(const Instruction *CxtI)
void ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, Type *Ty, SmallVectorImpl< EVT > &ValueVTs, SmallVectorImpl< EVT > *MemVTs=nullptr, SmallVectorImpl< TypeSize > *Offsets=nullptr, TypeSize StartingOffset=TypeSize::getZero())
ComputeValueVTs - Given an LLVM IR type, compute a sequence of EVTs that represent all the individual...
Definition Analysis.cpp:119
LLVM_ABI SDValue peekThroughBitcasts(SDValue V)
Return the non-bitcasted source operand of V if it exists.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
@ Done
Definition Threading.h:60
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition bit.h:293
LLVM_ABI void diagnoseDontCall(const CallInst &CI)
auto successors(const MachineBasicBlock *BB)
bool isIntOrFPConstant(SDValue V)
Return true if V is either a integer or FP constant.
static ConstantRange getRange(Value *Op, SCCPSolver &Solver, const SmallPtrSetImpl< Value * > &InsertedValues)
Helper for getting ranges from Solver.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2184
Value * GetPointerBaseWithConstantOffset(Value *Ptr, int64_t &Offset, const DataLayout &DL, bool AllowNonInbounds=true)
Analyze the specified pointer to see if it can be expressed as a base pointer plus a constant offset.
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition MathExtras.h:243
auto cast_or_null(const Y &Val)
Definition Casting.h:714
constexpr T alignDown(U Value, V Align, W Skew=0)
Returns the largest unsigned integer less than or equal to Value and is Skew mod Align.
Definition MathExtras.h:546
gep_type_iterator gep_type_end(const User *GEP)
constexpr int popcount(T Value) noexcept
Count the number of set bits in a value.
Definition bit.h:154
LLVM_ABI ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
detail::concat_range< ValueT, RangeTs... > concat(RangeTs &&...Ranges)
Returns a concatenated range across two or more ranges.
Definition STLExtras.h:1150
bool isScopedEHPersonality(EHPersonality Pers)
Returns true if this personality uses scope-style EH IR instructions: catchswitch,...
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition bit.h:202
void ComputeValueTypes(const DataLayout &DL, Type *Ty, SmallVectorImpl< Type * > &Types, SmallVectorImpl< TypeSize > *Offsets=nullptr, TypeSize StartingOffset=TypeSize::getZero())
Given an LLVM IR type, compute non-aggregate subtypes.
Definition Analysis.cpp:72
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1744
LLVM_ABI llvm::SmallVector< int, 16 > createStrideMask(unsigned Start, unsigned Stride, unsigned VF)
Create a stride shuffle mask.
@ SPF_ABS
Floating point maxnum.
@ SPF_NABS
Absolute value.
@ SPF_FMAXNUM
Floating point minnum.
@ SPF_UMIN
Signed minimum.
@ SPF_UMAX
Signed maximum.
@ SPF_SMAX
Unsigned minimum.
@ SPF_FMINNUM
Unsigned maximum.
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
detail::zippy< detail::zip_first, T, U, Args... > zip_first(T &&t, U &&u, Args &&...args)
zip iterator that, for the sake of efficiency, assumes the first iteratee to be the shortest.
Definition STLExtras.h:852
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1634
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI SelectPatternResult matchSelectPattern(Value *V, Value *&LHS, Value *&RHS, Instruction::CastOps *CastOp=nullptr, unsigned Depth=0)
Pattern match integer [SU]MIN, [SU]MAX and ABS idioms, returning the kind and providing the out param...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:167
generic_gep_type_iterator<> gep_type_iterator
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
auto succ_size(const MachineBasicBlock *BB)
bool hasSingleElement(ContainerTy &&C)
Returns true if the given container only contains a single element.
Definition STLExtras.h:300
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
ISD::CondCode getFCmpCondCode(FCmpInst::Predicate Pred)
getFCmpCondCode - Return the ISD condition code corresponding to the given LLVM IR floating-point con...
Definition Analysis.cpp: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:2274
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Global
Append to llvm.global_dtors.
AtomicOrdering
Atomic ordering for LLVM's memory model.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
bool isFuncletEHPersonality(EHPersonality Pers)
Returns true if this is a personality function that invokes handler funclets (which must return to it...
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:189
LLVM_ABI bool isAssignmentTrackingEnabled(const Module &M)
Return true if assignment tracking is enabled for module M.
LLVM_ABI llvm::SmallVector< int, 16 > createInterleaveMask(unsigned VF, unsigned NumVecs)
Create an interleave shuffle mask.
@ UMin
Unsigned integer min implemented in terms of select(cmp()).
@ Or
Bitwise or logical OR of integers.
@ Mul
Product of integers.
@ And
Bitwise or logical AND of integers.
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:144
@ SPNB_RETURNS_NAN
NaN behavior not applicable.
@ SPNB_RETURNS_OTHER
Given one NaN input, returns the NaN.
@ SPNB_RETURNS_ANY
Given one NaN input, returns the non-NaN.
bool isInTailCallPosition(const CallBase &Call, const TargetMachine &TM, bool ReturnsFirstArg=false)
Test if the given instruction is in a position to be optimized with a tail-call.
Definition Analysis.cpp: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 std::optional< RoundingMode > convertStrToRoundingMode(StringRef)
Returns a valid RoundingMode enumerator when given a string that is valid as input in constrained int...
Definition FPEnv.cpp:25
gep_type_iterator gep_type_begin(const User *GEP)
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
Definition STLExtras.h:2168
GlobalValue * ExtractTypeInfo(Value *V)
ExtractTypeInfo - Returns the type info, possibly bitcast, encoded in V.
Definition Analysis.cpp:181
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1945
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:201
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
Definition STLExtras.h:2156
LLVM_ABI Constant * ConstantFoldLoadFromConstPtr(Constant *C, Type *Ty, APInt Offset, const DataLayout &DL)
Return the value that a load from C with offset Offset would produce if it is constant and determinab...
unsigned ComputeLinearIndex(Type *Ty, const unsigned *Indices, const unsigned *IndicesEnd, unsigned CurIndex=0)
Compute the linearized index of a member in a nested aggregate/struct/array.
Definition Analysis.cpp:33
T bit_floor(T Value)
Returns the largest integral power of two no greater than Value if Value is nonzero.
Definition bit.h:330
@ Default
The result values are uniform if and only if all operands are uniform.
Definition Uniformity.h:20
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:180
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:872
#define N
#define NC
Definition regutils.h:42
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:77
Extended Value Type.
Definition ValueTypes.h:35
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
Definition ValueTypes.h:395
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
Definition ValueTypes.h:74
uint64_t getScalarStoreSize() const
Definition ValueTypes.h:402
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition ValueTypes.h:284
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:300
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition ValueTypes.h:147
ElementCount getVectorElementCount() const
Definition ValueTypes.h:350
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:373
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition ValueTypes.h:359
static LLVM_ABI EVT getEVT(Type *Ty, bool HandleUnknown=false)
Return the value type corresponding to the specified type.
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:251
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)