LLVM 24.0.0git
InstCombineCasts.cpp
Go to the documentation of this file.
1//===- InstCombineCasts.cpp -----------------------------------------------===//
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 the visit functions for cast operations.
10//
11//===----------------------------------------------------------------------===//
12
13#include "InstCombineInternal.h"
14#include "llvm/ADT/APInt.h"
15#include "llvm/ADT/DenseMap.h"
16#include "llvm/ADT/STLExtras.h"
18#include "llvm/ADT/SetVector.h"
21#include "llvm/IR/DataLayout.h"
22#include "llvm/IR/DebugInfo.h"
23#include "llvm/IR/Instruction.h"
26#include "llvm/IR/Type.h"
27#include "llvm/IR/Value.h"
31#include <optional>
32
33using namespace llvm;
34using namespace PatternMatch;
35
36#define DEBUG_TYPE "instcombine"
37
39
42 EvaluatedMap &Processed) {
43 // Since we cover transformation of instructions with multiple users, we might
44 // come to the same node via multiple paths. We should not create a
45 // replacement for every single one of them though.
46 if (Value *Result = Processed.lookup(V))
47 return Result;
48
51
52 // Otherwise, it must be an instruction.
54 Instruction *Res = nullptr;
55 unsigned Opc = I->getOpcode();
56 switch (Opc) {
57 case Instruction::Add:
58 case Instruction::Sub:
59 case Instruction::Mul:
60 case Instruction::And:
61 case Instruction::Or:
62 case Instruction::Xor:
63 case Instruction::AShr:
64 case Instruction::LShr:
65 case Instruction::Shl:
66 case Instruction::UDiv:
67 case Instruction::URem: {
68 Value *LHS = EvaluateInDifferentTypeImpl(I->getOperand(0), Ty, isSigned, IC,
69 Processed);
70 Value *RHS = EvaluateInDifferentTypeImpl(I->getOperand(1), Ty, isSigned, IC,
71 Processed);
73 if (Opc == Instruction::LShr || Opc == Instruction::AShr)
74 Res->setIsExact(I->isExact());
75 break;
76 }
77 case Instruction::Trunc:
78 case Instruction::ZExt:
79 case Instruction::SExt:
80 // If the source type of the cast is the type we're trying for then we can
81 // just return the source. There's no need to insert it because it is not
82 // new.
83 if (I->getOperand(0)->getType() == Ty)
84 return I->getOperand(0);
85
86 // Otherwise, must be the same type of cast, so just reinsert a new one.
87 // This also handles the case of zext(trunc(x)) -> zext(x).
88 Res = CastInst::CreateIntegerCast(I->getOperand(0), Ty,
89 Opc == Instruction::SExt);
90 if (auto *Trunc = dyn_cast<TruncInst>(I)) {
91 if (auto *NewTrunc = dyn_cast<TruncInst>(Res)) {
92 if (Trunc->getType()->getScalarSizeInBits() <=
93 Ty->getScalarSizeInBits()) {
94 NewTrunc->setHasNoSignedWrap(Trunc->hasNoSignedWrap());
95 NewTrunc->setHasNoUnsignedWrap(Trunc->hasNoUnsignedWrap());
96 }
97 } else if (auto *NewZExt = dyn_cast<ZExtInst>(Res)) {
98 if (Trunc->hasNoUnsignedWrap())
99 NewZExt->setNonNeg();
100 }
101 }
102 break;
103 case Instruction::Select: {
104 Value *True = EvaluateInDifferentTypeImpl(I->getOperand(1), Ty, isSigned,
105 IC, Processed);
106 Value *False = EvaluateInDifferentTypeImpl(I->getOperand(2), Ty, isSigned,
107 IC, Processed);
108 Res = SelectInst::Create(I->getOperand(0), True, False, "", nullptr,
109 ProfcheckDisableMetadataFixes ? nullptr : I);
110 break;
111 }
112 case Instruction::PHI: {
113 PHINode *OPN = cast<PHINode>(I);
115 for (unsigned i = 0, e = OPN->getNumIncomingValues(); i != e; ++i) {
117 isSigned, IC, Processed);
118 NPN->addIncoming(V, OPN->getIncomingBlock(i));
119 }
120 Res = NPN;
121 break;
122 }
123 case Instruction::FPToUI:
124 case Instruction::FPToSI:
125 Res = CastInst::Create(static_cast<Instruction::CastOps>(Opc),
126 I->getOperand(0), Ty);
127 break;
128 case Instruction::Call:
130 switch (II->getIntrinsicID()) {
131 default:
132 llvm_unreachable("Unsupported call!");
133 case Intrinsic::vscale: {
135 I->getModule(), Intrinsic::vscale, {Ty});
136 Res = CallInst::Create(Fn->getFunctionType(), Fn);
137 break;
138 }
139 case Intrinsic::umin:
140 case Intrinsic::umax:
141 case Intrinsic::smin:
142 case Intrinsic::smax: {
143 Value *Op0 = EvaluateInDifferentTypeImpl(II->getArgOperand(0), Ty,
144 isSigned, IC, Processed);
145 Value *Op1 = EvaluateInDifferentTypeImpl(II->getArgOperand(1), Ty,
146 isSigned, IC, Processed);
148 I->getModule(), II->getIntrinsicID(), {Ty});
149 Res = CallInst::Create(Fn->getFunctionType(), Fn, {Op0, Op1});
150 break;
151 }
152 case Intrinsic::abs: {
153 Value *Arg = EvaluateInDifferentTypeImpl(II->getArgOperand(0), Ty,
154 isSigned, IC, Processed);
156 I->getModule(), II->getIntrinsicID(), {Ty});
157 Res = CallInst::Create(Fn->getFunctionType(), Fn,
158 {Arg, ConstantInt::getFalse(I->getContext())});
159 break;
160 }
161 }
162 }
163 break;
164 case Instruction::ShuffleVector: {
165 auto *ScalarTy = cast<VectorType>(Ty)->getElementType();
166 auto *VTy = cast<VectorType>(I->getOperand(0)->getType());
167 auto *FixedTy = VectorType::get(ScalarTy, VTy->getElementCount());
168 Value *Op0 = EvaluateInDifferentTypeImpl(I->getOperand(0), FixedTy,
169 isSigned, IC, Processed);
170 Value *Op1 = EvaluateInDifferentTypeImpl(I->getOperand(1), FixedTy,
171 isSigned, IC, Processed);
172 Res = new ShuffleVectorInst(Op0, Op1,
173 cast<ShuffleVectorInst>(I)->getShuffleMask());
174 break;
175 }
176 default:
177 // TODO: Can handle more cases here.
178 llvm_unreachable("Unreachable!");
179 }
180
181 Res->takeName(I);
182 Value *Result = IC.InsertNewInstWith(Res, I->getIterator());
183 // There is no need in keeping track of the old value/new value relationship
184 // when we have only one user, we came have here from that user and no-one
185 // else cares.
186 if (!V->hasOneUse())
187 Processed[V] = Result;
188
189 return Result;
190}
191
192/// Given an expression that CanEvaluateTruncated or CanEvaluateSExtd returns
193/// true for, actually insert the code to evaluate the expression.
195 bool isSigned) {
196 EvaluatedMap Processed;
197 return EvaluateInDifferentTypeImpl(V, Ty, isSigned, *this, Processed);
198}
199
201InstCombinerImpl::isEliminableCastPair(const CastInst *CI1,
202 const CastInst *CI2) {
203 Type *SrcTy = CI1->getSrcTy();
204 Type *MidTy = CI1->getDestTy();
205 Type *DstTy = CI2->getDestTy();
206
207 Instruction::CastOps firstOp = CI1->getOpcode();
208 Instruction::CastOps secondOp = CI2->getOpcode();
209 Type *SrcIntPtrTy =
210 SrcTy->isPtrOrPtrVectorTy() ? DL.getIntPtrType(SrcTy) : nullptr;
211 Type *DstIntPtrTy =
212 DstTy->isPtrOrPtrVectorTy() ? DL.getIntPtrType(DstTy) : nullptr;
213 unsigned Res = CastInst::isEliminableCastPair(firstOp, secondOp, SrcTy, MidTy,
214 DstTy, &DL);
215
216 // We don't want to form an inttoptr or ptrtoint that converts to an integer
217 // type that differs from the pointer size.
218 if ((Res == Instruction::IntToPtr && SrcTy != DstIntPtrTy) ||
219 (Res == Instruction::PtrToInt && DstTy != SrcIntPtrTy))
220 Res = 0;
221
222 return Instruction::CastOps(Res);
223}
224
225/// Implement the transforms common to all CastInst visitors.
227 Value *Src = CI.getOperand(0);
228 Type *Ty = CI.getType();
229
230 if (Value *Res =
231 simplifyCastInst(CI.getOpcode(), Src, Ty, SQ.getWithInstruction(&CI)))
232 return replaceInstUsesWith(CI, Res);
233
234 // Try to eliminate a cast of a cast.
235 if (auto *CSrc = dyn_cast<CastInst>(Src)) { // A->B->C cast
236 if (Instruction::CastOps NewOpc = isEliminableCastPair(CSrc, &CI)) {
237 // The first cast (CSrc) is eliminable so we need to fix up or replace
238 // the second cast (CI). CSrc will then have a good chance of being dead.
239 auto *Res = CastInst::Create(NewOpc, CSrc->getOperand(0), Ty);
240 // Point debug users of the dying cast to the new one.
241 if (CSrc->hasOneUse())
242 replaceAllDbgUsesWith(*CSrc, *Res, CI, DT);
243 return Res;
244 }
245 }
246
247 if (auto *Sel = dyn_cast<SelectInst>(Src)) {
248 // We are casting a select. Try to fold the cast into the select if the
249 // select does not have a compare instruction with matching operand types
250 // or the select is likely better done in a narrow type.
251 // Creating a select with operands that are different sizes than its
252 // condition may inhibit other folds and lead to worse codegen.
253 Value *Cond = Sel->getCondition();
255 cast<Instruction>(Cond)->getOperand(0)->getType() != Sel->getType() ||
256 (CI.getOpcode() == Instruction::Trunc &&
257 shouldChangeType(CI.getSrcTy(), CI.getType()))) {
258
259 // If it's a bitcast involving vectors, make sure it has the same number
260 // of elements on both sides.
261 if (CI.getOpcode() != Instruction::BitCast ||
263 if (Instruction *NV = FoldOpIntoSelect(CI, Sel)) {
264 replaceAllDbgUsesWith(*Sel, *NV, CI, DT);
265 return NV;
266 }
267 }
268 }
269 }
270
271 // If we are casting a PHI, then fold the cast into the PHI.
272 if (auto *PN = dyn_cast<PHINode>(Src)) {
273 // Don't do this if it would create a PHI node with an illegal type from a
274 // legal type.
275 if (!Src->getType()->isIntegerTy() || !CI.getType()->isIntegerTy() ||
276 shouldChangeType(CI.getSrcTy(), CI.getType()))
277 if (Instruction *NV = foldOpIntoPhi(CI, PN))
278 return NV;
279 }
280
281 // Canonicalize a unary shuffle after the cast if neither operation changes
282 // the size or element size of the input vector.
283 // TODO: We could allow size-changing ops if that doesn't harm codegen.
284 // cast (shuffle X, Mask) --> shuffle (cast X), Mask
285 Value *X;
286 ArrayRef<int> Mask;
287 if (match(Src, m_OneUse(m_Shuffle(m_Value(X), m_Poison(), m_Mask(Mask))))) {
288 // TODO: Allow scalable vectors?
289 auto *SrcTy = dyn_cast<FixedVectorType>(X->getType());
290 auto *DestTy = dyn_cast<FixedVectorType>(Ty);
291 if (SrcTy && DestTy &&
292 SrcTy->getNumElements() == DestTy->getNumElements() &&
293 SrcTy->getPrimitiveSizeInBits() == DestTy->getPrimitiveSizeInBits()) {
294 Value *CastX = Builder.CreateCast(CI.getOpcode(), X, DestTy);
295 return new ShuffleVectorInst(CastX, Mask);
296 }
297 }
298
299 return nullptr;
300}
301
302namespace {
303
304/// Helper class for evaluating whether a value can be computed in a different
305/// type without changing its value. Used by cast simplification transforms.
306class TypeEvaluationHelper {
307public:
308 /// Return true if we can evaluate the specified expression tree as type Ty
309 /// instead of its larger type, and arrive with the same value.
310 /// This is used by code that tries to eliminate truncates.
311 [[nodiscard]] static bool canEvaluateTruncated(Value *V, Type *Ty,
313 Instruction *CtxI);
314
315 /// Determine if the specified value can be computed in the specified wider
316 /// type and produce the same low bits. If not, return false.
317 [[nodiscard]] static bool canEvaluateZExtd(Value *V, Type *Ty,
318 unsigned &BitsToClear,
320 Instruction *CtxI);
321
322 /// Return true if we can take the specified value and return it as type Ty
323 /// without inserting any new casts and without changing the value of the
324 /// common low bits.
325 [[nodiscard]] static bool canEvaluateSExtd(Value *V, Type *Ty,
326 unsigned MaxTypeEvalDepth);
327
328private:
329 explicit TypeEvaluationHelper(unsigned MaxTypeEvalDepth)
330 : MaxTypeEvalDepth(MaxTypeEvalDepth) {}
331
332 /// Constants and extensions/truncates from the destination type are always
333 /// free to be evaluated in that type.
334 [[nodiscard]] static bool canAlwaysEvaluateInType(Value *V, Type *Ty);
335
336 /// Check if we traversed all the users of the multi-use values we've seen.
337 [[nodiscard]] bool allPendingVisited() const {
338 return llvm::all_of(Pending,
339 [this](Value *V) { return Visited.contains(V); });
340 }
341
342 /// A generic wrapper for canEvaluate* recursions to inject visitation
343 /// tracking and enforce correct multi-use value evaluations.
344 [[nodiscard]] bool
345 canEvaluate(Value *V, Type *Ty,
346 llvm::function_ref<bool(Value *, Type *Type)> Pred) {
347 if (Depth >= MaxTypeEvalDepth)
348 return false;
349
350 if (canAlwaysEvaluateInType(V, Ty))
351 return true;
352
353 auto *I = dyn_cast<Instruction>(V);
354
355 if (I == nullptr)
356 return false;
357
358 // We insert false by default to return false when we encounter user loops.
359 const auto [It, Inserted] = Visited.insert({V, false});
360
361 // There are three possible cases for us having information on this value
362 // in the Visited map:
363 // 1. We properly checked it and concluded that we can evaluate it (true)
364 // 2. We properly checked it and concluded that we can't (false)
365 // 3. We started to check it, but during the recursive traversal we came
366 // back to it.
367 //
368 // For cases 1 and 2, we can safely return the stored result. For case 3, we
369 // can potentially have a situation where we can evaluate recursive user
370 // chains, but that can be quite tricky to do properly and isntead, we
371 // return false.
372 //
373 // In any case, we should return whatever was there in the map to begin
374 // with.
375 if (!Inserted)
376 return It->getSecond();
377
378 // We can easily make a decision about single-user values whether they can
379 // be evaluated in a different type or not, we came from that user. This is
380 // not as simple for multi-user values.
381 //
382 // In general, we have the following case (inverted control-flow, users are
383 // at the top):
384 //
385 // Cast %A
386 // ____|
387 // /
388 // %A = Use %B, %C
389 // ________| |
390 // / |
391 // %B = Use %D |
392 // ________| |
393 // / |
394 // %D = Use %C |
395 // ________|___|
396 // /
397 // %C = ...
398 //
399 // In this case, when we check %A, %B and %D, we are confident that we can
400 // make the decision here and now, since we came from their only users.
401 //
402 // For %C, it is harder. We come there twice, and when we come the first
403 // time, it's hard to tell if we will visit the second user (technically
404 // it's not hard, but we might need a lot of repetitive checks with non-zero
405 // cost).
406 //
407 // In the case above, we are allowed to evaluate %C in different type
408 // because all of it users were part of the traversal.
409 //
410 // In the following case, however, we can't make this conclusion:
411 //
412 // Cast %A
413 // ____|
414 // /
415 // %A = Use %B, %C
416 // ________| |
417 // / |
418 // %B = Use %D |
419 // ________| |
420 // / |
421 // %D = Use %C |
422 // | |
423 // foo(%C) | | <- never traversing foo(%C)
424 // ________|___|
425 // /
426 // %C = ...
427 //
428 // In this case, we still can evaluate %C in a different type, but we'd need
429 // to create a copy of the original %C to be used in foo(%C). Such
430 // duplication might be not profitable.
431 //
432 // For this reason, we collect all users of the mult-user values and mark
433 // them as "pending" and defer this decision to the very end. When we are
434 // done and and ready to have a positive verdict, we should double-check all
435 // of the pending users and ensure that we visited them. allPendingVisited
436 // predicate checks exactly that.
437 if (!I->hasOneUse()) {
438 for (Use &U : I->uses()) {
439 // For most instructions, evaluating them in a different type will
440 // change the type of all operands. This is not the case for select
441 // conditions. Make sure we don't retain an extra use via the select
442 // condition.
443 if (isa<SelectInst>(U.getUser()) && U.getOperandNo() == 0)
444 return false;
445
446 Pending.push_back(U.getUser());
447 }
448 }
449
450 SaveAndRestore RestoreDepth(Depth, Depth + 1);
451 const bool Result = Pred(V, Ty);
452 // We have to set result this way and not via It because Pred is recursive
453 // and it is very likely that we grew Visited and invalidated It.
454 Visited[V] = Result;
455 return Result;
456 }
457
458 /// Filter out values that we can not evaluate in the destination type for
459 /// free.
460 [[nodiscard]] bool canNotEvaluateInType(Value *V, Type *Ty);
461
462 [[nodiscard]] bool canEvaluateTruncatedImpl(Value *V, Type *Ty,
463 InstCombinerImpl &IC,
464 Instruction *CtxI);
465 [[nodiscard]] bool canEvaluateTruncatedPred(Value *V, Type *Ty,
466 InstCombinerImpl &IC,
467 Instruction *CtxI);
468 [[nodiscard]] bool canEvaluateZExtdImpl(Value *V, Type *Ty,
469 unsigned &BitsToClear,
470 InstCombinerImpl &IC,
471 Instruction *CtxI);
472 [[nodiscard]] bool canEvaluateSExtdImpl(Value *V, Type *Ty);
473 [[nodiscard]] bool canEvaluateSExtdPred(Value *V, Type *Ty);
474
475 /// The recursion depth of this traversal.
476 unsigned Depth = 0;
477
478 const unsigned MaxTypeEvalDepth;
479
480 /// A bookkeeping map to memorize an already made decision for a traversed
481 /// value.
482 SmallDenseMap<Value *, bool, 8> Visited;
483
484 /// A list of pending values to check in the end.
485 SmallVector<Value *, 8> Pending;
486};
487
488} // anonymous namespace
489
490/// Constants and extensions/truncates from the destination type are always
491/// free to be evaluated in that type. This is a helper for canEvaluate*.
492bool TypeEvaluationHelper::canAlwaysEvaluateInType(Value *V, Type *Ty) {
493 if (isa<Constant>(V))
494 return match(V, m_ImmConstant());
495
496 Value *X;
497 if (match(V, m_ZExtOrSExt(m_SpecificType(Ty, X))) ||
498 match(V, m_Trunc(m_SpecificType(Ty, X))))
499 return true;
500
501 return false;
502}
503
504/// Filter out values that we can not evaluate in the destination type for free.
505/// This is a helper for canEvaluate*.
506bool TypeEvaluationHelper::canNotEvaluateInType(Value *V, Type *Ty) {
507 if (!isa<Instruction>(V))
508 return true;
509 // We don't extend or shrink something that has multiple uses -- doing so
510 // would require duplicating the instruction which isn't profitable.
511 if (!V->hasOneUse())
512 return true;
513
514 return false;
515}
516
517/// Return true if we can evaluate the specified expression tree as type Ty
518/// instead of its larger type, and arrive with the same value.
519/// This is used by code that tries to eliminate truncates.
520///
521/// Ty will always be a type smaller than V. We should return true if trunc(V)
522/// can be computed by computing V in the smaller type. If V is an instruction,
523/// then trunc(inst(x,y)) can be computed as inst(trunc(x),trunc(y)), which only
524/// makes sense if x and y can be efficiently truncated.
525///
526/// This function works on both vectors and scalars.
527///
528bool TypeEvaluationHelper::canEvaluateTruncated(Value *V, Type *Ty,
530 Instruction *CtxI) {
531 TypeEvaluationHelper TYH(IC.CLOpts.max_type_eval_depth);
532 return TYH.canEvaluateTruncatedImpl(V, Ty, IC, CtxI) &&
533 // We need to check whether we visited all users of multi-user values,
534 // and we have to do it at the very end, outside of the recursion.
535 TYH.allPendingVisited();
536}
537
538bool TypeEvaluationHelper::canEvaluateTruncatedImpl(Value *V, Type *Ty,
540 Instruction *CtxI) {
541 return canEvaluate(V, Ty, [this, &IC, CtxI](Value *V, Type *Ty) {
542 return canEvaluateTruncatedPred(V, Ty, IC, CtxI);
543 });
544}
545
546bool TypeEvaluationHelper::canEvaluateTruncatedPred(Value *V, Type *Ty,
548 Instruction *CtxI) {
549 auto *I = cast<Instruction>(V);
550 Type *OrigTy = V->getType();
551 switch (I->getOpcode()) {
552 case Instruction::Add:
553 case Instruction::Sub:
554 case Instruction::Mul:
555 case Instruction::And:
556 case Instruction::Or:
557 case Instruction::Xor:
558 // These operators can all arbitrarily be extended or truncated.
559 return canEvaluateTruncatedImpl(I->getOperand(0), Ty, IC, CtxI) &&
560 canEvaluateTruncatedImpl(I->getOperand(1), Ty, IC, CtxI);
561
562 case Instruction::UDiv:
563 case Instruction::URem: {
564 // UDiv and URem can be truncated if all the truncated bits are zero.
565 uint32_t OrigBitWidth = OrigTy->getScalarSizeInBits();
566 uint32_t BitWidth = Ty->getScalarSizeInBits();
567 assert(BitWidth < OrigBitWidth && "Unexpected bitwidths!");
568 APInt Mask = APInt::getBitsSetFrom(OrigBitWidth, BitWidth);
569 // Do not preserve the original context instruction. Simplifying div/rem
570 // based on later context may introduce a trap.
571 if (IC.MaskedValueIsZero(I->getOperand(0), Mask, I) &&
572 IC.MaskedValueIsZero(I->getOperand(1), Mask, I)) {
573 return canEvaluateTruncatedImpl(I->getOperand(0), Ty, IC, CtxI) &&
574 canEvaluateTruncatedImpl(I->getOperand(1), Ty, IC, CtxI);
575 }
576 break;
577 }
578 case Instruction::Shl: {
579 // If we are truncating the result of this SHL, and if it's a shift of an
580 // inrange amount, we can always perform a SHL in a smaller type.
581 uint32_t BitWidth = Ty->getScalarSizeInBits();
582 KnownBits AmtKnownBits =
583 llvm::computeKnownBits(I->getOperand(1), IC.getDataLayout());
584 if (AmtKnownBits.getMaxValue().ult(BitWidth))
585 return canEvaluateTruncatedImpl(I->getOperand(0), Ty, IC, CtxI) &&
586 canEvaluateTruncatedImpl(I->getOperand(1), Ty, IC, CtxI);
587 break;
588 }
589 case Instruction::LShr: {
590 // If this is a truncate of a logical shr, we can truncate it to a smaller
591 // lshr iff we know that the bits we would otherwise be shifting in are
592 // already zeros.
593 // TODO: It is enough to check that the bits we would be shifting in are
594 // zero - use AmtKnownBits.getMaxValue().
595 uint32_t OrigBitWidth = OrigTy->getScalarSizeInBits();
596 uint32_t BitWidth = Ty->getScalarSizeInBits();
597 KnownBits AmtKnownBits = IC.computeKnownBits(I->getOperand(1), CtxI);
598 APInt MaxShiftAmt = AmtKnownBits.getMaxValue();
599 APInt ShiftedBits = APInt::getBitsSetFrom(OrigBitWidth, BitWidth);
600 if (MaxShiftAmt.ult(BitWidth)) {
601 // If the only user is a trunc then we can narrow the shift if any new
602 // MSBs are not going to be used.
603 if (auto *Trunc = dyn_cast<TruncInst>(V->user_back())) {
604 auto DemandedBits = Trunc->getType()->getScalarSizeInBits();
605 if ((MaxShiftAmt + DemandedBits).ule(BitWidth))
606 return canEvaluateTruncatedImpl(I->getOperand(0), Ty, IC, CtxI) &&
607 canEvaluateTruncatedImpl(I->getOperand(1), Ty, IC, CtxI);
608 }
609 if (IC.MaskedValueIsZero(I->getOperand(0), ShiftedBits, CtxI))
610 return canEvaluateTruncatedImpl(I->getOperand(0), Ty, IC, CtxI) &&
611 canEvaluateTruncatedImpl(I->getOperand(1), Ty, IC, CtxI);
612 }
613 break;
614 }
615 case Instruction::AShr: {
616 // If this is a truncate of an arithmetic shr, we can truncate it to a
617 // smaller ashr iff we know that all the bits from the sign bit of the
618 // original type and the sign bit of the truncate type are similar.
619 // TODO: It is enough to check that the bits we would be shifting in are
620 // similar to sign bit of the truncate type.
621 uint32_t OrigBitWidth = OrigTy->getScalarSizeInBits();
622 uint32_t BitWidth = Ty->getScalarSizeInBits();
623 KnownBits AmtKnownBits =
624 llvm::computeKnownBits(I->getOperand(1), IC.getDataLayout());
625 unsigned ShiftedBits = OrigBitWidth - BitWidth;
626 if (AmtKnownBits.getMaxValue().ult(BitWidth) &&
627 ShiftedBits < IC.ComputeNumSignBits(I->getOperand(0), CtxI))
628 return canEvaluateTruncatedImpl(I->getOperand(0), Ty, IC, CtxI) &&
629 canEvaluateTruncatedImpl(I->getOperand(1), Ty, IC, CtxI);
630 break;
631 }
632 case Instruction::Trunc:
633 // trunc(trunc(x)) -> trunc(x)
634 return true;
635 case Instruction::ZExt:
636 case Instruction::SExt:
637 // trunc(ext(x)) -> ext(x) if the source type is smaller than the new dest
638 // trunc(ext(x)) -> trunc(x) if the source type is larger than the new dest
639 return true;
640 case Instruction::Select: {
642 return canEvaluateTruncatedImpl(SI->getTrueValue(), Ty, IC, CtxI) &&
643 canEvaluateTruncatedImpl(SI->getFalseValue(), Ty, IC, CtxI);
644 }
645 case Instruction::PHI: {
646 // We can change a phi if we can change all operands. Note that we never
647 // get into trouble with cyclic PHIs here because canEvaluate handles use
648 // chain loops.
649 PHINode *PN = cast<PHINode>(I);
650 return llvm::all_of(
651 PN->incoming_values(), [this, Ty, &IC, CtxI](Value *IncValue) {
652 return canEvaluateTruncatedImpl(IncValue, Ty, IC, CtxI);
653 });
654 }
655 case Instruction::FPToUI:
656 case Instruction::FPToSI: {
657 // If the integer type can hold the max FP value, it is safe to cast
658 // directly to that type. Otherwise, we may create poison via overflow
659 // that did not exist in the original code.
660 Type *InputTy = I->getOperand(0)->getType()->getScalarType();
661 const fltSemantics &Semantics = InputTy->getFltSemantics();
662 uint32_t MinBitWidth = APFloatBase::semanticsIntSizeInBits(
663 Semantics, I->getOpcode() == Instruction::FPToSI);
664 return Ty->getScalarSizeInBits() >= MinBitWidth;
665 }
666 case Instruction::ShuffleVector:
667 return canEvaluateTruncatedImpl(I->getOperand(0), Ty, IC, CtxI) &&
668 canEvaluateTruncatedImpl(I->getOperand(1), Ty, IC, CtxI);
669
670 case Instruction::Call: {
671 Value *AbsOp;
673 if (IC.ComputeMaxSignificantBits(AbsOp, CtxI) > Ty->getScalarSizeInBits())
674 return false;
675 return canEvaluateTruncatedImpl(AbsOp, Ty, IC, CtxI);
676 }
677 auto *MM = dyn_cast<MinMaxIntrinsic>(I);
678 if (!MM)
679 return false;
680 // The min/max can be performed in the narrow type when each operand has
681 // zero high bits (for umin/umax) or enough sign bits (for smin/smax).
682 Value *Op0 = MM->getLHS();
683 Value *Op1 = MM->getRHS();
684 uint32_t BitWidth = Ty->getScalarSizeInBits();
685 if (MM->isSigned()) {
686 if (IC.ComputeMaxSignificantBits(Op0, CtxI) > BitWidth ||
687 IC.ComputeMaxSignificantBits(Op1, CtxI) > BitWidth)
688 break;
689 } else {
690 APInt Mask =
692 if (!IC.MaskedValueIsZero(Op0, Mask, CtxI) ||
693 !IC.MaskedValueIsZero(Op1, Mask, CtxI))
694 break;
695 }
696 return canEvaluateTruncatedImpl(Op0, Ty, IC, CtxI) &&
697 canEvaluateTruncatedImpl(Op1, Ty, IC, CtxI);
698 }
699 default:
700 // TODO: Can handle more cases here.
701 break;
702 }
703
704 return false;
705}
706
707/// Given a vector that is bitcast to an integer, optionally logically
708/// right-shifted, and truncated, convert it to an extractelement.
709/// Example (big endian):
710/// trunc (lshr (bitcast <4 x i32> %X to i128), 32) to i32
711/// --->
712/// extractelement <4 x i32> %X, 1
714 InstCombinerImpl &IC) {
715 Value *TruncOp = Trunc.getOperand(0);
716 Type *DestType = Trunc.getType();
717 if (!TruncOp->hasOneUse() || !isa<IntegerType>(DestType))
718 return nullptr;
719
720 Value *VecInput = nullptr;
721 ConstantInt *ShiftVal = nullptr;
722 if (!match(TruncOp, m_CombineOr(m_BitCast(m_Value(VecInput)),
723 m_LShr(m_BitCast(m_Value(VecInput)),
724 m_ConstantInt(ShiftVal)))) ||
725 !isa<VectorType>(VecInput->getType()))
726 return nullptr;
727
728 VectorType *VecType = cast<VectorType>(VecInput->getType());
729 unsigned VecWidth = VecType->getPrimitiveSizeInBits();
730 unsigned DestWidth = DestType->getPrimitiveSizeInBits();
731 unsigned ShiftAmount = ShiftVal ? ShiftVal->getZExtValue() : 0;
732
733 if ((VecWidth % DestWidth != 0) || (ShiftAmount % DestWidth != 0))
734 return nullptr;
735
736 // If the element type of the vector doesn't match the result type,
737 // bitcast it to a vector type that we can extract from.
738 unsigned NumVecElts = VecWidth / DestWidth;
739 if (VecType->getElementType() != DestType) {
740 VecType = FixedVectorType::get(DestType, NumVecElts);
741 VecInput = IC.Builder.CreateBitCast(VecInput, VecType, "bc");
742 }
743
744 unsigned Elt = ShiftAmount / DestWidth;
745 if (IC.getDataLayout().isBigEndian())
746 Elt = NumVecElts - 1 - Elt;
747
748 return ExtractElementInst::Create(VecInput, IC.Builder.getInt32(Elt));
749}
750
751/// Whenever an element is extracted from a vector, optionally shifted down, and
752/// then truncated, canonicalize by converting it to a bitcast followed by an
753/// extractelement.
754///
755/// Examples (little endian):
756/// trunc (extractelement <4 x i64> %X, 0) to i32
757/// --->
758/// extractelement <8 x i32> (bitcast <4 x i64> %X to <8 x i32>), i32 0
759///
760/// trunc (lshr (extractelement <4 x i32> %X, 0), 8) to i8
761/// --->
762/// extractelement <16 x i8> (bitcast <4 x i32> %X to <16 x i8>), i32 1
764 InstCombinerImpl &IC) {
765 Value *Src = Trunc.getOperand(0);
766 Type *SrcType = Src->getType();
767 Type *DstType = Trunc.getType();
768
769 // Only attempt this if we have simple aliasing of the vector elements.
770 // A badly fit destination size would result in an invalid cast.
771 unsigned SrcBits = SrcType->getScalarSizeInBits();
772 unsigned DstBits = DstType->getScalarSizeInBits();
773 uint64_t TruncRatio = SrcBits / DstBits;
774 if ((SrcBits % DstBits) != 0)
775 return nullptr;
776
777 Value *VecOp;
778 ConstantInt *Cst;
779 const APInt *ShiftAmount = nullptr;
780 if (!match(Src, m_OneUse(m_ExtractElt(m_Value(VecOp), m_ConstantInt(Cst)))) &&
781 !match(Src,
783 m_APInt(ShiftAmount)))))
784 return nullptr;
785
786 auto *VecOpTy = cast<VectorType>(VecOp->getType());
787 auto VecElts = VecOpTy->getElementCount();
788
789 uint64_t BitCastNumElts = VecElts.getKnownMinValue() * TruncRatio;
790 // Computed in 64-bit above to avoid a 32-bit overflow. Bail out if the
791 // element count exceeds IntegerType::MAX_INT_BITS, as we cannot create a
792 // wider vector type.
793 if (BitCastNumElts > IntegerType::MAX_INT_BITS)
794 return nullptr;
795 // Make sure we don't overflow in the calculation of the new index.
796 // (VecOpIdx + 1) * TruncRatio should not overflow.
797 if (Cst->uge(std::numeric_limits<uint64_t>::max() / TruncRatio))
798 return nullptr;
799 uint64_t VecOpIdx = Cst->getZExtValue();
800 uint64_t NewIdx = IC.getDataLayout().isBigEndian()
801 ? (VecOpIdx + 1) * TruncRatio - 1
802 : VecOpIdx * TruncRatio;
803
804 // Adjust index by the whole number of truncated elements.
805 if (ShiftAmount) {
806 // Check shift amount is in range and shifts a whole number of truncated
807 // elements.
808 if (ShiftAmount->uge(SrcBits) || ShiftAmount->urem(DstBits) != 0)
809 return nullptr;
810
811 uint64_t IdxOfs = ShiftAmount->udiv(DstBits).getZExtValue();
812 // IdxOfs is guaranteed to be less than TruncRatio, so we won't overflow in
813 // the adjustment.
814 assert(IdxOfs < TruncRatio &&
815 "IdxOfs is expected to be less than TruncRatio.");
816 NewIdx = IC.getDataLayout().isBigEndian() ? (NewIdx - IdxOfs)
817 : (NewIdx + IdxOfs);
818 }
819
820 auto *BitCastTo =
821 VectorType::get(DstType, BitCastNumElts, VecElts.isScalable());
822 Value *BitCast = IC.Builder.CreateBitCast(VecOp, BitCastTo);
823 return ExtractElementInst::Create(BitCast, IC.Builder.getInt64(NewIdx));
824}
825
826/// Funnel/Rotate left/right may occur in a wider type than necessary because of
827/// type promotion rules. Try to narrow the inputs and convert to funnel shift.
828Instruction *InstCombinerImpl::narrowFunnelShift(TruncInst &Trunc) {
829 assert((isa<VectorType>(Trunc.getSrcTy()) ||
830 shouldChangeType(Trunc.getSrcTy(), Trunc.getType())) &&
831 "Don't narrow to an illegal scalar type");
832
833 // Bail out on strange types. It is possible to handle some of these patterns
834 // even with non-power-of-2 sizes, but it is not a likely scenario.
835 Type *DestTy = Trunc.getType();
836 unsigned NarrowWidth = DestTy->getScalarSizeInBits();
837 unsigned WideWidth = Trunc.getSrcTy()->getScalarSizeInBits();
838 if (!isPowerOf2_32(NarrowWidth))
839 return nullptr;
840
841 // First, find an or'd pair of opposite shifts:
842 // trunc (or (lshr ShVal0, ShAmt0), (shl ShVal1, ShAmt1))
843 BinaryOperator *Or0, *Or1;
844 if (!match(Trunc.getOperand(0), m_OneUse(m_Or(m_BinOp(Or0), m_BinOp(Or1)))))
845 return nullptr;
846
847 Value *ShVal0, *ShVal1, *ShAmt0, *ShAmt1;
848 if (!match(Or0, m_OneUse(m_LogicalShift(m_Value(ShVal0), m_Value(ShAmt0)))) ||
849 !match(Or1, m_OneUse(m_LogicalShift(m_Value(ShVal1), m_Value(ShAmt1)))) ||
850 Or0->getOpcode() == Or1->getOpcode())
851 return nullptr;
852
853 // Canonicalize to or(shl(ShVal0, ShAmt0), lshr(ShVal1, ShAmt1)).
854 if (Or0->getOpcode() == BinaryOperator::LShr) {
855 std::swap(Or0, Or1);
856 std::swap(ShVal0, ShVal1);
857 std::swap(ShAmt0, ShAmt1);
858 }
859 assert(Or0->getOpcode() == BinaryOperator::Shl &&
860 Or1->getOpcode() == BinaryOperator::LShr &&
861 "Illegal or(shift,shift) pair");
862
863 // Match the shift amount operands for a funnel/rotate pattern. This always
864 // matches a subtraction on the R operand.
865 auto matchShiftAmount = [&](Value *L, Value *R, unsigned Width) -> Value * {
866 // The shift amounts may add up to the narrow bit width:
867 // (shl ShVal0, L) | (lshr ShVal1, Width - L)
868 // If this is a funnel shift (different operands are shifted), then the
869 // shift amount can not over-shift (create poison) in the narrow type.
870 unsigned MaxShiftAmountWidth = Log2_32(NarrowWidth);
871 APInt HiBitMask = ~APInt::getLowBitsSet(WideWidth, MaxShiftAmountWidth);
872 if (ShVal0 == ShVal1 || MaskedValueIsZero(L, HiBitMask))
873 if (match(R, m_OneUse(m_Sub(m_SpecificInt(Width), m_Specific(L)))))
874 return L;
875
876 // The following patterns currently only work for rotation patterns.
877 // TODO: Add more general funnel-shift compatible patterns.
878 if (ShVal0 != ShVal1)
879 return nullptr;
880
881 // The shift amount may be masked with negation:
882 // (shl ShVal0, (X & (Width - 1))) | (lshr ShVal1, ((-X) & (Width - 1)))
883 Value *X;
884 unsigned Mask = Width - 1;
885 if (match(L, m_And(m_Value(X), m_SpecificInt(Mask))) &&
887 return X;
888
889 // Same as above, but the shift amount may be extended after masking:
890 if (match(L, m_ZExt(m_And(m_Value(X), m_SpecificInt(Mask)))) &&
892 return X;
893
894 return nullptr;
895 };
896
897 Value *ShAmt = matchShiftAmount(ShAmt0, ShAmt1, NarrowWidth);
898 bool IsFshl = true; // Sub on LSHR.
899 if (!ShAmt) {
900 ShAmt = matchShiftAmount(ShAmt1, ShAmt0, NarrowWidth);
901 IsFshl = false; // Sub on SHL.
902 }
903 if (!ShAmt)
904 return nullptr;
905
906 // The right-shifted value must have high zeros in the wide type (for example
907 // from 'zext', 'and' or 'shift'). High bits of the left-shifted value are
908 // truncated, so those do not matter.
909 APInt HiBitMask = APInt::getHighBitsSet(WideWidth, WideWidth - NarrowWidth);
910 if (!MaskedValueIsZero(ShVal1, HiBitMask, &Trunc))
911 return nullptr;
912
913 // Adjust the width of ShAmt for narrowed funnel shift operation:
914 // - Zero-extend if ShAmt is narrower than the destination type.
915 // - Truncate if ShAmt is wider, discarding non-significant high-order bits.
916 // This prepares ShAmt for llvm.fshl.i8(trunc(ShVal), trunc(ShVal),
917 // zext/trunc(ShAmt)).
918 Value *NarrowShAmt = Builder.CreateZExtOrTrunc(ShAmt, DestTy);
919
920 Value *X, *Y;
921 X = Y = Builder.CreateTrunc(ShVal0, DestTy);
922 if (ShVal0 != ShVal1)
923 Y = Builder.CreateTrunc(ShVal1, DestTy);
924 Intrinsic::ID IID = IsFshl ? Intrinsic::fshl : Intrinsic::fshr;
925 Function *F =
926 Intrinsic::getOrInsertDeclaration(Trunc.getModule(), IID, DestTy);
927 return CallInst::Create(F, {X, Y, NarrowShAmt});
928}
929
930/// Try to narrow the width of math or bitwise logic instructions by pulling a
931/// truncate ahead of binary operators.
932Instruction *InstCombinerImpl::narrowBinOp(TruncInst &Trunc) {
933 Type *SrcTy = Trunc.getSrcTy();
934 Type *DestTy = Trunc.getType();
935 unsigned SrcWidth = SrcTy->getScalarSizeInBits();
936 unsigned DestWidth = DestTy->getScalarSizeInBits();
937
938 if (!isa<VectorType>(SrcTy) && !shouldChangeType(SrcTy, DestTy))
939 return nullptr;
940
941 BinaryOperator *BinOp;
942 if (!match(Trunc.getOperand(0), m_OneUse(m_BinOp(BinOp))))
943 return nullptr;
944
945 Value *BinOp0 = BinOp->getOperand(0);
946 Value *BinOp1 = BinOp->getOperand(1);
947 switch (BinOp->getOpcode()) {
948 case Instruction::And:
949 case Instruction::Or:
950 case Instruction::Xor:
951 case Instruction::Add:
952 case Instruction::Sub:
953 case Instruction::Mul: {
954 Constant *C;
955 if (match(BinOp0, m_Constant(C))) {
956 // trunc (binop C, X) --> binop (trunc C', X)
957 Constant *NarrowC = ConstantExpr::getTrunc(C, DestTy);
958 Value *TruncX = Builder.CreateTrunc(BinOp1, DestTy);
959 return BinaryOperator::Create(BinOp->getOpcode(), NarrowC, TruncX);
960 }
961 if (match(BinOp1, m_Constant(C))) {
962 // trunc (binop X, C) --> binop (trunc X, C')
963 Constant *NarrowC = ConstantExpr::getTrunc(C, DestTy);
964 Value *TruncX = Builder.CreateTrunc(BinOp0, DestTy);
965 return BinaryOperator::Create(BinOp->getOpcode(), TruncX, NarrowC);
966 }
967 Value *X;
968 if (match(BinOp0, m_ZExtOrSExt(m_SpecificType(DestTy, X)))) {
969 // trunc (binop (ext X), Y) --> binop X, (trunc Y)
970 Value *NarrowOp1 = Builder.CreateTrunc(BinOp1, DestTy);
971 return BinaryOperator::Create(BinOp->getOpcode(), X, NarrowOp1);
972 }
973 if (match(BinOp1, m_ZExtOrSExt(m_SpecificType(DestTy, X)))) {
974 // trunc (binop Y, (ext X)) --> binop (trunc Y), X
975 Value *NarrowOp0 = Builder.CreateTrunc(BinOp0, DestTy);
976 return BinaryOperator::Create(BinOp->getOpcode(), NarrowOp0, X);
977 }
978 break;
979 }
980 case Instruction::LShr:
981 case Instruction::AShr: {
982 // trunc (*shr (trunc A), C) --> trunc(*shr A, C)
983 Value *A;
984 Constant *C;
985 if (match(BinOp0, m_Trunc(m_Value(A))) && match(BinOp1, m_Constant(C))) {
986 unsigned MaxShiftAmt = SrcWidth - DestWidth;
987 // If the shift is small enough, all zero/sign bits created by the shift
988 // are removed by the trunc.
990 APInt(SrcWidth, MaxShiftAmt)))) {
991 auto *OldShift = cast<Instruction>(Trunc.getOperand(0));
992 bool IsExact = OldShift->isExact();
993 if (Constant *ShAmt = ConstantFoldIntegerCast(C, A->getType(),
994 /*IsSigned*/ true, DL)) {
995 ShAmt = Constant::mergeUndefsWith(ShAmt, C);
996 Value *Shift =
997 OldShift->getOpcode() == Instruction::AShr
998 ? Builder.CreateAShr(A, ShAmt, OldShift->getName(), IsExact)
999 : Builder.CreateLShr(A, ShAmt, OldShift->getName(), IsExact);
1000 return CastInst::CreateTruncOrBitCast(Shift, DestTy);
1001 }
1002 }
1003 }
1004 break;
1005 }
1006 default: break;
1007 }
1008
1009 if (Instruction *NarrowOr = narrowFunnelShift(Trunc))
1010 return NarrowOr;
1011
1012 return nullptr;
1013}
1014
1015/// Try to narrow the width of a splat shuffle. This could be generalized to any
1016/// shuffle with a constant operand, but we limit the transform to avoid
1017/// creating a shuffle type that targets may not be able to lower effectively.
1019 InstCombiner::BuilderTy &Builder) {
1020 Value *Shuf = Trunc.getOperand(0), *ShufVec;
1021 ArrayRef<int> SplatMask;
1022 if (match(Shuf, m_OneUse(m_Shuffle(m_Value(ShufVec), m_Poison(),
1023 m_Mask(SplatMask)))) &&
1024 match(SplatMask, m_SplatMask()) &&
1026 cast<VectorType>(Shuf->getType())->getElementCount(),
1027 cast<VectorType>(ShufVec->getType())->getElementCount())) {
1028 // trunc (shuf X, poison, SplatMask) --> shuf (trunc X), poison, SplatMask
1029 Type *NewTruncTy =
1030 ShufVec->getType()->getWithNewType(Trunc.getType()->getScalarType());
1031 Value *NarrowOp = Builder.CreateTrunc(ShufVec, NewTruncTy);
1032 return new ShuffleVectorInst(NarrowOp, SplatMask);
1033 }
1034
1035 return nullptr;
1036}
1037
1038/// Try to narrow the width of an insert element. This could be generalized for
1039/// any vector constant, but we limit the transform to insertion into poison to
1040/// avoid potential backend problems from unsupported insertion widths. This
1041/// could also be extended to handle the case of inserting a scalar constant
1042/// into a vector variable.
1044 InstCombiner::BuilderTy &Builder) {
1045 Instruction::CastOps Opcode = Trunc.getOpcode();
1046 assert((Opcode == Instruction::Trunc || Opcode == Instruction::FPTrunc) &&
1047 "Unexpected instruction for shrinking");
1048
1049 Value *Elt, *Index;
1050 if (match(Trunc.getOperand(0),
1051 m_OneUse(m_InsertElt(m_Poison(), m_Value(Elt), m_Value(Index))))) {
1052 // trunc (inselt poison, X, Index) --> inselt poison, (trunc X), Index
1053 // fptrunc (inselt poison, X, Index) --> inselt poison, (fptrunc X), Index
1054 auto *NarrowPoison = PoisonValue::get(Trunc.getType());
1055 Value *NarrowOp =
1056 Builder.CreateCast(Opcode, Elt, Trunc.getType()->getScalarType());
1057 return InsertElementInst::Create(NarrowPoison, NarrowOp, Index);
1058 }
1059
1060 return nullptr;
1061}
1062
1064 if (Instruction *Result = commonCastTransforms(Trunc))
1065 return Result;
1066
1067 Value *Src = Trunc.getOperand(0);
1068 Type *DestTy = Trunc.getType(), *SrcTy = Src->getType();
1069 unsigned DestWidth = DestTy->getScalarSizeInBits();
1070 unsigned SrcWidth = SrcTy->getScalarSizeInBits();
1071
1072 // Attempt to truncate the entire input expression tree to the destination
1073 // type. Only do this if the dest type is a simple type, don't convert the
1074 // expression tree to something weird like i93 unless the source is also
1075 // strange.
1076 if ((DestTy->isVectorTy() || shouldChangeType(SrcTy, DestTy)) &&
1077 TypeEvaluationHelper::canEvaluateTruncated(Src, DestTy, *this, &Trunc)) {
1078
1079 // If this cast is a truncate, evaluting in a different type always
1080 // eliminates the cast, so it is always a win.
1081 LLVM_DEBUG(
1082 dbgs() << "ICE: EvaluateInDifferentType converting expression type"
1083 " to avoid cast: "
1084 << Trunc << '\n');
1085 Value *Res = EvaluateInDifferentType(Src, DestTy, false);
1086 assert(Res->getType() == DestTy);
1087 return replaceInstUsesWith(Trunc, Res);
1088 }
1089
1090 // For integer types, check if we can shorten the entire input expression to
1091 // DestWidth * 2, which won't allow removing the truncate, but reducing the
1092 // width may enable further optimizations, e.g. allowing for larger
1093 // vectorization factors.
1094 if (auto *DestITy = dyn_cast<IntegerType>(DestTy)) {
1095 if (DestWidth * 2 < SrcWidth) {
1096 auto *NewDestTy = DestITy->getExtendedType();
1097 if (shouldChangeType(SrcTy, NewDestTy) &&
1098 TypeEvaluationHelper::canEvaluateTruncated(Src, NewDestTy, *this,
1099 &Trunc)) {
1100 LLVM_DEBUG(
1101 dbgs() << "ICE: EvaluateInDifferentType converting expression type"
1102 " to reduce the width of operand of"
1103 << Trunc << '\n');
1104 Value *Res = EvaluateInDifferentType(Src, NewDestTy, false);
1105 return new TruncInst(Res, DestTy);
1106 }
1107 }
1108 }
1109 Value *X;
1110 if (DestWidth == 1 &&
1111 (Trunc.hasNoUnsignedWrap() || Trunc.hasNoSignedWrap()) &&
1112 match(Src, m_Exact(m_Shr(m_Value(X), m_Value()))))
1114
1115 // See if we can simplify any instructions used by the input whose sole
1116 // purpose is to compute bits we don't care about.
1118 return &Trunc;
1119
1120 if (DestWidth == 1) {
1121 Value *Zero = Constant::getNullValue(SrcTy);
1122
1123 const APInt *C1;
1124 Constant *C2;
1125 if (match(Src, m_OneUse(m_Shr(m_Shl(m_Power2(C1), m_Value(X)),
1126 m_ImmConstant(C2))))) {
1127 // trunc ((C1 << X) >> C2) to i1 --> X == (C2-cttz(C1)), where C1 is pow2
1128 Constant *Log2C1 = ConstantInt::get(SrcTy, C1->exactLogBase2());
1129 Constant *CmpC = ConstantExpr::getSub(C2, Log2C1);
1130 return new ICmpInst(ICmpInst::ICMP_EQ, X, CmpC);
1131 }
1132
1133 if (match(Src, m_Shr(m_Value(X), m_SpecificInt(SrcWidth - 1)))) {
1134 // trunc (ashr X, BW-1) to i1 --> icmp slt X, 0
1135 // trunc (lshr X, BW-1) to i1 --> icmp slt X, 0
1136 return new ICmpInst(ICmpInst::ICMP_SLT, X, Zero);
1137 }
1138
1139 Constant *C;
1140 if (match(Src, m_OneUse(m_LShr(m_Value(X), m_ImmConstant(C))))) {
1141 // trunc (lshr X, C) to i1 --> icmp ne (and X, C'), 0
1142 Constant *One = ConstantInt::get(SrcTy, APInt(SrcWidth, 1));
1143 Value *MaskC = Builder.CreateShl(One, C);
1144 Value *And = Builder.CreateAnd(X, MaskC);
1145 return new ICmpInst(ICmpInst::ICMP_NE, And, Zero);
1146 }
1148 m_Deferred(X))))) {
1149 // trunc (or (lshr X, C), X) to i1 --> icmp ne (and X, C'), 0
1150 Constant *One = ConstantInt::get(SrcTy, APInt(SrcWidth, 1));
1151 Value *MaskC = Builder.CreateShl(One, C);
1152 Value *And = Builder.CreateAnd(X, Builder.CreateOr(MaskC, One));
1153 return new ICmpInst(ICmpInst::ICMP_NE, And, Zero);
1154 }
1155
1156 {
1157 const APInt *C;
1158 if (match(Src, m_Shl(m_APInt(C), m_Value(X))) && (*C)[0] == 1) {
1159 // trunc (C << X) to i1 --> X == 0, where C is odd
1160 return new ICmpInst(ICmpInst::Predicate::ICMP_EQ, X, Zero);
1161 }
1162 }
1163
1164 if (Trunc.hasNoUnsignedWrap() || Trunc.hasNoSignedWrap()) {
1165 Value *X, *Y;
1166 if (match(Src, m_Xor(m_Value(X), m_Value(Y))))
1167 return new ICmpInst(ICmpInst::ICMP_NE, X, Y);
1168 }
1169
1170 if (match(Src,
1172 return new ICmpInst(ICmpInst::ICMP_EQ, X,
1174 }
1175
1176 Value *A, *B;
1177 Constant *C;
1178
1179 // trunc(u/smin(zext(a) + zext(b), MAX)) --> uadd.sat(a, b)
1180 if (match(Src, m_OneUse(m_CombineOr(
1182 m_ZExt(m_SpecificType(DestTy, B)))),
1183 m_SpecificInt(APInt::getMaxValue(DestWidth))),
1185 m_ZExt(m_SpecificType(DestTy, B)))),
1186 m_SpecificInt(APInt::getMaxValue(DestWidth))))))) {
1187 return replaceInstUsesWith(
1188 Trunc, Builder.CreateBinaryIntrinsic(Intrinsic::uadd_sat, A, B));
1189 }
1190
1191 // trunc(smax(zext(a) - zext(b), 0)) --> usub.sat(a, b)
1192 if (match(Src,
1194 m_ZExt(m_SpecificType(DestTy, B)))),
1195 m_Zero())))) {
1196 return replaceInstUsesWith(
1197 Trunc, Builder.CreateBinaryIntrinsic(Intrinsic::usub_sat, A, B));
1198 }
1199
1200 if (match(Src, m_LShr(m_SExt(m_Value(A)), m_Constant(C)))) {
1201 unsigned AWidth = A->getType()->getScalarSizeInBits();
1202 unsigned MaxShiftAmt = SrcWidth - std::max(DestWidth, AWidth);
1203 auto *OldSh = cast<Instruction>(Src);
1204 bool IsExact = OldSh->isExact();
1205
1206 // If the shift is small enough, all zero bits created by the shift are
1207 // removed by the trunc.
1209 APInt(SrcWidth, MaxShiftAmt)))) {
1210 auto GetNewShAmt = [&](unsigned Width) {
1211 Constant *MaxAmt = ConstantInt::get(SrcTy, Width - 1, false);
1212 Constant *Cmp =
1214 Constant *ShAmt = ConstantFoldSelectInstruction(Cmp, C, MaxAmt);
1215 return ConstantFoldCastOperand(Instruction::Trunc, ShAmt, A->getType(),
1216 DL);
1217 };
1218
1219 // trunc (lshr (sext A), C) --> ashr A, C
1220 if (A->getType() == DestTy) {
1221 Constant *ShAmt = GetNewShAmt(DestWidth);
1222 ShAmt = Constant::mergeUndefsWith(ShAmt, C);
1223 return IsExact ? BinaryOperator::CreateExactAShr(A, ShAmt)
1224 : BinaryOperator::CreateAShr(A, ShAmt);
1225 }
1226 // The types are mismatched, so create a cast after shifting:
1227 // trunc (lshr (sext A), C) --> sext/trunc (ashr A, C)
1228 if (Src->hasOneUse()) {
1229 Constant *ShAmt = GetNewShAmt(AWidth);
1230 Value *Shift = Builder.CreateAShr(A, ShAmt, "", IsExact);
1231 return CastInst::CreateIntegerCast(Shift, DestTy, true);
1232 }
1233 }
1234 // TODO: Mask high bits with 'and'.
1235 }
1236
1237 if (Instruction *I = narrowBinOp(Trunc))
1238 return I;
1239
1240 if (Instruction *I = shrinkSplatShuffle(Trunc, Builder))
1241 return I;
1242
1243 if (Instruction *I = shrinkInsertElt(Trunc, Builder))
1244 return I;
1245
1246 if (Src->hasOneUse() &&
1247 (isa<VectorType>(SrcTy) || shouldChangeType(SrcTy, DestTy))) {
1248 // Transform "trunc (shl X, cst)" -> "shl (trunc X), cst" so long as the
1249 // dest type is native and cst < dest size.
1250 if (match(Src, m_Shl(m_Value(A), m_Constant(C))) &&
1251 !match(A, m_Shr(m_Value(), m_Constant()))) {
1252 // Skip shifts of shift by constants. It undoes a combine in
1253 // FoldShiftByConstant and is the extend in reg pattern.
1254 APInt Threshold = APInt(C->getType()->getScalarSizeInBits(), DestWidth);
1255 if (match(C, m_SpecificInt_ICMP(ICmpInst::ICMP_ULT, Threshold))) {
1256 // If neither the wide shift nor the truncate wrap, propagate the wrap
1257 // flags on the new truncate and shift.
1258 auto *WideShl = cast<OverflowingBinaryOperator>(Src);
1259 bool NUW = Trunc.hasNoUnsignedWrap() && WideShl->hasNoUnsignedWrap();
1260 bool NSW = Trunc.hasNoSignedWrap() && WideShl->hasNoSignedWrap();
1261 Value *NewTrunc = Builder.CreateTrunc(A, DestTy, A->getName() + ".tr",
1262 /*IsNUW=*/NUW, /*IsNSW=*/NSW);
1263 auto *NewShl = BinaryOperator::Create(
1264 Instruction::Shl, NewTrunc, ConstantExpr::getTrunc(C, DestTy));
1265 NewShl->setHasNoUnsignedWrap(NUW);
1266 NewShl->setHasNoSignedWrap(NSW);
1267 return NewShl;
1268 }
1269 }
1270 }
1271
1272 // trunc (select(icmp_ult(A, DestTy_umax+1), A, sext(icmp_sgt(A, 0)))) -->
1273 // trunc (smin(smax(0, A), DestTy_umax))
1274 // Also handle the inverted form:
1275 // trunc (select(icmp_ugt(A, DestTy_umax), sext(icmp_sgt(A, 0)), A))
1276 CmpPredicate Pred;
1277 const APInt *CmpC;
1278 Value *TVal, *FVal;
1279 if (SrcTy->isIntegerTy() && isPowerOf2_64(SrcWidth) &&
1280 isPowerOf2_64(DestWidth) &&
1281 match(Src,
1283 m_Value(TVal), m_Value(FVal))))) {
1284 APInt TruncatedMax = APInt::getLowBitsSet(SrcWidth, DestWidth);
1285 Value *SExtVal = nullptr;
1286 // Check the select arm first so that A is known to have type SrcTy.
1287 if (Pred == ICmpInst::ICMP_ULT && TVal == A && *CmpC == TruncatedMax + 1)
1288 SExtVal = FVal;
1289 else if (Pred == ICmpInst::ICMP_UGT && FVal == A && *CmpC == TruncatedMax)
1290 SExtVal = TVal;
1291 if (SExtVal &&
1294 Value *SMax = Builder.CreateIntrinsic(Intrinsic::smax, {SrcTy},
1295 {ConstantInt::get(SrcTy, 0), A});
1296 Value *SMin = Builder.CreateIntrinsic(
1297 Intrinsic::smin, {SrcTy},
1298 {SMax, ConstantInt::get(SrcTy, TruncatedMax)});
1299 return new TruncInst(SMin, DestTy);
1300 }
1301 }
1302
1303 if (Instruction *I = foldVecTruncToExtElt(Trunc, *this))
1304 return I;
1305
1306 if (Instruction *I = foldVecExtTruncToExtElt(Trunc, *this))
1307 return I;
1308
1309 // trunc (ctlz_i32(zext(A), B) --> add(ctlz_i16(A, B), C)
1310 if (match(Src, m_OneUse(m_Ctlz(m_ZExt(m_Value(A)), m_Value(B))))) {
1311 unsigned AWidth = A->getType()->getScalarSizeInBits();
1312 if (AWidth == DestWidth && AWidth > Log2_32(SrcWidth)) {
1313 Value *WidthDiff = ConstantInt::get(A->getType(), SrcWidth - AWidth);
1314 Value *NarrowCtlz =
1315 Builder.CreateIntrinsic(Intrinsic::ctlz, {Trunc.getType()}, {A, B});
1316 return BinaryOperator::CreateAdd(NarrowCtlz, WidthDiff);
1317 }
1318 }
1319
1320 if (match(Src, m_VScale())) {
1321 if (Trunc.getFunction() &&
1322 Trunc.getFunction()->hasFnAttribute(Attribute::VScaleRange)) {
1323 Attribute Attr =
1324 Trunc.getFunction()->getFnAttribute(Attribute::VScaleRange);
1325 if (std::optional<unsigned> MaxVScale = Attr.getVScaleRangeMax())
1326 if (Log2_32(*MaxVScale) < DestWidth)
1327 return replaceInstUsesWith(Trunc, Builder.CreateVScale(DestTy));
1328 }
1329 }
1330
1331 // trunc(scmp(x, y)) -> scmp(x, y) with a narrower result type.
1332 // trunc(ucmp(x, y)) -> ucmp(x, y) with a narrower result type.
1333 // scmp/ucmp produce only -1, 0, or 1, so any result type with at least 2
1334 // bits can represent every possible value and the truncation is lossless.
1335 if (DestWidth >= 2)
1336 if (auto *CI = dyn_cast<CmpIntrinsic>(Src); CI && CI->hasOneUse())
1337 return replaceInstUsesWith(
1338 Trunc, Builder.CreateIntrinsic(DestTy, CI->getIntrinsicID(),
1339 {CI->getLHS(), CI->getRHS()}));
1340
1341 if (DestWidth == 1 &&
1342 (Trunc.hasNoUnsignedWrap() || Trunc.hasNoSignedWrap()) &&
1343 isKnownNonZero(Src, SQ.getWithInstruction(&Trunc)))
1344 return replaceInstUsesWith(Trunc, ConstantInt::getTrue(DestTy));
1345
1346 bool Changed = false;
1347 if (!Trunc.hasNoSignedWrap() &&
1348 ComputeMaxSignificantBits(Src, &Trunc) <= DestWidth) {
1349 Trunc.setHasNoSignedWrap(true);
1350 Changed = true;
1351 }
1352 if (!Trunc.hasNoUnsignedWrap() &&
1353 MaskedValueIsZero(Src, APInt::getBitsSetFrom(SrcWidth, DestWidth),
1354 &Trunc)) {
1355 Trunc.setHasNoUnsignedWrap(true);
1356 Changed = true;
1357 }
1358
1359 const APInt *C1;
1360 Value *V1;
1361 // OP = { lshr, ashr }
1362 // trunc ( OP i8 C1, V1) to i1 -> icmp eq V1, log_2(C1) iff C1 is power of 2
1363 if (DestWidth == 1 && match(Src, m_Shr(m_Power2(C1), m_Value(V1)))) {
1364 Value *Right = ConstantInt::get(V1->getType(), C1->countr_zero());
1365 return new ICmpInst(ICmpInst::ICMP_EQ, V1, Right);
1366 }
1367
1368 // OP = { lshr, ashr }
1369 // trunc ( OP i8 C1, V1) to i1 -> icmp ult V1, log_2(C1 + 1) iff (C1 + 1) is
1370 // power of 2
1371 if (DestWidth == 1 && match(Src, m_Shr(m_LowBitMask(C1), m_Value(V1)))) {
1372 Value *Right = ConstantInt::get(V1->getType(), C1->countr_one());
1373 return new ICmpInst(ICmpInst::ICMP_ULT, V1, Right);
1374 }
1375
1376 // OP = { lshr, ashr }
1377 // trunc ( OP i8 C1, V1) to i1 -> icmp ugt V1, cttz(C1) - 1 iff (C1) is
1378 // negative power of 2
1379 if (DestWidth == 1 && match(Src, m_Shr(m_NegatedPower2(C1), m_Value(V1)))) {
1380 Value *Right = ConstantInt::get(V1->getType(), C1->countr_zero());
1381 return new ICmpInst(ICmpInst::ICMP_UGE, V1, Right);
1382 }
1383
1384 if (DestTy->isIntegerTy(1))
1385 if (auto *LI = dyn_cast<LoadInst>(Src))
1386 if (auto *GEP = dyn_cast<GetElementPtrInst>(LI->getOperand(0))) {
1389 Trunc, ConstantInt::get(cast<IntegerType>(SrcTy), 1)))
1390 return Res;
1391 }
1392
1393 return Changed ? &Trunc : nullptr;
1394}
1395
1396Instruction *InstCombinerImpl::transformZExtICmp(ICmpInst *Cmp,
1397 ZExtInst &Zext) {
1398 // If we are just checking for a icmp eq of a single bit and zext'ing it
1399 // to an integer, then shift the bit to the appropriate place and then
1400 // cast to integer to avoid the comparison.
1401
1402 // FIXME: This set of transforms does not check for extra uses and/or creates
1403 // an extra instruction (an optional final cast is not included
1404 // in the transform comments). We may also want to favor icmp over
1405 // shifts in cases of equal instructions because icmp has better
1406 // analysis in general (invert the transform).
1407
1408 const APInt *Op1CV;
1409 if (match(Cmp->getOperand(1), m_APInt(Op1CV))) {
1410
1411 // zext (x <s 0) to i32 --> x>>u31 true if signbit set.
1412 if (Cmp->getPredicate() == ICmpInst::ICMP_SLT && Op1CV->isZero()) {
1413 Value *In = Cmp->getOperand(0);
1414 Value *Sh = ConstantInt::get(In->getType(),
1415 In->getType()->getScalarSizeInBits() - 1);
1416 In = Builder.CreateLShr(In, Sh, In->getName() + ".lobit");
1417 if (In->getType() != Zext.getType())
1418 In = Builder.CreateIntCast(In, Zext.getType(), false /*ZExt*/);
1419
1420 return replaceInstUsesWith(Zext, In);
1421 }
1422
1423 // zext (X == 0) to i32 --> X^1 iff X has only the low bit set.
1424 // zext (X == 0) to i32 --> (X>>1)^1 iff X has only the 2nd bit set.
1425 // zext (X != 0) to i32 --> X iff X has only the low bit set.
1426 // zext (X != 0) to i32 --> X>>1 iff X has only the 2nd bit set.
1427
1428 if (Op1CV->isZero() && Cmp->isEquality()) {
1429 // Exactly 1 possible 1? But not the high-bit because that is
1430 // canonicalized to this form.
1431 KnownBits Known = computeKnownBits(Cmp->getOperand(0), &Zext);
1432 APInt KnownZeroMask(~Known.Zero);
1433 uint32_t ShAmt = KnownZeroMask.logBase2();
1434 bool IsExpectShAmt = KnownZeroMask.isPowerOf2() &&
1435 (Zext.getType()->getScalarSizeInBits() != ShAmt + 1);
1436 if (IsExpectShAmt &&
1437 (Cmp->getOperand(0)->getType() == Zext.getType() ||
1438 Cmp->getPredicate() == ICmpInst::ICMP_NE || ShAmt == 0)) {
1439 Value *In = Cmp->getOperand(0);
1440 if (ShAmt) {
1441 // Perform a logical shr by shiftamt.
1442 // Insert the shift to put the result in the low bit.
1443 In = Builder.CreateLShr(In, ConstantInt::get(In->getType(), ShAmt),
1444 In->getName() + ".lobit");
1445 }
1446
1447 // Toggle the low bit for "X == 0".
1448 if (Cmp->getPredicate() == ICmpInst::ICMP_EQ)
1449 In = Builder.CreateXor(In, ConstantInt::get(In->getType(), 1));
1450
1451 if (Zext.getType() == In->getType())
1452 return replaceInstUsesWith(Zext, In);
1453
1454 Value *IntCast = Builder.CreateIntCast(In, Zext.getType(), false);
1455 return replaceInstUsesWith(Zext, IntCast);
1456 }
1457 }
1458 }
1459
1460 if (Cmp->isEquality()) {
1461 // Test if a bit is clear/set using a shifted-one mask:
1462 // zext (icmp eq (and X, (1 << ShAmt)), 0) --> and (lshr (not X), ShAmt), 1
1463 // zext (icmp ne (and X, (1 << ShAmt)), 0) --> and (lshr X, ShAmt), 1
1464 Value *X, *ShAmt;
1465 if (Cmp->hasOneUse() && match(Cmp->getOperand(1), m_ZeroInt()) &&
1466 match(Cmp->getOperand(0),
1467 m_OneUse(m_c_And(m_Shl(m_One(), m_Value(ShAmt)), m_Value(X))))) {
1468 auto *And = cast<BinaryOperator>(Cmp->getOperand(0));
1469 Value *Shift = And->getOperand(X == And->getOperand(0) ? 1 : 0);
1470 if (Zext.getType() == And->getType() ||
1471 Cmp->getPredicate() != ICmpInst::ICMP_EQ || Shift->hasOneUse()) {
1472 if (Cmp->getPredicate() == ICmpInst::ICMP_EQ)
1473 X = Builder.CreateNot(X);
1474 Value *Lshr = Builder.CreateLShr(X, ShAmt);
1475 Value *And1 =
1476 Builder.CreateAnd(Lshr, ConstantInt::get(X->getType(), 1));
1477 return replaceInstUsesWith(
1478 Zext, Builder.CreateZExtOrTrunc(And1, Zext.getType()));
1479 }
1480 }
1481 }
1482
1483 return nullptr;
1484}
1485
1486/// Determine if the specified value can be computed in the specified wider type
1487/// and produce the same low bits. If not, return false.
1488///
1489/// If this function returns true, it can also return a non-zero number of bits
1490/// (in BitsToClear) which indicates that the value it computes is correct for
1491/// the zero extend, but that the additional BitsToClear bits need to be zero'd
1492/// out. For example, to promote something like:
1493///
1494/// %B = trunc i64 %A to i32
1495/// %C = lshr i32 %B, 8
1496/// %E = zext i32 %C to i64
1497///
1498/// CanEvaluateZExtd for the 'lshr' will return true, and BitsToClear will be
1499/// set to 8 to indicate that the promoted value needs to have bits 24-31
1500/// cleared in addition to bits 32-63. Since an 'and' will be generated to
1501/// clear the top bits anyway, doing this has no extra cost.
1502///
1503/// This function works on both vectors and scalars.
1504bool TypeEvaluationHelper::canEvaluateZExtd(Value *V, Type *Ty,
1505 unsigned &BitsToClear,
1506 InstCombinerImpl &IC,
1507 Instruction *CtxI) {
1508 TypeEvaluationHelper TYH(IC.CLOpts.max_type_eval_depth);
1509 return TYH.canEvaluateZExtdImpl(V, Ty, BitsToClear, IC, CtxI);
1510}
1511bool TypeEvaluationHelper::canEvaluateZExtdImpl(Value *V, Type *Ty,
1512 unsigned &BitsToClear,
1513 InstCombinerImpl &IC,
1514 Instruction *CtxI) {
1515 BitsToClear = 0;
1516 if (Depth >= MaxTypeEvalDepth)
1517 return false;
1518
1519 if (canAlwaysEvaluateInType(V, Ty))
1520 return true;
1521 // We stick to the one-user limit for the ZExt transform due to the fact
1522 // that this predicate returns two values: predicate result and BitsToClear.
1523 if (canNotEvaluateInType(V, Ty))
1524 return false;
1525
1526 // canEvaluateZExtd does not go through canEvaluate (it also returns
1527 // BitsToClear), so it has to track the depth itself.
1528 SaveAndRestore RestoreDepth(Depth, Depth + 1);
1529 auto *I = cast<Instruction>(V);
1530 unsigned Tmp;
1531 switch (I->getOpcode()) {
1532 case Instruction::ZExt: // zext(zext(x)) -> zext(x).
1533 case Instruction::SExt: // zext(sext(x)) -> sext(x).
1534 case Instruction::Trunc: // zext(trunc(x)) -> trunc(x) or zext(x)
1535 return true;
1536 case Instruction::And:
1537 case Instruction::Or:
1538 case Instruction::Xor:
1539 case Instruction::Add:
1540 case Instruction::Sub:
1541 case Instruction::Mul:
1542 if (!canEvaluateZExtdImpl(I->getOperand(0), Ty, BitsToClear, IC, CtxI) ||
1543 !canEvaluateZExtdImpl(I->getOperand(1), Ty, Tmp, IC, CtxI))
1544 return false;
1545 // These can all be promoted if neither operand has 'bits to clear'.
1546 if (BitsToClear == 0 && Tmp == 0)
1547 return true;
1548
1549 // If the operation is an AND/OR/XOR and the bits to clear are zero in the
1550 // other side, BitsToClear is ok.
1551 if (Tmp == 0 && I->isBitwiseLogicOp()) {
1552 // We use MaskedValueIsZero here for generality, but the case we care
1553 // about the most is constant RHS.
1554 unsigned VSize = V->getType()->getScalarSizeInBits();
1555 if (IC.MaskedValueIsZero(I->getOperand(1),
1556 APInt::getHighBitsSet(VSize, BitsToClear),
1557 CtxI)) {
1558 // If this is an And instruction and all of the BitsToClear are
1559 // known to be zero we can reset BitsToClear.
1560 if (I->getOpcode() == Instruction::And)
1561 BitsToClear = 0;
1562 return true;
1563 }
1564 }
1565
1566 // Otherwise, we don't know how to analyze this BitsToClear case yet.
1567 return false;
1568
1569 case Instruction::Shl: {
1570 // We can promote shl(x, cst) if we can promote x. Since shl overwrites the
1571 // upper bits we can reduce BitsToClear by the shift amount.
1572 uint64_t ShiftAmt;
1573 if (match(I->getOperand(1), m_ConstantInt(ShiftAmt))) {
1574 if (!canEvaluateZExtdImpl(I->getOperand(0), Ty, BitsToClear, IC, CtxI))
1575 return false;
1576 BitsToClear = ShiftAmt < BitsToClear ? BitsToClear - ShiftAmt : 0;
1577 return true;
1578 }
1579 return false;
1580 }
1581 case Instruction::LShr: {
1582 // We can promote lshr(x, cst) if we can promote x. This requires the
1583 // ultimate 'and' to clear out the high zero bits we're clearing out though.
1584 uint64_t ShiftAmt;
1585 if (match(I->getOperand(1), m_ConstantInt(ShiftAmt))) {
1586 if (!canEvaluateZExtdImpl(I->getOperand(0), Ty, BitsToClear, IC, CtxI))
1587 return false;
1588 BitsToClear += ShiftAmt;
1589 if (BitsToClear > V->getType()->getScalarSizeInBits())
1590 BitsToClear = V->getType()->getScalarSizeInBits();
1591 return true;
1592 }
1593 // Cannot promote variable LSHR.
1594 return false;
1595 }
1596 case Instruction::Select:
1597 if (!canEvaluateZExtdImpl(I->getOperand(1), Ty, Tmp, IC, CtxI) ||
1598 !canEvaluateZExtdImpl(I->getOperand(2), Ty, BitsToClear, IC, CtxI) ||
1599 // TODO: If important, we could handle the case when the BitsToClear are
1600 // known zero in the disagreeing side.
1601 Tmp != BitsToClear)
1602 return false;
1603 return true;
1604
1605 case Instruction::PHI: {
1606 // We can change a phi if we can change all operands. Note that we never
1607 // get into trouble with cyclic PHIs here because we only consider
1608 // instructions with a single use.
1609 PHINode *PN = cast<PHINode>(I);
1610 if (!canEvaluateZExtdImpl(PN->getIncomingValue(0), Ty, BitsToClear, IC,
1611 CtxI))
1612 return false;
1613 for (unsigned i = 1, e = PN->getNumIncomingValues(); i != e; ++i)
1614 if (!canEvaluateZExtdImpl(PN->getIncomingValue(i), Ty, Tmp, IC, CtxI) ||
1615 // TODO: If important, we could handle the case when the BitsToClear
1616 // are known zero in the disagreeing input.
1617 Tmp != BitsToClear)
1618 return false;
1619 return true;
1620 }
1621 case Instruction::Call:
1622 // llvm.vscale() can always be executed in larger type, because the
1623 // value is automatically zero-extended.
1625 if (II->getIntrinsicID() == Intrinsic::vscale)
1626 return true;
1627 return false;
1628 default:
1629 // TODO: Can handle more cases here.
1630 return false;
1631 }
1632}
1633
1635 // If this zero extend is only used by a truncate, let the truncate be
1636 // eliminated before we try to optimize this zext.
1637 if (Zext.hasOneUse() && isa<TruncInst>(Zext.user_back()) &&
1638 !isa<Constant>(Zext.getOperand(0)))
1639 return nullptr;
1640
1641 // If one of the common conversion will work, do it.
1642 if (Instruction *Result = commonCastTransforms(Zext))
1643 return Result;
1644
1645 if (auto *NewI = foldExtractionOfVectorDeinterleave(Zext))
1646 return NewI;
1647
1648 Value *Src = Zext.getOperand(0);
1649 Type *SrcTy = Src->getType(), *DestTy = Zext.getType();
1650
1651 // zext nneg bool x -> 0
1652 if (SrcTy->isIntOrIntVectorTy(1) && Zext.hasNonNeg())
1654
1655 // zext nneg means Src is non-negative and we can treat this as an sext.
1656 // Evaluating as a signed type means that any constant operands will be
1657 // sign-extended instead of zero-extended, which means that, if the
1658 // expression tree contains only no-signed-wrap arithmetic, the sign bits in
1659 // the final result should be enough that we avoid having to clear the high
1660 // bits.
1661 bool EvaluateAsSigned =
1662 Zext.hasNonNeg() && TypeEvaluationHelper::canEvaluateSExtd(
1663 Src, DestTy, CLOpts.max_type_eval_depth);
1664
1665 // Try to extend the entire expression tree to the wide destination type.
1666 unsigned BitsToClear = 0;
1667 if (shouldChangeType(SrcTy, DestTy) &&
1668 (EvaluateAsSigned || TypeEvaluationHelper::canEvaluateZExtd(
1669 Src, DestTy, BitsToClear, *this, &Zext))) {
1670 assert(BitsToClear <= SrcTy->getScalarSizeInBits() &&
1671 "Can't clear more bits than in SrcTy");
1672
1673 // Okay, we can transform this! Insert the new expression now.
1674 LLVM_DEBUG(
1675 dbgs() << "ICE: EvaluateInDifferentType converting expression type"
1676 " to avoid zero extend: "
1677 << Zext << '\n');
1678 Value *Res = EvaluateInDifferentType(Src, DestTy, EvaluateAsSigned);
1679 assert(Res->getType() == DestTy);
1680
1681 // Preserve debug values referring to Src if the zext is its last use.
1682 if (auto *SrcOp = dyn_cast<Instruction>(Src))
1683 if (SrcOp->hasOneUse())
1684 replaceAllDbgUsesWith(*SrcOp, *Res, Zext, DT);
1685
1686 uint32_t SrcBitsKept = SrcTy->getScalarSizeInBits() - BitsToClear;
1687 uint32_t DestBitSize = DestTy->getScalarSizeInBits();
1688
1689 // If the high bits are already filled with zeros, just replace this
1690 // cast with the result. If we've evaluated as a signed expressions then
1691 // instead check that the high bits are the sign bit, which we know is zero.
1692 if (EvaluateAsSigned
1693 ? (ComputeNumSignBits(Res, &Zext) > DestBitSize - SrcBitsKept)
1695 Res,
1696 APInt::getHighBitsSet(DestBitSize, DestBitSize - SrcBitsKept),
1697 &Zext))
1698 return replaceInstUsesWith(Zext, Res);
1699
1700 // We need to emit an AND to clear the high bits.
1701 Constant *C = ConstantInt::get(Res->getType(),
1702 APInt::getLowBitsSet(DestBitSize, SrcBitsKept));
1703 return BinaryOperator::CreateAnd(Res, C);
1704 }
1705
1706 // If this is a TRUNC followed by a ZEXT then we are dealing with integral
1707 // types and if the sizes are just right we can convert this into a logical
1708 // 'and' which will be much cheaper than the pair of casts.
1709 if (auto *CSrc = dyn_cast<TruncInst>(Src)) { // A->B->C cast
1710 // TODO: Subsume this into EvaluateInDifferentType.
1711
1712 // Get the sizes of the types involved. We know that the intermediate type
1713 // will be smaller than A or C, but don't know the relation between A and C.
1714 Value *A = CSrc->getOperand(0);
1715 unsigned SrcSize = A->getType()->getScalarSizeInBits();
1716 unsigned MidSize = CSrc->getType()->getScalarSizeInBits();
1717 unsigned DstSize = DestTy->getScalarSizeInBits();
1718 // If we're actually extending zero bits, then if
1719 // SrcSize < DstSize: zext(a & mask)
1720 // SrcSize == DstSize: a & mask
1721 // SrcSize > DstSize: trunc(a) & mask
1722 if (SrcSize < DstSize) {
1723 APInt AndValue(APInt::getLowBitsSet(SrcSize, MidSize));
1724 Constant *AndConst = ConstantInt::get(A->getType(), AndValue);
1725 Value *And = Builder.CreateAnd(A, AndConst, CSrc->getName() + ".mask");
1726 return new ZExtInst(And, DestTy);
1727 }
1728
1729 if (SrcSize == DstSize) {
1730 APInt AndValue(APInt::getLowBitsSet(SrcSize, MidSize));
1731 return BinaryOperator::CreateAnd(A, ConstantInt::get(A->getType(),
1732 AndValue));
1733 }
1734 if (SrcSize > DstSize) {
1735 Value *Trunc = Builder.CreateTrunc(A, DestTy);
1736 APInt AndValue(APInt::getLowBitsSet(DstSize, MidSize));
1737 return BinaryOperator::CreateAnd(Trunc,
1738 ConstantInt::get(Trunc->getType(),
1739 AndValue));
1740 }
1741 }
1742
1743 if (auto *Cmp = dyn_cast<ICmpInst>(Src))
1744 return transformZExtICmp(Cmp, Zext);
1745
1746 Constant *C;
1747 Value *X;
1748 // zext((trunc(X) & C) ^ C) -> ((X & zext(C)) ^ zext(C)).
1749 Value *And;
1750 if (match(Src, m_OneUse(m_Xor(m_Value(And), m_Constant(C)))) &&
1752 m_Specific(C))))) {
1753 Value *ZC = Builder.CreateZExt(C, DestTy);
1754 return BinaryOperator::CreateXor(Builder.CreateAnd(X, ZC), ZC);
1755 }
1756
1757 // zext(sub(0, trunc(X))) -> and(sub(0, X), mask)
1758 if (match(Src, m_Sub(m_Zero(), m_Trunc(m_SpecificType(DestTy, X))))) {
1760 SrcTy->getScalarSizeInBits());
1761 Value *Neg = Builder.CreateSub(ConstantInt::get(DestTy, 0), X);
1762 return BinaryOperator::CreateAnd(Neg, ConstantInt::get(DestTy, Mask));
1763 }
1764
1765 // If we are truncating, masking, and then zexting back to the original type,
1766 // that's just a mask. This is not handled by canEvaluateZextd if the
1767 // intermediate values have extra uses. This could be generalized further for
1768 // a non-constant mask operand.
1769 // zext (and (trunc X), C) --> and X, (zext C)
1770 if (match(Src, m_And(m_Trunc(m_SpecificType(DestTy, X)), m_Constant(C)))) {
1771 Value *ZextC = Builder.CreateZExt(C, DestTy);
1772 return BinaryOperator::CreateAnd(X, ZextC);
1773 }
1774
1775 Value *Y;
1777 m_NUWTrunc(m_SpecificType(DestTy, X)), m_Value(Y))))) {
1778 Value *ZextY = Builder.CreateZExt(Y, DestTy);
1779 return BinaryOperator::Create(cast<BinaryOperator>(Src)->getOpcode(), X,
1780 ZextY);
1781 }
1782
1783 if (match(Src, m_VScale())) {
1784 if (Zext.getFunction() &&
1785 Zext.getFunction()->hasFnAttribute(Attribute::VScaleRange)) {
1786 Attribute Attr =
1787 Zext.getFunction()->getFnAttribute(Attribute::VScaleRange);
1788 if (std::optional<unsigned> MaxVScale = Attr.getVScaleRangeMax()) {
1789 unsigned TypeWidth = Src->getType()->getScalarSizeInBits();
1790 if (Log2_32(*MaxVScale) < TypeWidth)
1791 return replaceInstUsesWith(Zext, Builder.CreateVScale(DestTy));
1792 }
1793 }
1794 }
1795
1796 if (!Zext.hasNonNeg()) {
1797 // If this zero extend is only used by a shift, add nneg flag.
1798 if (Zext.hasOneUse() &&
1799 SrcTy->getScalarSizeInBits() >
1800 Log2_64_Ceil(DestTy->getScalarSizeInBits()) &&
1801 match(Zext.user_back(), m_Shift(m_Value(), m_Specific(&Zext)))) {
1802 Zext.setNonNeg();
1803 return &Zext;
1804 }
1805
1806 if (isKnownNonNegative(Src, SQ.getWithInstruction(&Zext))) {
1807 Zext.setNonNeg();
1808 return &Zext;
1809 }
1810 }
1811
1812 return nullptr;
1813}
1814
1815/// Transform (sext icmp) to bitwise / integer operations to eliminate the icmp.
1816Instruction *InstCombinerImpl::transformSExtICmp(ICmpInst *Cmp,
1817 SExtInst &Sext) {
1818 Value *Op0 = Cmp->getOperand(0), *Op1 = Cmp->getOperand(1);
1819 ICmpInst::Predicate Pred = Cmp->getPredicate();
1820
1821 // Don't bother if Op1 isn't of vector or integer type.
1822 if (!Op1->getType()->isIntOrIntVectorTy())
1823 return nullptr;
1824
1825 if (Pred == ICmpInst::ICMP_SLT && match(Op1, m_ZeroInt())) {
1826 // sext (x <s 0) --> ashr x, 31 (all ones if negative)
1827 Value *Sh = ConstantInt::get(Op0->getType(),
1828 Op0->getType()->getScalarSizeInBits() - 1);
1829 Value *In = Builder.CreateAShr(Op0, Sh, Op0->getName() + ".lobit");
1830 if (In->getType() != Sext.getType())
1831 In = Builder.CreateIntCast(In, Sext.getType(), true /*SExt*/);
1832
1833 return replaceInstUsesWith(Sext, In);
1834 }
1835
1836 if (ConstantInt *Op1C = dyn_cast<ConstantInt>(Op1)) {
1837 // If we know that only one bit of the LHS of the icmp can be set and we
1838 // have an equality comparison with zero or a power of 2, we can transform
1839 // the icmp and sext into bitwise/integer operations.
1840 if (Cmp->hasOneUse() &&
1841 Cmp->isEquality() && (Op1C->isZero() || Op1C->getValue().isPowerOf2())){
1842 KnownBits Known = computeKnownBits(Op0, &Sext);
1843
1844 APInt KnownZeroMask(~Known.Zero);
1845 if (KnownZeroMask.isPowerOf2()) {
1846 Value *In = Cmp->getOperand(0);
1847
1848 // If the icmp tests for a known zero bit we can constant fold it.
1849 if (!Op1C->isZero() && Op1C->getValue() != KnownZeroMask) {
1850 Value *V = Pred == ICmpInst::ICMP_NE ?
1852 ConstantInt::getNullValue(Sext.getType());
1853 return replaceInstUsesWith(Sext, V);
1854 }
1855
1856 if (!Op1C->isZero() == (Pred == ICmpInst::ICMP_NE)) {
1857 // sext ((x & 2^n) == 0) -> (x >> n) - 1
1858 // sext ((x & 2^n) != 2^n) -> (x >> n) - 1
1859 unsigned ShiftAmt = KnownZeroMask.countr_zero();
1860 // Perform a right shift to place the desired bit in the LSB.
1861 if (ShiftAmt)
1862 In = Builder.CreateLShr(In,
1863 ConstantInt::get(In->getType(), ShiftAmt));
1864
1865 // At this point "In" is either 1 or 0. Subtract 1 to turn
1866 // {1, 0} -> {0, -1}.
1867 In = Builder.CreateAdd(In,
1868 ConstantInt::getAllOnesValue(In->getType()),
1869 "sext");
1870 } else {
1871 // sext ((x & 2^n) != 0) -> (x << bitwidth-n) a>> bitwidth-1
1872 // sext ((x & 2^n) == 2^n) -> (x << bitwidth-n) a>> bitwidth-1
1873 unsigned ShiftAmt = KnownZeroMask.countl_zero();
1874 // Perform a left shift to place the desired bit in the MSB.
1875 if (ShiftAmt)
1876 In = Builder.CreateShl(In,
1877 ConstantInt::get(In->getType(), ShiftAmt));
1878
1879 // Distribute the bit over the whole bit width.
1880 In = Builder.CreateAShr(In, ConstantInt::get(In->getType(),
1881 KnownZeroMask.getBitWidth() - 1), "sext");
1882 }
1883
1884 if (Sext.getType() == In->getType())
1885 return replaceInstUsesWith(Sext, In);
1886 return CastInst::CreateIntegerCast(In, Sext.getType(), true/*SExt*/);
1887 }
1888 }
1889 }
1890
1891 return nullptr;
1892}
1893
1894/// Return true if we can take the specified value and return it as type Ty
1895/// without inserting any new casts and without changing the value of the common
1896/// low bits. This is used by code that tries to promote integer operations to
1897/// a wider types will allow us to eliminate the extension.
1898///
1899/// This function works on both vectors and scalars.
1900///
1901bool TypeEvaluationHelper::canEvaluateSExtd(Value *V, Type *Ty,
1902 unsigned MaxTypeEvalDepth) {
1903 TypeEvaluationHelper TYH(MaxTypeEvalDepth);
1904 return TYH.canEvaluateSExtdImpl(V, Ty) && TYH.allPendingVisited();
1905}
1906
1907bool TypeEvaluationHelper::canEvaluateSExtdImpl(Value *V, Type *Ty) {
1908 return canEvaluate(V, Ty, [this](Value *V, Type *Ty) {
1909 return canEvaluateSExtdPred(V, Ty);
1910 });
1911}
1912
1913bool TypeEvaluationHelper::canEvaluateSExtdPred(Value *V, Type *Ty) {
1914 assert(V->getType()->getScalarSizeInBits() < Ty->getScalarSizeInBits() &&
1915 "Can't sign extend type to a smaller type");
1916
1917 auto *I = cast<Instruction>(V);
1918 switch (I->getOpcode()) {
1919 case Instruction::SExt: // sext(sext(x)) -> sext(x)
1920 case Instruction::ZExt: // sext(zext(x)) -> zext(x)
1921 case Instruction::Trunc: // sext(trunc(x)) -> trunc(x) or sext(x)
1922 return true;
1923 case Instruction::And:
1924 case Instruction::Or:
1925 case Instruction::Xor:
1926 case Instruction::Add:
1927 case Instruction::Sub:
1928 case Instruction::Mul:
1929 // These operators can all arbitrarily be extended if their inputs can.
1930 return canEvaluateSExtdImpl(I->getOperand(0), Ty) &&
1931 canEvaluateSExtdImpl(I->getOperand(1), Ty);
1932
1933 // case Instruction::Shl: TODO
1934 // case Instruction::LShr: TODO
1935
1936 case Instruction::Select:
1937 return canEvaluateSExtdImpl(I->getOperand(1), Ty) &&
1938 canEvaluateSExtdImpl(I->getOperand(2), Ty);
1939
1940 case Instruction::PHI: {
1941 // We can change a phi if we can change all operands. Note that we never
1942 // get into trouble with cyclic PHIs here because canEvaluate handles use
1943 // chain loops.
1944 PHINode *PN = cast<PHINode>(I);
1945 for (Value *IncValue : PN->incoming_values())
1946 if (!canEvaluateSExtdImpl(IncValue, Ty))
1947 return false;
1948 return true;
1949 }
1950 default:
1951 // TODO: Can handle more cases here.
1952 break;
1953 }
1954
1955 return false;
1956}
1957
1959 // If this sign extend is only used by a truncate, let the truncate be
1960 // eliminated before we try to optimize this sext.
1961 if (Sext.hasOneUse() && isa<TruncInst>(Sext.user_back()))
1962 return nullptr;
1963
1964 if (Instruction *I = commonCastTransforms(Sext))
1965 return I;
1966
1967 Value *Src = Sext.getOperand(0);
1968 Type *SrcTy = Src->getType(), *DestTy = Sext.getType();
1969 unsigned SrcBitSize = SrcTy->getScalarSizeInBits();
1970 unsigned DestBitSize = DestTy->getScalarSizeInBits();
1971
1972 // If the value being extended is zero or positive, use a zext instead.
1973 if (isKnownNonNegative(Src, SQ.getWithInstruction(&Sext))) {
1974 auto CI = CastInst::Create(Instruction::ZExt, Src, DestTy);
1975 CI->setNonNeg(true);
1976 return CI;
1977 }
1978
1979 Value *X;
1980 if (match(Src, m_Trunc(m_Value(X)))) {
1981 // If the input has more sign bits than bits truncated, then convert
1982 // directly to final type.
1983 unsigned XBitSize = X->getType()->getScalarSizeInBits();
1984 unsigned TruncatedBits = XBitSize - SrcBitSize;
1985 bool HasNSW = cast<TruncInst>(Src)->hasNoSignedWrap();
1986 if (HasNSW || (ComputeNumSignBits(X, &Sext) > TruncatedBits)) {
1987 auto *Res = CastInst::CreateIntegerCast(X, DestTy, /* isSigned */ true);
1988 if (auto *ResTrunc = dyn_cast<TruncInst>(Res); ResTrunc && HasNSW)
1989 ResTrunc->setHasNoSignedWrap(true);
1990 return Res;
1991 }
1992
1993 // If we are replacing shifted-in high zero bits with sign bits, convert
1994 // the logic shift to arithmetic shift and eliminate the cast to
1995 // intermediate type:
1996 // sext (trunc (lshr Y, C)) --> sext/trunc (ashr Y, C)
1997 // where C <= truncatedbits && signbits(Y) + C > truncatedbits
1998 Value *Y;
1999 const APInt *C;
2000 if (Src->hasOneUse() &&
2002 C->ule(TruncatedBits) &&
2003 (*C == TruncatedBits ||
2004 ComputeNumSignBits(Y, &Sext) + C->getZExtValue() > TruncatedBits)) {
2005 Value *Ashr = Builder.CreateAShr(Y, C->getZExtValue());
2006 return CastInst::CreateIntegerCast(Ashr, DestTy, /* isSigned */ true);
2007 }
2008
2009 // If input is a trunc from the destination type, then convert into shifts.
2010 if (Src->hasOneUse() && X->getType() == DestTy) {
2011 // sext (trunc X) --> ashr (shl X, C), C
2012 Constant *ShAmt = ConstantInt::get(DestTy, DestBitSize - SrcBitSize);
2013 return BinaryOperator::CreateAShr(Builder.CreateShl(X, ShAmt), ShAmt);
2014 }
2015 }
2016
2017 // Try to extend the entire expression tree to the wide destination type.
2018 bool ShouldExtendExpression = true;
2019 Value *TruncSrc = nullptr;
2020 // It is not desirable to extend expression in the trunc + sext pattern when
2021 // destination type is narrower than original (pre-trunc) type.
2022 if (match(Src, m_Trunc(m_Value(TruncSrc))))
2023 if (TruncSrc->getType()->getScalarSizeInBits() > DestBitSize)
2024 ShouldExtendExpression = false;
2025 if (ShouldExtendExpression && shouldChangeType(SrcTy, DestTy) &&
2026 TypeEvaluationHelper::canEvaluateSExtd(Src, DestTy,
2027 CLOpts.max_type_eval_depth)) {
2028 // Okay, we can transform this! Insert the new expression now.
2029 LLVM_DEBUG(
2030 dbgs() << "ICE: EvaluateInDifferentType converting expression type"
2031 " to avoid sign extend: "
2032 << Sext << '\n');
2033 Value *Res = EvaluateInDifferentType(Src, DestTy, true);
2034 assert(Res->getType() == DestTy);
2035
2036 // If the high bits are already filled with sign bit, just replace this
2037 // cast with the result.
2038 if (ComputeNumSignBits(Res, &Sext) > DestBitSize - SrcBitSize)
2039 return replaceInstUsesWith(Sext, Res);
2040
2041 // We need to emit a shl + ashr to do the sign extend.
2042 Value *ShAmt = ConstantInt::get(DestTy, DestBitSize - SrcBitSize);
2043 return BinaryOperator::CreateAShr(Builder.CreateShl(Res, ShAmt, "sext"),
2044 ShAmt);
2045 }
2046
2047 if (auto *Cmp = dyn_cast<ICmpInst>(Src))
2048 return transformSExtICmp(Cmp, Sext);
2049
2050 // If the input is a shl/ashr pair of a same constant, then this is a sign
2051 // extension from a smaller value. If we could trust arbitrary bitwidth
2052 // integers, we could turn this into a truncate to the smaller bit and then
2053 // use a sext for the whole extension. Since we don't, look deeper and check
2054 // for a truncate. If the source and dest are the same type, eliminate the
2055 // trunc and extend and just do shifts. For example, turn:
2056 // %a = trunc i32 %i to i8
2057 // %b = shl i8 %a, C
2058 // %c = ashr i8 %b, C
2059 // %d = sext i8 %c to i32
2060 // into:
2061 // %a = shl i32 %i, 32-(8-C)
2062 // %d = ashr i32 %a, 32-(8-C)
2063 Value *A = nullptr;
2064 // TODO: Eventually this could be subsumed by EvaluateInDifferentType.
2065 Constant *BA = nullptr, *CA = nullptr;
2066 if (match(Src,
2068 m_ImmConstant(CA))) &&
2069 BA->isElementWiseEqual(CA)) {
2070 Constant *WideCurrShAmt =
2071 ConstantFoldCastOperand(Instruction::SExt, CA, DestTy, DL);
2072 assert(WideCurrShAmt && "Constant folding of ImmConstant cannot fail");
2073 Constant *NumLowbitsLeft = ConstantExpr::getSub(
2074 ConstantInt::get(DestTy, SrcTy->getScalarSizeInBits()), WideCurrShAmt);
2075 Constant *NewShAmt = ConstantExpr::getSub(
2076 ConstantInt::get(DestTy, DestTy->getScalarSizeInBits()),
2077 NumLowbitsLeft);
2078 NewShAmt =
2080 A = Builder.CreateShl(A, NewShAmt, Sext.getName());
2081 return BinaryOperator::CreateAShr(A, NewShAmt);
2082 }
2083
2084 // Splatting a bit of constant-index across a value:
2085 // sext (ashr (trunc iN X to iM), M-1) to iN --> ashr (shl X, N-M), N-1
2086 // If the dest type is different, use a cast (adjust use check).
2087 if (match(Src, m_OneUse(m_AShr(m_Trunc(m_Value(X)),
2088 m_SpecificInt(SrcBitSize - 1))))) {
2089 Type *XTy = X->getType();
2090 unsigned XBitSize = XTy->getScalarSizeInBits();
2091 Constant *ShlAmtC = ConstantInt::get(XTy, XBitSize - SrcBitSize);
2092 Constant *AshrAmtC = ConstantInt::get(XTy, XBitSize - 1);
2093 if (XTy == DestTy)
2094 return BinaryOperator::CreateAShr(Builder.CreateShl(X, ShlAmtC),
2095 AshrAmtC);
2096 if (cast<BinaryOperator>(Src)->getOperand(0)->hasOneUse()) {
2097 Value *Ashr = Builder.CreateAShr(Builder.CreateShl(X, ShlAmtC), AshrAmtC);
2098 return CastInst::CreateIntegerCast(Ashr, DestTy, /* isSigned */ true);
2099 }
2100 }
2101
2102 if (match(Src, m_VScale())) {
2103 if (Sext.getFunction() &&
2104 Sext.getFunction()->hasFnAttribute(Attribute::VScaleRange)) {
2105 Attribute Attr =
2106 Sext.getFunction()->getFnAttribute(Attribute::VScaleRange);
2107 if (std::optional<unsigned> MaxVScale = Attr.getVScaleRangeMax())
2108 if (Log2_32(*MaxVScale) < (SrcBitSize - 1))
2109 return replaceInstUsesWith(Sext, Builder.CreateVScale(DestTy));
2110 }
2111 }
2112
2113 // sext(scmp(x, y)) -> scmp(x, y) with a wider result type.
2114 // sext(ucmp(x, y)) -> ucmp(x, y) with a wider result type.
2115 // scmp/ucmp return only -1, 0, or 1, which sign-extend correctly to any
2116 // wider integer type, so we can sink the extension into the intrinsic.
2117 if (auto *CI = dyn_cast<CmpIntrinsic>(Src); CI && CI->hasOneUse())
2118 return replaceInstUsesWith(
2119 Sext, Builder.CreateIntrinsic(DestTy, CI->getIntrinsicID(),
2120 {CI->getLHS(), CI->getRHS()}));
2121
2122 Value *Y;
2124 m_NSWTrunc(m_SpecificType(DestTy, X)), m_Value(Y))))) {
2125 Value *SextY = Builder.CreateSExt(Y, DestTy);
2126 return BinaryOperator::Create(cast<BinaryOperator>(Src)->getOpcode(), X,
2127 SextY);
2128 }
2129
2130 return nullptr;
2131}
2132
2133/// Return a Constant* for the specified floating-point constant if it fits
2134/// in the specified FP type without changing its value.
2135static bool fitsInFPType(APFloat F, const fltSemantics &Sem) {
2136 bool losesInfo;
2137 (void)F.convert(Sem, APFloat::rmNearestTiesToEven, &losesInfo);
2138 return !losesInfo;
2139}
2140
2142 bool PreferBFloat) {
2143 // See if the value can be truncated to bfloat and then reextended.
2144 if (PreferBFloat && fitsInFPType(F, APFloat::BFloat()))
2145 return Type::getBFloatTy(Ctx);
2146 // See if the value can be truncated to half and then reextended.
2147 if (!PreferBFloat && fitsInFPType(F, APFloat::IEEEhalf()))
2148 return Type::getHalfTy(Ctx);
2149 // See if the value can be truncated to float and then reextended.
2151 return Type::getFloatTy(Ctx);
2152 if (&F.getSemantics() == &APFloat::IEEEdouble())
2153 return nullptr; // Won't shrink.
2154 // See if the value can be truncated to double and then reextended.
2156 return Type::getDoubleTy(Ctx);
2157 // Don't try to shrink to various long double types.
2158 return nullptr;
2159}
2160
2161static Type *shrinkFPConstant(ConstantFP *CFP, bool PreferBFloat) {
2162 Type *Ty = CFP->getType();
2163 if (Ty->getScalarType()->isPPC_FP128Ty())
2164 return nullptr; // No constant folding of this.
2165
2166 Type *ShrinkTy =
2167 shrinkFPConstant(CFP->getContext(), CFP->getValueAPF(), PreferBFloat);
2168 if (ShrinkTy)
2169 if (auto *VecTy = dyn_cast<VectorType>(Ty))
2170 ShrinkTy = VectorType::get(ShrinkTy, VecTy);
2171
2172 return ShrinkTy;
2173}
2174
2175// Determine if this is a vector of ConstantFPs and if so, return the minimal
2176// type we can safely truncate all elements to.
2177static Type *shrinkFPConstantVector(Value *V, bool PreferBFloat) {
2178 auto *CV = dyn_cast<Constant>(V);
2179 auto *CVVTy = dyn_cast<FixedVectorType>(V->getType());
2180 if (!CV || !CVVTy)
2181 return nullptr;
2182
2183 Type *MinType = nullptr;
2184
2185 unsigned NumElts = CVVTy->getNumElements();
2186
2187 // For fixed-width vectors we find the minimal type by looking
2188 // through the constant values of the vector.
2189 for (unsigned I = 0; I != NumElts; ++I) {
2190 if (match(CV->getAggregateElement(I), m_Poison()))
2191 continue;
2192
2193 auto *CFP = dyn_cast_or_null<ConstantFP>(CV->getAggregateElement(I));
2194 if (!CFP)
2195 return nullptr;
2196
2197 Type *T = shrinkFPConstant(CFP, PreferBFloat);
2198 if (!T)
2199 return nullptr;
2200
2201 // If we haven't found a type yet or this type has a larger mantissa than
2202 // our previous type, this is our new minimal type.
2203 if (!MinType || T->getFPMantissaWidth() > MinType->getFPMantissaWidth())
2204 MinType = T;
2205 }
2206
2207 // Make a vector type from the minimal type.
2208 return MinType ? FixedVectorType::get(MinType, NumElts) : nullptr;
2209}
2210
2211/// Find the minimum FP type we can safely truncate to.
2212static Type *getMinimumFPType(Value *V, Type *PreferredTy, InstCombiner &IC) {
2213 if (auto *FPExt = dyn_cast<FPExtInst>(V))
2214 return FPExt->getOperand(0)->getType();
2215
2216 Value *Src;
2217 if (match(V, m_IToFP(m_Value(Src))) &&
2218 IC.canBeCastedExactlyIntToFP(Src, PreferredTy, isa<SIToFPInst>(V),
2220 return PreferredTy;
2221
2222 bool PreferBFloat = PreferredTy->getScalarType()->isBFloatTy();
2223 // If this value is a constant, return the constant in the smallest FP type
2224 // that can accurately represent it. This allows us to turn
2225 // (float)((double)X+2.0) into x+2.0f.
2226 if (auto *CFP = dyn_cast<ConstantFP>(V))
2227 if (Type *T = shrinkFPConstant(CFP, PreferBFloat))
2228 return T;
2229
2230 // Try to shrink scalable and fixed splat vectors.
2231 if (auto *FPC = dyn_cast<Constant>(V))
2232 if (auto *VTy = dyn_cast<VectorType>(V->getType()))
2233 if (auto *Splat = dyn_cast_or_null<ConstantFP>(FPC->getSplatValue()))
2234 if (Type *T = shrinkFPConstant(Splat, PreferBFloat))
2235 return VectorType::get(T, VTy);
2236
2237 // Try to shrink a vector of FP constants. This returns nullptr on scalable
2238 // vectors
2239 if (Type *T = shrinkFPConstantVector(V, PreferBFloat))
2240 return T;
2241
2242 return V->getType();
2243}
2244
2246 bool IsSigned,
2247 const Instruction *CtxI) const {
2248 Type *SrcTy = V->getType();
2249 assert(SrcTy->isIntOrIntVectorTy() && "Expected an integer type");
2250 int SrcSize = (int)SrcTy->getScalarSizeInBits() - IsSigned;
2251 int DestNumSigBits = FPTy->getFPMantissaWidth();
2252
2253 // Easy case - if the source integer type has less bits than the FP mantissa,
2254 // then the cast must be exact.
2255 if (SrcSize <= DestNumSigBits)
2256 return true;
2257
2258 // Cast from FP to integer and back to FP is independent of the intermediate
2259 // integer width because of poison on overflow.
2260 Value *F;
2261 if (match(V, m_FPToI(m_Value(F)))) {
2262 // If this is uitofp (fptosi F), the source needs an extra bit to avoid
2263 // potential rounding of negative FP input values.
2264 int SrcNumSigBits = F->getType()->getFPMantissaWidth();
2265 if (!IsSigned && match(V, m_FPToSI(m_Value())))
2266 SrcNumSigBits++;
2267
2268 // [su]itofp (fpto[su]i F) --> exact if the source type has less or equal
2269 // significant bits than the destination (and make sure neither type is
2270 // weird -- ppc_fp128).
2271 if (SrcNumSigBits > 0 && DestNumSigBits > 0 &&
2272 SrcNumSigBits <= DestNumSigBits)
2273 return true;
2274 }
2275
2276 // Try harder to find if the source integer type has less significant bits.
2277 // Compute number of sign bits or determine trailing zeros.
2278 KnownBits SrcKnown = computeKnownBits(V, CtxI);
2279 int SigBits = (int)SrcTy->getScalarSizeInBits() -
2280 SrcKnown.countMinLeadingZeros() -
2281 SrcKnown.countMinTrailingZeros();
2282 if (SigBits <= DestNumSigBits)
2283 return true;
2284
2285 // For sitofp, the sign maps to the FP sign bit, so only magnitude bits
2286 // (BitWidth - NumSignBits) consume mantissa.
2287 if (IsSigned) {
2288 SigBits = (int)SrcTy->getScalarSizeInBits() - ComputeNumSignBits(V, CtxI);
2289 if (SigBits <= DestNumSigBits)
2290 return true;
2291 }
2292
2293 return false;
2294}
2295
2297 CastInst::CastOps Opcode = I.getOpcode();
2298 assert((Opcode == CastInst::SIToFP || Opcode == CastInst::UIToFP) &&
2299 "Unexpected cast");
2300 Value *Src = I.getOperand(0);
2301 Type *FPTy = I.getType();
2302 return canBeCastedExactlyIntToFP(Src, FPTy, Opcode == CastInst::SIToFP, &I);
2303}
2304
2307 return I;
2308
2309 // If we have fptrunc(OpI (fpextend x), (fpextend y)), we would like to
2310 // simplify this expression to avoid one or more of the trunc/extend
2311 // operations if we can do so without changing the numerical results.
2312 //
2313 // The exact manner in which the widths of the operands interact to limit
2314 // what we can and cannot do safely varies from operation to operation, and
2315 // is explained below in the various case statements.
2316 Type *Ty = FPT.getType();
2317 auto *BO = dyn_cast<BinaryOperator>(FPT.getOperand(0));
2318 if (BO && BO->hasOneUse()) {
2319 Type *LHSMinType = getMinimumFPType(BO->getOperand(0), Ty, *this);
2320 Type *RHSMinType = getMinimumFPType(BO->getOperand(1), Ty, *this);
2321 unsigned OpWidth = BO->getType()->getFPMantissaWidth();
2322 unsigned LHSWidth = LHSMinType->getFPMantissaWidth();
2323 unsigned RHSWidth = RHSMinType->getFPMantissaWidth();
2324 unsigned SrcWidth = std::max(LHSWidth, RHSWidth);
2325 unsigned DstWidth = Ty->getFPMantissaWidth();
2326
2327 // The operands must be convertible to the destination type without loss.
2328 // This is more than comparing the significand widths: the source type may
2329 // have a larger exponent range (e.g. bfloat has fewer significand bits than
2330 // half, but a much wider range).
2331 auto IsLosslesslyConvertibleToDst = [&](Type *SrcTy) {
2333 SrcTy->getScalarType()->getFltSemantics(),
2334 Ty->getScalarType()->getFltSemantics(), /*IgnoreNaNs=*/true);
2335 };
2336 bool OperandsFitDst = IsLosslesslyConvertibleToDst(LHSMinType) &&
2337 IsLosslesslyConvertibleToDst(RHSMinType);
2338
2339 // Narrowing recomputes the binop in a smaller type, which can overflow to
2340 // inf where the wide op was finite. Therefore we can only keep ninf if
2341 // both the binop and the fptrunc have that flag.
2342 FastMathFlags NarrowFMF = BO->getFastMathFlags();
2343 NarrowFMF.setNoInfs(NarrowFMF.noInfs() && FPT.hasNoInfs());
2344
2345 switch (BO->getOpcode()) {
2346 default: break;
2347 case Instruction::FAdd:
2348 case Instruction::FSub:
2349 // For addition and subtraction, the infinitely precise result can
2350 // essentially be arbitrarily wide; proving that double rounding
2351 // will not occur because the result of OpI is exact (as we will for
2352 // FMul, for example) is hopeless. However, we *can* nonetheless
2353 // frequently know that double rounding cannot occur (or that it is
2354 // innocuous) by taking advantage of the specific structure of
2355 // infinitely-precise results that admit double rounding.
2356 //
2357 // Specifically, if OpWidth >= 2*DstWdith+1 and DstWidth is sufficient
2358 // to represent both sources, we can guarantee that the double
2359 // rounding is innocuous (See p50 of Figueroa's 2000 PhD thesis,
2360 // "A Rigorous Framework for Fully Supporting the IEEE Standard ..."
2361 // for proof of this fact).
2362 //
2363 // Note: Figueroa does not consider the case where DstFormat !=
2364 // SrcFormat. It's possible (likely even!) that this analysis
2365 // could be tightened for those cases, but they are rare (the main
2366 // case of interest here is (float)((double)float + float)).
2367 if (OpWidth >= 2 * DstWidth + 1 && OperandsFitDst) {
2368 Value *LHS = Builder.CreateFPTrunc(BO->getOperand(0), Ty);
2369 Value *RHS = Builder.CreateFPTrunc(BO->getOperand(1), Ty);
2370 Instruction *RI = BinaryOperator::Create(BO->getOpcode(), LHS, RHS);
2371 RI->setFastMathFlags(NarrowFMF);
2372 return RI;
2373 }
2374 break;
2375 case Instruction::FMul:
2376 // For multiplication, the infinitely precise result has at most
2377 // LHSWidth + RHSWidth significant bits; if OpWidth is sufficient
2378 // that such a value can be exactly represented, then no double
2379 // rounding can possibly occur; we can safely perform the operation
2380 // in the destination format if it can represent both sources.
2381 if (OpWidth >= LHSWidth + RHSWidth && OperandsFitDst) {
2382 Value *LHS = Builder.CreateFPTrunc(BO->getOperand(0), Ty);
2383 Value *RHS = Builder.CreateFPTrunc(BO->getOperand(1), Ty);
2384 return BinaryOperator::CreateFMulFMF(LHS, RHS, NarrowFMF);
2385 }
2386 break;
2387 case Instruction::FDiv:
2388 // For division, we use again use the bound from Figueroa's
2389 // dissertation. I am entirely certain that this bound can be
2390 // tightened in the unbalanced operand case by an analysis based on
2391 // the diophantine rational approximation bound, but the well-known
2392 // condition used here is a good conservative first pass.
2393 // TODO: Tighten bound via rigorous analysis of the unbalanced case.
2394 if (OpWidth >= 2 * DstWidth && OperandsFitDst) {
2395 Value *LHS = Builder.CreateFPTrunc(BO->getOperand(0), Ty);
2396 Value *RHS = Builder.CreateFPTrunc(BO->getOperand(1), Ty);
2397 return BinaryOperator::CreateFDivFMF(LHS, RHS, NarrowFMF);
2398 }
2399 break;
2400 case Instruction::FRem: {
2401 // Remainder is straightforward. Remainder is always exact, so the
2402 // type of OpI doesn't enter into things at all. We simply evaluate
2403 // in whichever source type is larger, then convert to the
2404 // destination type.
2405 if (SrcWidth == OpWidth)
2406 break;
2407 Value *LHS, *RHS;
2408 if (LHSWidth == SrcWidth) {
2409 LHS = Builder.CreateFPTrunc(BO->getOperand(0), LHSMinType);
2410 RHS = Builder.CreateFPTrunc(BO->getOperand(1), LHSMinType);
2411 } else {
2412 LHS = Builder.CreateFPTrunc(BO->getOperand(0), RHSMinType);
2413 RHS = Builder.CreateFPTrunc(BO->getOperand(1), RHSMinType);
2414 }
2415
2416 Value *ExactResult = Builder.CreateFRemFMF(LHS, RHS, BO);
2417 return CastInst::CreateFPCast(ExactResult, Ty);
2418 }
2419 }
2420 }
2421
2422 // (fptrunc (fneg x)) -> (fneg (fptrunc x))
2423 Value *X;
2425 if (Op && Op->hasOneUse()) {
2426 FastMathFlags FMF = FPT.getFastMathFlags();
2427 if (auto *FPMO = dyn_cast<FPMathOperator>(Op))
2428 FMF &= FPMO->getFastMathFlags();
2429
2430 if (match(Op, m_FNeg(m_Value(X)))) {
2431 Value *InnerTrunc = Builder.CreateFPTruncFMF(X, Ty, FMF);
2432 Value *Neg = Builder.CreateFNegFMF(InnerTrunc, FMF);
2433 return replaceInstUsesWith(FPT, Neg);
2434 }
2435
2436 // If we are truncating a select that has an extended operand, we can
2437 // narrow the other operand and do the select as a narrow op.
2438 Value *Cond, *X, *Y;
2440 m_Value(Y)))) {
2441 // fptrunc (select Cond, (fpext X), Y --> select Cond, X, (fptrunc Y)
2442 Value *NarrowY = Builder.CreateFPTruncFMF(Y, Ty, FMF);
2443 Value *Sel =
2444 Builder.CreateSelectFMF(Cond, X, NarrowY, FMF, "narrow.sel", Op);
2445 return replaceInstUsesWith(FPT, Sel);
2446 }
2448 m_FPExt(m_SpecificType(Ty, X))))) {
2449 // fptrunc (select Cond, Y, (fpext X) --> select Cond, (fptrunc Y), X
2450 Value *NarrowY = Builder.CreateFPTruncFMF(Y, Ty, FMF);
2451 Value *Sel =
2452 Builder.CreateSelectFMF(Cond, NarrowY, X, FMF, "narrow.sel", Op);
2453 return replaceInstUsesWith(FPT, Sel);
2454 }
2455 }
2456
2457 if (auto *II = dyn_cast<IntrinsicInst>(FPT.getOperand(0))) {
2458 switch (II->getIntrinsicID()) {
2459 default: break;
2460 case Intrinsic::ceil:
2461 case Intrinsic::fabs:
2462 case Intrinsic::floor:
2463 case Intrinsic::nearbyint:
2464 case Intrinsic::rint:
2465 case Intrinsic::round:
2466 case Intrinsic::roundeven:
2467 case Intrinsic::trunc: {
2468 Value *Src = II->getArgOperand(0);
2469 if (!Src->hasOneUse())
2470 break;
2471
2472 // Except for fabs, this transformation requires the input of the unary FP
2473 // operation to be itself an fpext from the type to which we're
2474 // truncating.
2475 if (II->getIntrinsicID() != Intrinsic::fabs) {
2476 FPExtInst *FPExtSrc = dyn_cast<FPExtInst>(Src);
2477 if (!FPExtSrc || FPExtSrc->getSrcTy() != Ty)
2478 break;
2479 }
2480
2481 // Do unary FP operation on smaller type.
2482 // (fptrunc (fabs x)) -> (fabs (fptrunc x))
2483 Value *InnerTrunc = Builder.CreateFPTrunc(Src, Ty);
2485 FPT.getModule(), II->getIntrinsicID(), Ty);
2487 II->getOperandBundlesAsDefs(OpBundles);
2488 CallInst *NewCI =
2489 CallInst::Create(Overload, {InnerTrunc}, OpBundles, II->getName());
2490 // A normal value may be converted to an infinity. It means that we cannot
2491 // propagate ninf from the intrinsic. So we propagate FMF from fptrunc.
2492 NewCI->copyFastMathFlags(&FPT);
2493 return NewCI;
2494 }
2495 }
2496 }
2497
2498 if (Instruction *I = shrinkInsertElt(FPT, Builder))
2499 return I;
2500
2501 Value *Src = FPT.getOperand(0);
2502 if (isa<SIToFPInst>(Src) || isa<UIToFPInst>(Src)) {
2503 auto *FPCast = cast<CastInst>(Src);
2504 if (isKnownExactCastIntToFP(*FPCast))
2505 return CastInst::Create(FPCast->getOpcode(), FPCast->getOperand(0), Ty);
2506 }
2507
2508 return nullptr;
2509}
2510
2512 // If the source operand is a cast from integer to FP and known exact, then
2513 // cast the integer operand directly to the destination type.
2514 Type *Ty = FPExt.getType();
2515 Value *Src = FPExt.getOperand(0);
2516 if (isa<SIToFPInst>(Src) || isa<UIToFPInst>(Src)) {
2517 auto *FPCast = cast<CastInst>(Src);
2518 if (isKnownExactCastIntToFP(*FPCast))
2519 return CastInst::Create(FPCast->getOpcode(), FPCast->getOperand(0), Ty);
2520 }
2521
2522 return commonCastTransforms(FPExt);
2523}
2524
2525/// fpto{s/u}i[.sat]({u/s}itofp(X)) --> X or zext(X) or sext(X) or trunc(X)
2526/// This is safe if the intermediate type has enough bits in its mantissa to
2527/// accurately represent all values of X. For example, this won't work with
2528/// i64 -> float -> i64.
2529template <typename FPToIntTy>
2531 constexpr bool IsSaturating = std::is_same_v<FPToIntTy, IntrinsicInst>;
2532
2533 if (!isa<UIToFPInst>(FI.getOperand(0)) && !isa<SIToFPInst>(FI.getOperand(0)))
2534 return nullptr;
2535
2536 auto *OpI = cast<CastInst>(FI.getOperand(0));
2537 Value *X = OpI->getOperand(0);
2538 Type *XType = X->getType();
2539 Type *DestType = FI.getType();
2540 bool IsInputSigned = isa<SIToFPInst>(OpI);
2541
2542 bool IsOutputSigned;
2543 if constexpr (IsSaturating)
2544 IsOutputSigned = FI.getIntrinsicID() == Intrinsic::fptosi_sat;
2545 else
2546 IsOutputSigned = isa<FPToSIInst>(FI);
2547
2548 // Since we can assume the conversion won't overflow, our decision as to
2549 // whether the input will fit in the float should depend on the minimum
2550 // of the input range and output range.
2551
2552 // This means this is also safe for a signed input and unsigned output, since
2553 // a negative input would lead to undefined behavior.
2554 if (!isKnownExactCastIntToFP(*OpI)) {
2555 if constexpr (!IsSaturating) {
2556 // The first cast may not round exactly based on the source integer width
2557 // and FP width, but the overflow UB rules can still allow this to fold.
2558 // If the destination type is narrow, that means the intermediate FP value
2559 // must be large enough to hold the source value exactly.
2560 //
2561 // For example, (uint8_t)((float)(uint32_t 16777217) is UB.
2562 int OutputSize = (int)DestType->getScalarSizeInBits();
2563 if (OutputSize > OpI->getType()->getFPMantissaWidth())
2564 return nullptr;
2565 } else {
2566 // Sat intrinsics produce a defined saturated value on overflow, so
2567 // the UB-based shortcut is invalid. Require exactness.
2568 return nullptr;
2569 }
2570 }
2571
2572 unsigned SrcWidth = XType->getScalarSizeInBits();
2573 unsigned DestWidth = DestType->getScalarSizeInBits();
2574
2575 if constexpr (IsSaturating) {
2576 // TODO: cross-sign and narrowing cases could be handled with range
2577 // analysis to prove the source fits in the destination.
2578 if (IsInputSigned != IsOutputSigned || DestWidth < SrcWidth)
2579 return nullptr;
2580 }
2581
2582 if (DestWidth > SrcWidth) {
2583 if (IsInputSigned && IsOutputSigned)
2584 return new SExtInst(X, DestType);
2585 return new ZExtInst(X, DestType);
2586 }
2587 if (DestWidth < SrcWidth)
2588 return new TruncInst(X, DestType);
2589
2590 assert(XType == DestType && "Unexpected types for int to FP to int casts");
2591 return replaceInstUsesWith(FI, X);
2592}
2593
2595template Instruction *
2597
2599 // fpto{u/s}i non-norm --> 0
2600 FPClassTest Mask =
2601 FI.getOpcode() == Instruction::FPToUI ? fcPosNormal : fcNormal;
2603 FI.getOperand(0), Mask, IC.getSimplifyQuery().getWithInstruction(&FI));
2604 if (FPClass.isKnownNever(Mask))
2606
2607 // fpto{u/s}i (trunc X) --> fpto{u/s}i X
2608 Value *Src;
2610 return IC.replaceOperand(FI, 0, Src);
2611
2612 // fpto{u/s}i (fdiv ({u/s}itofp X to F), C_fp) --> {u/s}div X, C
2613 //
2614 // F has precision p (significand bits incl. hidden bit); C_fp is the exact FP
2615 // value of the integer constant C. Given N = integer width, this is safe if:
2616 // Unsigned: C > 0 and N <= p.
2617 // Signed: C != 0 and N - 1 <= p, excluding (X == INT_MIN, C == -1) since
2618 // sdiv INT_MIN, -1 is UB while the FP path only yields poison.
2619 // fdiv X, -1 gets transformed to fneg in InstCombine regardless.
2620 //
2621 // The bounds make {u/s}itofp and C_fp exact (every |int| <= 2^p is exact),
2622 // and ensure the rounded quotient never crosses an integer boundary:
2623 // Rounding lemma: for 0 <= A <= 2^p, 1 <= B <= 2^p, q = floor(A/B),
2624 // trunc(R_p(A/B)) = q.
2625 // For r = A - qB > 0, m = q+1, half-gap H(m) <= q/2^p and
2626 // m - A/B = (B-r)/B >= 1/B > q/2^p >= H(m), so R_p(A/B) < m; q = 0 is
2627 // similar (H(1) = 2^(-p-1) < 2^-p <= 1/B).
2628 // Signed case: by symmetry R_p(-z) = -R_p(z), so fptosi yields s*q = sdiv.
2629 bool IsSigned = FI.getOpcode() == Instruction::FPToSI;
2630 Value *X;
2631 const APFloat *APF;
2632 if (IsSigned) {
2633 if (!match(FI.getOperand(0),
2635 return nullptr;
2636 } else {
2637 if (!match(FI.getOperand(0),
2639 return nullptr;
2640 }
2641 Type *IntTy = X->getType();
2642 if (FI.getType() != IntTy)
2643 return nullptr;
2644
2645 unsigned IntWidth = IntTy->getScalarSizeInBits();
2646 unsigned Precision = APFloat::semanticsPrecision(APF->getSemantics());
2647 if (Precision + IsSigned < IntWidth)
2648 return nullptr;
2649
2650 if (!APF->isInteger())
2651 return nullptr;
2652
2653 APSInt Divisor(IntWidth, !IsSigned);
2654 bool IsExact = false;
2655 APF->convertToInteger(Divisor, APFloat::rmTowardZero, &IsExact);
2656 if (!IsExact)
2657 return nullptr;
2658
2659 if (Divisor.isZero())
2660 return nullptr;
2661
2662 // sdiv INT_MIN, -1 is UB, not poison, so this isn't valid if X == INT_MIN.
2663 // fdiv X, -1 gets transformed to fneg anyways, so we do not handle C == -1.
2664 if (IsSigned && Divisor.isAllOnes())
2665 return nullptr;
2666
2667 Constant *C = ConstantInt::get(IntTy, Divisor);
2668 return IsSigned ? BinaryOperator::CreateSDiv(X, C)
2669 : BinaryOperator::CreateUDiv(X, C);
2670}
2671
2673 if (Instruction *I = foldItoFPtoI(FI))
2674 return I;
2675
2676 if (Instruction *I = foldFPtoI(FI, *this))
2677 return I;
2678
2679 return commonCastTransforms(FI);
2680}
2681
2683 if (Instruction *I = foldItoFPtoI(FI))
2684 return I;
2685
2686 if (Instruction *I = foldFPtoI(FI, *this))
2687 return I;
2688
2689 return commonCastTransforms(FI);
2690}
2691
2693 if (Instruction *R = commonCastTransforms(CI))
2694 return R;
2695 if (!CI.hasNonNeg() && isKnownNonNegative(CI.getOperand(0), SQ)) {
2696 CI.setNonNeg();
2697 return &CI;
2698 }
2699
2700 // uitofp (and (trunc X), Mask) --> uitofp (and X, zext(Mask))
2701 Value *Src = CI.getOperand(0);
2702 Value *X;
2703 Constant *Mask;
2705 m_ImmConstant(Mask))))) {
2706 unsigned SourceWidth = Src->getType()->getScalarSizeInBits();
2707 unsigned InputWidth = X->getType()->getScalarSizeInBits();
2708 if (!DL.isLegalInteger(SourceWidth) &&
2709 shouldChangeType(SourceWidth, InputWidth)) {
2710 Value *MaskedX =
2711 Builder.CreateAnd(X, Builder.CreateZExt(Mask, X->getType()));
2712 auto *NewUIToFP =
2713 CastInst::Create(Instruction::UIToFP, MaskedX, CI.getType());
2714 NewUIToFP->setNonNeg(CI.hasNonNeg());
2715 return NewUIToFP;
2716 }
2717 }
2718
2719 return nullptr;
2720}
2721
2723 if (Instruction *R = commonCastTransforms(CI))
2724 return R;
2725 if (isKnownNonNegative(CI.getOperand(0), SQ)) {
2726 auto *UI =
2727 CastInst::Create(Instruction::UIToFP, CI.getOperand(0), CI.getType());
2728 UI->setNonNeg(true);
2729 // nnan/afn/reassoc/contract/arcp carry no meaning for a value-preserving
2730 // cast, but ninf/nsz are semantically meaningful for {u,s}itofp and
2731 // remain valid after reinterpreting the operand as unsigned.
2732 UI->setHasNoInfs(CI.hasNoInfs());
2733 UI->setHasNoSignedZeros(CI.hasNoSignedZeros());
2734 return UI;
2735 }
2736 return nullptr;
2737}
2738
2740 // If the source integer type is not the intptr_t type for this target, do a
2741 // trunc or zext to the intptr_t type, then inttoptr of it. This allows the
2742 // cast to be exposed to other transforms.
2743 unsigned AS = CI.getAddressSpace();
2744 if (CI.getOperand(0)->getType()->getScalarSizeInBits() !=
2745 DL.getPointerSizeInBits(AS)) {
2746 Type *Ty = CI.getOperand(0)->getType()->getWithNewType(
2747 DL.getIntPtrType(CI.getContext(), AS));
2748 Value *P = Builder.CreateZExtOrTrunc(CI.getOperand(0), Ty);
2749 return new IntToPtrInst(P, CI.getType());
2750 }
2751
2752 // Replace (inttoptr (add (ptrtoint %Base), %Offset)) with
2753 // (getelementptr i8, %Base, %Offset) if the pointer is only used as integer
2754 // value.
2755 Value *Base;
2756 Value *Offset;
2757 auto UsesPointerAsInt = [](User *U) {
2759 return true;
2760 if (auto *P = dyn_cast<PHINode>(U))
2761 return P->hasOneUse() && isa<ICmpInst, PtrToIntInst>(*P->user_begin());
2762 return false;
2763 };
2764 if (match(CI.getOperand(0),
2766 m_Value(Offset)))) &&
2768 Base->getType()->getPointerAddressSpace() &&
2769 all_of(CI.users(), UsesPointerAsInt)) {
2770 return GetElementPtrInst::Create(Builder.getInt8Ty(), Base, Offset);
2771 }
2772
2774 return I;
2775
2776 return nullptr;
2777}
2778
2780 // Look through chain of one-use GEPs.
2781 Type *PtrTy = Ptr->getType();
2783 while (true) {
2784 auto *GEP = dyn_cast<GEPOperator>(Ptr);
2785 if (!GEP || !GEP->hasOneUse())
2786 break;
2787 GEPs.push_back(GEP);
2788 Ptr = GEP->getPointerOperand();
2789 }
2790
2791 // Don't handle case where GEP converts from pointer to vector.
2792 if (GEPs.empty() || PtrTy != Ptr->getType())
2793 return nullptr;
2794
2795 // Check whether we know the integer value of the base pointer.
2796 Value *Res;
2797 Type *IdxTy = DL.getIndexType(PtrTy);
2798 if (match(Ptr, m_OneUse(m_IntToPtr(m_Value(Res)))) &&
2799 Res->getType() == IntTy && IntTy == IdxTy) {
2800 // pass
2801 } else if (isa<ConstantPointerNull>(Ptr)) {
2802 Res = Constant::getNullValue(IdxTy);
2803 } else {
2804 return nullptr;
2805 }
2806
2807 // Perform the entire operation on integers instead.
2808 for (GEPOperator *GEP : reverse(GEPs)) {
2809 Value *Offset = EmitGEPOffset(GEP);
2810 Res = Builder.CreateAdd(Res, Offset, "", GEP->hasNoUnsignedWrap());
2811 }
2812 return Builder.CreateZExtOrTrunc(Res, IntTy);
2813}
2814
2816 // If the destination integer type is not the intptr_t type for this target,
2817 // do a ptrtoint to intptr_t then do a trunc or zext. This allows the cast
2818 // to be exposed to other transforms.
2820 Type *SrcTy = SrcOp->getType();
2821 Type *Ty = CI.getType();
2822 unsigned AS = CI.getPointerAddressSpace();
2823 unsigned TySize = Ty->getScalarSizeInBits();
2824 unsigned PtrSize = DL.getPointerSizeInBits(AS);
2825 if (TySize != PtrSize) {
2826 Type *IntPtrTy =
2827 SrcTy->getWithNewType(DL.getIntPtrType(CI.getContext(), AS));
2828 Value *P = Builder.CreatePtrToInt(SrcOp, IntPtrTy);
2829 return CastInst::CreateIntegerCast(P, Ty, /*isSigned=*/false);
2830 }
2831
2832 // (ptrtoint (ptrmask P, M))
2833 // -> (and (ptrtoint P), M)
2834 // This is generally beneficial as `and` is better supported than `ptrmask`.
2835 Value *Ptr, *Mask;
2837 m_Value(Ptr), m_SpecificType(Ty, Mask)))))
2838 return BinaryOperator::CreateAnd(Builder.CreatePtrToInt(Ptr, Ty), Mask);
2839
2840 if (Value *V = foldPtrToIntOrAddrOfGEP(Ty, SrcOp))
2841 return replaceInstUsesWith(CI, V);
2842
2843 Value *Vec, *Scalar, *Index;
2845 m_Value(Scalar), m_Value(Index))))) {
2846 assert(Vec->getType()->getScalarSizeInBits() == PtrSize && "Wrong type");
2847 // Convert the scalar to int followed by insert to eliminate one cast:
2848 // p2i (ins (i2p Vec), Scalar, Index --> ins Vec, (p2i Scalar), Index
2849 Value *NewCast = Builder.CreatePtrToInt(Scalar, Ty->getScalarType());
2850 return InsertElementInst::Create(Vec, NewCast, Index);
2851 }
2852
2853 return commonCastTransforms(CI);
2854}
2855
2858 Type *Ty = CI.getType();
2859
2860 // (ptrtoaddr (ptrmask P, M))
2861 // -> (and (ptrtoaddr P), M)
2862 // This is generally beneficial as `and` is better supported than `ptrmask`.
2863 Value *Ptr, *Mask;
2865 m_Value(Ptr), m_SpecificType(Ty, Mask)))))
2866 return BinaryOperator::CreateAnd(Builder.CreatePtrToAddr(Ptr), Mask);
2867
2868 if (Value *V = foldPtrToIntOrAddrOfGEP(Ty, SrcOp))
2869 return replaceInstUsesWith(CI, V);
2870
2871 // FIXME: Implement variants of ptrtoint folds.
2872 return commonCastTransforms(CI);
2873}
2874
2875/// This input value (which is known to have vector type) is being zero extended
2876/// or truncated to the specified vector type. Since the zext/trunc is done
2877/// using an integer type, we have a (bitcast(cast(bitcast))) pattern,
2878/// endianness will impact which end of the vector that is extended or
2879/// truncated.
2880///
2881/// A vector is always stored with index 0 at the lowest address, which
2882/// corresponds to the most significant bits for a big endian stored integer and
2883/// the least significant bits for little endian. A trunc/zext of an integer
2884/// impacts the big end of the integer. Thus, we need to add/remove elements at
2885/// the front of the vector for big endian targets, and the back of the vector
2886/// for little endian targets.
2887///
2888/// Try to replace it with a shuffle (and vector/vector bitcast) if possible.
2889///
2890/// The source and destination vector types may have different element types.
2891static Instruction *
2893 InstCombinerImpl &IC) {
2894 // We can only do this optimization if the output is a multiple of the input
2895 // element size, or the input is a multiple of the output element size.
2896 // Convert the input type to have the same element type as the output.
2897 VectorType *SrcTy = cast<VectorType>(InVal->getType());
2898
2899 if (SrcTy->getElementType() != DestTy->getElementType()) {
2900 // The input types don't need to be identical, but for now they must be the
2901 // same size. There is no specific reason we couldn't handle things like
2902 // <4 x i16> -> <4 x i32> by bitcasting to <2 x i32> but haven't gotten
2903 // there yet.
2904 if (SrcTy->getElementType()->getPrimitiveSizeInBits() !=
2905 DestTy->getElementType()->getPrimitiveSizeInBits())
2906 return nullptr;
2907
2908 SrcTy =
2909 FixedVectorType::get(DestTy->getElementType(),
2910 cast<FixedVectorType>(SrcTy)->getNumElements());
2911 InVal = IC.Builder.CreateBitCast(InVal, SrcTy);
2912 }
2913
2914 bool IsBigEndian = IC.getDataLayout().isBigEndian();
2915 unsigned SrcElts = cast<FixedVectorType>(SrcTy)->getNumElements();
2916 unsigned DestElts = cast<FixedVectorType>(DestTy)->getNumElements();
2917
2918 assert(SrcElts != DestElts && "Element counts should be different.");
2919
2920 // Now that the element types match, get the shuffle mask and RHS of the
2921 // shuffle to use, which depends on whether we're increasing or decreasing the
2922 // size of the input.
2923 auto ShuffleMaskStorage = llvm::to_vector<16>(llvm::seq<int>(0, SrcElts));
2924 ArrayRef<int> ShuffleMask;
2925 Value *V2;
2926
2927 if (SrcElts > DestElts) {
2928 // If we're shrinking the number of elements (rewriting an integer
2929 // truncate), just shuffle in the elements corresponding to the least
2930 // significant bits from the input and use poison as the second shuffle
2931 // input.
2932 V2 = PoisonValue::get(SrcTy);
2933 // Make sure the shuffle mask selects the "least significant bits" by
2934 // keeping elements from back of the src vector for big endian, and from the
2935 // front for little endian.
2936 ShuffleMask = ShuffleMaskStorage;
2937 if (IsBigEndian)
2938 ShuffleMask = ShuffleMask.take_back(DestElts);
2939 else
2940 ShuffleMask = ShuffleMask.take_front(DestElts);
2941 } else {
2942 // If we're increasing the number of elements (rewriting an integer zext),
2943 // shuffle in all of the elements from InVal. Fill the rest of the result
2944 // elements with zeros from a constant zero.
2945 V2 = Constant::getNullValue(SrcTy);
2946 // Use first elt from V2 when indicating zero in the shuffle mask.
2947 uint32_t NullElt = SrcElts;
2948 // Extend with null values in the "most significant bits" by adding elements
2949 // in front of the src vector for big endian, and at the back for little
2950 // endian.
2951 unsigned DeltaElts = DestElts - SrcElts;
2952 if (IsBigEndian)
2953 ShuffleMaskStorage.insert(ShuffleMaskStorage.begin(), DeltaElts, NullElt);
2954 else
2955 ShuffleMaskStorage.append(DeltaElts, NullElt);
2956 ShuffleMask = ShuffleMaskStorage;
2957 }
2958
2959 return new ShuffleVectorInst(InVal, V2, ShuffleMask);
2960}
2961
2962static bool isMultipleOfTypeSize(unsigned Value, Type *Ty) {
2963 return Value % Ty->getPrimitiveSizeInBits() == 0;
2964}
2965
2966static unsigned getTypeSizeIndex(unsigned Value, Type *Ty) {
2967 return Value / Ty->getPrimitiveSizeInBits();
2968}
2969
2970/// V is a value which is inserted into a vector of VecEltTy.
2971/// Look through the value to see if we can decompose it into
2972/// insertions into the vector. See the example in the comment for
2973/// OptimizeIntegerToVectorInsertions for the pattern this handles.
2974/// The type of V is always a non-zero multiple of VecEltTy's size.
2975/// Shift is the number of bits between the lsb of V and the lsb of
2976/// the vector.
2977///
2978/// This returns false if the pattern can't be matched or true if it can,
2979/// filling in Elements with the elements found here.
2980static bool collectInsertionElements(Value *V, unsigned Shift,
2981 SmallVectorImpl<Value *> &Elements,
2982 Type *VecEltTy, bool isBigEndian) {
2983 assert(isMultipleOfTypeSize(Shift, VecEltTy) &&
2984 "Shift should be a multiple of the element type size");
2985
2986 // Poison values never contribute useful bits to the result.
2987 if (match(V, m_Poison()))
2988 return true;
2989
2990 // If we got down to a value of the right type, we win, try inserting into the
2991 // right element.
2992 if (V->getType() == VecEltTy) {
2993 // Inserting null doesn't actually insert any elements.
2994 if (Constant *C = dyn_cast<Constant>(V))
2995 if (C->isNullValue())
2996 return true;
2997
2998 unsigned ElementIndex = getTypeSizeIndex(Shift, VecEltTy);
2999 if (isBigEndian)
3000 ElementIndex = Elements.size() - ElementIndex - 1;
3001
3002 // Fail if multiple elements are inserted into this slot.
3003 if (Elements[ElementIndex])
3004 return false;
3005
3006 Elements[ElementIndex] = V;
3007 return true;
3008 }
3009
3010 if (Constant *C = dyn_cast<Constant>(V)) {
3011 // Figure out the # elements this provides, and bitcast it or slice it up
3012 // as required.
3013 unsigned NumElts = getTypeSizeIndex(C->getType()->getPrimitiveSizeInBits(),
3014 VecEltTy);
3015 // If the constant is the size of a vector element, we just need to bitcast
3016 // it to the right type so it gets properly inserted.
3017 if (NumElts == 1)
3019 Shift, Elements, VecEltTy, isBigEndian);
3020
3021 // Okay, this is a constant that covers multiple elements. Slice it up into
3022 // pieces and insert each element-sized piece into the vector.
3023 if (!isa<IntegerType>(C->getType()))
3024 C = ConstantExpr::getBitCast(C, IntegerType::get(V->getContext(),
3025 C->getType()->getPrimitiveSizeInBits()));
3026 unsigned ElementSize = VecEltTy->getPrimitiveSizeInBits();
3027 Type *ElementIntTy = IntegerType::get(C->getContext(), ElementSize);
3028
3029 for (unsigned i = 0; i != NumElts; ++i) {
3030 unsigned ShiftI = i * ElementSize;
3032 Instruction::LShr, C, ConstantInt::get(C->getType(), ShiftI));
3033 if (!Piece)
3034 return false;
3035
3036 Piece = ConstantExpr::getTrunc(Piece, ElementIntTy);
3037 if (!collectInsertionElements(Piece, ShiftI + Shift, Elements, VecEltTy,
3038 isBigEndian))
3039 return false;
3040 }
3041 return true;
3042 }
3043
3044 if (!V->hasOneUse()) return false;
3045
3047 if (!I) return false;
3048 switch (I->getOpcode()) {
3049 default: return false; // Unhandled case.
3050 case Instruction::BitCast:
3051 if (I->getOperand(0)->getType()->isVectorTy())
3052 return false;
3053 return collectInsertionElements(I->getOperand(0), Shift, Elements, VecEltTy,
3054 isBigEndian);
3055 case Instruction::ZExt:
3057 I->getOperand(0)->getType()->getPrimitiveSizeInBits(),
3058 VecEltTy))
3059 return false;
3060 return collectInsertionElements(I->getOperand(0), Shift, Elements, VecEltTy,
3061 isBigEndian);
3062 case Instruction::Or:
3063 return collectInsertionElements(I->getOperand(0), Shift, Elements, VecEltTy,
3064 isBigEndian) &&
3065 collectInsertionElements(I->getOperand(1), Shift, Elements, VecEltTy,
3066 isBigEndian);
3067 case Instruction::Shl: {
3068 // Must be shifting by a constant that is a multiple of the element size.
3069 ConstantInt *CI = dyn_cast<ConstantInt>(I->getOperand(1));
3070 if (!CI) return false;
3071 Shift += CI->getZExtValue();
3072 if (!isMultipleOfTypeSize(Shift, VecEltTy)) return false;
3073 return collectInsertionElements(I->getOperand(0), Shift, Elements, VecEltTy,
3074 isBigEndian);
3075 }
3076
3077 }
3078}
3079
3080
3081/// If the input is an 'or' instruction, we may be doing shifts and ors to
3082/// assemble the elements of the vector manually.
3083/// Try to rip the code out and replace it with insertelements. This is to
3084/// optimize code like this:
3085///
3086/// %tmp37 = bitcast float %inc to i32
3087/// %tmp38 = zext i32 %tmp37 to i64
3088/// %tmp31 = bitcast float %inc5 to i32
3089/// %tmp32 = zext i32 %tmp31 to i64
3090/// %tmp33 = shl i64 %tmp32, 32
3091/// %ins35 = or i64 %tmp33, %tmp38
3092/// %tmp43 = bitcast i64 %ins35 to <2 x float>
3093///
3094/// Into two insertelements that do "buildvector{%inc, %inc5}".
3096 InstCombinerImpl &IC) {
3097 auto *DestVecTy = cast<FixedVectorType>(CI.getType());
3098 Value *IntInput = CI.getOperand(0);
3099
3100 // if the int input is just an undef value do not try to optimize to vector
3101 // insertions as it will prevent undef propagation
3102 if (isa<UndefValue>(IntInput))
3103 return nullptr;
3104
3105 SmallVector<Value*, 8> Elements(DestVecTy->getNumElements());
3106 if (!collectInsertionElements(IntInput, 0, Elements,
3107 DestVecTy->getElementType(),
3108 IC.getDataLayout().isBigEndian()))
3109 return nullptr;
3110
3111 // If we succeeded, we know that all of the element are specified by Elements
3112 // or are zero if Elements has a null entry. Recast this as a set of
3113 // insertions.
3114 Value *Result = Constant::getNullValue(CI.getType());
3115 for (unsigned i = 0, e = Elements.size(); i != e; ++i) {
3116 if (!Elements[i]) continue; // Unset element.
3117
3118 Result = IC.Builder.CreateInsertElement(Result, Elements[i], i);
3119 }
3120
3121 return Result;
3122}
3123
3124/// Canonicalize scalar bitcasts of extracted elements into a bitcast of the
3125/// vector followed by extract element. The backend tends to handle bitcasts of
3126/// vectors better than bitcasts of scalars because vector registers are
3127/// usually not type-specific like scalar integer or scalar floating-point.
3129 InstCombinerImpl &IC) {
3130 Value *VecOp, *Index;
3131 if (!match(BitCast.getOperand(0),
3132 m_OneUse(m_ExtractElt(m_Value(VecOp), m_Value(Index)))))
3133 return nullptr;
3134
3135 // The bitcast must be to a vectorizable type, otherwise we can't make a new
3136 // type to extract from.
3137 Type *DestType = BitCast.getType();
3138 VectorType *VecType = cast<VectorType>(VecOp->getType());
3139 if (VectorType::isValidElementType(DestType)) {
3140 auto *NewVecType = VectorType::get(DestType, VecType);
3141 auto *NewBC = IC.Builder.CreateBitCast(VecOp, NewVecType, "bc");
3142 return ExtractElementInst::Create(NewBC, Index);
3143 }
3144
3145 // Only solve DestType is vector to avoid inverse transform in visitBitCast.
3146 // bitcast (extractelement <1 x elt>, dest) -> bitcast(<1 x elt>, dest)
3147 auto *FixedVType = dyn_cast<FixedVectorType>(VecType);
3148 if (DestType->isVectorTy() && FixedVType && FixedVType->getNumElements() == 1)
3149 return CastInst::Create(Instruction::BitCast, VecOp, DestType);
3150
3151 return nullptr;
3152}
3153
3154/// Change the type of a bitwise logic operation if we can eliminate a bitcast.
3156 InstCombiner::BuilderTy &Builder) {
3157 Type *DestTy = BitCast.getType();
3158 BinaryOperator *BO;
3159
3160 if (!match(BitCast.getOperand(0), m_OneUse(m_BinOp(BO))) ||
3161 !BO->isBitwiseLogicOp())
3162 return nullptr;
3163
3164 // FIXME: This transform is restricted to vector types to avoid backend
3165 // problems caused by creating potentially illegal operations. If a fix-up is
3166 // added to handle that situation, we can remove this check.
3167 if (!DestTy->isVectorTy() || !BO->getType()->isVectorTy())
3168 return nullptr;
3169
3170 if (DestTy->isFPOrFPVectorTy()) {
3171 Value *X, *Y;
3172 // bitcast(logic(bitcast(X), bitcast(Y))) -> bitcast'(logic(bitcast'(X), Y))
3173 if (match(BO->getOperand(0), m_OneUse(m_BitCast(m_Value(X)))) &&
3175 if (X->getType()->isFPOrFPVectorTy() &&
3176 Y->getType()->isIntOrIntVectorTy()) {
3177 Value *CastedOp =
3178 Builder.CreateBitCast(BO->getOperand(0), Y->getType());
3179 Value *NewBO = Builder.CreateBinOp(BO->getOpcode(), CastedOp, Y);
3180 return CastInst::CreateBitOrPointerCast(NewBO, DestTy);
3181 }
3182 if (X->getType()->isIntOrIntVectorTy() &&
3183 Y->getType()->isFPOrFPVectorTy()) {
3184 Value *CastedOp =
3185 Builder.CreateBitCast(BO->getOperand(1), X->getType());
3186 Value *NewBO = Builder.CreateBinOp(BO->getOpcode(), CastedOp, X);
3187 return CastInst::CreateBitOrPointerCast(NewBO, DestTy);
3188 }
3189 }
3190 return nullptr;
3191 }
3192
3193 if (!DestTy->isIntOrIntVectorTy())
3194 return nullptr;
3195
3196 Value *X;
3197 if (match(BO->getOperand(0),
3198 m_OneUse(m_BitCast(m_SpecificType(DestTy, X)))) &&
3199 !isa<Constant>(X)) {
3200 // bitcast(logic(bitcast(X), Y)) --> logic'(X, bitcast(Y))
3201 Value *CastedOp1 = Builder.CreateBitCast(BO->getOperand(1), DestTy);
3202 return BinaryOperator::Create(BO->getOpcode(), X, CastedOp1);
3203 }
3204
3205 if (match(BO->getOperand(1),
3206 m_OneUse(m_BitCast(m_SpecificType(DestTy, X)))) &&
3207 !isa<Constant>(X)) {
3208 // bitcast(logic(Y, bitcast(X))) --> logic'(bitcast(Y), X)
3209 Value *CastedOp0 = Builder.CreateBitCast(BO->getOperand(0), DestTy);
3210 return BinaryOperator::Create(BO->getOpcode(), CastedOp0, X);
3211 }
3212
3213 // Canonicalize vector bitcasts to come before vector bitwise logic with a
3214 // constant. This eases recognition of special constants for later ops.
3215 // Example:
3216 // icmp u/s (a ^ signmask), (b ^ signmask) --> icmp s/u a, b
3217 Constant *C;
3218 if (match(BO->getOperand(1), m_Constant(C))) {
3219 // bitcast (logic X, C) --> logic (bitcast X, C')
3220 Value *CastedOp0 = Builder.CreateBitCast(BO->getOperand(0), DestTy);
3221 Value *CastedC = Builder.CreateBitCast(C, DestTy);
3222 return BinaryOperator::Create(BO->getOpcode(), CastedOp0, CastedC);
3223 }
3224
3225 return nullptr;
3226}
3227
3228/// Change the type of a select if we can eliminate a bitcast.
3230 InstCombiner::BuilderTy &Builder) {
3231 Value *Cond, *TVal, *FVal;
3232 if (!match(BitCast.getOperand(0),
3233 m_OneUse(m_Select(m_Value(Cond), m_Value(TVal), m_Value(FVal)))))
3234 return nullptr;
3235
3236 // A vector select must maintain the same number of elements in its operands.
3237 Type *CondTy = Cond->getType();
3238 Type *DestTy = BitCast.getType();
3239
3240 auto *DestVecTy = dyn_cast<VectorType>(DestTy);
3241
3242 if (auto *CondVTy = dyn_cast<VectorType>(CondTy))
3243 if (!DestVecTy ||
3244 CondVTy->getElementCount() != DestVecTy->getElementCount())
3245 return nullptr;
3246
3247 auto *Sel = cast<Instruction>(BitCast.getOperand(0));
3248 auto *SrcVecTy = dyn_cast<VectorType>(TVal->getType());
3249
3250 if ((isa<Constant>(TVal) || isa<Constant>(FVal)) &&
3251 (!DestVecTy ||
3252 (SrcVecTy && ElementCount::isKnownLE(DestVecTy->getElementCount(),
3253 SrcVecTy->getElementCount())))) {
3254 // Avoid introducing select of vector (or select of vector with more
3255 // elements) until the backend can undo this transformation.
3256 Value *CastedTVal = Builder.CreateBitCast(TVal, DestTy);
3257 Value *CastedFVal = Builder.CreateBitCast(FVal, DestTy);
3258 return SelectInst::Create(Cond, CastedTVal, CastedFVal, "", nullptr, Sel);
3259 }
3260
3261 // FIXME: This transform is restricted from changing the select between
3262 // scalars and vectors to avoid backend problems caused by creating
3263 // potentially illegal operations. If a fix-up is added to handle that
3264 // situation, we can remove this check.
3265 if ((DestVecTy != nullptr) != (SrcVecTy != nullptr))
3266 return nullptr;
3267
3268 Value *X;
3269 if (match(TVal, m_OneUse(m_BitCast(m_SpecificType(DestTy, X)))) &&
3270 !isa<Constant>(X)) {
3271 // bitcast(select(Cond, bitcast(X), Y)) --> select'(Cond, X, bitcast(Y))
3272 Value *CastedVal = Builder.CreateBitCast(FVal, DestTy);
3273 return SelectInst::Create(Cond, X, CastedVal, "", nullptr, Sel);
3274 }
3275
3276 if (match(FVal, m_OneUse(m_BitCast(m_SpecificType(DestTy, X)))) &&
3277 !isa<Constant>(X)) {
3278 // bitcast(select(Cond, Y, bitcast(X))) --> select'(Cond, bitcast(Y), X)
3279 Value *CastedVal = Builder.CreateBitCast(TVal, DestTy);
3280 return SelectInst::Create(Cond, CastedVal, X, "", nullptr, Sel);
3281 }
3282
3283 return nullptr;
3284}
3285
3286/// Check if all users of CI are StoreInsts.
3287static bool hasStoreUsersOnly(CastInst &CI) {
3288 for (User *U : CI.users()) {
3289 if (!isa<StoreInst>(U))
3290 return false;
3291 }
3292 return true;
3293}
3294
3295/// This function handles following case
3296///
3297/// A -> B cast
3298/// PHI
3299/// B -> A cast
3300///
3301/// All the related PHI nodes can be replaced by new PHI nodes with type A.
3302/// The uses of \p CI can be changed to the new PHI node corresponding to \p PN.
3303Instruction *InstCombinerImpl::optimizeBitCastFromPhi(CastInst &CI,
3304 PHINode *PN) {
3305 // BitCast used by Store can be handled in InstCombineLoadStoreAlloca.cpp.
3306 if (hasStoreUsersOnly(CI))
3307 return nullptr;
3308
3309 Value *Src = CI.getOperand(0);
3310 Type *SrcTy = Src->getType(); // Type B
3311 Type *DestTy = CI.getType(); // Type A
3312
3313 SmallVector<PHINode *, 4> PhiWorklist;
3314 SmallSetVector<PHINode *, 4> OldPhiNodes;
3315
3316 // Find all of the A->B casts and PHI nodes.
3317 // We need to inspect all related PHI nodes, but PHIs can be cyclic, so
3318 // OldPhiNodes is used to track all known PHI nodes, before adding a new
3319 // PHI to PhiWorklist, it is checked against and added to OldPhiNodes first.
3320 PhiWorklist.push_back(PN);
3321 OldPhiNodes.insert(PN);
3322 while (!PhiWorklist.empty()) {
3323 auto *OldPN = PhiWorklist.pop_back_val();
3324 for (Value *IncValue : OldPN->incoming_values()) {
3325 if (isa<Constant>(IncValue))
3326 continue;
3327
3328 if (auto *LI = dyn_cast<LoadInst>(IncValue)) {
3329 // If there is a sequence of one or more load instructions, each loaded
3330 // value is used as address of later load instruction, bitcast is
3331 // necessary to change the value type, don't optimize it. For
3332 // simplicity we give up if the load address comes from another load.
3333 Value *Addr = LI->getOperand(0);
3334 if (Addr == &CI || isa<LoadInst>(Addr))
3335 return nullptr;
3336 // Don't tranform "load <256 x i32>, <256 x i32>*" to
3337 // "load x86_amx, x86_amx*", because x86_amx* is invalid.
3338 // TODO: Remove this check when bitcast between vector and x86_amx
3339 // is replaced with a specific intrinsic.
3340 if (DestTy->isX86_AMXTy())
3341 return nullptr;
3342 if (LI->hasOneUse() && LI->isSimple())
3343 continue;
3344 // If a LoadInst has more than one use, changing the type of loaded
3345 // value may create another bitcast.
3346 return nullptr;
3347 }
3348
3349 if (auto *PNode = dyn_cast<PHINode>(IncValue)) {
3350 if (OldPhiNodes.insert(PNode))
3351 PhiWorklist.push_back(PNode);
3352 continue;
3353 }
3354
3355 auto *BCI = dyn_cast<BitCastInst>(IncValue);
3356 // We can't handle other instructions.
3357 if (!BCI)
3358 return nullptr;
3359
3360 // Verify it's a A->B cast.
3361 Type *TyA = BCI->getOperand(0)->getType();
3362 Type *TyB = BCI->getType();
3363 if (TyA != DestTy || TyB != SrcTy)
3364 return nullptr;
3365 }
3366 }
3367
3368 // Check that each user of each old PHI node is something that we can
3369 // rewrite, so that all of the old PHI nodes can be cleaned up afterwards.
3370 for (auto *OldPN : OldPhiNodes) {
3371 for (User *V : OldPN->users()) {
3372 if (auto *SI = dyn_cast<StoreInst>(V)) {
3373 if (!SI->isSimple() || SI->getOperand(0) != OldPN)
3374 return nullptr;
3375 } else if (auto *BCI = dyn_cast<BitCastInst>(V)) {
3376 // Verify it's a B->A cast.
3377 Type *TyB = BCI->getOperand(0)->getType();
3378 Type *TyA = BCI->getType();
3379 if (TyA != DestTy || TyB != SrcTy)
3380 return nullptr;
3381 } else if (auto *PHI = dyn_cast<PHINode>(V)) {
3382 // As long as the user is another old PHI node, then even if we don't
3383 // rewrite it, the PHI web we're considering won't have any users
3384 // outside itself, so it'll be dead.
3385 if (!OldPhiNodes.contains(PHI))
3386 return nullptr;
3387 } else {
3388 return nullptr;
3389 }
3390 }
3391 }
3392
3393 // For each old PHI node, create a corresponding new PHI node with a type A.
3394 SmallDenseMap<PHINode *, PHINode *> NewPNodes;
3395 for (auto *OldPN : OldPhiNodes) {
3396 Builder.SetInsertPoint(OldPN);
3397 PHINode *NewPN = Builder.CreatePHI(DestTy, OldPN->getNumOperands());
3398 NewPNodes[OldPN] = NewPN;
3399 }
3400
3401 // Fill in the operands of new PHI nodes.
3402 for (auto *OldPN : OldPhiNodes) {
3403 PHINode *NewPN = NewPNodes[OldPN];
3404 for (unsigned j = 0, e = OldPN->getNumOperands(); j != e; ++j) {
3405 Value *V = OldPN->getOperand(j);
3406 Value *NewV = nullptr;
3407 if (auto *C = dyn_cast<Constant>(V)) {
3408 NewV = ConstantExpr::getBitCast(C, DestTy);
3409 } else if (auto *LI = dyn_cast<LoadInst>(V)) {
3410 // Explicitly perform load combine to make sure no opposing transform
3411 // can remove the bitcast in the meantime and trigger an infinite loop.
3412 Builder.SetInsertPoint(LI);
3413 NewV = combineLoadToNewType(*LI, DestTy);
3414 // Remove the old load and its use in the old phi, which itself becomes
3415 // dead once the whole transform finishes.
3416 replaceInstUsesWith(*LI, PoisonValue::get(LI->getType()));
3418 } else if (auto *BCI = dyn_cast<BitCastInst>(V)) {
3419 NewV = BCI->getOperand(0);
3420 } else if (auto *PrevPN = dyn_cast<PHINode>(V)) {
3421 NewV = NewPNodes[PrevPN];
3422 }
3423 assert(NewV);
3424 NewPN->addIncoming(NewV, OldPN->getIncomingBlock(j));
3425 }
3426 }
3427
3428 // Traverse all accumulated PHI nodes and process its users,
3429 // which are Stores and BitcCasts. Without this processing
3430 // NewPHI nodes could be replicated and could lead to extra
3431 // moves generated after DeSSA.
3432 // If there is a store with type B, change it to type A.
3433
3434
3435 // Replace users of BitCast B->A with NewPHI. These will help
3436 // later to get rid off a closure formed by OldPHI nodes.
3437 Instruction *RetVal = nullptr;
3438 for (auto *OldPN : OldPhiNodes) {
3439 PHINode *NewPN = NewPNodes[OldPN];
3440 for (User *V : make_early_inc_range(OldPN->users())) {
3441 if (auto *SI = dyn_cast<StoreInst>(V)) {
3442 assert(SI->isSimple() && SI->getOperand(0) == OldPN);
3443 Builder.SetInsertPoint(SI);
3444 auto *NewBC =
3445 cast<BitCastInst>(Builder.CreateBitCast(NewPN, SrcTy));
3446 SI->setOperand(0, NewBC);
3447 Worklist.push(SI);
3448 assert(hasStoreUsersOnly(*NewBC));
3449 }
3450 else if (auto *BCI = dyn_cast<BitCastInst>(V)) {
3451 Type *TyB = BCI->getOperand(0)->getType();
3452 Type *TyA = BCI->getType();
3453 assert(TyA == DestTy && TyB == SrcTy);
3454 (void) TyA;
3455 (void) TyB;
3456 Instruction *I = replaceInstUsesWith(*BCI, NewPN);
3457 if (BCI == &CI)
3458 RetVal = I;
3459 } else if (auto *PHI = dyn_cast<PHINode>(V)) {
3460 assert(OldPhiNodes.contains(PHI));
3461 (void) PHI;
3462 } else {
3463 llvm_unreachable("all uses should be handled");
3464 }
3465 }
3466 }
3467
3468 return RetVal;
3469}
3470
3471/// Fold (bitcast (or (and (bitcast X to int), signmask), nneg Y) to fp) to
3472/// copysign((bitcast Y to fp), X)
3474 InstCombiner::BuilderTy &Builder,
3475 const SimplifyQuery &SQ) {
3476 Value *X, *Y;
3477 Type *FTy = CI.getType();
3478 if (!FTy->isFPOrFPVectorTy())
3479 return nullptr;
3482 m_Value(Y)))))
3483 return nullptr;
3484 if (X->getType() != FTy)
3485 return nullptr;
3486 if (!isKnownNonNegative(Y, SQ))
3487 return nullptr;
3488
3489 return Builder.CreateCopySign(Builder.CreateBitCast(Y, FTy), X);
3490}
3491
3493 // If the operands are integer typed then apply the integer transforms,
3494 // otherwise just apply the common ones.
3495 Value *Src = CI.getOperand(0);
3496 Type *SrcTy = Src->getType();
3497 Type *DestTy = CI.getType();
3498
3499 // Get rid of casts from one type to the same type. These are useless and can
3500 // be replaced by the operand.
3501 if (DestTy == Src->getType())
3502 return replaceInstUsesWith(CI, Src);
3503
3504 if (isa<FixedVectorType>(DestTy)) {
3505 if (isa<IntegerType>(SrcTy)) {
3506 // If this is a cast from an integer to vector, check to see if the input
3507 // is a trunc or zext of a bitcast from vector. If so, we can replace all
3508 // the casts with a shuffle and (potentially) a bitcast.
3509 if (isa<TruncInst>(Src) || isa<ZExtInst>(Src)) {
3510 CastInst *SrcCast = cast<CastInst>(Src);
3511 if (BitCastInst *BCIn = dyn_cast<BitCastInst>(SrcCast->getOperand(0)))
3512 if (isa<VectorType>(BCIn->getOperand(0)->getType()))
3514 BCIn->getOperand(0), cast<VectorType>(DestTy), *this))
3515 return I;
3516 }
3517
3518 // If the input is an 'or' instruction, we may be doing shifts and ors to
3519 // assemble the elements of the vector manually. Try to rip the code out
3520 // and replace it with insertelements.
3521 if (Value *V = optimizeIntegerToVectorInsertions(CI, *this))
3522 return replaceInstUsesWith(CI, V);
3523 }
3524 }
3525
3526 if (FixedVectorType *SrcVTy = dyn_cast<FixedVectorType>(SrcTy)) {
3527 if (SrcVTy->getNumElements() == 1) {
3528 // If our destination is not a vector, then make this a straight
3529 // scalar-scalar cast.
3530 if (!DestTy->isVectorTy()) {
3531 Value *Elem = Builder.CreateExtractElement(Src, uint64_t{0});
3532 return CastInst::Create(Instruction::BitCast, Elem, DestTy);
3533 }
3534
3535 // Otherwise, see if our source is an insert. If so, then use the scalar
3536 // component directly:
3537 // bitcast (inselt <1 x elt> V, X, 0) to <n x m> --> bitcast X to <n x m>
3538 if (auto *InsElt = dyn_cast<InsertElementInst>(Src))
3539 return new BitCastInst(InsElt->getOperand(1), DestTy);
3540 }
3541
3542 // Convert an artificial vector insert into more analyzable bitwise logic.
3543 unsigned BitWidth = DestTy->getScalarSizeInBits();
3544 Value *X, *Y;
3545 uint64_t IndexC;
3546 if (match(Src, m_OneUse(m_InsertElt(
3548 m_Value(Y), m_ConstantInt(IndexC)))) &&
3549 DestTy->isIntegerTy() && Y->getType()->isIntegerTy() &&
3550 isDesirableIntType(BitWidth)) {
3551 // Adjust for big endian - the LSBs are at the high index.
3552 if (DL.isBigEndian())
3553 IndexC = SrcVTy->getNumElements() - 1 - IndexC;
3554
3555 // We only handle (endian-normalized) insert to index 0. Any other insert
3556 // would require a left-shift, so that is an extra instruction.
3557 if (IndexC == 0) {
3558 // bitcast (inselt (bitcast X), Y, 0) --> or (and X, MaskC), (zext Y)
3559 unsigned EltWidth = Y->getType()->getScalarSizeInBits();
3560 APInt MaskC = APInt::getHighBitsSet(BitWidth, BitWidth - EltWidth);
3561 Value *AndX = Builder.CreateAnd(X, MaskC);
3562 Value *ZextY = Builder.CreateZExt(Y, DestTy);
3563 return BinaryOperator::CreateOr(AndX, ZextY);
3564 }
3565 }
3566 }
3567
3568 if (auto *Shuf = dyn_cast<ShuffleVectorInst>(Src)) {
3569 // Okay, we have (bitcast (shuffle ..)). Check to see if this is
3570 // a bitcast to a vector with the same # elts.
3571 Value *ShufOp0 = Shuf->getOperand(0);
3572 Value *ShufOp1 = Shuf->getOperand(1);
3573 auto ShufElts = cast<VectorType>(Shuf->getType())->getElementCount();
3574 auto SrcVecElts = cast<VectorType>(ShufOp0->getType())->getElementCount();
3575 if (Shuf->hasOneUse() && DestTy->isVectorTy() &&
3576 cast<VectorType>(DestTy)->getElementCount() == ShufElts &&
3577 ShufElts == SrcVecElts) {
3578 BitCastInst *Tmp;
3579 // If either of the operands is a cast from CI.getType(), then
3580 // evaluating the shuffle in the casted destination's type will allow
3581 // us to eliminate at least one cast.
3582 if (((Tmp = dyn_cast<BitCastInst>(ShufOp0)) &&
3583 Tmp->getOperand(0)->getType() == DestTy) ||
3584 ((Tmp = dyn_cast<BitCastInst>(ShufOp1)) &&
3585 Tmp->getOperand(0)->getType() == DestTy)) {
3586 Value *LHS = Builder.CreateBitCast(ShufOp0, DestTy);
3587 Value *RHS = Builder.CreateBitCast(ShufOp1, DestTy);
3588 // Return a new shuffle vector. Use the same element ID's, as we
3589 // know the vector types match #elts.
3590 return new ShuffleVectorInst(LHS, RHS, Shuf->getShuffleMask());
3591 }
3592 }
3593
3594 // A bitcasted-to-scalar and byte/bit reversing shuffle is better recognized
3595 // as a byte/bit swap:
3596 // bitcast <N x i8> (shuf X, undef, <N, N-1,...0>) -> bswap (bitcast X)
3597 // bitcast <N x i1> (shuf X, undef, <N, N-1,...0>) -> bitreverse (bitcast X)
3598 if (DestTy->isIntegerTy() && ShufElts.getKnownMinValue() % 2 == 0 &&
3599 Shuf->hasOneUse() && Shuf->isReverse() && match(ShufOp1, m_Poison())) {
3600 unsigned IntrinsicNum = 0;
3601 if (DL.isLegalInteger(DestTy->getScalarSizeInBits()) &&
3602 SrcTy->getScalarSizeInBits() == 8) {
3603 IntrinsicNum = Intrinsic::bswap;
3604 } else if (SrcTy->getScalarSizeInBits() == 1) {
3605 IntrinsicNum = Intrinsic::bitreverse;
3606 }
3607 if (IntrinsicNum != 0) {
3608 assert(ShufOp0->getType() == SrcTy && "Unexpected shuffle mask");
3609 Function *BswapOrBitreverse = Intrinsic::getOrInsertDeclaration(
3610 CI.getModule(), IntrinsicNum, DestTy);
3611 Value *ScalarX = Builder.CreateBitCast(ShufOp0, DestTy);
3612 return CallInst::Create(BswapOrBitreverse, {ScalarX});
3613 }
3614 }
3615 }
3616
3617 // Handle the A->B->A cast, and there is an intervening PHI node.
3618 if (PHINode *PN = dyn_cast<PHINode>(Src))
3619 if (Instruction *I = optimizeBitCastFromPhi(CI, PN))
3620 return I;
3621
3622 if (Instruction *I = canonicalizeBitCastExtElt(CI, *this))
3623 return I;
3624
3626 return I;
3627
3629 return I;
3630
3631 if (Value *V = foldCopySignIdioms(CI, Builder, SQ.getWithInstruction(&CI)))
3632 return replaceInstUsesWith(CI, V);
3633
3634 return commonCastTransforms(CI);
3635}
3636
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
uint64_t uint64_t
Rewrite undef for PHI
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define X(NUM, ENUM, NAME)
Definition ELF.h:857
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static std::optional< bool > isBigEndian(const SmallDenseMap< int64_t, int64_t, 8 > &MemOffset2Idx, int64_t LowestIdx)
Given a map from byte offsets in memory to indices in a load/store, determine if that map corresponds...
This file defines the DenseMap class.
static bool isSigned(unsigned Opcode)
Hexagon Common GEP
static bool collectInsertionElements(Value *V, unsigned Shift, SmallVectorImpl< Value * > &Elements, Type *VecEltTy, bool isBigEndian)
V is a value which is inserted into a vector of VecEltTy.
static bool hasStoreUsersOnly(CastInst &CI)
Check if all users of CI are StoreInsts.
static Value * foldCopySignIdioms(BitCastInst &CI, InstCombiner::BuilderTy &Builder, const SimplifyQuery &SQ)
Fold (bitcast (or (and (bitcast X to int), signmask), nneg Y) to fp) to copysign((bitcast Y to fp),...
static Type * shrinkFPConstantVector(Value *V, bool PreferBFloat)
static Instruction * canonicalizeBitCastExtElt(BitCastInst &BitCast, InstCombinerImpl &IC)
Canonicalize scalar bitcasts of extracted elements into a bitcast of the vector followed by extract e...
static Instruction * shrinkSplatShuffle(TruncInst &Trunc, InstCombiner::BuilderTy &Builder)
Try to narrow the width of a splat shuffle.
static Instruction * foldFPtoI(Instruction &FI, InstCombiner &IC)
static Instruction * foldBitCastSelect(BitCastInst &BitCast, InstCombiner::BuilderTy &Builder)
Change the type of a select if we can eliminate a bitcast.
static Instruction * foldBitCastBitwiseLogic(BitCastInst &BitCast, InstCombiner::BuilderTy &Builder)
Change the type of a bitwise logic operation if we can eliminate a bitcast.
static bool fitsInFPType(APFloat F, const fltSemantics &Sem)
Return a Constant* for the specified floating-point constant if it fits in the specified FP type with...
static Instruction * optimizeVectorResizeWithIntegerBitCasts(Value *InVal, VectorType *DestTy, InstCombinerImpl &IC)
This input value (which is known to have vector type) is being zero extended or truncated to the spec...
static Instruction * shrinkInsertElt(CastInst &Trunc, InstCombiner::BuilderTy &Builder)
Try to narrow the width of an insert element.
SmallDenseMap< Value *, Value *, 8 > EvaluatedMap
static Type * getMinimumFPType(Value *V, Type *PreferredTy, InstCombiner &IC)
Find the minimum FP type we can safely truncate to.
static bool isMultipleOfTypeSize(unsigned Value, Type *Ty)
static Value * optimizeIntegerToVectorInsertions(BitCastInst &CI, InstCombinerImpl &IC)
If the input is an 'or' instruction, we may be doing shifts and ors to assemble the elements of the v...
static Type * shrinkFPConstant(LLVMContext &Ctx, const APFloat &F, bool PreferBFloat)
static Instruction * foldVecExtTruncToExtElt(TruncInst &Trunc, InstCombinerImpl &IC)
Whenever an element is extracted from a vector, optionally shifted down, and then truncated,...
static Value * EvaluateInDifferentTypeImpl(Value *V, Type *Ty, bool isSigned, InstCombinerImpl &IC, EvaluatedMap &Processed)
static unsigned getTypeSizeIndex(unsigned Value, Type *Ty)
static Instruction * foldVecTruncToExtElt(TruncInst &Trunc, InstCombinerImpl &IC)
Given a vector that is bitcast to an integer, optionally logically right-shifted, and truncated,...
This file provides internal interfaces used to implement the InstCombine.
This file provides the interface for the instcombine pass implementation.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define T
uint64_t IntrinsicInst * II
#define P(N)
This file contains the declarations for profiling metadata utility functions.
const SmallVectorImpl< MachineOperand > & Cond
This file contains some templates that are useful if you are working with the STL at all.
This file provides utility classes that use RAII to save and restore values.
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition Debug.h:119
static unsigned getScalarSizeInBits(Type *Ty)
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
Value * RHS
Value * LHS
static const fltSemantics & IEEEsingle()
Definition APFloat.h:304
static constexpr roundingMode rmTowardZero
Definition APFloat.h:365
static const fltSemantics & BFloat()
Definition APFloat.h:303
static const fltSemantics & IEEEdouble()
Definition APFloat.h:305
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:361
static LLVM_ABI unsigned int semanticsPrecision(const fltSemantics &)
Definition APFloat.cpp:335
static LLVM_ABI bool isLosslesslyConvertibleTo(const fltSemantics &From, const fltSemantics &To, bool IgnoreNaNs=false)
Returns whether converting a value from From to To is known to preserve all information.
Definition APFloat.cpp:238
static const fltSemantics & IEEEhalf()
Definition APFloat.h:302
static LLVM_ABI unsigned int semanticsIntSizeInBits(const fltSemantics &, bool)
Definition APFloat.cpp:349
const fltSemantics & getSemantics() const
Definition APFloat.h:1591
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Definition APFloat.h:1436
bool isInteger() const
Definition APFloat.h:1600
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1602
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1560
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition APInt.h:202
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:367
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:376
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Definition APInt.cpp:1695
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1115
int32_t exactLogBase2() const
Definition APInt.h:1803
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1659
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:302
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
Definition APInt.h:292
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:282
unsigned countr_one() const
Count the number of trailing one bits.
Definition APInt.h:1676
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1225
An arbitrary precision integer that knows its signedness.
Definition APSInt.h:24
This class represents a conversion between pointers from one address space to another.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
Functions, function parameters, and return types can have attributes to indicate how they should be t...
Definition Attributes.h:106
LLVM_ABI std::optional< unsigned > getVScaleRangeMax() const
Returns the maximum value for the vscale_range attribute or std::nullopt when unknown.
BinaryOps getOpcode() const
Definition InstrTypes.h:409
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
static BinaryOperator * CreateFMulFMF(Value *V1, Value *V2, FastMathFlags FMF, const Twine &Name="")
Definition InstrTypes.h:279
static BinaryOperator * CreateFDivFMF(Value *V1, Value *V2, FastMathFlags FMF, const Twine &Name="")
Definition InstrTypes.h:283
This class represents a no-op cast from one type to another.
This class represents a function call, abstracting a target machine's calling convention.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This is the base class for all instructions that perform data casts.
Definition InstrTypes.h:512
Type * getSrcTy() const
Return the source type, as a convenience.
Definition InstrTypes.h:679
Instruction::CastOps getOpcode() const
Return the opcode of this CastInst.
Definition InstrTypes.h:674
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.
static LLVM_ABI CastInst * CreateIntegerCast(Value *S, Type *Ty, bool isSigned, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a ZExt, BitCast, or Trunc for int -> int casts.
static LLVM_ABI CastInst * CreateFPCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create an FPExt, BitCast, or FPTrunc for fp -> fp casts.
static LLVM_ABI CastInst * CreateTruncOrBitCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a Trunc or BitCast cast instruction.
static LLVM_ABI CastInst * CreateBitOrPointerCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a BitCast, a PtrToInt, or an IntToPTr cast instruction.
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
Type * getDestTy() const
Return the destination type, as a convenience.
Definition InstrTypes.h:681
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
@ ICMP_SLT
signed less than
Definition InstrTypes.h:769
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:764
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:763
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:767
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:765
@ ICMP_NE
not equal
Definition InstrTypes.h:762
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:766
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
static LLVM_ABI Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getTrunc(Constant *C, Type *Ty, bool OnlyIfReduced=false)
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:420
const APFloat & getValueAPF() const
Definition Constants.h:463
This is the shared class of boolean and integer constants.
Definition Constants.h:87
static LLVM_ABI ConstantInt * getTrue(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
This is an important base class in LLVM.
Definition Constant.h:43
static LLVM_ABI Constant * mergeUndefsWith(Constant *C, Constant *Other)
Merges undefs of a Constant with another Constant, along with the undefs already present.
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 bool isElementWiseEqual(Value *Y) const
Return true if this constant and a constant 'Y' are element-wise equal.
bool isBigEndian() const
Definition DataLayout.h:218
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
Definition DenseMap.h:793
static ExtractElementInst * Create(Value *Vec, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This class represents an extension of floating point types.
This class represents a cast from floating point to signed integer.
This class represents a cast from floating point to unsigned integer.
This class represents a truncation of floating point types.
Convenience struct for specifying and reasoning about fast-math flags.
Definition FMF.h:23
bool noInfs() const
Definition FMF.h:66
void setNoInfs(bool B=true)
Definition FMF.h:81
Class to represent fixed width SIMD vectors.
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
Definition Type.cpp:843
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Definition Function.h:212
Attribute getFnAttribute(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind.
Definition Function.cpp:766
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:731
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This instruction compares its operands according to the predicate given to the constructor.
Value * CreateInsertElement(Type *VecTy, Value *NewElt, Value *Idx, const Twine &Name="")
Definition IRBuilder.h:2669
ConstantInt * getInt64(uint64_t C)
Get a constant 64-bit value.
Definition IRBuilder.h:470
ConstantInt * getInt32(uint32_t C)
Get a constant 32-bit value.
Definition IRBuilder.h:465
Value * CreateBitCast(Value *V, Type *DestTy, const Twine &Name="")
Definition IRBuilder.h:2243
static InsertElementInst * Create(Value *Vec, Value *NewElt, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Instruction * visitZExt(ZExtInst &Zext)
Instruction * visitAddrSpaceCast(AddrSpaceCastInst &CI)
Instruction * foldExtractionOfVectorDeinterleave(ZExtInst &RootZExt)
Instruction * visitSExt(SExtInst &Sext)
Instruction * foldOpIntoPhi(Instruction &I, PHINode *PN, bool AllowMultipleUses=false)
Given a binary operator, cast instruction, or select which has a PHI node as operand #0,...
Instruction * visitFPToSI(FPToSIInst &FI)
Instruction * visitTrunc(TruncInst &CI)
Instruction * visitUIToFP(CastInst &CI)
Instruction * visitPtrToInt(PtrToIntInst &CI)
Instruction * FoldOpIntoSelect(Instruction &Op, SelectInst *SI, bool FoldWithMultiUse=false, bool SimplifyBothArms=false)
Given an instruction with a select as one operand and a constant as the other operand,...
Instruction * foldItoFPtoI(FPToIntTy &FI)
fpto{s/u}i.sat --> X or zext(X) or sext(X) or trunc(X) This is safe if the intermediate type has enou...
Instruction * visitSIToFP(CastInst &CI)
Instruction * commonCastTransforms(CastInst &CI)
Implement the transforms common to all CastInst visitors.
Instruction * eraseInstFromFunction(Instruction &I) override
Combiner aware instruction erasure.
Instruction * visitFPTrunc(FPTruncInst &CI)
const InstCombineCLOptions & CLOpts
Value * foldPtrToIntOrAddrOfGEP(Type *IntTy, Value *Ptr)
Instruction * visitBitCast(BitCastInst &CI)
Instruction * visitIntToPtr(IntToPtrInst &CI)
Instruction * visitFPToUI(FPToUIInst &FI)
Instruction * visitPtrToAddr(PtrToAddrInst &CI)
Instruction * foldCmpLoadFromIndexedGlobal(LoadInst *LI, GetElementPtrInst *GEP, CmpPredicate Pred, Constant *RHSC, Instruction &CtxI, ConstantInt *AndCst=nullptr)
This is called when we see this pattern: cmp pred (load (gep GV, ...)), cmpcst where GV is a global v...
Value * EvaluateInDifferentType(Value *V, Type *Ty, bool isSigned)
Given an expression that CanEvaluateTruncated or CanEvaluateSExtd returns true for,...
bool SimplifyDemandedInstructionBits(Instruction &Inst)
Tries to simplify operands to an integer instruction based on its demanded bits.
Instruction * visitFPExt(CastInst &CI)
LoadInst * combineLoadToNewType(LoadInst &LI, Type *NewTy, const Twine &Suffix="")
Helper to combine a load to a new type.
The core instruction combiner logic.
SimplifyQuery SQ
const DataLayout & getDataLayout() const
LLVM_ABI bool canBeCastedExactlyIntToFP(Value *V, Type *FPTy, bool IsSigned, const Instruction *CtxI=nullptr) const
unsigned ComputeMaxSignificantBits(const Value *Op, const Instruction *CtxI=nullptr, unsigned Depth=0) const
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
InstructionWorklist & Worklist
A worklist of the instructions that need to be simplified.
Instruction * InsertNewInstWith(Instruction *New, BasicBlock::iterator Old)
Same as InsertNewInstBefore, but also sets the debug loc.
const DataLayout & DL
unsigned ComputeNumSignBits(const Value *Op, const Instruction *CtxI=nullptr, unsigned Depth=0) const
bool MaskedValueIsZero(const Value *V, const APInt &Mask, const Instruction *CtxI=nullptr, unsigned Depth=0) const
LLVM_ABI bool isKnownExactCastIntToFP(CastInst &I) const
Return true if the cast from integer to FP can be proven to be exact for all possible inputs (the con...
IRBuilder< TargetFolder, IRBuilderInstCombineInserter > BuilderTy
An IRBuilder that automatically inserts new instructions into the worklist.
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
DominatorTree & DT
void computeKnownBits(const Value *V, KnownBits &Known, const Instruction *CtxI, unsigned Depth=0) const
const SimplifyQuery & getSimplifyQuery() const
LLVM_ABI bool hasNoInfs() const LLVM_READONLY
Determine whether the no-infs flag is set.
LLVM_ABI void copyFastMathFlags(FastMathFlags FMF)
Convenience function for transferring all fast-math flag values to this instruction,...
LLVM_ABI bool hasNoSignedZeros() const LLVM_READONLY
Determine whether the no-signed-zeros flag is set.
static bool isBitwiseLogicOp(unsigned Opcode)
Determine if the Opcode is and/or/xor.
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
LLVM_ABI void setFastMathFlags(FastMathFlags FMF)
Convenience function for setting multiple fast-math flags on this instruction, which must be an opera...
Instruction * user_back()
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
LLVM_ABI void setNonNeg(bool b=true)
Set or clear the nneg flag on this instruction, which must be a zext instruction.
LLVM_ABI bool hasNonNeg() const LLVM_READONLY
Determine whether the the nneg flag is set.
iterator_range< user_iterator > users()
LLVM_ABI FastMathFlags getFastMathFlags() const LLVM_READONLY
Convenience function for getting all the fast-math flags, which must be an operator which supports th...
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
LLVM_ABI void setIsExact(bool b=true)
Set or clear the exact flag on this instruction, which must be an operator which supports this flag.
This class represents a cast from an integer to a pointer.
unsigned getAddressSpace() const
Returns the address space of this instruction's pointer type.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:338
@ MAX_INT_BITS
Maximum number of bits that can be specified.
A wrapper class for inspecting calls to intrinsic functions.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:76
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
op_range incoming_values()
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
This class represents a cast from a pointer to an address (non-capturing ptrtoint).
Value * getPointerOperand()
Gets the pointer operand.
This class represents a cast from a pointer to an integer.
Value * getPointerOperand()
Gets the pointer operand.
unsigned getPointerAddressSpace() const
Returns the address space of the pointer operand.
This class represents a sign extension of integer types.
This class represents the LLVM 'select' instruction.
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:157
This instruction constructs a fixed permutation of two input vectors.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
This class represents a truncation of integer types.
void setHasNoSignedWrap(bool B)
void setHasNoUnsignedWrap(bool B)
bool hasNoSignedWrap() const
Test whether this operation is known to never undergo signed overflow, aka the nsw property.
bool hasNoUnsignedWrap() const
Test whether this operation is known to never undergo unsigned overflow, aka the nuw property.
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 isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
Definition Type.h:147
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:363
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:187
LLVM_ABI Type * getWithNewType(Type *EltTy) const
Given vector type, change the element type, whilst keeping the old number of elements.
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
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 isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:252
static LLVM_ABI Type * getDoubleTy(LLVMContext &C)
Definition Type.cpp:277
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Definition Type.h:222
static LLVM_ABI Type * getFloatTy(LLVMContext &C)
Definition Type.cpp:276
LLVM_ABI int getFPMantissaWidth() const
Return the width of the mantissa of this type.
Definition Type.cpp:227
LLVM_ABI const fltSemantics & getFltSemantics() const
Definition Type.cpp:96
static LLVM_ABI Type * getBFloatTy(LLVMContext &C)
Definition Type.cpp:275
static LLVM_ABI Type * getHalfTy(LLVMContext &C)
Definition Type.cpp:274
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
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:441
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:260
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:315
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:396
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
static LLVM_ABI bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
This class represents zero extension of integer types.
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:231
static constexpr bool isKnownGE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:238
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
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.
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > OverloadTys={})
Look up the Function declaration of the intrinsic id in the Module M.
SpecificConstantMatch m_ZeroInt()
Convenience matchers for specific integer values.
BinaryOp_match< SpecificConstantMatch, SrcTy, TargetOpcode::G_SUB > m_Neg(const SrcTy &&Src)
Matches a register negated by a G_SUB.
CheckType m_SpecificType(LLT Ty)
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
match_combine_or< Ty... > m_CombineOr(const Ty &...Ps)
Combine pattern matchers matching any of Ps patterns.
cst_pred_ty< is_lowbit_mask > m_LowBitMask()
Match an integer or vector with only the low bit(s) set.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
PtrToIntSameSize_match< OpTy > m_PtrToIntSameSize(const DataLayout &DL, const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
cst_pred_ty< is_sign_mask > m_SignMask()
Match an integer or vector with only the sign bit(s) set.
BinaryOp_match< LHS, RHS, Instruction::AShr > m_AShr(const LHS &L, const RHS &R)
cst_pred_ty< is_power2 > m_Power2()
Match an integer or vector power-of-2.
auto m_Poison()
Match an arbitrary poison constant.
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
BinaryOp_match< LHS, RHS, Instruction::And, true > m_c_And(const LHS &L, const RHS &R)
Matches an And with LHS and RHS in either order.
CastInst_match< OpTy, TruncInst > m_Trunc(const OpTy &Op)
Matches Trunc.
BinaryOp_match< LHS, RHS, Instruction::Xor > m_Xor(const LHS &L, const RHS &R)
ap_match< APInt > m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
specific_intval< false > m_SpecificInt(const APInt &V)
Match a specific integer value or vector with all elements equal to the value.
bool match(Val *V, const Pattern &P)
auto m_UMin(const Opnd0 &Op0, const Opnd1 &Op1)
match_deferred< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
BinOpPred_match< LHS, RHS, is_right_shift_op > m_Shr(const LHS &L, const RHS &R)
Matches logical shift operations.
ap_match< APFloat > m_APFloat(const APFloat *&Res)
Match a ConstantFP or splatted ConstantVector, binding the specified pointer to the contained APFloat...
TwoOps_match< Val_t, Idx_t, Instruction::ExtractElement > m_ExtractElt(const Val_t &Val, const Idx_t &Idx)
Matches ExtractElementInst.
auto m_SMax(const Opnd0 &Op0, const Opnd1 &Op1)
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
auto m_BinOp()
Match an arbitrary binary operation and ignore it.
BinOpPred_match< LHS, RHS, is_logical_shift_op > m_LogicalShift(const LHS &L, const RHS &R)
Matches logical shift operations.
match_combine_or< CastInst_match< OpTy, UIToFPInst >, CastInst_match< OpTy, SIToFPInst > > m_IToFP(const OpTy &Op)
auto m_Value()
Match an arbitrary value and ignore it.
auto m_Constant()
Match an arbitrary Constant and ignore it.
NoWrapTrunc_match< OpTy, TruncInst::NoSignedWrap > m_NSWTrunc(const OpTy &Op)
Matches trunc nsw.
TwoOps_match< V1_t, V2_t, Instruction::ShuffleVector > m_Shuffle(const V1_t &v1, const V2_t &v2)
Matches ShuffleVectorInst independently of mask value.
auto m_VScale()
Matches a call to llvm.vscale().
match_combine_or< CastInst_match< OpTy, FPToUIInst >, CastInst_match< OpTy, FPToSIInst > > m_FPToI(const OpTy &Op)
CastInst_match< OpTy, FPExtInst > m_FPExt(const OpTy &Op)
SpecificCmpClass_match< LHS, RHS, ICmpInst > m_SpecificICmp(CmpPredicate MatchPred, const LHS &L, const RHS &R)
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
auto m_Ctlz(const Opnd0 &Op0, const Opnd1 &Op1)
is_zero< true > m_Zero()
Match any null constant or a vector with all elements equal to 0.
BinOpPred_match< LHS, RHS, is_bitwiselogic_op, true > m_c_BitwiseLogic(const LHS &L, const RHS &R)
Matches bitwise logic operations in either order.
cst_pred_ty< is_negated_power2 > m_NegatedPower2()
Match a integer or vector negated power-of-2.
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
NoWrapTrunc_match< OpTy, TruncInst::NoUnsignedWrap > m_NUWTrunc(const OpTy &Op)
Matches trunc nuw.
BinaryOp_match< LHS, RHS, Instruction::Add, true > m_c_Add(const LHS &L, const RHS &R)
Matches a Add with LHS and RHS in either order.
CastInst_match< OpTy, UIToFPInst > m_UIToFP(const OpTy &Op)
CastOperator_match< OpTy, Instruction::BitCast > m_BitCast(const OpTy &Op)
Matches BitCast.
CastInst_match< OpTy, FPToSIInst > m_FPToSI(const OpTy &Op)
auto m_Intrinsic(const Ts &...Ops)
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
auto m_SMin(const Opnd0 &Op0, const Opnd1 &Op1)
CastInst_match< OpTy, SIToFPInst > m_SIToFP(const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::LShr > m_LShr(const LHS &L, const RHS &R)
CmpClass_match< LHS, RHS, ICmpInst > m_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, ZExtInst >, CastInst_match< OpTy, SExtInst > > m_ZExtOrSExt(const OpTy &Op)
Exact_match< T > m_Exact(const T &SubPattern)
FNeg_match< OpTy > m_FNeg(const OpTy &X)
Match 'fneg X' as 'fsub -0.0, X'.
BinOpPred_match< LHS, RHS, is_shift_op > m_Shift(const LHS &L, const RHS &R)
Matches shift operations.
BinaryOp_match< LHS, RHS, Instruction::Shl > m_Shl(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::FDiv > m_FDiv(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
CastInst_match< OpTy, SExtInst > m_SExt(const OpTy &Op)
Matches SExt.
BinaryOp_match< LHS, RHS, Instruction::Or, true > m_c_Or(const LHS &L, const RHS &R)
Matches an Or with LHS and RHS in either order.
CastOperator_match< OpTy, Instruction::IntToPtr > m_IntToPtr(const OpTy &Op)
Matches IntToPtr.
ThreeOps_match< Val_t, Elt_t, Idx_t, Instruction::InsertElement > m_InsertElt(const Val_t &Val, const Elt_t &Elt, const Idx_t &Idx)
Matches InsertElementInst.
ElementWiseBitCast_match< OpTy > m_ElementWiseBitCast(const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
cst_pred_ty< icmp_pred_with_threshold > m_SpecificInt_ICMP(ICmpInst::Predicate Predicate, const APInt &Threshold)
Match an integer or vector with every element comparing 'pred' (eg/ne/...) to Threshold.
auto m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
LLVM_ABI KnownFPClass computeKnownFPClass(const Value *V, const APInt &DemandedElts, FPClassTest InterestedClasses, const SimplifyQuery &SQ, unsigned Depth=0)
Determine which floating-point classes are valid for V, and return them in KnownFPClass bit sets.
LLVM_ABI cl::opt< bool > ProfcheckDisableMetadataFixes
Definition LoopInfo.cpp:61
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
SaveAndRestore(T &) -> SaveAndRestore< T >
LLVM_ABI Constant * ConstantFoldSelectInstruction(Constant *Cond, Constant *V1, Constant *V2)
Attempt to constant fold a select instruction with the specified operands.
@ Known
Known to have no common set bits.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
unsigned Log2_64_Ceil(uint64_t Value)
Return the ceil log base 2 of the specified value, 64 if the value is zero.
Definition MathExtras.h:345
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:649
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
Definition MathExtras.h:285
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
LLVM_ABI Value * simplifyCastInst(unsigned CastOpc, Value *Op, Type *Ty, const SimplifyQuery &Q)
Given operands for a CastInst, fold the result or return null.
LLVM_ABI Constant * ConstantFoldCompareInstOperands(unsigned Predicate, Constant *LHS, Constant *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const Function *CtxF=nullptr)
Attempt to constant fold a compare instruction (icmp/fcmp) with the specified operands.
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
Definition MathExtras.h:326
auto reverse(ContainerTy &&C)
Definition STLExtras.h:408
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:280
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
SmallVector< ValueTypeFromRangeType< R >, Size > to_vector(R &&Range)
Given a range of type R, iterate the entire range and return a SmallVector with elements of the vecto...
LLVM_ABI Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI bool replaceAllDbgUsesWith(Instruction &From, Value &To, Instruction &DomPoint, DominatorTree &DT)
Point debug users of From to To or salvage them.
Definition Local.cpp:2441
LLVM_ABI bool isKnownNonZero(const Value *V, const SimplifyQuery &Q, unsigned Depth=0)
Return true if the given value is known to be non-zero when defined.
@ SMax
Signed integer max implemented in terms of select(cmp()).
@ And
Bitwise or logical AND of integers.
@ SMin
Signed integer min implemented in terms of select(cmp()).
IntPtrTy
Definition InstrProf.h:82
DWARFExpression::Operation Op
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
constexpr auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
Definition Sequence.h:341
LLVM_ABI 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...
LLVM_ABI bool isKnownNonNegative(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the give value is known to be non-negative.
LLVM_ABI Constant * ConstantFoldBinaryInstruction(unsigned Opcode, Constant *V1, Constant *V2)
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
Definition KnownBits.h:256
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
Definition KnownBits.h:262
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:146
bool isKnownNever(FPClassTest Mask) const
Return true if it's known this can never be one of the mask entries.
Matching combinators.
A utility class that uses RAII to save and restore the value of a variable.
SimplifyQuery getWithInstruction(const Instruction *I) const