1//===-- ConstantFolding.cpp - Fold instructions into constants ------------===// 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 7//===----------------------------------------------------------------------===// 9// This file defines routines for folding instructions into constants. 11// Also, to supplement the basic IR ConstantExpr simplifications, 12// this file defines some additional folding routines that can make use of 13// DataLayout information. These functions cannot go in IR due to library 16//===----------------------------------------------------------------------===// 31#include "llvm/Config/config.h" 45#include "llvm/IR/IntrinsicsAArch64.h" 46#include "llvm/IR/IntrinsicsAMDGPU.h" 47#include "llvm/IR/IntrinsicsARM.h" 48#include "llvm/IR/IntrinsicsNVPTX.h" 49#include "llvm/IR/IntrinsicsWebAssembly.h" 50#include "llvm/IR/IntrinsicsX86.h" 69//===----------------------------------------------------------------------===// 70// Constant Folding internal helper functions 71//===----------------------------------------------------------------------===// 77// Now that we know that the input value is a vector of integers, just shift 78// and insert them into our result. 79unsigned BitShift =
DL.getTypeSizeInBits(SrcEltTy);
80for (
unsigned i = 0; i != NumSrcElts; ++i) {
82if (
DL.isLittleEndian())
83 Element =
C->getAggregateElement(NumSrcElts - i - 1);
85 Element =
C->getAggregateElement(i);
87if (isa_and_nonnull<UndefValue>(Element)) {
92auto *ElementCI = dyn_cast_or_null<ConstantInt>(Element);
97Result |= ElementCI->getValue().zext(
Result.getBitWidth());
103/// Constant fold bitcast, symbolically evaluating it with DataLayout. 104/// This always returns a non-null constant, but it may be a 105/// ConstantExpr if unfoldable. 108"Invalid constantexpr bitcast!");
110// Catch the obvious splat cases. 114if (
auto *VTy = dyn_cast<VectorType>(
C->getType())) {
115// Handle a vector->scalar integer/fp cast. 117unsigned NumSrcElts = cast<FixedVectorType>(VTy)->getNumElements();
118Type *SrcEltTy = VTy->getElementType();
120// If the vector is a vector of floating point, convert it to vector of int 121// to simplify things. 126// Ask IR to do the conversion now that #elts line up. 131if (
Constant *CE = foldConstVectorToAPInt(Result, DestTy,
C,
132 SrcEltTy, NumSrcElts,
DL))
135if (isa<IntegerType>(DestTy))
136return ConstantInt::get(DestTy, Result);
143// The code below only handles casts to vectors currently. 144auto *DestVTy = dyn_cast<VectorType>(DestTy);
148// If this is a scalar -> vector cast, convert the input into a <1 x scalar> 149// vector so the code below can handle it uniformly. 150if (!isa<VectorType>(
C->getType()) &&
151 (isa<ConstantFP>(
C) || isa<ConstantInt>(
C))) {
152Constant *Ops =
C;
// don't take the address of C! 156// Some of what follows may extend to cover scalable vectors but the current 157// implementation is fixed length specific. 158if (!isa<FixedVectorType>(
C->getType()))
161// If this is a bitcast from constant vector -> vector, fold it. 162if (!isa<ConstantDataVector>(
C) && !isa<ConstantVector>(
C) &&
163 !isa<ConstantInt>(
C) && !isa<ConstantFP>(
C))
166// If the element types match, IR can fold it. 167unsigned NumDstElt = cast<FixedVectorType>(DestVTy)->getNumElements();
168unsigned NumSrcElt = cast<FixedVectorType>(
C->getType())->getNumElements();
169if (NumDstElt == NumSrcElt)
172Type *SrcEltTy = cast<VectorType>(
C->getType())->getElementType();
173Type *DstEltTy = DestVTy->getElementType();
175// Otherwise, we're changing the number of elements in a vector, which 176// requires endianness information to do the right thing. For example, 177// bitcast (<2 x i64> <i64 0, i64 1> to <4 x i32>) 178// folds to (little endian): 179// <4 x i32> <i32 0, i32 0, i32 1, i32 0> 180// and to (big endian): 181// <4 x i32> <i32 0, i32 0, i32 0, i32 1> 183// First thing is first. We only want to think about integer here, so if 184// we have something in FP form, recast it as integer. 186// Fold to an vector of integers with same size as our FP type. 190// Recursively handle this integer conversion, if possible. 193// Finally, IR can handle this now that #elts line up. 197// Okay, we know the destination is integer, if the input is FP, convert 198// it to integer first. 203// Ask IR to do the conversion now that #elts line up. 205assert((isa<ConstantVector>(
C) ||
// FIXME: Remove ConstantVector. 206 isa<ConstantDataVector>(
C) || isa<ConstantInt>(
C)) &&
207"Constant folding cannot fail for plain fp->int bitcast!");
210// Now we know that the input and output vectors are both integer vectors 211// of the same size, and that their #elements is not the same. Do the 212// conversion here, which depends on whether the input or output has 214bool isLittleEndian =
DL.isLittleEndian();
217if (NumDstElt < NumSrcElt) {
218// Handle: bitcast (<4 x i32> <i32 0, i32 1, i32 2, i32 3> to <2 x i64>) 220unsigned Ratio = NumSrcElt/NumDstElt;
223for (
unsigned i = 0; i != NumDstElt; ++i) {
224// Build each element of the result. 226unsigned ShiftAmt = isLittleEndian ? 0 : SrcBitSize*(Ratio-1);
227for (
unsigned j = 0;
j != Ratio; ++
j) {
228Constant *Src =
C->getAggregateElement(SrcElt++);
229if (isa_and_nonnull<UndefValue>(Src))
231 cast<VectorType>(
C->getType())->getElementType());
233 Src = dyn_cast_or_null<ConstantInt>(Src);
234if (!Src)
// Reject constantexpr elements. 237// Zero extend the element to the right size. 240assert(Src &&
"Constant folding cannot fail on plain integers");
242// Shift it to the right place, depending on endianness. 244 Instruction::Shl, Src, ConstantInt::get(Src->getType(), ShiftAmt),
246assert(Src &&
"Constant folding cannot fail on plain integers");
248 ShiftAmt += isLittleEndian ? SrcBitSize : -SrcBitSize;
252assert(Elt &&
"Constant folding cannot fail on plain integers");
259// Handle: bitcast (<2 x i64> <i64 0, i64 1> to <4 x i32>) 260unsigned Ratio = NumDstElt/NumSrcElt;
261unsigned DstBitSize =
DL.getTypeSizeInBits(DstEltTy);
263// Loop over each source value, expanding into multiple results. 264for (
unsigned i = 0; i != NumSrcElt; ++i) {
265auto *Element =
C->getAggregateElement(i);
267if (!Element)
// Reject constantexpr elements. 270if (isa<UndefValue>(Element)) {
271// Correctly Propagate undef values. 276auto *Src = dyn_cast<ConstantInt>(Element);
280unsigned ShiftAmt = isLittleEndian ? 0 : DstBitSize*(Ratio-1);
281for (
unsigned j = 0;
j != Ratio; ++
j) {
282// Shift the piece of the value into the right place, depending on 284APInt Elt = Src->getValue().lshr(ShiftAmt);
285 ShiftAmt += isLittleEndian ? DstBitSize : -DstBitSize;
287// Truncate and remember this piece. 288Result.push_back(ConstantInt::get(DstEltTy, Elt.
trunc(DstBitSize)));
295}
// end anonymous namespace 297/// If this constant is a constant offset from a global, return the global and 298/// the constant. Because of constantexprs, this function is recursive. 305// Trivial case, constant is the global. 306if ((GV = dyn_cast<GlobalValue>(
C))) {
312if (
auto *FoundDSOEquiv = dyn_cast<DSOLocalEquivalent>(
C)) {
314 *DSOEquiv = FoundDSOEquiv;
315 GV = FoundDSOEquiv->getGlobalValue();
321// Otherwise, if this isn't a constant expr, bail out. 322auto *CE = dyn_cast<ConstantExpr>(
C);
325// Look through ptr->int and ptr->ptr casts. 326if (CE->getOpcode() == Instruction::PtrToInt ||
327 CE->getOpcode() == Instruction::BitCast)
331// i32* getelementptr ([5 x i32]* @a, i32 0, i32 5) 332auto *
GEP = dyn_cast<GEPOperator>(CE);
339// If the base isn't a global+constant, we aren't either. 344// Otherwise, add any offset that our operands provide. 345if (!
GEP->accumulateConstantOffset(
DL, TmpOffset))
355Type *SrcTy =
C->getType();
359TypeSize DestSize =
DL.getTypeSizeInBits(DestTy);
361if (!TypeSize::isKnownGE(SrcSize, DestSize))
364// Catch the obvious splat cases (since all-zeros can coerce non-integral 369// If the type sizes are the same and a cast is legal, just directly 371// But be careful not to coerce non-integral pointers illegally. 372if (SrcSize == DestSize &&
376// If we are going from a pointer to int or vice versa, we spell the cast 379 Cast = Instruction::IntToPtr;
381 Cast = Instruction::PtrToInt;
387// If this isn't an aggregate type, there is nothing we can do to drill down 388// and find a bitcastable constant. 392// We're simulating a load through a pointer that was bitcast to point to 393// a different type, so we can try to walk down through the initial 394// elements of an aggregate to see if some part of the aggregate is 395// castable to implement the "load" semantic model. 397// Struct types might have leading zero-length elements like [0 x i32], 398// which are certainly not what we are looking for, so skip them. 402 ElemC =
C->getAggregateElement(Elem++);
403 }
while (ElemC &&
DL.getTypeSizeInBits(ElemC->
getType()).isZero());
406// For non-byte-sized vector elements, the first element is not 407// necessarily located at the vector base address. 408if (
auto *VT = dyn_cast<VectorType>(SrcTy))
409if (!
DL.typeSizeEqualsStoreSize(VT->getElementType()))
412C =
C->getAggregateElement(0u);
421/// Recursive helper to read bits out of global. C is the constant being copied 422/// out of. ByteOffset is an offset into C. CurPtr is the pointer to copy 423/// results into and BytesLeft is the number of bytes left in 424/// the CurPtr buffer. DL is the DataLayout. 427assert(ByteOffset <=
DL.getTypeAllocSize(
C->getType()) &&
428"Out of range access");
430// If this element is zero or undefined, we can just return since *CurPtr is 432if (isa<ConstantAggregateZero>(
C) || isa<UndefValue>(
C))
435if (
auto *CI = dyn_cast<ConstantInt>(
C)) {
436if ((CI->getBitWidth() & 7) != 0)
438constAPInt &Val = CI->getValue();
439unsigned IntBytes =
unsigned(CI->getBitWidth()/8);
441for (
unsigned i = 0; i != BytesLeft && ByteOffset != IntBytes; ++i) {
442unsigned n = ByteOffset;
443if (!
DL.isLittleEndian())
444 n = IntBytes - n - 1;
451if (
auto *CFP = dyn_cast<ConstantFP>(
C)) {
452if (CFP->getType()->isDoubleTy()) {
454return ReadDataFromGlobal(
C, ByteOffset, CurPtr, BytesLeft,
DL);
456if (CFP->getType()->isFloatTy()){
458return ReadDataFromGlobal(
C, ByteOffset, CurPtr, BytesLeft,
DL);
460if (CFP->getType()->isHalfTy()){
462return ReadDataFromGlobal(
C, ByteOffset, CurPtr, BytesLeft,
DL);
467if (
auto *CS = dyn_cast<ConstantStruct>(
C)) {
471 ByteOffset -= CurEltOffset;
474// If the element access is to the element itself and not to tail padding, 475// read the bytes from the element. 476uint64_t EltSize =
DL.getTypeAllocSize(CS->getOperand(Index)->getType());
478if (ByteOffset < EltSize &&
479 !ReadDataFromGlobal(CS->getOperand(Index), ByteOffset, CurPtr,
485// Check to see if we read from the last struct element, if so we're done. 486if (Index == CS->getType()->getNumElements())
489// If we read all of the bytes we needed from this element we're done. 492if (BytesLeft <= NextEltOffset - CurEltOffset - ByteOffset)
495// Move to the next element of the struct. 496 CurPtr += NextEltOffset - CurEltOffset - ByteOffset;
497 BytesLeft -= NextEltOffset - CurEltOffset - ByteOffset;
499 CurEltOffset = NextEltOffset;
504if (isa<ConstantArray>(
C) || isa<ConstantVector>(
C) ||
505 isa<ConstantDataSequential>(
C)) {
508if (
auto *AT = dyn_cast<ArrayType>(
C->getType())) {
509 NumElts = AT->getNumElements();
510 EltTy = AT->getElementType();
511 EltSize =
DL.getTypeAllocSize(EltTy);
513 NumElts = cast<FixedVectorType>(
C->getType())->getNumElements();
514 EltTy = cast<FixedVectorType>(
C->getType())->getElementType();
515// TODO: For non-byte-sized vectors, current implementation assumes there is 516// padding to the next byte boundary between elements. 517if (!
DL.typeSizeEqualsStoreSize(EltTy))
520 EltSize =
DL.getTypeStoreSize(EltTy);
526if (!ReadDataFromGlobal(
C->getAggregateElement(Index),
Offset, CurPtr,
531assert(BytesWritten <= EltSize &&
"Not indexing into this element?");
532if (BytesWritten >= BytesLeft)
536 BytesLeft -= BytesWritten;
537 CurPtr += BytesWritten;
542if (
auto *CE = dyn_cast<ConstantExpr>(
C)) {
543if (
CE->getOpcode() == Instruction::IntToPtr &&
544CE->getOperand(0)->getType() ==
DL.getIntPtrType(
CE->getType())) {
545return ReadDataFromGlobal(
CE->getOperand(0), ByteOffset, CurPtr,
550// Otherwise, unknown initializer type. 556// Bail out early. Not expect to load from scalable global variable. 557if (isa<ScalableVectorType>(LoadTy))
560auto *IntType = dyn_cast<IntegerType>(LoadTy);
562// If this isn't an integer load we can't fold it directly. 564// If this is a non-integer load, we can try folding it as an int load and 565// then bitcast the result. This can be useful for union cases. Note 566// that address spaces don't matter here since we're not going to result in 567// an actual new load. 573DL.getTypeSizeInBits(LoadTy).getFixedValue());
576// Materializing a zero can be done trivially without a bitcast 581// For vector of pointer, we needed to first convert to a vector of integer, then do vector inttoptr 585// Be careful not to replace a load of an addrspace value with an inttoptr here 594unsigned BytesLoaded = (IntType->getBitWidth() + 7) / 8;
595if (BytesLoaded > 32 || BytesLoaded == 0)
598// If we're not accessing anything in this constant, the result is undefined. 599if (
Offset <= -1 *
static_cast<int64_t
>(BytesLoaded))
602// TODO: We should be able to support scalable types. 603TypeSize InitializerSize =
DL.getTypeAllocSize(
C->getType());
607// If we're not accessing anything in this constant, the result is undefined. 611unsignedchar RawBytes[32] = {0};
612unsignedchar *CurPtr = RawBytes;
613unsigned BytesLeft = BytesLoaded;
615// If we're loading off the beginning of the global, some bytes may be valid. 622if (!ReadDataFromGlobal(
C,
Offset, CurPtr, BytesLeft,
DL))
625APInt ResultVal =
APInt(IntType->getBitWidth(), 0);
626if (
DL.isLittleEndian()) {
627 ResultVal = RawBytes[BytesLoaded - 1];
628for (
unsigned i = 1; i != BytesLoaded; ++i) {
630 ResultVal |= RawBytes[BytesLoaded - 1 - i];
633 ResultVal = RawBytes[0];
634for (
unsigned i = 1; i != BytesLoaded; ++i) {
636 ResultVal |= RawBytes[i];
640return ConstantInt::get(IntType->getContext(), ResultVal);
643}
// anonymous namespace 645// If GV is a constant with an initializer read its representation starting 646// at Offset and return it as a constant array of unsigned char. Otherwise 660if (NBytes > UINT16_MAX)
661// Bail for large initializers in excess of 64K to avoid allocating 663// Offset is assumed to be less than or equal than InitSize (this 664// is enforced in ReadDataFromGlobal). 668unsignedchar *CurPtr = RawBytes.
data();
676/// If this Offset points exactly to the start of an aggregate element, return 677/// that element, otherwise return nullptr. 683if (!isa<ConstantAggregate>(
Base) && !isa<ConstantDataSequential>(
Base))
688if (!
Offset.isZero() || !Indices[0].isZero())
693if (Index.isNegative() || Index.getActiveBits() >= 32)
696C =
C->getAggregateElement(Index.getZExtValue());
711// Explicitly check for out-of-bounds access, so we return poison even if the 712// constant is a uniform value. 717// Try an offset-independent fold of a uniform value. 721// Try hard to fold loads from bitcasted strange and non-type-safe things. 722if (
Offset.getSignificantBits() <= 64)
724 FoldReinterpretLoadFromConst(
C, Ty,
Offset.getSExtValue(),
DL))
738// We can only fold loads from constant globals with a definitive initializer. 739// Check this upfront, to skip expensive offset calculations. 741if (!GV || !GV->isConstant() || !GV->hasDefinitiveInitializer())
744C = cast<Constant>(
C->stripAndAccumulateConstantOffsets(
745DL,
Offset,
/* AllowNonInbounds */true));
752// If this load comes from anywhere in a uniform constant global, the value 753// is always the same, regardless of the loaded offset. 765if (isa<PoisonValue>(
C))
767if (isa<UndefValue>(
C))
769// If padding is needed when storing C to memory, then it isn't considered as 771if (!
DL.typeSizeEqualsStoreSize(
C->getType()))
775if (
C->isAllOnesValue() &&
783/// One of Op0/Op1 is a constant expression. 784/// Attempt to symbolically evaluate the result of a binary operator merging 785/// these together. If target data info is available, it is provided as DL, 786/// otherwise DL is null. 791// Fold (and 0xffffffff00000000, (shl x, 32)) -> shl. 792// Fold (lshr (or X, Y), 32) -> (lshr [X/Y], 32) if one doesn't contribute 795if (Opc == Instruction::And) {
798if ((Known1.
One | Known0.
Zero).isAllOnes()) {
799// All the bits of Op0 that the 'and' could be masking are already zero. 802if ((Known0.
One | Known1.
Zero).isAllOnes()) {
803// All the bits of Op1 that the 'and' could be masking are already zero. 812// If the constant expr is something like &A[123] - &A[4].f, fold this into a 813// constant. This happens frequently when iterating over a global array. 814if (Opc == Instruction::Sub) {
820unsigned OpSize =
DL.getTypeSizeInBits(Op0->
getType());
822// (&GV+C1) - (&GV+C2) -> C1-C2, pointer arithmetic cannot overflow. 823// PtrToInt may change the bitwidth so we have convert to the right size 833/// If array indices are not pointer-sized integers, explicitly cast them so 834/// that they aren't implicitly casted by the getelementptr. 837 std::optional<ConstantRange>
InRange,
839Type *IntIdxTy =
DL.getIndexType(ResultTy);
844for (
unsigned i = 1, e = Ops.
size(); i != e; ++i) {
847 SrcElemTy, Ops.
slice(1, i - 1)))) &&
848 Ops[i]->getType()->getScalarType() != IntIdxScalarTy) {
851 Ops[i]->getType()->isVectorTy() ? IntIdxTy : IntIdxScalarTy;
870/// If we can symbolically evaluate the GEP constant expression, do so. 875Type *SrcElemTy =
GEP->getSourceElementType();
877if (!SrcElemTy->
isSized() || isa<ScalableVectorType>(SrcElemTy))
880if (
Constant *
C = CastGEPIndices(SrcElemTy, Ops, ResTy,
GEP->getNoWrapFlags(),
881GEP->getInRange(),
DL, TLI))
885if (!
Ptr->getType()->isPointerTy())
888Type *IntIdxTy =
DL.getIndexType(
Ptr->getType());
890for (
unsigned i = 1, e = Ops.
size(); i != e; ++i)
891if (!isa<ConstantInt>(Ops[i]) || !Ops[i]->
getType()->isIntegerTy())
894unsignedBitWidth =
DL.getTypeSizeInBits(IntIdxTy);
897DL.getIndexedOffsetInType(
899/*isSigned=*/true,
/*implicitTrunc=*/true);
901 std::optional<ConstantRange>
InRange =
GEP->getInRange();
905// If this is a GEP of a GEP, fold it all into a single GEP. 908while (
auto *
GEP = dyn_cast<GEPOperator>(
Ptr)) {
909 NW &=
GEP->getNoWrapFlags();
913// Do not try the incorporate the sub-GEP if some index is not a number. 914bool AllConstantInt =
true;
915for (
Value *NestedOp : NestedOps)
916if (!isa<ConstantInt>(NestedOp)) {
917 AllConstantInt =
false;
923// TODO: Try to intersect two inrange attributes? 927// Adjust inrange by offset until now. 931Ptr = cast<Constant>(
GEP->getOperand(0));
932 SrcElemTy =
GEP->getSourceElementType();
935/*isSigned=*/true,
/*implicitTrunc=*/true),
939// Preserving nusw (without inbounds) also requires that the offset 940// additions did not overflow. 944// If the base value for this address is a literal integer value, fold the 945// getelementptr to the resulting integer value casted to the pointer type. 947if (
auto *CE = dyn_cast<ConstantExpr>(
Ptr)) {
948if (
CE->getOpcode() == Instruction::IntToPtr) {
949if (
auto *
Base = dyn_cast<ConstantInt>(
CE->getOperand(0)))
954auto *PTy = cast<PointerType>(
Ptr->getType());
955if ((
Ptr->isNullValue() || BasePtr != 0) &&
956 !
DL.isNonIntegralPointerType(PTy)) {
961// Try to infer inbounds for GEPs of globals. 963bool CanBeNull, CanBeFreed;
965Ptr->getPointerDereferenceableBytes(
DL, CanBeNull, CanBeFreed);
966if (DerefBytes != 0 && !CanBeNull &&
Offset.sle(DerefBytes))
974// Otherwise canonicalize this to a single ptradd. 977 ConstantInt::get(Ctx,
Offset), NW,
981/// Attempt to constant fold an instruction with the 982/// specified opcode and operands. If successful, the constant result is 983/// returned, if not, null is returned. Note that this function can fail when 984/// attempting to fold instructions like loads and stores, which have no 985/// constant expression form. 986Constant *ConstantFoldInstOperandsImpl(
constValue *InstOrCE,
unsigned Opcode,
990bool AllowNonDeterministic) {
1000case Instruction::FAdd:
1001case Instruction::FSub:
1002case Instruction::FMul:
1003case Instruction::FDiv:
1004case Instruction::FRem:
1005// Handle floating point instructions separately to account for denormals 1006// TODO: If a constant expression is being folded rather than an 1007// instruction, denormals will not be flushed/treated as zero 1008if (
constauto *
I = dyn_cast<Instruction>(InstOrCE)) {
1010 AllowNonDeterministic);
1019if (
auto *
GEP = dyn_cast<GEPOperator>(InstOrCE)) {
1020Type *SrcElemTy =
GEP->getSourceElementType();
1028GEP->getNoWrapFlags(),
1032if (
auto *CE = dyn_cast<ConstantExpr>(InstOrCE))
1033returnCE->getWithOperands(Ops);
1036default:
returnnullptr;
1037case Instruction::ICmp:
1038case Instruction::FCmp: {
1039auto *
C = cast<CmpInst>(InstOrCE);
1043case Instruction::Freeze:
1045case Instruction::Call:
1046if (
auto *
F = dyn_cast<Function>(Ops.
back())) {
1047constauto *
Call = cast<CallBase>(InstOrCE);
1050 AllowNonDeterministic);
1053case Instruction::Select:
1055case Instruction::ExtractElement:
1057case Instruction::ExtractValue:
1059 Ops[0], cast<ExtractValueInst>(InstOrCE)->getIndices());
1060case Instruction::InsertElement:
1062case Instruction::InsertValue:
1064 Ops[0], Ops[1], cast<InsertValueInst>(InstOrCE)->getIndices());
1065case Instruction::ShuffleVector:
1067 Ops[0], Ops[1], cast<ShuffleVectorInst>(InstOrCE)->getShuffleMask());
1068case Instruction::Load: {
1069constauto *LI = dyn_cast<LoadInst>(InstOrCE);
1070if (LI->isVolatile())
1077}
// end anonymous namespace 1079//===----------------------------------------------------------------------===// 1080// Constant Folding public APIs 1081//===----------------------------------------------------------------------===// 1089if (!isa<ConstantVector>(
C) && !isa<ConstantExpr>(
C))
1093for (
constUse &OldU :
C->operands()) {
1094Constant *OldC = cast<Constant>(&OldU);
1096// Recursively fold the ConstantExpr's operands. If we have already folded 1097// a ConstantExpr, we don't have to process it again. 1098if (isa<ConstantVector>(OldC) || isa<ConstantExpr>(OldC)) {
1099auto It = FoldedOps.
find(OldC);
1100if (It == FoldedOps.
end()) {
1101 NewC = ConstantFoldConstantImpl(OldC,
DL, TLI, FoldedOps);
1102 FoldedOps.
insert({OldC, NewC});
1110if (
auto *CE = dyn_cast<ConstantExpr>(
C)) {
1111if (
Constant *Res = ConstantFoldInstOperandsImpl(
1112 CE,
CE->getOpcode(), Ops,
DL, TLI,
/*AllowNonDeterministic=*/true))
1117assert(isa<ConstantVector>(
C));
1121}
// end anonymous namespace 1125// Handle PHI nodes quickly here... 1126if (
auto *PN = dyn_cast<PHINode>(
I)) {
1131// If the incoming value is undef then skip it. Note that while we could 1132// skip the value if it is equal to the phi node itself we choose not to 1133// because that would break the rule that constant folding only applies if 1134// all operands are constants. 1137// If the incoming value is not a constant, then give up. 1141// Fold the PHI's operands. 1142C = ConstantFoldConstantImpl(
C,
DL, TLI, FoldedOps);
1143// If the incoming value is a different constant to 1144// the one we saw previously, then give up. 1145if (CommonValue &&
C != CommonValue)
1150// If we reach here, all incoming values are the same constant or undef. 1154// Scan the operand list, checking to see if they are all constants, if so, 1155// hand off to ConstantFoldInstOperandsImpl. 1156if (!
all_of(
I->operands(), [](
Use &U) { return isa<Constant>(U); }))
1161for (
constUse &OpU :
I->operands()) {
1162auto *
Op = cast<Constant>(&OpU);
1163// Fold the Instruction's operands. 1164Op = ConstantFoldConstantImpl(
Op,
DL, TLI, FoldedOps);
1174return ConstantFoldConstantImpl(
C,
DL, TLI, FoldedOps);
1181bool AllowNonDeterministic) {
1182return ConstantFoldInstOperandsImpl(
I,
I->getOpcode(), Ops,
DL, TLI,
1183 AllowNonDeterministic);
1190// fold: icmp (inttoptr x), null -> icmp x, 0 1191// fold: icmp null, (inttoptr x) -> icmp 0, x 1192// fold: icmp (ptrtoint x), 0 -> icmp x, null 1193// fold: icmp 0, (ptrtoint x) -> icmp null, x 1194// fold: icmp (inttoptr x), (inttoptr y) -> icmp trunc/zext x, trunc/zext y 1195// fold: icmp (ptrtoint x), (ptrtoint y) -> icmp x, y 1197// FIXME: The following comment is out of data and the DataLayout is here now. 1198// ConstantExpr::getCompare cannot do this, because it doesn't have DL 1199// around to know if bit truncation is happening. 1200if (
auto *CE0 = dyn_cast<ConstantExpr>(Ops0)) {
1202if (CE0->getOpcode() == Instruction::IntToPtr) {
1203Type *IntPtrTy =
DL.getIntPtrType(CE0->getType());
1204// Convert the integer value to the right size to ensure we get the 1205// proper extension or truncation. 1207/*IsSigned*/false,
DL)) {
1213// Only do this transformation if the int is intptrty in size, otherwise 1214// there is a truncation or extension that we aren't modeling. 1215if (CE0->getOpcode() == Instruction::PtrToInt) {
1216Type *IntPtrTy =
DL.getIntPtrType(CE0->getOperand(0)->getType());
1217if (CE0->getType() == IntPtrTy) {
1225if (
auto *CE1 = dyn_cast<ConstantExpr>(Ops1)) {
1226if (CE0->getOpcode() == CE1->getOpcode()) {
1227if (CE0->getOpcode() == Instruction::IntToPtr) {
1228Type *IntPtrTy =
DL.getIntPtrType(CE0->getType());
1230// Convert the integer value to the right size to ensure we get the 1231// proper extension or truncation. 1233/*IsSigned*/false,
DL);
1235/*IsSigned*/false,
DL);
1240// Only do this transformation if the int is intptrty in size, otherwise 1241// there is a truncation or extension that we aren't modeling. 1242if (CE0->getOpcode() == Instruction::PtrToInt) {
1243Type *IntPtrTy =
DL.getIntPtrType(CE0->getOperand(0)->getType());
1244if (CE0->getType() == IntPtrTy &&
1245 CE0->getOperand(0)->getType() == CE1->getOperand(0)->getType()) {
1247 Predicate, CE0->getOperand(0), CE1->getOperand(0),
DL, TLI);
1253// Convert pointer comparison (base+offset1) pred (base+offset2) into 1254// offset1 pred offset2, for the case where the offset is inbounds. This 1255// only works for equality and unsigned comparison, as inbounds permits 1256// crossing the sign boundary. However, the offset comparison itself is 1259unsigned IndexWidth =
DL.getIndexTypeSizeInBits(Ops0->
getType());
1260APInt Offset0(IndexWidth, 0);
1263APInt Offset1(IndexWidth, 0);
1266if (Stripped0 == Stripped1)
1272 }
elseif (isa<ConstantExpr>(Ops1)) {
1273// If RHS is a constant expression, but the left side isn't, swap the 1274// operands and try again. 1275 Predicate = ICmpInst::getSwappedPredicate(Predicate);
1280// Flush any denormal constant float input according to denormal handling 1304if (isa<ConstantExpr>(
LHS) || isa<ConstantExpr>(
RHS))
1319return ConstantFP::get(Ty->
getContext(), APF);
1321return ConstantFP::get(
1334/// Return the denormal mode that can be assumed when executing a floating point 1335/// operation at \p CtxI. 1351 IsOutput ? Mode.Output : Mode.Input);
1356if (
ConstantFP *CFP = dyn_cast<ConstantFP>(Operand))
1359if (isa<ConstantAggregateZero, UndefValue, ConstantExpr>(Operand))
1375if (
constauto *CV = dyn_cast<ConstantVector>(Operand)) {
1377for (
unsigned i = 0, e = CV->getNumOperands(); i != e; ++i) {
1379if (isa<UndefValue>(Element)) {
1384ConstantFP *CFP = dyn_cast<ConstantFP>(Element);
1397if (
constauto *CDV = dyn_cast<ConstantDataVector>(Operand)) {
1399for (
unsignedI = 0, E = CDV->getNumElements();
I < E; ++
I) {
1400constAPFloat &Elt = CDV->getElementAsAPFloat(
I);
1402 NewElts.
push_back(ConstantFP::get(Ty, Elt));
1422bool AllowNonDeterministic) {
1424// Flush denormal inputs if needed. 1432// If nsz or an algebraic FMF flag is set, the result of the FP operation 1433// may change due to future optimization. Don't constant fold them if 1434// non-deterministic results are not allowed. 1435if (!AllowNonDeterministic)
1436if (
auto *
FP = dyn_cast_or_null<FPMathOperator>(
I))
1437if (
FP->hasNoSignedZeros() ||
FP->hasAllowReassoc() ||
1438FP->hasAllowContract() ||
FP->hasAllowReciprocal())
1441// Calculate constant result. 1446// Flush denormal output if needed. 1451// The precise NaN value is non-deterministic. 1452if (!AllowNonDeterministic &&
C->isNaN())
1457// If instruction lacks a parent/function and the denormal mode cannot be 1458// determined, use the default (IEEE). 1468case Instruction::PtrToInt:
1469if (
auto *CE = dyn_cast<ConstantExpr>(
C)) {
1471// If the input is a inttoptr, eliminate the pair. This requires knowing 1472// the width of a pointer, so it can't be done in ConstantExpr::getCast. 1473if (CE->getOpcode() == Instruction::IntToPtr) {
1474// zext/trunc the inttoptr to pointer size. 1476DL.getIntPtrType(CE->getType()),
1477/*IsSigned=*/false,
DL);
1478 }
elseif (
auto *
GEP = dyn_cast<GEPOperator>(CE)) {
1479// If we have GEP, we can perform the following folds: 1480// (ptrtoint (gep null, x)) -> x 1481// (ptrtoint (gep (gep null, x), y) -> x + y, etc. 1484auto *
Base = cast<Constant>(
GEP->stripAndAccumulateConstantOffsets(
1485DL, BaseOffset,
/*AllowNonInbounds=*/true));
1486if (
Base->isNullValue()) {
1487 FoldedValue = ConstantInt::get(CE->getContext(), BaseOffset);
1489// ptrtoint (gep i8, Ptr, (sub 0, V)) -> sub (ptrtoint Ptr), V 1490if (
GEP->getNumIndices() == 1 &&
1491GEP->getSourceElementType()->isIntegerTy(8)) {
1492auto *
Ptr = cast<Constant>(
GEP->getPointerOperand());
1493auto *Sub = dyn_cast<ConstantExpr>(
GEP->getOperand(1));
1494Type *IntIdxTy =
DL.getIndexType(
Ptr->getType());
1495if (Sub && Sub->getType() == IntIdxTy &&
1496 Sub->getOpcode() == Instruction::Sub &&
1497 Sub->getOperand(0)->isNullValue())
1504// Do a zext or trunc to get to the ptrtoint dest size. 1510case Instruction::IntToPtr:
1511// If the input is a ptrtoint, turn the pair into a ptr to ptr bitcast if 1512// the int size is >= the ptr size and the address spaces are the same. 1513// This requires knowing the width of a pointer, so it can't be done in 1514// ConstantExpr::getCast. 1515if (
auto *CE = dyn_cast<ConstantExpr>(
C)) {
1516if (CE->getOpcode() == Instruction::PtrToInt) {
1517Constant *SrcPtr = CE->getOperand(0);
1518unsigned SrcPtrSize =
DL.getPointerTypeSizeInBits(SrcPtr->
getType());
1519unsigned MidIntSize = CE->getType()->getScalarSizeInBits();
1521if (MidIntSize >= SrcPtrSize) {
1529case Instruction::Trunc:
1530case Instruction::ZExt:
1531case Instruction::SExt:
1532case Instruction::FPTrunc:
1533case Instruction::FPExt:
1534case Instruction::UIToFP:
1535case Instruction::SIToFP:
1536case Instruction::FPToUI:
1537case Instruction::FPToSI:
1538case Instruction::AddrSpaceCast:
1540case Instruction::BitCast:
1551Type *SrcTy =
C->getType();
1561//===----------------------------------------------------------------------===// 1562// Constant Folding for Calls 1566if (Call->isNoBuiltin())
1568if (Call->getFunctionType() !=
F->getFunctionType())
1570switch (
F->getIntrinsicID()) {
1571// Operations that do not operate floating-point numbers and do not depend on 1572// FP environment can be folded even in strictfp functions. 1573case Intrinsic::bswap:
1574case Intrinsic::ctpop:
1575case Intrinsic::ctlz:
1576case Intrinsic::cttz:
1577case Intrinsic::fshl:
1578case Intrinsic::fshr:
1579case Intrinsic::launder_invariant_group:
1580case Intrinsic::strip_invariant_group:
1581case Intrinsic::masked_load:
1582case Intrinsic::get_active_lane_mask:
1584case Intrinsic::smax:
1585case Intrinsic::smin:
1586case Intrinsic::umax:
1587case Intrinsic::umin:
1588case Intrinsic::scmp:
1589case Intrinsic::ucmp:
1590case Intrinsic::sadd_with_overflow:
1591case Intrinsic::uadd_with_overflow:
1592case Intrinsic::ssub_with_overflow:
1593case Intrinsic::usub_with_overflow:
1594case Intrinsic::smul_with_overflow:
1595case Intrinsic::umul_with_overflow:
1596case Intrinsic::sadd_sat:
1597case Intrinsic::uadd_sat:
1598case Intrinsic::ssub_sat:
1599case Intrinsic::usub_sat:
1600case Intrinsic::smul_fix:
1601case Intrinsic::smul_fix_sat:
1602case Intrinsic::bitreverse:
1603case Intrinsic::is_constant:
1604case Intrinsic::vector_reduce_add:
1605case Intrinsic::vector_reduce_mul:
1606case Intrinsic::vector_reduce_and:
1607case Intrinsic::vector_reduce_or:
1608case Intrinsic::vector_reduce_xor:
1609case Intrinsic::vector_reduce_smin:
1610case Intrinsic::vector_reduce_smax:
1611case Intrinsic::vector_reduce_umin:
1612case Intrinsic::vector_reduce_umax:
1614case Intrinsic::amdgcn_perm:
1615case Intrinsic::amdgcn_wave_reduce_umin:
1616case Intrinsic::amdgcn_wave_reduce_umax:
1617case Intrinsic::amdgcn_s_wqm:
1618case Intrinsic::amdgcn_s_quadmask:
1619case Intrinsic::amdgcn_s_bitreplicate:
1620case Intrinsic::arm_mve_vctp8:
1621case Intrinsic::arm_mve_vctp16:
1622case Intrinsic::arm_mve_vctp32:
1623case Intrinsic::arm_mve_vctp64:
1624case Intrinsic::aarch64_sve_convert_from_svbool:
1625// WebAssembly float semantics are always known 1626case Intrinsic::wasm_trunc_signed:
1627case Intrinsic::wasm_trunc_unsigned:
1630// Floating point operations cannot be folded in strictfp functions in 1631// general case. They can be folded if FP environment is known to compiler. 1632case Intrinsic::minnum:
1633case Intrinsic::maxnum:
1634case Intrinsic::minimum:
1635case Intrinsic::maximum:
1637case Intrinsic::log2:
1638case Intrinsic::log10:
1640case Intrinsic::exp2:
1641case Intrinsic::exp10:
1642case Intrinsic::sqrt:
1645case Intrinsic::sincos:
1647case Intrinsic::powi:
1648case Intrinsic::ldexp:
1650case Intrinsic::fmuladd:
1651case Intrinsic::frexp:
1652case Intrinsic::fptoui_sat:
1653case Intrinsic::fptosi_sat:
1654case Intrinsic::convert_from_fp16:
1655case Intrinsic::convert_to_fp16:
1656case Intrinsic::amdgcn_cos:
1657case Intrinsic::amdgcn_cubeid:
1658case Intrinsic::amdgcn_cubema:
1659case Intrinsic::amdgcn_cubesc:
1660case Intrinsic::amdgcn_cubetc:
1661case Intrinsic::amdgcn_fmul_legacy:
1662case Intrinsic::amdgcn_fma_legacy:
1663case Intrinsic::amdgcn_fract:
1664case Intrinsic::amdgcn_sin:
1665// The intrinsics below depend on rounding mode in MXCSR. 1666case Intrinsic::x86_sse_cvtss2si:
1667case Intrinsic::x86_sse_cvtss2si64:
1668case Intrinsic::x86_sse_cvttss2si:
1669case Intrinsic::x86_sse_cvttss2si64:
1670case Intrinsic::x86_sse2_cvtsd2si:
1671case Intrinsic::x86_sse2_cvtsd2si64:
1672case Intrinsic::x86_sse2_cvttsd2si:
1673case Intrinsic::x86_sse2_cvttsd2si64:
1674case Intrinsic::x86_avx512_vcvtss2si32:
1675case Intrinsic::x86_avx512_vcvtss2si64:
1676case Intrinsic::x86_avx512_cvttss2si:
1677case Intrinsic::x86_avx512_cvttss2si64:
1678case Intrinsic::x86_avx512_vcvtsd2si32:
1679case Intrinsic::x86_avx512_vcvtsd2si64:
1680case Intrinsic::x86_avx512_cvttsd2si:
1681case Intrinsic::x86_avx512_cvttsd2si64:
1682case Intrinsic::x86_avx512_vcvtss2usi32:
1683case Intrinsic::x86_avx512_vcvtss2usi64:
1684case Intrinsic::x86_avx512_cvttss2usi:
1685case Intrinsic::x86_avx512_cvttss2usi64:
1686case Intrinsic::x86_avx512_vcvtsd2usi32:
1687case Intrinsic::x86_avx512_vcvtsd2usi64:
1688case Intrinsic::x86_avx512_cvttsd2usi:
1689case Intrinsic::x86_avx512_cvttsd2usi64:
1690return !Call->isStrictFP();
1692// NVVM FMax intrinsics 1693case Intrinsic::nvvm_fmax_d:
1694case Intrinsic::nvvm_fmax_f:
1695case Intrinsic::nvvm_fmax_ftz_f:
1696case Intrinsic::nvvm_fmax_ftz_nan_f:
1697case Intrinsic::nvvm_fmax_ftz_nan_xorsign_abs_f:
1698case Intrinsic::nvvm_fmax_ftz_xorsign_abs_f:
1699case Intrinsic::nvvm_fmax_nan_f:
1700case Intrinsic::nvvm_fmax_nan_xorsign_abs_f:
1701case Intrinsic::nvvm_fmax_xorsign_abs_f:
1703// NVVM FMin intrinsics 1704case Intrinsic::nvvm_fmin_d:
1705case Intrinsic::nvvm_fmin_f:
1706case Intrinsic::nvvm_fmin_ftz_f:
1707case Intrinsic::nvvm_fmin_ftz_nan_f:
1708case Intrinsic::nvvm_fmin_ftz_nan_xorsign_abs_f:
1709case Intrinsic::nvvm_fmin_ftz_xorsign_abs_f:
1710case Intrinsic::nvvm_fmin_nan_f:
1711case Intrinsic::nvvm_fmin_nan_xorsign_abs_f:
1712case Intrinsic::nvvm_fmin_xorsign_abs_f:
1714// NVVM float/double to int32/uint32 conversion intrinsics 1715case Intrinsic::nvvm_f2i_rm:
1716case Intrinsic::nvvm_f2i_rn:
1717case Intrinsic::nvvm_f2i_rp:
1718case Intrinsic::nvvm_f2i_rz:
1719case Intrinsic::nvvm_f2i_rm_ftz:
1720case Intrinsic::nvvm_f2i_rn_ftz:
1721case Intrinsic::nvvm_f2i_rp_ftz:
1722case Intrinsic::nvvm_f2i_rz_ftz:
1723case Intrinsic::nvvm_f2ui_rm:
1724case Intrinsic::nvvm_f2ui_rn:
1725case Intrinsic::nvvm_f2ui_rp:
1726case Intrinsic::nvvm_f2ui_rz:
1727case Intrinsic::nvvm_f2ui_rm_ftz:
1728case Intrinsic::nvvm_f2ui_rn_ftz:
1729case Intrinsic::nvvm_f2ui_rp_ftz:
1730case Intrinsic::nvvm_f2ui_rz_ftz:
1731case Intrinsic::nvvm_d2i_rm:
1732case Intrinsic::nvvm_d2i_rn:
1733case Intrinsic::nvvm_d2i_rp:
1734case Intrinsic::nvvm_d2i_rz:
1735case Intrinsic::nvvm_d2ui_rm:
1736case Intrinsic::nvvm_d2ui_rn:
1737case Intrinsic::nvvm_d2ui_rp:
1738case Intrinsic::nvvm_d2ui_rz:
1740// NVVM float/double to int64/uint64 conversion intrinsics 1741case Intrinsic::nvvm_f2ll_rm:
1742case Intrinsic::nvvm_f2ll_rn:
1743case Intrinsic::nvvm_f2ll_rp:
1744case Intrinsic::nvvm_f2ll_rz:
1745case Intrinsic::nvvm_f2ll_rm_ftz:
1746case Intrinsic::nvvm_f2ll_rn_ftz:
1747case Intrinsic::nvvm_f2ll_rp_ftz:
1748case Intrinsic::nvvm_f2ll_rz_ftz:
1749case Intrinsic::nvvm_f2ull_rm:
1750case Intrinsic::nvvm_f2ull_rn:
1751case Intrinsic::nvvm_f2ull_rp:
1752case Intrinsic::nvvm_f2ull_rz:
1753case Intrinsic::nvvm_f2ull_rm_ftz:
1754case Intrinsic::nvvm_f2ull_rn_ftz:
1755case Intrinsic::nvvm_f2ull_rp_ftz:
1756case Intrinsic::nvvm_f2ull_rz_ftz:
1757case Intrinsic::nvvm_d2ll_rm:
1758case Intrinsic::nvvm_d2ll_rn:
1759case Intrinsic::nvvm_d2ll_rp:
1760case Intrinsic::nvvm_d2ll_rz:
1761case Intrinsic::nvvm_d2ull_rm:
1762case Intrinsic::nvvm_d2ull_rn:
1763case Intrinsic::nvvm_d2ull_rp:
1764case Intrinsic::nvvm_d2ull_rz:
1766// Sign operations are actually bitwise operations, they do not raise 1767// exceptions even for SNANs. 1768case Intrinsic::fabs:
1769case Intrinsic::copysign:
1770case Intrinsic::is_fpclass:
1771// Non-constrained variants of rounding operations means default FP 1772// environment, they can be folded in any case. 1773case Intrinsic::ceil:
1774case Intrinsic::floor:
1775case Intrinsic::round:
1776case Intrinsic::roundeven:
1777case Intrinsic::trunc:
1778case Intrinsic::nearbyint:
1779case Intrinsic::rint:
1780case Intrinsic::canonicalize:
1781// Constrained intrinsics can be folded if FP environment is known 1783case Intrinsic::experimental_constrained_fma:
1784case Intrinsic::experimental_constrained_fmuladd:
1785case Intrinsic::experimental_constrained_fadd:
1786case Intrinsic::experimental_constrained_fsub:
1787case Intrinsic::experimental_constrained_fmul:
1788case Intrinsic::experimental_constrained_fdiv:
1789case Intrinsic::experimental_constrained_frem:
1790case Intrinsic::experimental_constrained_ceil:
1791case Intrinsic::experimental_constrained_floor:
1792case Intrinsic::experimental_constrained_round:
1793case Intrinsic::experimental_constrained_roundeven:
1794case Intrinsic::experimental_constrained_trunc:
1795case Intrinsic::experimental_constrained_nearbyint:
1796case Intrinsic::experimental_constrained_rint:
1797case Intrinsic::experimental_constrained_fcmp:
1798case Intrinsic::experimental_constrained_fcmps:
1805if (!
F->hasName() || Call->isStrictFP())
1808// In these cases, the check of the length is required. We don't want to 1809// return true for a name like "cos\0blah" which strcmp would return equal to 1810// "cos", but has length 8. 1816returnName ==
"acos" ||
Name ==
"acosf" ||
1821returnName ==
"ceil" ||
Name ==
"ceilf" ||
1828returnName ==
"fabs" ||
Name ==
"fabsf" ||
1832returnName ==
"ilogb" ||
Name ==
"ilogbf";
1839returnName ==
"nearbyint" ||
Name ==
"nearbyintf";
1843returnName ==
"remainder" ||
Name ==
"remainderf" ||
1847returnName ==
"sin" ||
Name ==
"sinf" ||
1851returnName ==
"tan" ||
Name ==
"tanf" ||
1855// Check for various function names that get used for the math functions 1856// when the header files are preprocessed with the macro 1857// __FINITE_MATH_ONLY__ enabled. 1858// The '12' here is the length of the shortest name that can match. 1859// We need to check the size before looking at Name[1] and Name[2] 1860// so we may as well check a limit that will eliminate mismatches. 1861if (
Name.size() < 12 ||
Name[1] !=
'_')
1867returnName ==
"__acos_finite" ||
Name ==
"__acosf_finite" ||
1868Name ==
"__asin_finite" ||
Name ==
"__asinf_finite" ||
1869Name ==
"__atan2_finite" ||
Name ==
"__atan2f_finite";
1871returnName ==
"__cosh_finite" ||
Name ==
"__coshf_finite";
1873returnName ==
"__exp_finite" ||
Name ==
"__expf_finite" ||
1874Name ==
"__exp2_finite" ||
Name ==
"__exp2f_finite";
1876returnName ==
"__log_finite" ||
Name ==
"__logf_finite" ||
1877Name ==
"__log10_finite" ||
Name ==
"__log10f_finite";
1879returnName ==
"__pow_finite" ||
Name ==
"__powf_finite";
1881returnName ==
"__sinh_finite" ||
Name ==
"__sinhf_finite";
1892 APF.convert(Ty->
getFltSemantics(), APFloat::rmNearestTiesToEven, &unused);
1893return ConstantFP::get(Ty->
getContext(), APF);
1900#if defined(HAS_IEE754_FLOAT128) && defined(HAS_LOGF128) 1901Constant *GetConstantFoldFPValue128(float128 V,
Type *Ty) {
1903return ConstantFP::get(Ty, V);
1908/// Clear the floating-point exception state. 1909inlinevoid llvm_fenv_clearexcept() {
1910#if HAVE_DECL_FE_ALL_EXCEPT 1911 feclearexcept(FE_ALL_EXCEPT);
1916/// Test if a floating-point exception was raised. 1917inlinebool llvm_fenv_testexcept() {
1918int errno_val = errno;
1919if (errno_val == ERANGE || errno_val == EDOM)
1921#if HAVE_DECL_FE_ALL_EXCEPT && HAVE_DECL_FE_INEXACT 1922if (fetestexcept(FE_ALL_EXCEPT & ~FE_INEXACT))
1936 llvm_fenv_clearexcept();
1937doubleResult = NativeFP(
V.convertToDouble());
1938if (llvm_fenv_testexcept()) {
1939 llvm_fenv_clearexcept();
1943return GetConstantFoldFPValue(Result, Ty);
1946#if defined(HAS_IEE754_FLOAT128) && defined(HAS_LOGF128) 1947Constant *ConstantFoldFP128(float128 (*NativeFP)(float128),
constAPFloat &V,
1949 llvm_fenv_clearexcept();
1950 float128
Result = NativeFP(
V.convertToQuad());
1951if (llvm_fenv_testexcept()) {
1952 llvm_fenv_clearexcept();
1956return GetConstantFoldFPValue128(Result, Ty);
1960Constant *ConstantFoldBinaryFP(
double (*NativeFP)(
double,
double),
1962 llvm_fenv_clearexcept();
1963doubleResult = NativeFP(
V.convertToDouble(),
W.convertToDouble());
1964if (llvm_fenv_testexcept()) {
1965 llvm_fenv_clearexcept();
1969return GetConstantFoldFPValue(Result, Ty);
1977// This isn't strictly necessary, but handle the special/common case of zero: 1978// all integer reductions of a zero input produce zero. 1979if (isa<ConstantAggregateZero>(
Op))
1982// This is the same as the underlying binops - poison propagates. 1983if (isa<PoisonValue>(
Op) ||
Op->containsPoisonElement())
1986// TODO: Handle undef. 1987if (!isa<ConstantVector>(
Op) && !isa<ConstantDataVector>(
Op))
1990auto *EltC = dyn_cast<ConstantInt>(
Op->getAggregateElement(0U));
1994APInt Acc = EltC->getValue();
1996if (!(EltC = dyn_cast<ConstantInt>(
Op->getAggregateElement(
I))))
1998constAPInt &
X = EltC->getValue();
2000case Intrinsic::vector_reduce_add:
2003case Intrinsic::vector_reduce_mul:
2006case Intrinsic::vector_reduce_and:
2009case Intrinsic::vector_reduce_or:
2012case Intrinsic::vector_reduce_xor:
2015case Intrinsic::vector_reduce_smin:
2018case Intrinsic::vector_reduce_smax:
2021case Intrinsic::vector_reduce_umin:
2024case Intrinsic::vector_reduce_umax:
2030return ConstantInt::get(
Op->getContext(), Acc);
2033/// Attempt to fold an SSE floating point to integer conversion of a constant 2034/// floating point. If roundTowardZero is false, the default IEEE rounding is 2035/// used (toward nearest, ties to even). This matches the behavior of the 2036/// non-truncating SSE instructions in the default rounding mode. The desired 2037/// integer type Ty is used to select how many bits are available for the 2038/// result. Returns null if the conversion cannot be performed, otherwise 2039/// returns the Constant value resulting from the conversion. 2040Constant *ConstantFoldSSEConvertToInt(
constAPFloat &Val,
bool roundTowardZero,
2041Type *Ty,
bool IsSigned) {
2042// All of these conversion intrinsics form an integer of at most 64bits. 2044assert(ResultWidth <= 64 &&
2045"Can only constant fold conversions to 64 and 32 bit ints");
2050 : APFloat::rmNearestTiesToEven;
2053 IsSigned,
mode, &isExact);
2054if (status != APFloat::opOK &&
2055 (!roundTowardZero || status != APFloat::opInexact))
2057return ConstantInt::get(Ty, UIntVal, IsSigned);
2064returnOp->getValueAPF().convertToDouble();
2068 APF.
convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven, &unused);
2073if (
auto *CI = dyn_cast<ConstantInt>(
Op)) {
2077if (isa<UndefValue>(
Op)) {
2084/// Checks if the given intrinsic call, which evaluates to constant, is allowed 2087/// \param CI Constrained intrinsic call. 2088/// \param St Exception flags raised during constant evaluation. 2094// If the operation does not change exception status flags, it is safe 2096if (St == APFloat::opStatus::opOK)
2099// If evaluation raised FP exception, the result can depend on rounding 2100// mode. If the latter is unknown, folding is not possible. 2101if (ORM && *ORM == RoundingMode::Dynamic)
2104// If FP exceptions are ignored, fold the call, even if such exception is 2106if (EB && *EB != fp::ExceptionBehavior::ebStrict)
2109// Leave the calculation for runtime so that exception flags be correctly set 2114/// Returns the rounding mode that should be used for constant evaluation. 2118if (!ORM || *ORM == RoundingMode::Dynamic)
2119// Even if the rounding mode is unknown, try evaluating the operation. 2120// If it does not raise inexact exception, rounding was not applied, 2121// so the result is exact and does not depend on rounding mode. Whether 2122// other FP exceptions are raised, it does not depend on rounding mode. 2123return RoundingMode::NearestTiesToEven;
2127/// Try to constant fold llvm.canonicalize for the given caller and value. 2130// Zero, positive and negative, is always OK to fold. 2132// Get a fresh 0, since ppc_fp128 does have non-canonical zeros. 2133return ConstantFP::get(
2141// Zero is always canonical and the sign must be preserved. 2143// Denorms and nans may have special encodings, but it should be OK to fold a 2144// totally average number. 2145if (Src.isNormal() || Src.isInfinity())
2146return ConstantFP::get(CI->
getContext(), Src);
2153return ConstantFP::get(CI->
getContext(), Src);
2158// If we know if either input or output is flushed, we can fold. 2185if (IntrinsicID == Intrinsic::is_constant) {
2186// We know we have a "Constant" argument. But we want to only 2187// return true for manifest constants, not those that depend on 2188// constants with unknowable values, e.g. GlobalValue or BlockAddress. 2189if (
Operands[0]->isManifestConstant())
2194if (isa<PoisonValue>(
Operands[0])) {
2195// TODO: All of these operations should probably propagate poison. 2196if (IntrinsicID == Intrinsic::canonicalize)
2201// cosine(arg) is between -1 and 1. cosine(invalid arg) is NaN. 2202// ctpop() is between 0 and bitwidth, pick 0 for undef. 2203// fptoui.sat and fptosi.sat can always fold to zero (for a zero input). 2204if (IntrinsicID == Intrinsic::cos ||
2205 IntrinsicID == Intrinsic::ctpop ||
2206 IntrinsicID == Intrinsic::fptoui_sat ||
2207 IntrinsicID == Intrinsic::fptosi_sat ||
2208 IntrinsicID == Intrinsic::canonicalize)
2210if (IntrinsicID == Intrinsic::bswap ||
2211 IntrinsicID == Intrinsic::bitreverse ||
2212 IntrinsicID == Intrinsic::launder_invariant_group ||
2213 IntrinsicID == Intrinsic::strip_invariant_group)
2217if (isa<ConstantPointerNull>(
Operands[0])) {
2218// launder(null) == null == strip(null) iff in addrspace 0 2219if (IntrinsicID == Intrinsic::launder_invariant_group ||
2220 IntrinsicID == Intrinsic::strip_invariant_group) {
2221// If instruction is not yet put in a basic block (e.g. when cloning 2222// a function during inlining), Call's caller may not be available. 2223// So check Call's BB first before querying Call->getCaller. 2225Call->getParent() ?
Call->getCaller() :
nullptr;
2235if (
auto *
Op = dyn_cast<ConstantFP>(
Operands[0])) {
2236if (IntrinsicID == Intrinsic::convert_to_fp16) {
2240 Val.
convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven, &lost);
2247if (IntrinsicID == Intrinsic::wasm_trunc_signed ||
2248 IntrinsicID == Intrinsic::wasm_trunc_unsigned) {
2249boolSigned = IntrinsicID == Intrinsic::wasm_trunc_signed;
2258U.convertToInteger(
Int, APFloat::rmTowardZero, &IsExact);
2260if (
Status == APFloat::opOK ||
Status == APFloat::opInexact)
2261return ConstantInt::get(Ty,
Int);
2266if (IntrinsicID == Intrinsic::fptoui_sat ||
2267 IntrinsicID == Intrinsic::fptosi_sat) {
2268// convertToInteger() already has the desired saturation semantics. 2270 IntrinsicID == Intrinsic::fptoui_sat);
2272U.convertToInteger(
Int, APFloat::rmTowardZero, &IsExact);
2273return ConstantInt::get(Ty,
Int);
2276if (IntrinsicID == Intrinsic::canonicalize)
2277return constantFoldCanonicalize(Ty, Call, U);
2279#if defined(HAS_IEE754_FLOAT128) && defined(HAS_LOGF128) 2281if (IntrinsicID == Intrinsic::log) {
2282 float128
Result = logf128(
Op->getValueAPF().convertToQuad());
2283return GetConstantFoldFPValue128(Result, Ty);
2288 Fp128Func == LibFunc_logl)
2289return ConstantFoldFP128(logf128,
Op->getValueAPF(), Ty);
2297// Use internal versions of these intrinsics. 2299if (IntrinsicID == Intrinsic::nearbyint || IntrinsicID == Intrinsic::rint) {
2300U.roundToIntegral(APFloat::rmNearestTiesToEven);
2304if (IntrinsicID == Intrinsic::round) {
2305U.roundToIntegral(APFloat::rmNearestTiesToAway);
2309if (IntrinsicID == Intrinsic::roundeven) {
2310U.roundToIntegral(APFloat::rmNearestTiesToEven);
2314if (IntrinsicID == Intrinsic::ceil) {
2315U.roundToIntegral(APFloat::rmTowardPositive);
2319if (IntrinsicID == Intrinsic::floor) {
2320U.roundToIntegral(APFloat::rmTowardNegative);
2324if (IntrinsicID == Intrinsic::trunc) {
2325U.roundToIntegral(APFloat::rmTowardZero);
2329if (IntrinsicID == Intrinsic::fabs) {
2334if (IntrinsicID == Intrinsic::amdgcn_fract) {
2335// The v_fract instruction behaves like the OpenCL spec, which defines 2336// fract(x) as fmin(x - floor(x), 0x1.fffffep-1f): "The min() operator is 2337// there to prevent fract(-small) from returning 1.0. It returns the 2338// largest positive floating-point number less than 1.0." 2340 FloorU.roundToIntegral(APFloat::rmTowardNegative);
2342APFloat AlmostOne(
U.getSemantics(), 1);
2343 AlmostOne.next(
/*nextDown*/true);
2347// Rounding operations (floor, trunc, ceil, round and nearbyint) do not 2348// raise FP exceptions, unless the argument is signaling NaN. 2350 std::optional<APFloat::roundingMode>
RM;
2351switch (IntrinsicID) {
2354case Intrinsic::experimental_constrained_nearbyint:
2355case Intrinsic::experimental_constrained_rint: {
2356auto CI = cast<ConstrainedFPIntrinsic>(Call);
2357RM = CI->getRoundingMode();
2358if (!RM || *RM == RoundingMode::Dynamic)
2362case Intrinsic::experimental_constrained_round:
2363RM = APFloat::rmNearestTiesToAway;
2365case Intrinsic::experimental_constrained_ceil:
2366RM = APFloat::rmTowardPositive;
2368case Intrinsic::experimental_constrained_floor:
2369RM = APFloat::rmTowardNegative;
2371case Intrinsic::experimental_constrained_trunc:
2372RM = APFloat::rmTowardZero;
2376auto CI = cast<ConstrainedFPIntrinsic>(Call);
2379if (IntrinsicID == Intrinsic::experimental_constrained_rint &&
2380 St == APFloat::opInexact) {
2381 std::optional<fp::ExceptionBehavior> EB = CI->getExceptionBehavior();
2385 }
elseif (
U.isSignaling()) {
2386 std::optional<fp::ExceptionBehavior> EB = CI->getExceptionBehavior();
2394// NVVM float/double to signed/unsigned int32/int64 conversions: 2395switch (IntrinsicID) {
2397case Intrinsic::nvvm_f2i_rm:
2398case Intrinsic::nvvm_f2i_rn:
2399case Intrinsic::nvvm_f2i_rp:
2400case Intrinsic::nvvm_f2i_rz:
2401case Intrinsic::nvvm_f2i_rm_ftz:
2402case Intrinsic::nvvm_f2i_rn_ftz:
2403case Intrinsic::nvvm_f2i_rp_ftz:
2404case Intrinsic::nvvm_f2i_rz_ftz:
2406case Intrinsic::nvvm_f2ui_rm:
2407case Intrinsic::nvvm_f2ui_rn:
2408case Intrinsic::nvvm_f2ui_rp:
2409case Intrinsic::nvvm_f2ui_rz:
2410case Intrinsic::nvvm_f2ui_rm_ftz:
2411case Intrinsic::nvvm_f2ui_rn_ftz:
2412case Intrinsic::nvvm_f2ui_rp_ftz:
2413case Intrinsic::nvvm_f2ui_rz_ftz:
2415case Intrinsic::nvvm_d2i_rm:
2416case Intrinsic::nvvm_d2i_rn:
2417case Intrinsic::nvvm_d2i_rp:
2418case Intrinsic::nvvm_d2i_rz:
2420case Intrinsic::nvvm_d2ui_rm:
2421case Intrinsic::nvvm_d2ui_rn:
2422case Intrinsic::nvvm_d2ui_rp:
2423case Intrinsic::nvvm_d2ui_rz:
2425case Intrinsic::nvvm_f2ll_rm:
2426case Intrinsic::nvvm_f2ll_rn:
2427case Intrinsic::nvvm_f2ll_rp:
2428case Intrinsic::nvvm_f2ll_rz:
2429case Intrinsic::nvvm_f2ll_rm_ftz:
2430case Intrinsic::nvvm_f2ll_rn_ftz:
2431case Intrinsic::nvvm_f2ll_rp_ftz:
2432case Intrinsic::nvvm_f2ll_rz_ftz:
2434case Intrinsic::nvvm_f2ull_rm:
2435case Intrinsic::nvvm_f2ull_rn:
2436case Intrinsic::nvvm_f2ull_rp:
2437case Intrinsic::nvvm_f2ull_rz:
2438case Intrinsic::nvvm_f2ull_rm_ftz:
2439case Intrinsic::nvvm_f2ull_rn_ftz:
2440case Intrinsic::nvvm_f2ull_rp_ftz:
2441case Intrinsic::nvvm_f2ull_rz_ftz:
2443case Intrinsic::nvvm_d2ll_rm:
2444case Intrinsic::nvvm_d2ll_rn:
2445case Intrinsic::nvvm_d2ll_rp:
2446case Intrinsic::nvvm_d2ll_rz:
2448case Intrinsic::nvvm_d2ull_rm:
2449case Intrinsic::nvvm_d2ull_rn:
2450case Intrinsic::nvvm_d2ull_rp:
2451case Intrinsic::nvvm_d2ull_rz: {
2452// In float-to-integer conversion, NaN inputs are converted to 0. 2454return ConstantInt::get(Ty, 0);
2462auto FloatToRound = IsFTZ ? FTZPreserveSign(U) :
U;
2466 FloatToRound.convertToInteger(ResInt, RMode, &IsExact);
2468if (
Status != APFloat::opInvalidOp)
2469return ConstantInt::get(Ty, ResInt);
2474 /// We only fold functions with finite arguments. Folding NaN and inf is 2475 /// likely to be aborted with an exception anyway, and some host libms 2476 /// have known errors raising exceptions. 2480 /// Currently APFloat versions of these functions do not exist, so we use 2481 /// the host native double versions. Float versions are not called 2482 /// directly but for all these it is true (float)(f((double)arg)) == 2483 /// f(arg). Long double not supported yet. 2486switch (IntrinsicID) {
2489return ConstantFoldFP(log, APF, Ty);
2490case Intrinsic::log2:
2491// TODO: What about hosts that lack a C99 library? 2492return ConstantFoldFP(
log2, APF, Ty);
2493case Intrinsic::log10:
2494// TODO: What about hosts that lack a C99 library? 2495return ConstantFoldFP(log10, APF, Ty);
2497return ConstantFoldFP(exp, APF, Ty);
2498case Intrinsic::exp2:
2499// Fold exp2(x) as pow(2, x), in case the host lacks a C99 library. 2500return ConstantFoldBinaryFP(pow,
APFloat(2.0), APF, Ty);
2501case Intrinsic::exp10:
2502// Fold exp10(x) as pow(10, x), in case the host lacks a C99 library. 2503return ConstantFoldBinaryFP(pow,
APFloat(10.0), APF, Ty);
2505return ConstantFoldFP(sin, APF, Ty);
2507return ConstantFoldFP(cos, APF, Ty);
2508case Intrinsic::sqrt:
2509return ConstantFoldFP(sqrt, APF, Ty);
2510case Intrinsic::amdgcn_cos:
2511case Intrinsic::amdgcn_sin: {
2512doubleV = getValueAsDouble(
Op);
2513if (V < -256.0 || V > 256.0)
2514// The gfx8 and gfx9 architectures handle arguments outside the range 2515// [-256, 256] differently. This should be a rare case so bail out 2516// rather than trying to handle the difference. 2518bool IsCos = IntrinsicID == Intrinsic::amdgcn_cos;
2520if (V4 == floor(V4)) {
2521// Force exact results for quarter-integer inputs. 2522constdouble SinVals[4] = { 0.0, 1.0, 0.0, -1.0 };
2523V = SinVals[((int)V4 + (IsCos ? 1 : 0)) & 3];
2530return GetConstantFoldFPValue(V, Ty);
2546case LibFunc_acos_finite:
2547case LibFunc_acosf_finite:
2549return ConstantFoldFP(acos, APF, Ty);
2553case LibFunc_asin_finite:
2554case LibFunc_asinf_finite:
2556return ConstantFoldFP(asin, APF, Ty);
2561return ConstantFoldFP(atan, APF, Ty);
2565if (TLI->
has(Func)) {
2566U.roundToIntegral(APFloat::rmTowardPositive);
2573return ConstantFoldFP(cos, APF, Ty);
2577case LibFunc_cosh_finite:
2578case LibFunc_coshf_finite:
2580return ConstantFoldFP(cosh, APF, Ty);
2584case LibFunc_exp_finite:
2585case LibFunc_expf_finite:
2587return ConstantFoldFP(exp, APF, Ty);
2591case LibFunc_exp2_finite:
2592case LibFunc_exp2f_finite:
2594// Fold exp2(x) as pow(2, x), in case the host lacks a C99 library. 2595return ConstantFoldBinaryFP(pow,
APFloat(2.0), APF, Ty);
2599if (TLI->
has(Func)) {
2606if (TLI->
has(Func)) {
2607U.roundToIntegral(APFloat::rmTowardNegative);
2613case LibFunc_log_finite:
2614case LibFunc_logf_finite:
2616return ConstantFoldFP(log, APF, Ty);
2620case LibFunc_log2_finite:
2621case LibFunc_log2f_finite:
2623// TODO: What about hosts that lack a C99 library? 2624return ConstantFoldFP(
log2, APF, Ty);
2628case LibFunc_log10_finite:
2629case LibFunc_log10f_finite:
2631// TODO: What about hosts that lack a C99 library? 2632return ConstantFoldFP(log10, APF, Ty);
2637return ConstantInt::get(Ty,
ilogb(APF),
true);
2642return ConstantFoldFP(logb, APF, Ty);
2646// Implement optional behavior from C's Annex F for +/-0.0. 2650return ConstantFoldFP(log1p, APF, Ty);
2657return ConstantFoldFP(erf, APF, Ty);
2659case LibFunc_nearbyint:
2660case LibFunc_nearbyintf:
2663if (TLI->
has(Func)) {
2664U.roundToIntegral(APFloat::rmNearestTiesToEven);
2670if (TLI->
has(Func)) {
2671U.roundToIntegral(APFloat::rmNearestTiesToAway);
2678return ConstantFoldFP(sin, APF, Ty);
2682case LibFunc_sinh_finite:
2683case LibFunc_sinhf_finite:
2685return ConstantFoldFP(sinh, APF, Ty);
2690return ConstantFoldFP(sqrt, APF, Ty);
2695return ConstantFoldFP(tan, APF, Ty);
2700return ConstantFoldFP(tanh, APF, Ty);
2704if (TLI->
has(Func)) {
2705U.roundToIntegral(APFloat::rmTowardZero);
2713if (
auto *
Op = dyn_cast<ConstantInt>(
Operands[0])) {
2714switch (IntrinsicID) {
2715case Intrinsic::bswap:
2716return ConstantInt::get(Ty->
getContext(),
Op->getValue().byteSwap());
2717case Intrinsic::ctpop:
2718return ConstantInt::get(Ty,
Op->getValue().popcount());
2719case Intrinsic::bitreverse:
2720return ConstantInt::get(Ty->
getContext(),
Op->getValue().reverseBits());
2721case Intrinsic::convert_from_fp16: {
2722APFloat Val(APFloat::IEEEhalf(),
Op->getValue());
2728// Conversion is always precise. 2730assert(status != APFloat::opInexact && !lost &&
2731"Precision lost during fp16 constfolding");
2733return ConstantFP::get(Ty->
getContext(), Val);
2736case Intrinsic::amdgcn_s_wqm: {
2738 Val |= (Val & 0x5555555555555555ULL) << 1 |
2739 ((Val >> 1) & 0x5555555555555555ULL);
2740 Val |= (Val & 0x3333333333333333ULL) << 2 |
2741 ((Val >> 2) & 0x3333333333333333ULL);
2742return ConstantInt::get(Ty, Val);
2745case Intrinsic::amdgcn_s_quadmask: {
2748for (
unsignedI = 0;
I <
Op->getBitWidth() / 4; ++
I, Val >>= 4) {
2752 QuadMask |= (1ULL <<
I);
2754return ConstantInt::get(Ty, QuadMask);
2757case Intrinsic::amdgcn_s_bitreplicate: {
2759 Val = (Val & 0x000000000000FFFFULL) | (Val & 0x00000000FFFF0000ULL) << 16;
2760 Val = (Val & 0x000000FF000000FFULL) | (Val & 0x0000FF000000FF00ULL) << 8;
2761 Val = (Val & 0x000F000F000F000FULL) | (Val & 0x00F000F000F000F0ULL) << 4;
2762 Val = (Val & 0x0303030303030303ULL) | (Val & 0x0C0C0C0C0C0C0C0CULL) << 2;
2763 Val = (Val & 0x1111111111111111ULL) | (Val & 0x2222222222222222ULL) << 1;
2764 Val = Val | Val << 1;
2765return ConstantInt::get(Ty, Val);
2773switch (IntrinsicID) {
2775case Intrinsic::vector_reduce_add:
2776case Intrinsic::vector_reduce_mul:
2777case Intrinsic::vector_reduce_and:
2778case Intrinsic::vector_reduce_or:
2779case Intrinsic::vector_reduce_xor:
2780case Intrinsic::vector_reduce_smin:
2781case Intrinsic::vector_reduce_smax:
2782case Intrinsic::vector_reduce_umin:
2783case Intrinsic::vector_reduce_umax:
2789// Support ConstantVector in case we have an Undef in the top. 2790if (isa<ConstantVector>(
Operands[0]) ||
2791 isa<ConstantDataVector>(
Operands[0])) {
2793switch (IntrinsicID) {
2795case Intrinsic::x86_sse_cvtss2si:
2796case Intrinsic::x86_sse_cvtss2si64:
2797case Intrinsic::x86_sse2_cvtsd2si:
2798case Intrinsic::x86_sse2_cvtsd2si64:
2800 dyn_cast_or_null<ConstantFP>(
Op->getAggregateElement(0U)))
2801return ConstantFoldSSEConvertToInt(FPOp->getValueAPF(),
2802/*roundTowardZero=*/false, Ty,
2805case Intrinsic::x86_sse_cvttss2si:
2806case Intrinsic::x86_sse_cvttss2si64:
2807case Intrinsic::x86_sse2_cvttsd2si:
2808case Intrinsic::x86_sse2_cvttsd2si64:
2810 dyn_cast_or_null<ConstantFP>(
Op->getAggregateElement(0U)))
2811return ConstantFoldSSEConvertToInt(FPOp->getValueAPF(),
2812/*roundTowardZero=*/true, Ty,
2824auto *FCmp = cast<ConstrainedFPCmpIntrinsic>(Call);
2826if (FCmp->isSignaling()) {
2828 St = APFloat::opInvalidOp;
2831 St = APFloat::opInvalidOp;
2835return ConstantInt::get(
Call->getType()->getScalarType(), Result);
2849constauto *Op1 = dyn_cast<ConstantFP>(
Operands[0]);
2853constauto *Op2 = dyn_cast<ConstantFP>(
Operands[1]);
2857constAPFloat &Op1V = Op1->getValueAPF();
2858constAPFloat &Op2V = Op2->getValueAPF();
2865case LibFunc_pow_finite:
2866case LibFunc_powf_finite:
2868return ConstantFoldBinaryFP(pow, Op1V, Op2V, Ty);
2872if (TLI->
has(Func)) {
2874if (APFloat::opStatus::opOK ==
V.mod(Op2->getValueAPF()))
2878case LibFunc_remainder:
2879case LibFunc_remainderf:
2880if (TLI->
has(Func)) {
2882if (APFloat::opStatus::opOK ==
V.remainder(Op2->getValueAPF()))
2888// atan2(+/-0.0, +/-0.0) is known to raise an exception on some libm 2889// (Solaris), so we do not assume a known result for that. 2893case LibFunc_atan2_finite:
2894case LibFunc_atan2f_finite:
2896return ConstantFoldBinaryFP(atan2, Op1V, Op2V, Ty);
2909// TODO: We should have undef handling for all of the FP intrinsics that 2910// are attempted to be folded in this function. 2911bool IsOp0Undef = isa<UndefValue>(
Operands[0]);
2912bool IsOp1Undef = isa<UndefValue>(
Operands[1]);
2913switch (IntrinsicID) {
2914case Intrinsic::maxnum:
2915case Intrinsic::minnum:
2916case Intrinsic::maximum:
2917case Intrinsic::minimum:
2918case Intrinsic::nvvm_fmax_d:
2919case Intrinsic::nvvm_fmin_d:
2920// If one argument is undef, return the other argument. 2927case Intrinsic::nvvm_fmax_f:
2928case Intrinsic::nvvm_fmax_ftz_f:
2929case Intrinsic::nvvm_fmax_ftz_nan_f:
2930case Intrinsic::nvvm_fmax_ftz_nan_xorsign_abs_f:
2931case Intrinsic::nvvm_fmax_ftz_xorsign_abs_f:
2932case Intrinsic::nvvm_fmax_nan_f:
2933case Intrinsic::nvvm_fmax_nan_xorsign_abs_f:
2934case Intrinsic::nvvm_fmax_xorsign_abs_f:
2936case Intrinsic::nvvm_fmin_f:
2937case Intrinsic::nvvm_fmin_ftz_f:
2938case Intrinsic::nvvm_fmin_ftz_nan_f:
2939case Intrinsic::nvvm_fmin_ftz_nan_xorsign_abs_f:
2940case Intrinsic::nvvm_fmin_ftz_xorsign_abs_f:
2941case Intrinsic::nvvm_fmin_nan_f:
2942case Intrinsic::nvvm_fmin_nan_xorsign_abs_f:
2943case Intrinsic::nvvm_fmin_xorsign_abs_f:
2944// If one arg is undef, the other arg can be returned only if it is 2945// constant, as we may need to flush it to sign-preserving zero or 2946// canonicalize the NaN. 2947if (!IsOp0Undef && !IsOp1Undef)
2949if (
auto *
Op = dyn_cast<ConstantFP>(
Operands[IsOp0Undef ? 1 : 0])) {
2951APInt NVCanonicalNaN(32, 0x7fffffff);
2952return ConstantFP::get(
2956return ConstantFP::get(Ty, FTZPreserveSign(
Op->getValueAPF()));
2964if (
constauto *Op1 = dyn_cast<ConstantFP>(
Operands[0])) {
2965constAPFloat &Op1V = Op1->getValueAPF();
2967if (
constauto *Op2 = dyn_cast<ConstantFP>(
Operands[1])) {
2968if (Op2->getType() != Op1->getType())
2970constAPFloat &Op2V = Op2->getValueAPF();
2972if (
constauto *ConstrIntr =
2973 dyn_cast_if_present<ConstrainedFPIntrinsic>(Call)) {
2977switch (IntrinsicID) {
2980case Intrinsic::experimental_constrained_fadd:
2981 St = Res.
add(Op2V, RM);
2983case Intrinsic::experimental_constrained_fsub:
2986case Intrinsic::experimental_constrained_fmul:
2989case Intrinsic::experimental_constrained_fdiv:
2990 St = Res.
divide(Op2V, RM);
2992case Intrinsic::experimental_constrained_frem:
2995case Intrinsic::experimental_constrained_fcmp:
2996case Intrinsic::experimental_constrained_fcmps:
2997return evaluateCompare(Op1V, Op2V, ConstrIntr);
3001return ConstantFP::get(Ty->
getContext(), Res);
3005switch (IntrinsicID) {
3008case Intrinsic::copysign:
3010case Intrinsic::minnum:
3012case Intrinsic::maxnum:
3014case Intrinsic::minimum:
3016case Intrinsic::maximum:
3019case Intrinsic::nvvm_fmax_d:
3020case Intrinsic::nvvm_fmax_f:
3021case Intrinsic::nvvm_fmax_ftz_f:
3022case Intrinsic::nvvm_fmax_ftz_nan_f:
3023case Intrinsic::nvvm_fmax_ftz_nan_xorsign_abs_f:
3024case Intrinsic::nvvm_fmax_ftz_xorsign_abs_f:
3025case Intrinsic::nvvm_fmax_nan_f:
3026case Intrinsic::nvvm_fmax_nan_xorsign_abs_f:
3027case Intrinsic::nvvm_fmax_xorsign_abs_f:
3029case Intrinsic::nvvm_fmin_d:
3030case Intrinsic::nvvm_fmin_f:
3031case Intrinsic::nvvm_fmin_ftz_f:
3032case Intrinsic::nvvm_fmin_ftz_nan_f:
3033case Intrinsic::nvvm_fmin_ftz_nan_xorsign_abs_f:
3034case Intrinsic::nvvm_fmin_ftz_xorsign_abs_f:
3035case Intrinsic::nvvm_fmin_nan_f:
3036case Intrinsic::nvvm_fmin_nan_xorsign_abs_f:
3037case Intrinsic::nvvm_fmin_xorsign_abs_f: {
3039bool ShouldCanonicalizeNaNs = !(IntrinsicID == Intrinsic::nvvm_fmax_d ||
3040 IntrinsicID == Intrinsic::nvvm_fmin_d);
3045APFloatA = IsFTZ ? FTZPreserveSign(Op1V) : Op1V;
3046APFloatB = IsFTZ ? FTZPreserveSign(Op2V) : Op2V;
3050 XorSign =
A.isNegative() ^
B.isNegative();
3056switch (IntrinsicID) {
3057case Intrinsic::nvvm_fmax_d:
3058case Intrinsic::nvvm_fmax_f:
3059case Intrinsic::nvvm_fmax_ftz_f:
3060case Intrinsic::nvvm_fmax_ftz_nan_f:
3061case Intrinsic::nvvm_fmax_ftz_nan_xorsign_abs_f:
3062case Intrinsic::nvvm_fmax_ftz_xorsign_abs_f:
3063case Intrinsic::nvvm_fmax_nan_f:
3064case Intrinsic::nvvm_fmax_nan_xorsign_abs_f:
3065case Intrinsic::nvvm_fmax_xorsign_abs_f:
3071if (ShouldCanonicalizeNaNs) {
3073if (
A.isNaN() &&
B.isNaN())
3074return ConstantFP::get(Ty, NVCanonicalNaN);
3075elseif (IsNaNPropagating && (
A.isNaN() ||
B.isNaN()))
3076return ConstantFP::get(Ty, NVCanonicalNaN);
3079if (
A.isNaN() &&
B.isNaN())
3086if (IsXorSignAbs && XorSign != Res.
isNegative())
3089return ConstantFP::get(Ty->
getContext(), Res);
3096switch (IntrinsicID) {
3100return ConstantFoldBinaryFP(pow, Op1V, Op2V, Ty);
3101case Intrinsic::amdgcn_fmul_legacy:
3102// The legacy behaviour is that multiplying +/- 0.0 by anything, even 3103// NaN or infinity, gives +0.0. 3106return ConstantFP::get(Ty->
getContext(), Op1V * Op2V);
3109 }
elseif (
auto *Op2C = dyn_cast<ConstantInt>(
Operands[1])) {
3110switch (IntrinsicID) {
3111case Intrinsic::ldexp: {
3112return ConstantFP::get(
3114scalbn(Op1V, Op2C->getSExtValue(), APFloat::rmNearestTiesToEven));
3116case Intrinsic::is_fpclass: {
3129return ConstantInt::get(Ty, Result);
3131case Intrinsic::powi: {
3132intExp =
static_cast<int>(Op2C->getSExtValue());
3139 Res.
convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven,
3142return ConstantFP::get(Ty->
getContext(), Res);
3160if (!getConstIntOrUndef(
Operands[0], C0) ||
3161 !getConstIntOrUndef(
Operands[1], C1))
3164switch (IntrinsicID) {
3166case Intrinsic::smax:
3167case Intrinsic::smin:
3168case Intrinsic::umax:
3169case Intrinsic::umin:
3170// This is the same as for binary ops - poison propagates. 3171// TODO: Poison handling should be consolidated. 3179return ConstantInt::get(
3185case Intrinsic::scmp:
3186case Intrinsic::ucmp:
3191return ConstantInt::get(Ty, 0);
3194if (IntrinsicID == Intrinsic::scmp)
3195 Res = C0->
sgt(*C1) ? 1 : C0->
slt(*C1) ? -1 : 0;
3197 Res = C0->
ugt(*C1) ? 1 : C0->
ult(*C1) ? -1 : 0;
3198return ConstantInt::get(Ty, Res,
/*IsSigned=*/true);
3200case Intrinsic::usub_with_overflow:
3201case Intrinsic::ssub_with_overflow:
3202// X - undef -> { 0, false } 3203// undef - X -> { 0, false } 3207case Intrinsic::uadd_with_overflow:
3208case Intrinsic::sadd_with_overflow:
3209// X + undef -> { -1, false } 3210// undef + x -> { -1, false } 3213 cast<StructType>(Ty),
3218case Intrinsic::smul_with_overflow:
3219case Intrinsic::umul_with_overflow: {
3220// undef * X -> { 0, false } 3221// X * undef -> { 0, false } 3227switch (IntrinsicID) {
3229case Intrinsic::sadd_with_overflow:
3230 Res = C0->
sadd_ov(*C1, Overflow);
3232case Intrinsic::uadd_with_overflow:
3233 Res = C0->
uadd_ov(*C1, Overflow);
3235case Intrinsic::ssub_with_overflow:
3236 Res = C0->
ssub_ov(*C1, Overflow);
3238case Intrinsic::usub_with_overflow:
3239 Res = C0->
usub_ov(*C1, Overflow);
3241case Intrinsic::smul_with_overflow:
3242 Res = C0->
smul_ov(*C1, Overflow);
3244case Intrinsic::umul_with_overflow:
3245 Res = C0->
umul_ov(*C1, Overflow);
3254case Intrinsic::uadd_sat:
3255case Intrinsic::sadd_sat:
3256// This is the same as for binary ops - poison propagates. 3257// TODO: Poison handling should be consolidated. 3265if (IntrinsicID == Intrinsic::uadd_sat)
3266return ConstantInt::get(Ty, C0->
uadd_sat(*C1));
3268return ConstantInt::get(Ty, C0->
sadd_sat(*C1));
3269case Intrinsic::usub_sat:
3270case Intrinsic::ssub_sat:
3271// This is the same as for binary ops - poison propagates. 3272// TODO: Poison handling should be consolidated. 3280if (IntrinsicID == Intrinsic::usub_sat)
3281return ConstantInt::get(Ty, C0->
usub_sat(*C1));
3283return ConstantInt::get(Ty, C0->
ssub_sat(*C1));
3284case Intrinsic::cttz:
3285case Intrinsic::ctlz:
3286assert(C1 &&
"Must be constant int");
3288// cttz(0, 1) and ctlz(0, 1) are poison. 3293if (IntrinsicID == Intrinsic::cttz)
3299assert(C1 &&
"Must be constant int");
3302// Undef or minimum val operand with poison min --> poison 3306// Undef operand with no poison min --> 0 (sign bit must be clear) 3310return ConstantInt::get(Ty, C0->
abs());
3311case Intrinsic::amdgcn_wave_reduce_umin:
3312case Intrinsic::amdgcn_wave_reduce_umax:
3313return dyn_cast<Constant>(
Operands[0]);
3319// Support ConstantVector in case we have an Undef in the top. 3320if ((isa<ConstantVector>(
Operands[0]) ||
3321 isa<ConstantDataVector>(
Operands[0])) &&
3322// Check for default rounding mode. 3323// FIXME: Support other rounding modes? 3325 cast<ConstantInt>(
Operands[1])->getValue() == 4) {
3327switch (IntrinsicID) {
3329case Intrinsic::x86_avx512_vcvtss2si32:
3330case Intrinsic::x86_avx512_vcvtss2si64:
3331case Intrinsic::x86_avx512_vcvtsd2si32:
3332case Intrinsic::x86_avx512_vcvtsd2si64:
3334 dyn_cast_or_null<ConstantFP>(
Op->getAggregateElement(0U)))
3335return ConstantFoldSSEConvertToInt(FPOp->getValueAPF(),
3336/*roundTowardZero=*/false, Ty,
3339case Intrinsic::x86_avx512_vcvtss2usi32:
3340case Intrinsic::x86_avx512_vcvtss2usi64:
3341case Intrinsic::x86_avx512_vcvtsd2usi32:
3342case Intrinsic::x86_avx512_vcvtsd2usi64:
3344 dyn_cast_or_null<ConstantFP>(
Op->getAggregateElement(0U)))
3345return ConstantFoldSSEConvertToInt(FPOp->getValueAPF(),
3346/*roundTowardZero=*/false, Ty,
3349case Intrinsic::x86_avx512_cvttss2si:
3350case Intrinsic::x86_avx512_cvttss2si64:
3351case Intrinsic::x86_avx512_cvttsd2si:
3352case Intrinsic::x86_avx512_cvttsd2si64:
3354 dyn_cast_or_null<ConstantFP>(
Op->getAggregateElement(0U)))
3355return ConstantFoldSSEConvertToInt(FPOp->getValueAPF(),
3356/*roundTowardZero=*/true, Ty,
3359case Intrinsic::x86_avx512_cvttss2usi:
3360case Intrinsic::x86_avx512_cvttss2usi64:
3361case Intrinsic::x86_avx512_cvttsd2usi:
3362case Intrinsic::x86_avx512_cvttsd2usi64:
3364 dyn_cast_or_null<ConstantFP>(
Op->getAggregateElement(0U)))
3365return ConstantFoldSSEConvertToInt(FPOp->getValueAPF(),
3366/*roundTowardZero=*/true, Ty,
3393if (
S1.isNegative() &&
S1.isNonZero() && !
S1.isNaN()) {
3415switch (IntrinsicID) {
3418case Intrinsic::amdgcn_cubeid:
3420case Intrinsic::amdgcn_cubema:
3422case Intrinsic::amdgcn_cubesc:
3424case Intrinsic::amdgcn_cubetc:
3431constAPInt *C0, *C1, *C2;
3432if (!getConstIntOrUndef(
Operands[0], C0) ||
3433 !getConstIntOrUndef(
Operands[1], C1) ||
3434 !getConstIntOrUndef(
Operands[2], C2))
3441unsigned NumUndefBytes = 0;
3442for (
unsignedI = 0;
I < 32;
I += 8) {
3451constAPInt *Src = ((Sel & 10) == 10 || (Sel & 12) == 4) ? C0 : C1;
3455B = Src->extractBitsAsZExtValue(8, (Sel & 3) * 8);
3457B = Src->extractBitsAsZExtValue(1, (Sel & 1) ? 31 : 15) * 0xff;
3460 Val.insertBits(
B,
I, 8);
3463if (NumUndefBytes == 4)
3466return ConstantInt::get(Ty, Val);
3477if (
constauto *Op1 = dyn_cast<ConstantFP>(
Operands[0])) {
3478if (
constauto *Op2 = dyn_cast<ConstantFP>(
Operands[1])) {
3479if (
constauto *Op3 = dyn_cast<ConstantFP>(
Operands[2])) {
3480constAPFloat &C1 = Op1->getValueAPF();
3481constAPFloat &C2 = Op2->getValueAPF();
3482constAPFloat &C3 = Op3->getValueAPF();
3484if (
constauto *ConstrIntr = dyn_cast<ConstrainedFPIntrinsic>(Call)) {
3488switch (IntrinsicID) {
3491case Intrinsic::experimental_constrained_fma:
3492case Intrinsic::experimental_constrained_fmuladd:
3496if (mayFoldConstrained(
3498return ConstantFP::get(Ty->
getContext(), Res);
3502switch (IntrinsicID) {
3504case Intrinsic::amdgcn_fma_legacy: {
3505// The legacy behaviour is that multiplying +/- 0.0 by anything, even 3506// NaN or infinity, gives +0.0. 3508// It's tempting to just return C3 here, but that would give the 3509// wrong result if C3 was -0.0. 3515case Intrinsic::fmuladd: {
3517V.fusedMultiplyAdd(C2, C3, APFloat::rmNearestTiesToEven);
3520case Intrinsic::amdgcn_cubeid:
3521case Intrinsic::amdgcn_cubema:
3522case Intrinsic::amdgcn_cubesc:
3523case Intrinsic::amdgcn_cubetc: {
3524APFloatV = ConstantFoldAMDGCNCubeIntrinsic(IntrinsicID, C1, C2, C3);
3532if (IntrinsicID == Intrinsic::smul_fix ||
3533 IntrinsicID == Intrinsic::smul_fix_sat) {
3534// poison * C -> poison 3535// C * poison -> poison 3540if (!getConstIntOrUndef(
Operands[0], C0) ||
3541 !getConstIntOrUndef(
Operands[1], C1))
3549// This code performs rounding towards negative infinity in case the result 3550// cannot be represented exactly for the given scale. Targets that do care 3551// about rounding should use a target hook for specifying how rounding 3552// should be done, and provide their own folding to be consistent with 3553// rounding. This is the same approach as used by 3554// DAGTypeLegalizer::ExpandIntRes_MULFIX. 3555unsigned Scale = cast<ConstantInt>(
Operands[2])->getZExtValue();
3557assert(Scale < Width &&
"Illegal scale.");
3558unsigned ExtendedWidth = Width * 2;
3560 (C0->
sext(ExtendedWidth) * C1->
sext(ExtendedWidth)).ashr(Scale);
3561if (IntrinsicID == Intrinsic::smul_fix_sat) {
3570if (IntrinsicID == Intrinsic::fshl || IntrinsicID == Intrinsic::fshr) {
3571constAPInt *C0, *C1, *C2;
3572if (!getConstIntOrUndef(
Operands[0], C0) ||
3573 !getConstIntOrUndef(
Operands[1], C1) ||
3574 !getConstIntOrUndef(
Operands[2], C2))
3577bool IsRight = IntrinsicID == Intrinsic::fshr;
3583// The shift amount is interpreted as modulo the bitwidth. If the shift 3584// amount is effectively 0, avoid UB due to oversized inverse shift below. 3590// (C0 << ShlAmt) | (C1 >> LshrAmt) 3591unsigned LshrAmt = IsRight ? ShAmt :
BitWidth - ShAmt;
3592unsigned ShlAmt = !IsRight ? ShAmt :
BitWidth - ShAmt;
3594return ConstantInt::get(Ty, C1->
lshr(LshrAmt));
3596return ConstantInt::get(Ty, C0->
shl(ShlAmt));
3597return ConstantInt::get(Ty, C0->
shl(ShlAmt) | C1->
lshr(LshrAmt));
3600if (IntrinsicID == Intrinsic::amdgcn_perm)
3601return ConstantFoldAMDGCNPermIntrinsic(
Operands, Ty);
3613return ConstantFoldScalarCall1(
Name, IntrinsicID, Ty,
Operands, TLI, Call);
3618return FoldedLibCall;
3620return ConstantFoldIntrinsicCall2(IntrinsicID, Ty,
Operands, Call);
3624return ConstantFoldScalarCall3(
Name, IntrinsicID, Ty,
Operands, TLI, Call);
3629staticConstant *ConstantFoldFixedVectorCall(
3637switch (IntrinsicID) {
3638case Intrinsic::masked_load: {
3647auto *MaskElt =
Mask->getAggregateElement(
I);
3650auto *PassthruElt = Passthru->getAggregateElement(
I);
3652if (isa<UndefValue>(MaskElt)) {
3660if (MaskElt->isNullValue()) {
3664 }
elseif (MaskElt->isOneValue()) {
3676case Intrinsic::arm_mve_vctp8:
3677case Intrinsic::arm_mve_vctp16:
3678case Intrinsic::arm_mve_vctp32:
3679case Intrinsic::arm_mve_vctp64: {
3680if (
auto *
Op = dyn_cast<ConstantInt>(
Operands[0])) {
3685for (
unsigned i = 0; i < Lanes; i++) {
3695case Intrinsic::get_active_lane_mask: {
3696auto *Op0 = dyn_cast<ConstantInt>(
Operands[0]);
3697auto *Op1 = dyn_cast<ConstantInt>(
Operands[1]);
3701uint64_t Limit = Op1->getZExtValue();
3704for (
unsigned i = 0; i < Lanes; i++) {
3705if (
Base + i < Limit)
3719// Gather a column of constants. 3720for (
unsigned J = 0, JE =
Operands.size(); J != JE; ++J) {
3721// Some intrinsics use a scalar type for certain arguments. 3734// Use the regular scalar folding to simplify this column. 3736 ConstantFoldScalarCall(
Name, IntrinsicID, Ty, Lane, TLI, Call);
3745staticConstant *ConstantFoldScalableVectorCall(
3749switch (IntrinsicID) {
3750case Intrinsic::aarch64_sve_convert_from_svbool: {
3751auto *Src = dyn_cast<Constant>(
Operands[0]);
3752if (!Src || !Src->isNullValue())
3763static std::pair<Constant *, Constant *>
3765if (isa<PoisonValue>(
Op))
3768auto *ConstFP = dyn_cast<ConstantFP>(
Op);
3772constAPFloat &
U = ConstFP->getValueAPF();
3774APFloat FrexpMant =
frexp(U, FrexpExp, APFloat::rmNearestTiesToEven);
3775Constant *Result0 = ConstantFP::get(ConstFP->getType(), FrexpMant);
3777// The exponent is an "unspecified value" for inf/nan. We use zero to avoid 3782return {Result0, Result1};
3785/// Handle intrinsics that return tuples, which may be tuples of vectors. 3792switch (IntrinsicID) {
3793case Intrinsic::frexp: {
3797if (
auto *FVTy0 = dyn_cast<FixedVectorType>(Ty0)) {
3801for (
unsignedI = 0, E = FVTy0->getNumElements();
I != E; ++
I) {
3803 std::tie(Results0[
I], Results1[
I]) =
3804 ConstantFoldScalarFrexpCall(Lane, Ty1);
3813auto [Result0, Result1] = ConstantFoldScalarFrexpCall(
Operands[0], Ty1);
3818case Intrinsic::sincos: {
3822auto ConstantFoldScalarSincosCall =
3823 [&](
Constant *
Op) -> std::pair<Constant *, Constant *> {
3825 ConstantFoldScalarCall(
Name, Intrinsic::sin, TyScalar,
Op, TLI, Call);
3827 ConstantFoldScalarCall(
Name, Intrinsic::cos, TyScalar,
Op, TLI, Call);
3828return std::make_pair(SinResult, CosResult);
3831if (
auto *FVTy = dyn_cast<FixedVectorType>(Ty)) {
3837 std::tie(SinResults[
I], CosResults[
I]) =
3838 ConstantFoldScalarSincosCall(Lane);
3839if (!SinResults[
I] || !CosResults[
I])
3847auto [SinResult, CosResult] = ConstantFoldScalarSincosCall(
Operands[0]);
3848if (!SinResult || !CosResult)
3853// TODO: Constant folding of vector intrinsics that fall through here does 3854// not work (e.g. overflow intrinsics) 3855return ConstantFoldScalarCall(
Name, IntrinsicID, StTy,
Operands, TLI, Call);
3861}
// end anonymous namespace 3866return ConstantFoldIntrinsicCall2(
ID, Ty, {
LHS,
RHS},
3867 dyn_cast_if_present<CallBase>(
FMFSource));
3873bool AllowNonDeterministic) {
3874if (Call->isNoBuiltin())
3879// If this is not an intrinsic and not recognized as a library call, bail out. 3889// Conservatively assume that floating-point libcalls may be 3890// non-deterministic. 3891Type *Ty =
F->getReturnType();
3896if (
auto *FVTy = dyn_cast<FixedVectorType>(Ty))
3897return ConstantFoldFixedVectorCall(
3900if (
auto *SVTy = dyn_cast<ScalableVectorType>(Ty))
3901return ConstantFoldScalableVectorCall(
3904if (
auto *StTy = dyn_cast<StructType>(Ty))
3906F->getDataLayout(), TLI, Call);
3908// TODO: If this is a library function, we already discovered that above, 3909// so we should pass the LibFunc, not the name (and it might be better 3910// still to separate intrinsic handling from libcalls). 3911return ConstantFoldScalarCall(
Name, IID, Ty,
Operands, TLI, Call);
3916// FIXME: Refactor this code; this duplicates logic in LibCallsShrinkWrap 3917// (and to some extent ConstantFoldScalarCall). 3918if (Call->isNoBuiltin() || Call->isStrictFP())
3928if (Call->arg_size() == 1) {
3929if (
ConstantFP *OpC = dyn_cast<ConstantFP>(Call->getArgOperand(0))) {
3941returnOp.isNaN() || (!
Op.isZero() && !
Op.isNegative());
3944return !
Op.isNaN() && !
Op.isZero() && !
Op.isInfinity();
3949// FIXME: These boundaries are slightly conservative. 3950if (OpC->getType()->isDoubleTy())
3952if (OpC->getType()->isFloatTy())
3959// FIXME: These boundaries are slightly conservative. 3960if (OpC->getType()->isDoubleTy())
3962if (OpC->getType()->isFloatTy())
3972return !
Op.isInfinity();
3977// FIXME: Stop using the host math library. 3978// FIXME: The computation isn't done in the right precision. 3979Type *Ty = OpC->getType();
3981return ConstantFoldFP(tan, OpC->getValueAPF(), Ty) !=
nullptr;
3988// Per POSIX, this MAY fail if Op is denormal. We choose not failing. 4006// FIXME: These boundaries are slightly conservative. 4007if (OpC->getType()->isDoubleTy())
4009if (OpC->getType()->isFloatTy())
4016returnOp.isNaN() ||
Op.isZero() || !
Op.isNegative();
4018// FIXME: Add more functions: sqrt_finite, atanh, expm1, log1p, 4026if (Call->arg_size() == 2) {
4027ConstantFP *Op0C = dyn_cast<ConstantFP>(Call->getArgOperand(0));
4028ConstantFP *Op1C = dyn_cast<ConstantFP>(Call->getArgOperand(1));
4037// FIXME: Stop using the host math library. 4038// FIXME: The computation isn't done in the right precision. 4042return ConstantFoldBinaryFP(pow, Op0, Op1, Ty) !=
nullptr;
4050case LibFunc_remainderl:
4051case LibFunc_remainder:
4052case LibFunc_remainderf:
4059// Although IEEE-754 says atan2(+/-0.0, +/-0.0) are well-defined, and 4060// GLIBC and MSVC do not appear to raise an error on those, we 4061// cannot rely on that behavior. POSIX and C11 say that a domain error 4062// may occur, so allow for that possibility. 4074void TargetFolder::anchor() {}
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...
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static Constant * FoldBitCast(Constant *V, Type *DestTy)
static ConstantFP * flushDenormalConstant(Type *Ty, const APFloat &APF, DenormalMode::DenormalModeKind Mode)
Constant * getConstantAtOffset(Constant *Base, APInt Offset, const DataLayout &DL)
If this Offset points exactly to the start of an aggregate element, return that element,...
static ConstantFP * flushDenormalConstantFP(ConstantFP *CFP, const Instruction *Inst, bool IsOutput)
static DenormalMode getInstrDenormalMode(const Instruction *CtxI, Type *Ty)
Return the denormal mode that can be assumed when executing a floating point operation at CtxI.
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
amode Optimize addressing mode
mir Rename Register Operands
static bool InRange(int64_t Value, unsigned short Shift, int LBound, int HBound)
This file contains the definitions of the enumerations and flags associated with NVVM Intrinsics,...
const SmallVectorImpl< MachineOperand > & Cond
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallVector class.
static SymbolRef::Type getType(const Symbol *Sym)
static APFloat getQNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for QNaN values.
opStatus divide(const APFloat &RHS, roundingMode RM)
void copySign(const APFloat &RHS)
opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
opStatus subtract(const APFloat &RHS, roundingMode RM)
double convertToDouble() const
Converts this APFloat to host double value.
bool isPosInfinity() const
opStatus add(const APFloat &RHS, roundingMode RM)
const fltSemantics & getSemantics() const
static APFloat getOne(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative One.
opStatus multiply(const APFloat &RHS, roundingMode RM)
float convertToFloat() const
Converts this APFloat to host float value.
opStatus fusedMultiplyAdd(const APFloat &Multiplicand, const APFloat &Addend, roundingMode RM)
APInt bitcastToAPInt() const
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
opStatus mod(const APFloat &RHS)
bool isNegInfinity() const
static APFloat getZero(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Zero.
Class for arbitrary precision integers.
APInt umul_ov(const APInt &RHS, bool &Overflow) const
APInt usub_sat(const APInt &RHS) const
bool isMinSignedValue() const
Determine if this is the smallest signed value.
uint64_t getZExtValue() const
Get zero extended value.
uint64_t extractBitsAsZExtValue(unsigned numBits, unsigned bitPosition) const
APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
APInt trunc(unsigned width) const
Truncate to new width.
APInt abs() const
Get the absolute value.
APInt sadd_sat(const APInt &RHS) const
bool sgt(const APInt &RHS) const
Signed greater than comparison.
APInt usub_ov(const APInt &RHS, bool &Overflow) const
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
APInt urem(const APInt &RHS) const
Unsigned remainder operation.
unsigned getBitWidth() const
Return the number of bits in the APInt.
bool ult(const APInt &RHS) const
Unsigned less than comparison.
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
APInt sadd_ov(const APInt &RHS, bool &Overflow) const
APInt uadd_ov(const APInt &RHS, bool &Overflow) const
unsigned countr_zero() const
Count the number of trailing zero bits.
unsigned countl_zero() const
The APInt version of std::countl_zero.
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
APInt uadd_sat(const APInt &RHS) const
APInt smul_ov(const APInt &RHS, bool &Overflow) const
APInt sext(unsigned width) const
Sign extend to a new width.
APInt shl(unsigned shiftAmt) const
Left-shift function.
bool slt(const APInt &RHS) const
Signed less than comparison.
APInt extractBits(unsigned numBits, unsigned bitPosition) const
Return an APInt with the extracted bits [bitPosition,bitPosition+numBits).
APInt ssub_ov(const APInt &RHS, bool &Overflow) const
bool isOne() const
Determine if this is a value of 1.
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
APInt ssub_sat(const APInt &RHS) const
An arbitrary precision integer that knows its signedness.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
const T & back() const
back - Get the last element.
size_t size() const
size - Get the array size.
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
static Instruction::CastOps getCastOpcode(const Value *Val, bool SrcIsSigned, Type *Ty, bool DstIsSigned)
Returns the opcode necessary to cast Val into Ty using usual casting rules.
static bool castIsValid(Instruction::CastOps op, Type *SrcTy, Type *DstTy)
This method can be used to determine if a cast from SrcTy to DstTy using Opcode op is valid or not.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
bool isFPPredicate() const
static Constant * get(LLVMContext &Context, ArrayRef< ElementTy > Elts)
get() constructor - Return a constant with array type with an element count and element type matching...
static Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static Constant * getExtractElement(Constant *Vec, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static bool isDesirableCastOp(unsigned Opcode)
Whether creating a constant expression for this cast is desirable.
static Constant * getCast(unsigned ops, Constant *C, Type *Ty, bool OnlyIfReduced=false)
Convenience function for getting a Cast operation.
static Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static Constant * getInsertElement(Constant *Vec, Constant *Elt, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static Constant * getPtrToInt(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static Constant * getShuffleVector(Constant *V1, Constant *V2, ArrayRef< int > Mask, Type *OnlyIfReducedTy=nullptr)
static bool isSupportedGetElementPtr(const Type *SrcElemTy)
Whether creating a constant expression for this getelementptr type is supported.
static Constant * get(unsigned Opcode, Constant *C1, Constant *C2, unsigned Flags=0, Type *OnlyIfReducedTy=nullptr)
get - Return a binary or shift operator constant expression, folding if possible.
static bool isDesirableBinOp(unsigned Opcode)
Whether creating a constant expression for this binary operator is desirable.
static Constant * getGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReducedTy=nullptr)
Getelementptr form.
static Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
ConstantFP - Floating Point Values [float, double].
const APFloat & getValueAPF() const
static Constant * getZero(Type *Ty, bool Negative=false)
This is the shared class of boolean and integer constants.
static ConstantInt * getTrue(LLVMContext &Context)
static ConstantInt * getSigned(IntegerType *Ty, int64_t V)
Return a ConstantInt with the specified value for the specified type.
static ConstantInt * getFalse(LLVMContext &Context)
static ConstantInt * getBool(LLVMContext &Context, bool V)
static Constant * get(StructType *T, ArrayRef< Constant * > V)
static Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
static Constant * get(ArrayRef< Constant * > V)
This is an important base class in LLVM.
Constant * getSplatValue(bool AllowPoison=false) const
If all elements of the vector constant have the same value, return that value.
static Constant * getAllOnesValue(Type *Ty)
static Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Constrained floating point compare intrinsics.
This is the common base class for constrained floating point intrinsics.
std::optional< fp::ExceptionBehavior > getExceptionBehavior() const
std::optional< RoundingMode > getRoundingMode() const
Wrapper for a function that represents a value that functionally represents the original function.
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
iterator find(const_arg_type_t< KeyT > Val)
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
static bool compare(const APFloat &LHS, const APFloat &RHS, FCmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
This provides a helper for copying FMF from an instruction or setting specified flags.
Class to represent fixed width SIMD vectors.
unsigned getNumElements() const
static FixedVectorType * get(Type *ElementType, unsigned NumElts)
DenormalMode getDenormalMode(const fltSemantics &FPType) const
Returns the denormal handling type for the default rounding mode of the function.
Represents flags for the getelementptr instruction/expression.
static GEPNoWrapFlags inBounds()
GEPNoWrapFlags withoutNoUnsignedSignedWrap() const
static GEPNoWrapFlags noUnsignedWrap()
bool hasNoUnsignedSignedWrap() const
static Type * getIndexedType(Type *Ty, ArrayRef< Value * > IdxList)
Returns the result type of a getelementptr with the given source element type and indexes.
PointerType * getType() const
Global values are always pointers.
const DataLayout & getDataLayout() const
Get the data layout of the module this global belongs to.
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
bool isConstant() const
If the value is a global constant, its value is immutable throughout the runtime execution of the pro...
bool hasDefinitiveInitializer() const
hasDefinitiveInitializer - Whether the global variable has an initializer, and any other instances of...
static bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
Predicate getSignedPredicate() const
For example, EQ->EQ, SLE->SLE, UGT->SGT, etc.
const Function * getFunction() const
Return the function this instruction belongs to.
static IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
This is an important class for using LLVM in a threaded context.
static APInt getSaturationPoint(Intrinsic::ID ID, unsigned numBits)
Min/max intrinsics are monotonic, they operate on a fixed-bitwidth values, so there is a certain thre...
ICmpInst::Predicate getPredicate() const
Returns the comparison predicate underlying the intrinsic.
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
static PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Class to represent scalable SIMD vectors.
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.
StringRef - Represent a constant reference to a string, i.e.
Used to lazily calculate structure layout information for a target machine, based on the DataLayout s...
unsigned getElementContainingOffset(uint64_t FixedOffset) const
Given a valid byte offset into the structure, returns the structure index that contains it.
TypeSize getElementOffset(unsigned Idx) const
Class to represent struct types.
Provides information about what library functions are available for the current target.
bool has(LibFunc F) const
Tests whether a library function is available.
bool getLibFunc(StringRef funcName, LibFunc &F) const
Searches for a particular function name.
The instances of the Type class are immutable: once they are created, they are never changed.
unsigned getIntegerBitWidth() const
Type * getStructElementType(unsigned N) const
const fltSemantics & getFltSemantics() const
bool isVectorTy() const
True if this is an instance of VectorType.
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
bool isPointerTy() const
True if this is an instance of PointerType.
static IntegerType * getInt1Ty(LLVMContext &C)
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
@ HalfTyID
16-bit floating point type
@ FloatTyID
32-bit floating point type
@ DoubleTyID
64-bit floating point type
static IntegerType * getIntNTy(LLVMContext &C, unsigned N)
bool isFP128Ty() const
Return true if this is 'fp128'.
unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
bool isStructTy() const
True if this is an instance of StructType.
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
static IntegerType * getInt16Ty(LLVMContext &C)
bool isAggregateType() const
Return true if the type is an aggregate type.
bool isHalfTy() const
Return true if this is 'half', a 16-bit IEEE fp type.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
static IntegerType * getInt8Ty(LLVMContext &C)
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
bool isX86_AMXTy() const
Return true if this is X86 AMX.
static IntegerType * getInt32Ty(LLVMContext &C)
static IntegerType * getInt64Ty(LLVMContext &C)
bool isIntegerTy() const
True if this is an instance of IntegerType.
TypeID getTypeID() const
Return the type id for the type.
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Type * getContainedType(unsigned i) const
This method is used to implement the type iterator (defined at the end of the file).
bool isIEEELikeFPTy() const
Return true if this is a well-behaved IEEE-like type, which has a IEEE compatible layout as defined b...
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
static UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
A Use represents the edge between a Value definition and its users.
Value * getOperand(unsigned i) const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
const Value * stripAndAccumulateInBoundsConstantOffsets(const DataLayout &DL, APInt &Offset) const
This is a wrapper around stripAndAccumulateConstantOffsets with the in-bounds requirement set to fals...
LLVMContext & getContext() const
All values hold a context through their type.
Base class of all SIMD vector types.
ElementCount getElementCount() const
Return an ElementCount instance to represent the (possibly scalable) number of elements in the vector...
Type * getElementType() const
constexpr ScalarTy getFixedValue() const
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
const ParentTy * getParent() const
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
const APInt & smin(const APInt &A, const APInt &B)
Determine the smaller of two APInts considered to be signed.
const APInt & smax(const APInt &A, const APInt &B)
Determine the larger of two APInts considered to be signed.
const APInt & umin(const APInt &A, const APInt &B)
Determine the smaller of two APInts considered to be unsigned.
const APInt & umax(const APInt &A, const APInt &B)
Determine the larger of two APInts considered to be unsigned.
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.
@ C
The default llvm calling convention, compatible with C.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ SC
CHAIN = SC CHAIN, Imm128 - System call.
@ CE
Windows NT (Windows on ARM)
int ilogb(const IEEEFloat &Arg)
@ ebStrict
This corresponds to "fpexcept.strict".
@ ebIgnore
This corresponds to "fpexcept.ignore".
bool FPToIntegerIntrinsicResultIsSigned(Intrinsic::ID IntrinsicID)
APFloat::roundingMode GetFPToIntegerRoundingMode(Intrinsic::ID IntrinsicID)
bool FPToIntegerIntrinsicShouldFTZ(Intrinsic::ID IntrinsicID)
bool FMinFMaxIsXorSignAbs(Intrinsic::ID IntrinsicID)
bool FMinFMaxShouldFTZ(Intrinsic::ID IntrinsicID)
bool FMinFMaxPropagatesNaNs(Intrinsic::ID IntrinsicID)
NodeAddr< FuncNode * > Func
std::error_code status(const Twine &path, file_status &result, bool follow=true)
Get file status as if by POSIX stat().
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Constant * ConstantFoldBinaryIntrinsic(Intrinsic::ID ID, Constant *LHS, Constant *RHS, Type *Ty, Instruction *FMFSource)
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Constant * ConstantFoldLoadThroughBitcast(Constant *C, Type *DestTy, const DataLayout &DL)
ConstantFoldLoadThroughBitcast - try to cast constant to destination type returning null if unsuccess...
static double log2(double V)
Constant * ConstantFoldSelectInstruction(Constant *Cond, Constant *V1, Constant *V2)
Attempt to constant fold a select instruction with the specified operands.
Constant * ConstantFoldFPInstOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL, const Instruction *I, bool AllowNonDeterministic=true)
Attempt to constant fold a floating point binary operation with the specified operands,...
bool canConstantFoldCallTo(const CallBase *Call, const Function *F)
canConstantFoldCallTo - Return true if its even possible to fold a call to the specified function.
unsigned getPointerAddressSpace(const Type *T)
APFloat abs(APFloat X)
Returns the absolute value of the argument.
Constant * ConstantFoldCompareInstruction(CmpInst::Predicate Predicate, Constant *C1, Constant *C2)
Constant * ConstantFoldUnaryInstruction(unsigned Opcode, Constant *V)
bool IsConstantOffsetFromGlobal(Constant *C, GlobalValue *&GV, APInt &Offset, const DataLayout &DL, DSOLocalEquivalent **DSOEquiv=nullptr)
If this constant is a constant offset from a global, return the global and the constant.
bool isMathLibCallNoop(const CallBase *Call, const TargetLibraryInfo *TLI)
Check whether the given call has no side-effects.
Constant * ReadByteArrayFromGlobal(const GlobalVariable *GV, uint64_t Offset)
LLVM_READONLY APFloat maximum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximum semantics.
const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=6)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
Constant * ConstantFoldCompareInstOperands(unsigned Predicate, Constant *LHS, Constant *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const Instruction *I=nullptr)
Attempt to constant fold a compare instruction (icmp/fcmp) with the specified operands.
Constant * ConstantFoldCall(const CallBase *Call, Function *F, ArrayRef< Constant * > Operands, const TargetLibraryInfo *TLI=nullptr, bool AllowNonDeterministic=true)
ConstantFoldCall - Attempt to constant fold a call to the specified function with the specified argum...
APFloat frexp(const APFloat &X, int &Exp, APFloat::roundingMode RM)
Equivalent of C standard library function.
Constant * ConstantFoldExtractValueInstruction(Constant *Agg, ArrayRef< unsigned > Idxs)
Attempt to constant fold an extractvalue instruction with the specified operands and indices.
Constant * ConstantFoldConstant(const Constant *C, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldConstant - Fold the constant using the specified DataLayout.
LLVM_READONLY APFloat maxnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2019 maximumNumber semantics.
Constant * ConstantFoldLoadFromUniformValue(Constant *C, Type *Ty, const DataLayout &DL)
If C is a uniform value where all bits are the same (either all zero, all ones, all undef or all pois...
Constant * ConstantFoldUnaryOpOperand(unsigned Opcode, Constant *Op, const DataLayout &DL)
Attempt to constant fold a unary operation with the specified operand.
Constant * FlushFPConstant(Constant *Operand, const Instruction *I, bool IsOutput)
Attempt to flush float point constant according to denormal mode set in the instruction's parent func...
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
APFloat scalbn(APFloat X, int Exp, APFloat::roundingMode RM)
bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
Constant * ConstantFoldInstOperands(Instruction *I, ArrayRef< Constant * > Ops, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, bool AllowNonDeterministic=true)
ConstantFoldInstOperands - Attempt to constant fold an instruction with the specified operands.
Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
Constant * ConstantFoldLoadFromConst(Constant *C, Type *Ty, const APInt &Offset, const DataLayout &DL)
Extract value of C at the given Offset reinterpreted as Ty.
Constant * ConstantFoldBinaryOpOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL)
Attempt to constant fold a binary operation with the specified operands.
LLVM_READONLY APFloat minnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2019 minimumNumber semantics.
bool isVectorIntrinsicWithScalarOpAtArg(Intrinsic::ID ID, unsigned ScalarOpdIdx, const TargetTransformInfo *TTI)
Identifies if the vector form of the intrinsic has a scalar operand.
void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, unsigned Depth=0, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
DWARFExpression::Operation Op
Constant * ConstantFoldInstruction(Instruction *I, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldInstruction - Try to constant fold the specified instruction.
RoundingMode
Rounding mode.
bool isGuaranteedNotToBeUndefOrPoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Return true if this function can prove that V does not have undef bits and is never poison.
constexpr unsigned BitWidth
Constant * ConstantFoldCastInstruction(unsigned opcode, Constant *V, Type *DestTy)
Constant * ConstantFoldInsertValueInstruction(Constant *Agg, Constant *Val, ArrayRef< unsigned > Idxs)
ConstantFoldInsertValueInstruction - Attempt to constant fold an insertvalue instruction with the spe...
Constant * ConstantFoldLoadFromConstPtr(Constant *C, Type *Ty, APInt Offset, const DataLayout &DL)
Return the value that a load from C with offset Offset would produce if it is constant and determinab...
LLVM_READONLY APFloat minimum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimum semantics.
Constant * ConstantFoldIntegerCast(Constant *C, Type *DestTy, bool IsSigned, const DataLayout &DL)
Constant fold a zext, sext or trunc, depending on IsSigned and whether the DestTy is wider or narrowe...
Constant * ConstantFoldBinaryInstruction(unsigned Opcode, Constant *V1, Constant *V2)
opStatus
IEEE-754R 7: Default exception handling.
Represent subnormal handling kind for floating point instruction inputs and outputs.
DenormalModeKind Input
Denormal treatment kind for floating point instruction inputs in the default floating-point environme...
DenormalModeKind
Represent handled modes for denormal (aka subnormal) modes in the floating point environment.
@ PreserveSign
The sign of a flushed-to-zero number is preserved in the sign of 0.
@ PositiveZero
Denormals are flushed to positive zero.
@ Dynamic
Denormals have unknown treatment.
@ IEEE
IEEE-754 denormal numbers preserved.
DenormalModeKind Output
Denormal flushing mode for floating point instruction results in the default floating point environme...
static constexpr DenormalMode getDynamic()
static constexpr DenormalMode getIEEE()
Incoming for lane maks phi as machine instruction, incoming register Reg and incoming block Block are...
bool isConstant() const
Returns true if we know the value of all bits.
const APInt & getConstant() const
Returns the value when all bits have a known value.