LLVM 24.0.0git
ConstantFold.cpp
Go to the documentation of this file.
1//===- ConstantFold.cpp - LLVM constant folder ----------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements folding of constants for LLVM. This implements the
10// (internal) ConstantFold.h interface, which is used by the
11// ConstantExpr::get* methods to automatically fold constants when possible.
12//
13// The current constant folding implementation is implemented in two pieces: the
14// pieces that don't need DataLayout, and the pieces that do. This is to avoid
15// a dependence in IR on Target.
16//
17//===----------------------------------------------------------------------===//
18
20#include "llvm/ADT/APInt.h"
21#include "llvm/ADT/APSInt.h"
23#include "llvm/IR/Constants.h"
25#include "llvm/IR/Function.h"
26#include "llvm/IR/GlobalAlias.h"
29#include "llvm/IR/Module.h"
30#include "llvm/IR/Operator.h"
33using namespace llvm;
34using namespace llvm::PatternMatch;
35
36//===----------------------------------------------------------------------===//
37// ConstantFold*Instruction Implementations
38//===----------------------------------------------------------------------===//
39
40/// This function determines which opcode to use to fold two constant cast
41/// expressions together. It uses CastInst::isEliminableCastPair to determine
42/// the opcode. Consequently its just a wrapper around that function.
43/// Determine if it is valid to fold a cast of a cast
44static unsigned
46 unsigned opc, ///< opcode of the second cast constant expression
47 ConstantExpr *Op, ///< the first cast constant expression
48 Type *DstTy ///< destination type of the first cast
49) {
50 assert(Op && Op->isCast() && "Can't fold cast of cast without a cast!");
51 assert(DstTy && DstTy->isFirstClassType() && "Invalid cast destination type");
52 assert(CastInst::isCast(opc) && "Invalid cast opcode");
53
54 // The types and opcodes for the two Cast constant expressions
55 Type *SrcTy = Op->getOperand(0)->getType();
56 Type *MidTy = Op->getType();
57 Instruction::CastOps firstOp = Instruction::CastOps(Op->getOpcode());
59 return CastInst::isEliminableCastPair(firstOp, secondOp, SrcTy, MidTy, DstTy,
60 /*DL=*/nullptr);
61}
62
63static Constant *FoldBitCast(Constant *V, Type *DestTy) {
64 Type *SrcTy = V->getType();
65 if (SrcTy == DestTy)
66 return V; // no-op cast
67
68 // Pointers have no all-ones constant.
69 if (V->isAllOnesValue() && !DestTy->isPtrOrPtrVectorTy())
70 return Constant::getAllOnesValue(DestTy);
71
72 // Handle ConstantInt -> Constant{Byte, FP}
74 // Canonicalize scalar-to-vector bitcasts into vector-to-vector bitcasts
75 // This allows for other simplifications (although some of them
76 // can only be handled by Analysis/ConstantFolding.cpp).
77 if (isa<VectorType>(DestTy) && !isa<VectorType>(SrcTy))
79
80 if (DestTy->isByteOrByteVectorTy() &&
81 DestTy->getScalarSizeInBits() == SrcTy->getScalarSizeInBits())
82 return ConstantByte::get(DestTy, CI->getValue());
83
84 // Make sure dest type is compatible with the folded fp constant.
85 // See note below regarding the PPC_FP128 restriction.
86 if (DestTy->isFPOrFPVectorTy() && !DestTy->isPPC_FP128Ty() &&
87 DestTy->getScalarSizeInBits() == SrcTy->getScalarSizeInBits())
88 return ConstantFP::get(
89 DestTy,
90 APFloat(DestTy->getScalarType()->getFltSemantics(), CI->getValue()));
91
92 return nullptr;
93 }
94
95 // Handle ConstantByte -> Constant{Int, FP}
97 // Canonicalize scalar-to-vector bitcasts into vector-to-vector bitcasts
98 // This allows for other simplifications (although some of them
99 // can only be handled by Analysis/ConstantFolding.cpp).
100 if (isa<VectorType>(DestTy) && !isa<VectorType>(SrcTy))
102
103 if (DestTy->isIntOrIntVectorTy() &&
104 DestTy->getScalarSizeInBits() == SrcTy->getScalarSizeInBits())
105 return ConstantInt::get(DestTy, CB->getValue());
106
107 // Make sure dest type is compatible with the folded fp constant.
108 // See note below regarding the PPC_FP128 restriction.
109 if (DestTy->isFPOrFPVectorTy() && !DestTy->isPPC_FP128Ty() &&
110 DestTy->getScalarSizeInBits() == SrcTy->getScalarSizeInBits())
111 return ConstantFP::get(
112 DestTy,
113 APFloat(DestTy->getScalarType()->getFltSemantics(), CB->getValue()));
114
115 return nullptr;
116 }
117
118 // Handle ConstantFP -> Constant{Int, Byte, FP}
120 // Handle half <-> bfloat
121 if (!isa<VectorType>(SrcTy) && DestTy->isFloatingPointTy()) {
122 APInt Val = FP->getValueAPF().bitcastToAPInt();
123 APFloat ResultFP(DestTy->getFltSemantics(), Val);
124 return ConstantFP::get(DestTy->getContext(), ResultFP);
125 }
126 // Canonicalize scalar-to-vector bitcasts into vector-to-vector bitcasts
127 // This allows for other simplifications (although some of them
128 // can only be handled by Analysis/ConstantFolding.cpp).
129 if (isa<VectorType>(DestTy) && !isa<VectorType>(SrcTy))
131
132 // PPC_FP128 is really the sum of two consecutive doubles, where the first
133 // double is always stored first in memory, regardless of the target
134 // endianness. The memory layout of i128, however, depends on the target
135 // endianness, and so we can't fold this without target endianness
136 // information. This should instead be handled by
137 // Analysis/ConstantFolding.cpp
138 if (SrcTy->isPPC_FP128Ty())
139 return nullptr;
140
141 // Make sure dest type is compatible with the folded integer constant.
142 if (DestTy->isIntOrIntVectorTy() &&
143 DestTy->getScalarSizeInBits() == SrcTy->getScalarSizeInBits())
144 return ConstantInt::get(DestTy, FP->getValueAPF().bitcastToAPInt());
145
146 // Make sure dest type is compatible with the folded byte constant.
147 if (DestTy->isByteOrByteVectorTy() &&
148 DestTy->getScalarSizeInBits() == SrcTy->getScalarSizeInBits())
149 return ConstantByte::get(DestTy, FP->getValueAPF().bitcastToAPInt());
150
151 return nullptr;
152 }
153
154 return nullptr;
155}
156
158 Type *DestTy) {
160 ? ConstantExpr::getCast(opc, V, DestTy)
161 : ConstantFoldCastInstruction(opc, V, DestTy);
162}
163
165 Type *DestTy) {
166 if (isa<PoisonValue>(V))
167 return PoisonValue::get(DestTy);
168
169 if (isa<UndefValue>(V)) {
170 // zext(undef) = 0, because the top bits will be zero.
171 // sext(undef) = 0, because the top bits will all be the same.
172 // [us]itofp(undef) = 0, because the result value is bounded.
173 if (opc == Instruction::ZExt || opc == Instruction::SExt ||
174 opc == Instruction::UIToFP || opc == Instruction::SIToFP)
175 return Constant::getNullValue(DestTy);
176 return UndefValue::get(DestTy);
177 }
178
179 if (V->isNullValue() && !DestTy->isX86_AMXTy() &&
180 opc != Instruction::AddrSpaceCast)
181 return Constant::getNullValue(DestTy);
182
183 // If the cast operand is a constant expression, there's a few things we can
184 // do to try to simplify it.
186 if (CE->isCast()) {
187 // Try hard to fold cast of cast because they are often eliminable.
188 if (unsigned newOpc = foldConstantCastPair(opc, CE, DestTy))
189 return foldMaybeUndesirableCast(newOpc, CE->getOperand(0), DestTy);
190 }
191 }
192
193 // If the cast operand is a constant vector, perform the cast by
194 // operating on each element. In the cast of bitcasts, the element
195 // count may be mismatched; don't attempt to handle that here.
196 if (DestTy->isVectorTy() && V->getType()->isVectorTy() &&
197 cast<VectorType>(DestTy)->getElementCount() ==
198 cast<VectorType>(V->getType())->getElementCount()) {
199 VectorType *DestVecTy = cast<VectorType>(DestTy);
200 Type *DstEltTy = DestVecTy->getElementType();
201 // Fast path for splatted constants.
202 if (Constant *Splat = V->getSplatValue()) {
203 Constant *Res = foldMaybeUndesirableCast(opc, Splat, DstEltTy);
204 if (!Res)
205 return nullptr;
207 cast<VectorType>(DestTy)->getElementCount(), Res);
208 }
209 if (isa<ScalableVectorType>(DestTy))
210 return nullptr;
212 Type *Ty = IntegerType::get(V->getContext(), 32);
213 for (unsigned i = 0,
214 e = cast<FixedVectorType>(V->getType())->getNumElements();
215 i != e; ++i) {
216 Constant *C = ConstantExpr::getExtractElement(V, ConstantInt::get(Ty, i));
217 Constant *Casted = foldMaybeUndesirableCast(opc, C, DstEltTy);
218 if (!Casted)
219 return nullptr;
220 res.push_back(Casted);
221 }
222 return ConstantVector::get(res);
223 }
224
225 // We actually have to do a cast now. Perform the cast according to the
226 // opcode specified.
227 switch (opc) {
228 default:
229 llvm_unreachable("Failed to cast constant expression");
230 case Instruction::FPTrunc:
231 case Instruction::FPExt:
232 if (ConstantFP *FPC = dyn_cast<ConstantFP>(V)) {
233 bool ignored;
234 APFloat Val = FPC->getValueAPF();
235 Val.convert(DestTy->getScalarType()->getFltSemantics(),
237 return ConstantFP::get(DestTy, Val);
238 }
239 return nullptr; // Can't fold.
240 case Instruction::FPToUI:
241 case Instruction::FPToSI:
242 if (ConstantFP *FPC = dyn_cast<ConstantFP>(V)) {
243 const APFloat &V = FPC->getValueAPF();
244 bool ignored;
245 APSInt IntVal(DestTy->getScalarSizeInBits(), opc == Instruction::FPToUI);
247 V.convertToInteger(IntVal, APFloat::rmTowardZero, &ignored)) {
248 // Undefined behavior invoked - the destination type can't represent
249 // the input constant.
250 return PoisonValue::get(DestTy);
251 }
252 return ConstantInt::get(DestTy, IntVal);
253 }
254 return nullptr; // Can't fold.
255 case Instruction::UIToFP:
256 case Instruction::SIToFP:
257 if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
258 const APInt &api = CI->getValue();
259 APFloat apf(DestTy->getScalarType()->getFltSemantics(),
261 apf.convertFromAPInt(api, opc==Instruction::SIToFP,
263 return ConstantFP::get(DestTy, apf);
264 }
265 return nullptr;
266 case Instruction::ZExt:
267 if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
269 return ConstantInt::get(DestTy, CI->getValue().zext(BitWidth));
270 }
271 return nullptr;
272 case Instruction::SExt:
273 if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
275 return ConstantInt::get(DestTy, CI->getValue().sext(BitWidth));
276 }
277 return nullptr;
278 case Instruction::Trunc: {
279 if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
281 return ConstantInt::get(DestTy, CI->getValue().trunc(BitWidth));
282 }
283
284 return nullptr;
285 }
286 case Instruction::BitCast:
287 return FoldBitCast(V, DestTy);
288 case Instruction::AddrSpaceCast:
289 case Instruction::IntToPtr:
290 case Instruction::PtrToAddr:
291 case Instruction::PtrToInt:
292 return nullptr;
293 }
294}
295
297 Constant *V1, Constant *V2) {
298 // Check for i1 and vector true/false conditions.
299 if (Cond->isNullValue()) return V2;
300 if (Cond->isAllOnesValue()) return V1;
301
302 // If the condition is a vector constant, fold the result elementwise.
304 auto *V1VTy = CondV->getType();
306 Type *Ty = IntegerType::get(CondV->getContext(), 32);
307 for (unsigned i = 0, e = V1VTy->getNumElements(); i != e; ++i) {
308 Constant *V;
310 ConstantInt::get(Ty, i));
312 ConstantInt::get(Ty, i));
313 auto *Cond = cast<Constant>(CondV->getOperand(i));
314 if (isa<PoisonValue>(Cond)) {
315 V = PoisonValue::get(V1Element->getType());
316 } else if (V1Element == V2Element) {
317 V = V1Element;
318 } else if (isa<UndefValue>(Cond)) {
319 V = isa<UndefValue>(V1Element) ? V1Element : V2Element;
320 } else {
321 if (!isa<ConstantInt>(Cond)) break;
322 V = Cond->isNullValue() ? V2Element : V1Element;
323 }
324 Result.push_back(V);
325 }
326
327 // If we were able to build the vector, return it.
328 if (Result.size() == V1VTy->getNumElements())
329 return ConstantVector::get(Result);
330 }
331
333 return PoisonValue::get(V1->getType());
334
335 if (isa<UndefValue>(Cond)) {
336 if (isa<UndefValue>(V1)) return V1;
337 return V2;
338 }
339
340 if (V1 == V2) return V1;
341
342 if (isa<PoisonValue>(V1))
343 return V2;
344 if (isa<PoisonValue>(V2))
345 return V1;
346
347 // If the true or false value is undef, we can fold to the other value as
348 // long as the other value isn't poison.
349 auto NotPoison = [](Constant *C) {
350 if (isa<PoisonValue>(C))
351 return false;
352
353 // TODO: We can analyze ConstExpr by opcode to determine if there is any
354 // possibility of poison.
355 if (isa<ConstantExpr>(C))
356 return false;
357
360 return true;
361
362 if (C->getType()->isVectorTy())
363 return !C->containsPoisonElement() && !C->containsConstantExpression();
364
365 // TODO: Recursively analyze aggregates or other constants.
366 return false;
367 };
368 if (isa<UndefValue>(V1) && NotPoison(V2)) return V2;
369 if (isa<UndefValue>(V2) && NotPoison(V1)) return V1;
370
371 return nullptr;
372}
373
375 Constant *Idx) {
376 auto *ValVTy = cast<VectorType>(Val->getType());
377
378 // extractelt poison, C -> poison
379 // extractelt C, undef -> poison
380 if (isa<PoisonValue>(Val) || isa<UndefValue>(Idx))
381 return PoisonValue::get(ValVTy->getElementType());
382
383 // extractelt undef, C -> undef
384 if (isa<UndefValue>(Val))
385 return UndefValue::get(ValVTy->getElementType());
386
387 auto *CIdx = dyn_cast<ConstantInt>(Idx);
388 if (!CIdx)
389 return nullptr;
390
391 if (auto *ValFVTy = dyn_cast<FixedVectorType>(Val->getType())) {
392 // ee({w,x,y,z}, wrong_value) -> poison
393 if (CIdx->uge(ValFVTy->getNumElements()))
394 return PoisonValue::get(ValFVTy->getElementType());
395 }
396
397 // ee (gep (ptr, idx0, ...), idx) -> gep (ee (ptr, idx), ee (idx0, idx), ...)
398 if (auto *CE = dyn_cast<ConstantExpr>(Val)) {
399 if (auto *GEP = dyn_cast<GEPOperator>(CE)) {
401 Ops.reserve(CE->getNumOperands());
402 for (unsigned i = 0, e = CE->getNumOperands(); i != e; ++i) {
403 Constant *Op = CE->getOperand(i);
404 if (Op->getType()->isVectorTy()) {
406 if (!ScalarOp)
407 return nullptr;
408 Ops.push_back(ScalarOp);
409 } else
410 Ops.push_back(Op);
411 }
412 return CE->getWithOperands(Ops, ValVTy->getElementType(), false,
413 GEP->getSourceElementType());
414 } else if (CE->getOpcode() == Instruction::InsertElement) {
415 if (const auto *IEIdx = dyn_cast<ConstantInt>(CE->getOperand(2))) {
416 if (APSInt::isSameValue(APSInt(IEIdx->getValue()),
417 APSInt(CIdx->getValue()))) {
418 return CE->getOperand(1);
419 } else {
420 return ConstantExpr::getExtractElement(CE->getOperand(0), CIdx);
421 }
422 }
423 }
424 }
425
426 if (Constant *C = Val->getAggregateElement(CIdx))
427 return C;
428
429 // Lane < Splat minimum vector width => extractelt Splat(x), Lane -> x
430 if (CIdx->getValue().ult(ValVTy->getElementCount().getKnownMinValue())) {
431 if (Constant *SplatVal = Val->getSplatValue())
432 return SplatVal;
433 }
434
435 return nullptr;
436}
437
439 Constant *Elt,
440 Constant *Idx) {
441 if (isa<UndefValue>(Idx))
442 return PoisonValue::get(Val->getType());
443
444 // Inserting null into all zeros is still all zeros.
445 // TODO: This is true for undef and poison splats too.
446 if (Val->isNullValue() && Elt->isNullValue())
447 return Val;
448
450 if (!CIdx) return nullptr;
451
452 // Do not iterate on scalable vector. The num of elements is unknown at
453 // compile-time.
455 return nullptr;
456
457 auto *ValTy = cast<FixedVectorType>(Val->getType());
458
459 unsigned NumElts = ValTy->getNumElements();
460 if (CIdx->uge(NumElts))
461 return PoisonValue::get(Val->getType());
462
464 Result.reserve(NumElts);
465 uint64_t IdxVal = CIdx->getZExtValue();
466 for (unsigned i = 0; i != NumElts; ++i) {
467 if (i == IdxVal) {
468 Result.push_back(Elt);
469 continue;
470 }
471
472 Constant *C = Val->getAggregateElement(i);
473 if (!C)
474 return nullptr;
475 Result.push_back(C);
476 }
477
478 return ConstantVector::get(Result);
479}
480
482 ArrayRef<int> Mask) {
483 auto *V1VTy = cast<VectorType>(V1->getType());
484 unsigned MaskNumElts = Mask.size();
485 auto MaskEltCount =
486 ElementCount::get(MaskNumElts, isa<ScalableVectorType>(V1VTy));
487 Type *EltTy = V1VTy->getElementType();
488
489 // Poison shuffle mask -> poison value.
490 if (all_of(Mask, equal_to(PoisonMaskElem))) {
491 return PoisonValue::get(VectorType::get(EltTy, MaskEltCount));
492 }
493
494 // If the mask is all zeros this is a splat, no need to go through all
495 // elements.
496 if (all_of(Mask, equal_to(0))) {
497 Type *Ty = IntegerType::get(V1->getContext(), 32);
498 Constant *Elt =
499 ConstantExpr::getExtractElement(V1, ConstantInt::get(Ty, 0));
500
501 // For scalable vectors, make sure this doesn't fold back into a
502 // shufflevector.
503 if (!MaskEltCount.isScalable() || Elt->isNullValue() || isa<UndefValue>(Elt))
504 return ConstantVector::getSplat(MaskEltCount, Elt);
505 }
506
507 // Do not iterate on scalable vector. The num of elements is unknown at
508 // compile-time.
509 if (isa<ScalableVectorType>(V1VTy))
510 return nullptr;
511
512 unsigned SrcNumElts = V1VTy->getElementCount().getKnownMinValue();
513
514 // Loop over the shuffle mask, evaluating each element.
516 for (unsigned i = 0; i != MaskNumElts; ++i) {
517 int Elt = Mask[i];
518 if (Elt == -1) {
519 Result.push_back(PoisonValue::get(EltTy));
520 continue;
521 }
522 Constant *InElt;
523 assert(unsigned(Elt) < SrcNumElts * 2 && "Invalid shuffle mask element");
524 if (unsigned(Elt) >= SrcNumElts) {
525 Type *Ty = IntegerType::get(V2->getContext(), 32);
526 InElt =
528 ConstantInt::get(Ty, Elt - SrcNumElts));
529 } else {
530 Type *Ty = IntegerType::get(V1->getContext(), 32);
531 InElt = ConstantExpr::getExtractElement(V1, ConstantInt::get(Ty, Elt));
532 }
533 Result.push_back(InElt);
534 }
535
536 return ConstantVector::get(Result);
537}
538
540 ArrayRef<unsigned> Idxs) {
541 // Base case: no indices, so return the entire value.
542 if (Idxs.empty())
543 return Agg;
544
545 if (Constant *C = Agg->getAggregateElement(Idxs[0]))
547
548 return nullptr;
549}
550
552 Constant *Val,
553 ArrayRef<unsigned> Idxs) {
554 // Base case: no indices, so replace the entire value.
555 if (Idxs.empty())
556 return Val;
557
558 unsigned NumElts;
559 if (StructType *ST = dyn_cast<StructType>(Agg->getType()))
560 NumElts = ST->getNumElements();
561 else
562 NumElts = cast<ArrayType>(Agg->getType())->getNumElements();
563
565 for (unsigned i = 0; i != NumElts; ++i) {
566 Constant *C = Agg->getAggregateElement(i);
567 if (!C) return nullptr;
568
569 if (Idxs[0] == i)
571
572 Result.push_back(C);
573 }
574
575 if (StructType *ST = dyn_cast<StructType>(Agg->getType()))
576 return ConstantStruct::get(ST, Result);
577 return ConstantArray::get(cast<ArrayType>(Agg->getType()), Result);
578}
579
581 assert(Instruction::isUnaryOp(Opcode) && "Non-unary instruction detected");
582
583 // Handle scalar UndefValue and scalable vector UndefValue. Fixed-length
584 // vectors are always evaluated per element.
585 bool IsScalableVector = isa<ScalableVectorType>(C->getType());
586 bool HasScalarUndefOrScalableVectorUndef =
587 (!C->getType()->isVectorTy() || IsScalableVector) && isa<UndefValue>(C);
588
589 if (HasScalarUndefOrScalableVectorUndef) {
590 switch (static_cast<Instruction::UnaryOps>(Opcode)) {
591 case Instruction::FNeg:
592 return C; // -undef -> undef
593 case Instruction::UnaryOpsEnd:
594 llvm_unreachable("Invalid UnaryOp");
595 }
596 }
597
598 // Constant should not be UndefValue, unless these are vector constants.
599 assert(!HasScalarUndefOrScalableVectorUndef && "Unexpected UndefValue");
600 // We only have FP UnaryOps right now.
601 assert(!isa<ConstantInt>(C) && "Unexpected Integer UnaryOp");
602
603 if (ConstantFP *CFP = dyn_cast<ConstantFP>(C)) {
604 const APFloat &CV = CFP->getValueAPF();
605 switch (Opcode) {
606 default:
607 break;
608 case Instruction::FNeg:
609 return ConstantFP::get(C->getType(), neg(CV));
610 }
611 } else if (auto *VTy = dyn_cast<VectorType>(C->getType())) {
612 // Fast path for splatted constants.
613 if (Constant *Splat = C->getSplatValue())
614 if (Constant *Elt = ConstantFoldUnaryInstruction(Opcode, Splat))
615 return ConstantVector::getSplat(VTy->getElementCount(), Elt);
616
617 if (auto *FVTy = dyn_cast<FixedVectorType>(VTy)) {
618 // Fold each element and create a vector constant from those constants.
619 Type *Ty = IntegerType::get(FVTy->getContext(), 32);
621 for (unsigned i = 0, e = FVTy->getNumElements(); i != e; ++i) {
622 Constant *ExtractIdx = ConstantInt::get(Ty, i);
623 Constant *Elt = ConstantExpr::getExtractElement(C, ExtractIdx);
624 Constant *Res = ConstantFoldUnaryInstruction(Opcode, Elt);
625 if (!Res)
626 return nullptr;
627 Result.push_back(Res);
628 }
629
630 return ConstantVector::get(Result);
631 }
632 }
633
634 // We don't know how to fold this.
635 return nullptr;
636}
637
639 Constant *C2) {
640 assert(Instruction::isBinaryOp(Opcode) && "Non-binary instruction detected");
641
642 // Simplify BinOps with their identity values first. They are no-ops and we
643 // can always return the other value, including undef or poison values.
645 Opcode, C1->getType(), /*AllowRHSIdentity*/ false)) {
646 if (C1 == Identity)
647 return C2;
648 if (C2 == Identity)
649 return C1;
650 } else if (Constant *Identity = ConstantExpr::getBinOpIdentity(
651 Opcode, C1->getType(), /*AllowRHSIdentity*/ true)) {
652 if (C2 == Identity)
653 return C1;
654 }
655
656 // Binary operations propagate poison.
658 return PoisonValue::get(C1->getType());
659
660 // Handle scalar UndefValue and scalable vector UndefValue. Fixed-length
661 // vectors are always evaluated per element.
662 bool IsScalableVector = isa<ScalableVectorType>(C1->getType());
663 bool HasScalarUndefOrScalableVectorUndef =
664 (!C1->getType()->isVectorTy() || IsScalableVector) &&
666 if (HasScalarUndefOrScalableVectorUndef) {
667 switch (static_cast<Instruction::BinaryOps>(Opcode)) {
668 case Instruction::Xor:
670 // Handle undef ^ undef -> 0 special case. This is a common
671 // idiom (misuse).
672 return Constant::getNullValue(C1->getType());
673 [[fallthrough]];
674 case Instruction::Add:
675 case Instruction::Sub:
676 return UndefValue::get(C1->getType());
677 case Instruction::And:
678 if (isa<UndefValue>(C1) && isa<UndefValue>(C2)) // undef & undef -> undef
679 return C1;
680 return Constant::getNullValue(C1->getType()); // undef & X -> 0
681 case Instruction::Mul: {
682 // undef * undef -> undef
684 return C1;
685 const APInt *CV;
686 // X * undef -> undef if X is odd
687 if (match(C1, m_APInt(CV)) || match(C2, m_APInt(CV)))
688 if ((*CV)[0])
689 return UndefValue::get(C1->getType());
690
691 // X * undef -> 0 otherwise
692 return Constant::getNullValue(C1->getType());
693 }
694 case Instruction::SDiv:
695 case Instruction::UDiv:
696 // X / undef -> poison
697 // X / 0 -> poison
698 if (match(C2, m_CombineOr(m_Undef(), m_Zero())))
699 return PoisonValue::get(C2->getType());
700 // undef / X -> 0 otherwise
701 return Constant::getNullValue(C1->getType());
702 case Instruction::URem:
703 case Instruction::SRem:
704 // X % undef -> poison
705 // X % 0 -> poison
706 if (match(C2, m_CombineOr(m_Undef(), m_Zero())))
707 return PoisonValue::get(C2->getType());
708 // undef % X -> 0 otherwise
709 return Constant::getNullValue(C1->getType());
710 case Instruction::Or: // X | undef -> -1
711 if (isa<UndefValue>(C1) && isa<UndefValue>(C2)) // undef | undef -> undef
712 return C1;
713 return Constant::getAllOnesValue(C1->getType()); // undef | X -> ~0
714 case Instruction::LShr:
715 // X >>l undef -> poison
716 if (isa<UndefValue>(C2))
717 return PoisonValue::get(C2->getType());
718 // undef >>l X -> 0
719 return Constant::getNullValue(C1->getType());
720 case Instruction::AShr:
721 // X >>a undef -> poison
722 if (isa<UndefValue>(C2))
723 return PoisonValue::get(C2->getType());
724 // TODO: undef >>a X -> poison if the shift is exact
725 // undef >>a X -> 0
726 return Constant::getNullValue(C1->getType());
727 case Instruction::Shl:
728 // X << undef -> undef
729 if (isa<UndefValue>(C2))
730 return PoisonValue::get(C2->getType());
731 // undef << X -> 0
732 return Constant::getNullValue(C1->getType());
733 case Instruction::FSub:
734 // -0.0 - undef --> undef (consistent with "fneg undef")
735 if (match(C1, m_NegZeroFP()) && isa<UndefValue>(C2))
736 return C2;
737 [[fallthrough]];
738 case Instruction::FAdd:
739 case Instruction::FMul:
740 case Instruction::FDiv:
741 case Instruction::FRem:
742 // [any flop] undef, undef -> undef
744 return C1;
745 // [any flop] C, undef -> NaN
746 // [any flop] undef, C -> NaN
747 // We could potentially specialize NaN/Inf constants vs. 'normal'
748 // constants (possibly differently depending on opcode and operand). This
749 // would allow returning undef sometimes. But it is always safe to fold to
750 // NaN because we can choose the undef operand as NaN, and any FP opcode
751 // with a NaN operand will propagate NaN.
752 return ConstantFP::getNaN(C1->getType());
753 case Instruction::BinaryOpsEnd:
754 llvm_unreachable("Invalid BinaryOp");
755 }
756 }
757
758 // Neither constant should be UndefValue, unless these are vector constants.
759 assert((!HasScalarUndefOrScalableVectorUndef) && "Unexpected UndefValue");
760
761 // Handle simplifications when the RHS is a constant int.
762 if (ConstantInt *CI2 = dyn_cast<ConstantInt>(C2)) {
763 if (C2 == ConstantExpr::getBinOpAbsorber(Opcode, C2->getType(),
764 /*AllowLHSConstant*/ false))
765 return C2;
766
767 switch (Opcode) {
768 case Instruction::UDiv:
769 case Instruction::SDiv:
770 if (CI2->isZero())
771 return PoisonValue::get(CI2->getType()); // X / 0 == poison
772 break;
773 case Instruction::URem:
774 case Instruction::SRem:
775 if (CI2->isOne())
776 return Constant::getNullValue(CI2->getType()); // X % 1 == 0
777 if (CI2->isZero())
778 return PoisonValue::get(CI2->getType()); // X % 0 == poison
779 break;
780 case Instruction::And:
781 assert(!CI2->isZero() && "And zero handled above");
783 // If and'ing the address of a global with a constant, fold it.
784 if ((CE1->getOpcode() == Instruction::PtrToInt ||
785 CE1->getOpcode() == Instruction::PtrToAddr) &&
786 isa<GlobalValue>(CE1->getOperand(0))) {
787 GlobalValue *GV = cast<GlobalValue>(CE1->getOperand(0));
788
789 Align GVAlign; // defaults to 1
790
791 if (Module *TheModule = GV->getParent()) {
792 const DataLayout &DL = TheModule->getDataLayout();
793 GVAlign = GV->getPointerAlignment(DL);
794
795 // If the function alignment is not specified then assume that it
796 // is 4.
797 // This is dangerous; on x86, the alignment of the pointer
798 // corresponds to the alignment of the function, but might be less
799 // than 4 if it isn't explicitly specified.
800 // However, a fix for this behaviour was reverted because it
801 // increased code size (see https://reviews.llvm.org/D55115)
802 // FIXME: This code should be deleted once existing targets have
803 // appropriate defaults
804 if (isa<Function>(GV) && !DL.getFunctionPtrAlign())
805 GVAlign = Align(4);
806 } else if (isa<GlobalVariable>(GV)) {
807 GVAlign = cast<GlobalVariable>(GV)->getAlign().valueOrOne();
808 }
809
810 if (GVAlign > 1) {
811 unsigned DstWidth = CI2->getBitWidth();
812 unsigned SrcWidth = std::min(DstWidth, Log2(GVAlign));
813 APInt BitsNotSet(APInt::getLowBitsSet(DstWidth, SrcWidth));
814
815 // If checking bits we know are clear, return zero.
816 if ((CI2->getValue() & BitsNotSet) == CI2->getValue())
817 return Constant::getNullValue(CI2->getType());
818 }
819 }
820 }
821 break;
822 }
823 } else if (isa<ConstantInt>(C1)) {
824 // If C1 is a ConstantInt and C2 is not, swap the operands.
825 if (Instruction::isCommutative(Opcode))
826 return ConstantExpr::isDesirableBinOp(Opcode)
827 ? ConstantExpr::get(Opcode, C2, C1)
828 : ConstantFoldBinaryInstruction(Opcode, C2, C1);
829 }
830
832 if (ConstantInt *CI2 = dyn_cast<ConstantInt>(C2)) {
833 const APInt &C1V = CI1->getValue();
834 const APInt &C2V = CI2->getValue();
835 switch (Opcode) {
836 default:
837 break;
838 case Instruction::Add:
839 return ConstantInt::get(C1->getType(), C1V + C2V);
840 case Instruction::Sub:
841 return ConstantInt::get(C1->getType(), C1V - C2V);
842 case Instruction::Mul:
843 return ConstantInt::get(C1->getType(), C1V * C2V);
844 case Instruction::UDiv:
845 assert(!CI2->isZero() && "Div by zero handled above");
846 return ConstantInt::get(CI1->getType(), C1V.udiv(C2V));
847 case Instruction::SDiv:
848 assert(!CI2->isZero() && "Div by zero handled above");
849 if (C2V.isAllOnes() && C1V.isMinSignedValue())
850 return PoisonValue::get(CI1->getType()); // MIN_INT / -1 -> poison
851 return ConstantInt::get(CI1->getType(), C1V.sdiv(C2V));
852 case Instruction::URem:
853 assert(!CI2->isZero() && "Div by zero handled above");
854 return ConstantInt::get(C1->getType(), C1V.urem(C2V));
855 case Instruction::SRem:
856 assert(!CI2->isZero() && "Div by zero handled above");
857 if (C2V.isAllOnes() && C1V.isMinSignedValue())
858 return PoisonValue::get(C1->getType()); // MIN_INT % -1 -> poison
859 return ConstantInt::get(C1->getType(), C1V.srem(C2V));
860 case Instruction::And:
861 return ConstantInt::get(C1->getType(), C1V & C2V);
862 case Instruction::Or:
863 return ConstantInt::get(C1->getType(), C1V | C2V);
864 case Instruction::Xor:
865 return ConstantInt::get(C1->getType(), C1V ^ C2V);
866 case Instruction::Shl:
867 if (C2V.ult(C1V.getBitWidth()))
868 return ConstantInt::get(C1->getType(), C1V.shl(C2V));
869 return PoisonValue::get(C1->getType()); // too big shift is poison
870 case Instruction::LShr:
871 if (C2V.ult(C1V.getBitWidth()))
872 return ConstantInt::get(C1->getType(), C1V.lshr(C2V));
873 return PoisonValue::get(C1->getType()); // too big shift is poison
874 case Instruction::AShr:
875 if (C2V.ult(C1V.getBitWidth()))
876 return ConstantInt::get(C1->getType(), C1V.ashr(C2V));
877 return PoisonValue::get(C1->getType()); // too big shift is poison
878 }
879 }
880
881 if (C1 == ConstantExpr::getBinOpAbsorber(Opcode, C1->getType(),
882 /*AllowLHSConstant*/ true))
883 return C1;
884 } else if (ConstantFP *CFP1 = dyn_cast<ConstantFP>(C1)) {
885 if (ConstantFP *CFP2 = dyn_cast<ConstantFP>(C2)) {
886 const APFloat &C1V = CFP1->getValueAPF();
887 const APFloat &C2V = CFP2->getValueAPF();
888 APFloat C3V = C1V; // copy for modification
889 switch (Opcode) {
890 default:
891 break;
892 case Instruction::FAdd:
893 (void)C3V.add(C2V, APFloat::rmNearestTiesToEven);
894 return ConstantFP::get(C1->getType(), C3V);
895 case Instruction::FSub:
897 return ConstantFP::get(C1->getType(), C3V);
898 case Instruction::FMul:
900 return ConstantFP::get(C1->getType(), C3V);
901 case Instruction::FDiv:
902 (void)C3V.divide(C2V, APFloat::rmNearestTiesToEven);
903 return ConstantFP::get(C1->getType(), C3V);
904 case Instruction::FRem:
905 (void)C3V.mod(C2V);
906 return ConstantFP::get(C1->getType(), C3V);
907 }
908 }
909 }
910
911 if (auto *VTy = dyn_cast<VectorType>(C1->getType())) {
912 // Fast path for splatted constants.
913 if (Constant *C2Splat = C2->getSplatValue()) {
914 if (Instruction::isIntDivRem(Opcode) && C2Splat->isNullValue())
915 return PoisonValue::get(VTy);
916 if (Constant *C1Splat = C1->getSplatValue()) {
917 Constant *Res =
919 ? ConstantExpr::get(Opcode, C1Splat, C2Splat)
920 : ConstantFoldBinaryInstruction(Opcode, C1Splat, C2Splat);
921 if (!Res)
922 return nullptr;
923 return ConstantVector::getSplat(VTy->getElementCount(), Res);
924 }
925 }
926
927 if (auto *FVTy = dyn_cast<FixedVectorType>(VTy)) {
928 // Fold each element and create a vector constant from those constants.
930 Type *Ty = IntegerType::get(FVTy->getContext(), 32);
931 for (unsigned i = 0, e = FVTy->getNumElements(); i != e; ++i) {
932 Constant *ExtractIdx = ConstantInt::get(Ty, i);
933 Constant *LHS = ConstantExpr::getExtractElement(C1, ExtractIdx);
934 Constant *RHS = ConstantExpr::getExtractElement(C2, ExtractIdx);
936 ? ConstantExpr::get(Opcode, LHS, RHS)
937 : ConstantFoldBinaryInstruction(Opcode, LHS, RHS);
938 if (!Res)
939 return nullptr;
940 Result.push_back(Res);
941 }
942
943 return ConstantVector::get(Result);
944 }
945 }
946
948 // There are many possible foldings we could do here. We should probably
949 // at least fold add of a pointer with an integer into the appropriate
950 // getelementptr. This will improve alias analysis a bit.
951
952 // Given ((a + b) + c), if (b + c) folds to something interesting, return
953 // (a + (b + c)).
954 if (Instruction::isAssociative(Opcode) && CE1->getOpcode() == Opcode) {
955 Constant *T = ConstantExpr::get(Opcode, CE1->getOperand(1), C2);
956 if (!isa<ConstantExpr>(T) || cast<ConstantExpr>(T)->getOpcode() != Opcode)
957 return ConstantExpr::get(Opcode, CE1->getOperand(0), T);
958 }
959 } else if (isa<ConstantExpr>(C2)) {
960 // If C2 is a constant expr and C1 isn't, flop them around and fold the
961 // other way if possible.
962 if (Instruction::isCommutative(Opcode))
963 return ConstantFoldBinaryInstruction(Opcode, C2, C1);
964 }
965
966 // i1 can be simplified in many cases.
967 if (C1->getType()->isIntegerTy(1)) {
968 switch (Opcode) {
969 case Instruction::Add:
970 case Instruction::Sub:
971 return ConstantExpr::getXor(C1, C2);
972 case Instruction::Shl:
973 case Instruction::LShr:
974 case Instruction::AShr:
975 // We can assume that C2 == 0. If it were one the result would be
976 // undefined because the shift value is as large as the bitwidth.
977 return C1;
978 case Instruction::SDiv:
979 case Instruction::UDiv:
980 // We can assume that C2 == 1. If it were zero the result would be
981 // undefined through division by zero.
982 return C1;
983 case Instruction::URem:
984 case Instruction::SRem:
985 // We can assume that C2 == 1. If it were zero the result would be
986 // undefined through division by zero.
987 return ConstantInt::getFalse(C1->getContext());
988 default:
989 break;
990 }
991 }
992
993 // We don't know how to fold this.
994 return nullptr;
995}
996
998 const GlobalValue *GV2) {
999 auto isGlobalUnsafeForEquality = [](const GlobalValue *GV) {
1000 // noipa doesn't affect which definition (and so which address) a global
1001 // resolves to, so it's ignored here.
1002 if (GV->isInterposable(/*CheckNoIPA=*/false) || GV->hasGlobalUnnamedAddr())
1003 return true;
1004 if (const auto *GVar = dyn_cast<GlobalVariable>(GV)) {
1005 Type *Ty = GVar->getValueType();
1006 // A global with opaque type might end up being zero sized.
1007 if (!Ty->isSized())
1008 return true;
1009 // A global with an empty type might lie at the address of any other
1010 // global.
1011 if (Ty->isEmptyTy())
1012 return true;
1013 }
1014 return false;
1015 };
1016 // Don't try to decide equality of aliases.
1017 if (!isa<GlobalAlias>(GV1) && !isa<GlobalAlias>(GV2))
1018 if (!isGlobalUnsafeForEquality(GV1) && !isGlobalUnsafeForEquality(GV2))
1019 return ICmpInst::ICMP_NE;
1021}
1022
1023/// This function determines if there is anything we can decide about the two
1024/// constants provided. This doesn't need to handle simple things like integer
1025/// comparisons, but should instead handle ConstantExprs and GlobalValues.
1026/// If we can determine that the two constants have a particular relation to
1027/// each other, we should return the corresponding ICmp predicate, otherwise
1028/// return ICmpInst::BAD_ICMP_PREDICATE.
1030 assert(V1->getType() == V2->getType() &&
1031 "Cannot compare different types of values!");
1032 if (V1 == V2) return ICmpInst::ICMP_EQ;
1033
1034 // The following folds only apply to pointers.
1035 if (!V1->getType()->isPointerTy())
1037
1038 // To simplify this code we canonicalize the relation so that the first
1039 // operand is always the most "complex" of the two. We consider simple
1040 // constants (like ConstantPointerNull) to be the simplest, followed by
1041 // BlockAddress, GlobalValues, and ConstantExpr's (the most complex).
1042 auto GetComplexity = [](Constant *V) {
1043 if (isa<ConstantExpr>(V))
1044 return 3;
1045 if (isa<GlobalValue>(V))
1046 return 2;
1047 if (isa<BlockAddress>(V))
1048 return 1;
1049 return 0;
1050 };
1051 if (GetComplexity(V1) < GetComplexity(V2)) {
1052 ICmpInst::Predicate SwappedRelation = evaluateICmpRelation(V2, V1);
1053 if (SwappedRelation != ICmpInst::BAD_ICMP_PREDICATE)
1054 return ICmpInst::getSwappedPredicate(SwappedRelation);
1056 }
1057
1058 if (const BlockAddress *BA = dyn_cast<BlockAddress>(V1)) {
1059 // Now we know that the RHS is a BlockAddress or simple constant.
1060 if (const BlockAddress *BA2 = dyn_cast<BlockAddress>(V2)) {
1061 // Block address in another function can't equal this one, but block
1062 // addresses in the current function might be the same if blocks are
1063 // empty.
1064 if (BA2->getFunction() != BA->getFunction())
1065 return ICmpInst::ICMP_NE;
1066 } else if (isa<ConstantPointerNull>(V2)) {
1067 return ICmpInst::ICMP_NE;
1068 }
1069 } else if (const GlobalValue *GV = dyn_cast<GlobalValue>(V1)) {
1070 // Now we know that the RHS is a GlobalValue, BlockAddress or simple
1071 // constant.
1072 if (const GlobalValue *GV2 = dyn_cast<GlobalValue>(V2)) {
1073 return areGlobalsPotentiallyEqual(GV, GV2);
1074 } else if (isa<BlockAddress>(V2)) {
1075 return ICmpInst::ICMP_NE; // Globals never equal labels.
1076 } else if (isa<ConstantPointerNull>(V2)) {
1077 // GlobalVals can never be null unless they have external weak linkage.
1078 // We don't try to evaluate aliases here.
1079 // NOTE: We should not be doing this constant folding if null pointer
1080 // is considered valid for the function. But currently there is no way to
1081 // query it from the Constant type.
1082 if (!GV->hasExternalWeakLinkage() && !isa<GlobalAlias>(GV) &&
1083 !NullPointerIsDefined(nullptr /* F */,
1084 GV->getType()->getAddressSpace()))
1085 return ICmpInst::ICMP_UGT;
1086 }
1087 } else if (auto *CE1 = dyn_cast<ConstantExpr>(V1)) {
1088 // Ok, the LHS is known to be a constantexpr. The RHS can be any of a
1089 // constantexpr, a global, block address, or a simple constant.
1090 Constant *CE1Op0 = CE1->getOperand(0);
1091
1092 switch (CE1->getOpcode()) {
1093 case Instruction::GetElementPtr: {
1094 GEPOperator *CE1GEP = cast<GEPOperator>(CE1);
1095 // Ok, since this is a getelementptr, we know that the constant has a
1096 // pointer type. Check the various cases.
1097 if (isa<ConstantPointerNull>(V2)) {
1098 // If we are comparing a GEP to a null pointer, check to see if the base
1099 // of the GEP equals the null pointer.
1100 if (const GlobalValue *GV = dyn_cast<GlobalValue>(CE1Op0)) {
1101 // If its not weak linkage, the GVal must have a non-zero address
1102 // so the result is greater-than
1103 if (!GV->hasExternalWeakLinkage() && CE1GEP->isInBounds())
1104 return ICmpInst::ICMP_UGT;
1105 }
1106 } else if (const GlobalValue *GV2 = dyn_cast<GlobalValue>(V2)) {
1107 if (const GlobalValue *GV = dyn_cast<GlobalValue>(CE1Op0)) {
1108 if (GV != GV2) {
1109 if (CE1GEP->hasAllZeroIndices())
1110 return areGlobalsPotentiallyEqual(GV, GV2);
1112 }
1113 }
1114 } else if (const auto *CE2GEP = dyn_cast<GEPOperator>(V2)) {
1115 // By far the most common case to handle is when the base pointers are
1116 // obviously to the same global.
1117 const Constant *CE2Op0 = cast<Constant>(CE2GEP->getPointerOperand());
1118 if (isa<GlobalValue>(CE1Op0) && isa<GlobalValue>(CE2Op0)) {
1119 // Don't know relative ordering, but check for inequality.
1120 if (CE1Op0 != CE2Op0) {
1121 if (CE1GEP->hasAllZeroIndices() && CE2GEP->hasAllZeroIndices())
1123 cast<GlobalValue>(CE2Op0));
1125 }
1126 }
1127 }
1128 break;
1129 }
1130 default:
1131 break;
1132 }
1133 }
1134
1136}
1137
1139 Constant *C1, Constant *C2) {
1140 Type *ResultTy;
1141 if (VectorType *VT = dyn_cast<VectorType>(C1->getType()))
1142 ResultTy = VectorType::get(Type::getInt1Ty(C1->getContext()),
1143 VT->getElementCount());
1144 else
1145 ResultTy = Type::getInt1Ty(C1->getContext());
1146
1147 // Fold FCMP_FALSE/FCMP_TRUE unconditionally.
1148 if (Predicate == FCmpInst::FCMP_FALSE)
1149 return Constant::getNullValue(ResultTy);
1150
1151 if (Predicate == FCmpInst::FCMP_TRUE)
1152 return Constant::getAllOnesValue(ResultTy);
1153
1154 // Handle some degenerate cases first
1156 return PoisonValue::get(ResultTy);
1157
1158 if (isa<UndefValue>(C1) || isa<UndefValue>(C2)) {
1159 bool isIntegerPredicate = ICmpInst::isIntPredicate(Predicate);
1160 // For EQ and NE, we can always pick a value for the undef to make the
1161 // predicate pass or fail, so we can return undef.
1162 // Also, if both operands are undef, we can return undef for int comparison.
1163 if (ICmpInst::isEquality(Predicate) || (isIntegerPredicate && C1 == C2))
1164 return UndefValue::get(ResultTy);
1165
1166 // Otherwise, for integer compare, pick the same value as the non-undef
1167 // operand, and fold it to true or false.
1168 if (isIntegerPredicate)
1169 return ConstantInt::get(ResultTy, CmpInst::isTrueWhenEqual(Predicate));
1170
1171 // Choosing NaN for the undef will always make unordered comparison succeed
1172 // and ordered comparison fails.
1173 return ConstantInt::get(ResultTy, CmpInst::isUnordered(Predicate));
1174 }
1175
1176 if (C2->isNullValue()) {
1177 // The caller is expected to commute the operands if the constant expression
1178 // is C2.
1179 // C1 >= 0 --> true
1180 if (Predicate == ICmpInst::ICMP_UGE)
1181 return Constant::getAllOnesValue(ResultTy);
1182 // C1 < 0 --> false
1183 if (Predicate == ICmpInst::ICMP_ULT)
1184 return Constant::getNullValue(ResultTy);
1185 }
1186
1187 // If the comparison is a comparison between two i1's, simplify it.
1188 if (C1->getType()->isIntOrIntVectorTy(1)) {
1189 switch (Predicate) {
1190 case ICmpInst::ICMP_EQ:
1191 if (isa<ConstantExpr>(C1))
1194 case ICmpInst::ICMP_NE:
1195 return ConstantExpr::getXor(C1, C2);
1196 default:
1197 break;
1198 }
1199 }
1200
1201 if (isa<ConstantInt>(C1) && isa<ConstantInt>(C2)) {
1202 const APInt &V1 = cast<ConstantInt>(C1)->getValue();
1203 const APInt &V2 = cast<ConstantInt>(C2)->getValue();
1204 return ConstantInt::get(ResultTy, ICmpInst::compare(V1, V2, Predicate));
1205 } else if (isa<ConstantFP>(C1) && isa<ConstantFP>(C2)) {
1206 const APFloat &C1V = cast<ConstantFP>(C1)->getValueAPF();
1207 const APFloat &C2V = cast<ConstantFP>(C2)->getValueAPF();
1208 return ConstantInt::get(ResultTy, FCmpInst::compare(C1V, C2V, Predicate));
1209 } else if (auto *C1VTy = dyn_cast<VectorType>(C1->getType())) {
1210
1211 // Fast path for splatted constants.
1212 if (Constant *C1Splat = C1->getSplatValue())
1213 if (Constant *C2Splat = C2->getSplatValue())
1214 if (Constant *Elt =
1215 ConstantFoldCompareInstruction(Predicate, C1Splat, C2Splat))
1216 return ConstantVector::getSplat(C1VTy->getElementCount(), Elt);
1217
1218 // Do not iterate on scalable vector. The number of elements is unknown at
1219 // compile-time.
1220 if (isa<ScalableVectorType>(C1VTy))
1221 return nullptr;
1222
1223 // If we can constant fold the comparison of each element, constant fold
1224 // the whole vector comparison.
1226 Type *Ty = IntegerType::get(C1->getContext(), 32);
1227 // Compare the elements, producing an i1 result or constant expr.
1228 for (unsigned I = 0, E = C1VTy->getElementCount().getKnownMinValue();
1229 I != E; ++I) {
1230 Constant *C1E =
1231 ConstantExpr::getExtractElement(C1, ConstantInt::get(Ty, I));
1232 Constant *C2E =
1233 ConstantExpr::getExtractElement(C2, ConstantInt::get(Ty, I));
1234 Constant *Elt = ConstantFoldCompareInstruction(Predicate, C1E, C2E);
1235 if (!Elt)
1236 return nullptr;
1237
1238 ResElts.push_back(Elt);
1239 }
1240
1241 return ConstantVector::get(ResElts);
1242 }
1243
1244 if (C1->getType()->isFPOrFPVectorTy()) {
1245 if (C1 == C2) {
1246 // We know that C1 == C2 || isUnordered(C1, C2).
1247 if (Predicate == FCmpInst::FCMP_ONE)
1248 return ConstantInt::getFalse(ResultTy);
1249 else if (Predicate == FCmpInst::FCMP_UEQ)
1250 return ConstantInt::getTrue(ResultTy);
1251 }
1252 } else {
1253 // Evaluate the relation between the two constants, per the predicate.
1255 if (RelPred != ICmpInst::BAD_ICMP_PREDICATE) {
1256 if (std::optional<bool> Res =
1257 ICmpInst::isImpliedByMatchingCmp(RelPred, Predicate))
1258 return ConstantInt::get(ResultTy, *Res);
1259 }
1260
1261 if ((!isa<ConstantExpr>(C1) && isa<ConstantExpr>(C2)) ||
1262 (C1->isNullValue() && !C2->isNullValue())) {
1263 // If C2 is a constant expr and C1 isn't, flip them around and fold the
1264 // other way if possible.
1265 // Also, if C1 is null and C2 isn't, flip them around.
1266 Predicate = ICmpInst::getSwappedPredicate(Predicate);
1267 return ConstantFoldCompareInstruction(Predicate, C2, C1);
1268 }
1269 }
1270 return nullptr;
1271}
1272
1274 std::optional<ConstantRange> InRange,
1275 ArrayRef<Value *> Idxs) {
1276 if (Idxs.empty()) return C;
1277
1279 C, ArrayRef((Value *const *)Idxs.data(), Idxs.size()));
1280
1281 if (isa<PoisonValue>(C))
1282 return PoisonValue::get(GEPTy);
1283
1284 if (isa<UndefValue>(C))
1285 return UndefValue::get(GEPTy);
1286
1287 auto IsNoOp = [&]() {
1288 // Avoid losing inrange information.
1289 if (InRange)
1290 return false;
1291
1292 return all_of(Idxs, [](Value *Idx) {
1293 Constant *IdxC = cast<Constant>(Idx);
1294 return IdxC->isNullValue() || isa<UndefValue>(IdxC);
1295 });
1296 };
1297 if (IsNoOp())
1298 return GEPTy->isVectorTy() && !C->getType()->isVectorTy()
1300 cast<VectorType>(GEPTy)->getElementCount(), C)
1301 : C;
1302
1303 return nullptr;
1304}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static unsigned foldConstantCastPair(unsigned opc, ConstantExpr *Op, Type *DstTy)
This function determines which opcode to use to fold two constant cast expressions together.
static Constant * foldMaybeUndesirableCast(unsigned opc, Constant *V, Type *DestTy)
static ICmpInst::Predicate areGlobalsPotentiallyEqual(const GlobalValue *GV1, const GlobalValue *GV2)
static Constant * FoldBitCast(Constant *V, Type *DestTy)
static ICmpInst::Predicate evaluateICmpRelation(Constant *V1, Constant *V2)
This function determines if there is anything we can decide about the two constants provided.
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Hexagon Common GEP
Module.h This file contains the declarations for the Module class.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define I(x, y, z)
Definition MD5.cpp:57
static bool InRange(int64_t Value, unsigned short Shift, int LBound, int HBound)
#define T
SmallVector< MachineOperand, 4 > Cond
int64_t C1
This file defines the SmallVector class.
static constexpr roundingMode rmTowardZero
Definition APFloat.h:365
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:361
opStatus divide(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1312
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition APFloat.cpp:6045
opStatus subtract(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1294
opStatus add(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1285
opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM)
Definition APFloat.h:1451
opStatus multiply(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1303
opStatus mod(const APFloat &RHS)
Definition APFloat.h:1330
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1602
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:419
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Definition APInt.cpp:1695
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1508
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1673
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:829
LLVM_ABI APInt srem(const APInt &RHS) const
Function for signed remainder operation.
Definition APInt.cpp:1774
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:875
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:302
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:196
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:853
An arbitrary precision integer that knows its signedness.
Definition APSInt.h:24
static bool isSameValue(const APSInt &I1, const APSInt &I2)
Determine if two APSInts have the same value, zero- or sign-extending as needed.
Definition APSInt.h:318
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
const T * data() const
Definition ArrayRef.h:138
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.
Definition ArrayRef.h:185
The address of a basic block.
Definition Constants.h:1088
static LLVM_ABI unsigned isEliminableCastPair(Instruction::CastOps firstOpcode, Instruction::CastOps secondOpcode, Type *SrcTy, Type *MidTy, Type *DstTy, const DataLayout *DL)
Determine how a pair of casts can be eliminated, if they can be at all.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
Definition InstrTypes.h:757
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:764
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:763
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition InstrTypes.h:748
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition InstrTypes.h:751
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:765
@ ICMP_NE
not equal
Definition InstrTypes.h:762
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
Definition InstrTypes.h:742
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:890
bool isTrueWhenEqual() const
This is just a convenience.
static LLVM_ABI bool isUnordered(Predicate predicate)
Determine if the predicate is an unordered operation.
static bool isIntPredicate(Predicate P)
Definition InstrTypes.h:839
static LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
Class for constant bytes.
Definition Constants.h:281
A constant value that is initialized with an expression using other constant values.
Definition Constants.h:1316
static LLVM_ABI Constant * getExtractElement(Constant *Vec, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI bool isDesirableCastOp(unsigned Opcode)
Whether creating a constant expression for this cast is desirable.
static LLVM_ABI Constant * getBinOpAbsorber(unsigned Opcode, Type *Ty, bool AllowLHSConstant=false)
Return the absorbing element for the given binary operation, i.e.
static LLVM_ABI Constant * getCast(unsigned ops, Constant *C, Type *Ty, bool OnlyIfReduced=false)
Convenience function for getting a Cast operation.
static LLVM_ABI Constant * getNot(Constant *C)
static LLVM_ABI Constant * getXor(Constant *C1, Constant *C2)
static LLVM_ABI 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 LLVM_ABI bool isDesirableBinOp(unsigned Opcode)
Whether creating a constant expression for this binary operator is desirable.
static LLVM_ABI Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getBinOpIdentity(unsigned Opcode, Type *Ty, bool AllowRHSConstant=false, bool NSZ=false)
Return the identity constant for a binary opcode.
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:420
static LLVM_ABI ConstantFP * getNaN(Type *Ty, bool Negative=false, uint64_t Payload=0)
This is the shared class of boolean and integer constants.
Definition Constants.h:87
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
Definition Constants.h:168
bool uge(uint64_t Num) const
This function will return true iff this constant represents a value with active bits bigger than 64 b...
Definition Constants.h:262
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
Constant Vector Declarations.
Definition Constants.h:674
static LLVM_ABI Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
static LLVM_ABI Constant * get(ArrayRef< Constant * > V)
This is an important base class in LLVM.
Definition Constant.h:44
LLVM_ABI Constant * getSplatValue(bool AllowPoison=false) const
If all elements of the vector constant have the same value, return that value.
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition Constant.h:65
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
LLVM_ABI Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
static constexpr ElementCount get(ScalarTy MinVal, bool Scalable)
Definition TypeSize.h:312
static LLVM_ABI bool compare(const APFloat &LHS, const APFloat &RHS, FCmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
bool isInBounds() const
Test whether this is an inbounds GEP, as defined by LangRef.html.
Definition Operator.h:390
bool hasAllZeroIndices() const
Return true if all of the indices of this GEP are zeros.
Definition Operator.h:451
static Type * getGEPReturnType(Value *Ptr, ArrayRef< Value * > IdxList)
Returns the pointer type returned by the GEP instruction, which may be a vector of pointers.
Module * getParent()
Get the module that this global value is contained inside of...
static LLVM_ABI bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
static LLVM_ABI std::optional< bool > isImpliedByMatchingCmp(CmpPredicate Pred1, CmpPredicate Pred2)
Determine if Pred1 implies Pred2 is true, false, or if nothing can be inferred about the implication,...
bool isCast() const
LLVM_ABI bool isAssociative() const LLVM_READONLY
Return true if the instruction is associative:
LLVM_ABI bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
bool isBinaryOp() const
bool isUnaryOp() const
bool isIntDivRem() const
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:338
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Class to represent struct types.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:283
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition Type.h:258
bool isPPC_FP128Ty() const
Return true if this is powerpc long double.
Definition Type.h:167
LLVM_ABI bool isFirstClassType() const
Return true if the type is "first class", meaning it is a valid type for a Value.
Definition Type.cpp:241
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:363
bool isByteOrByteVectorTy() const
Return true if this is a byte type or a vector of byte types.
Definition Type.h:243
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:130
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:222
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:296
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
Definition Type.h:186
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
Definition Type.h:280
bool isX86_AMXTy() const
Return true if this is X86 AMX.
Definition Type.h:202
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Definition Type.h:222
LLVM_ABI const fltSemantics & getFltSemantics() const
Definition Type.cpp:96
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
Value * getOperand(unsigned i) const
Definition User.h:207
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:260
LLVM_ABI Align getPointerAlignment(const DataLayout &DL) const
Returns an alignment of the pointer value.
Definition Value.cpp:985
Base class of all SIMD vector types.
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
Type * getElementType() const
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
match_combine_or< Ty... > m_CombineOr(const Ty &...Ps)
Combine pattern matchers matching any of Ps patterns.
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
bool match(Val *V, const Pattern &P)
cstfp_pred_ty< is_neg_zero_fp > m_NegZeroFP()
Match a floating-point negative zero.
is_zero< true > m_Zero()
Match any null constant or a vector with all elements equal to 0.
auto m_Undef()
Match an arbitrary undef constant.
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1755
LLVM_ABI Constant * ConstantFoldSelectInstruction(Constant *Cond, Constant *V1, Constant *V2)
Attempt to constant fold a select instruction with the specified operands.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
LLVM_ABI Constant * ConstantFoldCompareInstruction(CmpInst::Predicate Predicate, Constant *C1, Constant *C2)
LLVM_ABI Constant * ConstantFoldUnaryInstruction(unsigned Opcode, Constant *V)
LLVM_ABI Constant * ConstantFoldGetElementPtr(Type *Ty, Constant *C, std::optional< ConstantRange > InRange, ArrayRef< Value * > Idxs)
constexpr auto equal_to(T &&Arg)
Functor variant of std::equal_to that can be used as a UnaryPredicate in functional algorithms like a...
Definition STLExtras.h:2189
LLVM_ABI Constant * ConstantFoldExtractValueInstruction(Constant *Agg, ArrayRef< unsigned > Idxs)
Attempt to constant fold an extractvalue instruction with the specified operands and indices.
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
LLVM_ABI Constant * ConstantFoldInsertElementInstruction(Constant *Val, Constant *Elt, Constant *Idx)
Attempt to constant fold an insertelement instruction with the specified operands and indices.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
constexpr int PoisonMaskElem
LLVM_ABI Constant * ConstantFoldExtractElementInstruction(Constant *Val, Constant *Idx)
Attempt to constant fold an extractelement instruction with the specified operands and indices.
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
APFloat neg(APFloat X)
Returns the negated value of the argument.
Definition APFloat.h:1742
LLVM_ABI Constant * ConstantFoldCastInstruction(unsigned opcode, Constant *V, Type *DestTy)
LLVM_ABI Constant * ConstantFoldInsertValueInstruction(Constant *Agg, Constant *Val, ArrayRef< unsigned > Idxs)
Attempt to constant fold an insertvalue instruction with the specified operands and indices.
unsigned Log2(Align A)
Returns the log2 of the alignment.
Definition Alignment.h:202
LLVM_ABI Constant * ConstantFoldShuffleVectorInstruction(Constant *V1, Constant *V2, ArrayRef< int > Mask)
Attempt to constant fold a shufflevector instruction with the specified operands and mask.
LLVM_ABI Constant * ConstantFoldBinaryInstruction(unsigned Opcode, Constant *V1, Constant *V2)
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39