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