LLVM 24.0.0git
InstCombineSimplifyDemanded.cpp
Go to the documentation of this file.
1//===- InstCombineSimplifyDemanded.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 contains logic for simplifying instructions based on information
10// about how they are used.
11//
12//===----------------------------------------------------------------------===//
13
14#include "InstCombineInternal.h"
23
24using namespace llvm;
25using namespace llvm::PatternMatch;
26
27#define DEBUG_TYPE "instcombine"
28
29/// Check to see if the specified operand of the specified instruction is a
30/// constant integer. If so, check to see if there are any bits set in the
31/// constant that are not demanded. If so, shrink the constant and return true.
32static bool ShrinkDemandedConstant(Instruction *I, unsigned OpNo,
33 const APInt &Demanded) {
34 assert(I && "No instruction?");
35 assert(OpNo < I->getNumOperands() && "Operand index too large");
36
37 // The operand must be a constant integer or splat integer.
38 Value *Op = I->getOperand(OpNo);
39 const APInt *C;
40 if (!match(Op, m_APInt(C)))
41 return false;
42
43 // If there are no bits set that aren't demanded, nothing to do.
44 if (C->isSubsetOf(Demanded))
45 return false;
46
47 // This instruction is producing bits that are not demanded. Shrink the RHS.
48 I->setOperand(OpNo, ConstantInt::get(Op->getType(), *C & Demanded));
49
50 return true;
51}
52
53/// Let N = 2 * M.
54/// Given an N-bit integer representing a pack of two M-bit integers,
55/// we can select one of the packed integers by right-shifting by either
56/// zero or M (which is the most straightforward to check if M is a power
57/// of 2), and then isolating the lower M bits. In this case, we can
58/// represent the shift as a select on whether the shr amount is nonzero.
60 const APInt &DemandedMask,
62 unsigned Depth) {
63 assert(I->getOpcode() == Instruction::LShr &&
64 "Only lshr instruction supported");
65
66 uint64_t ShlAmt;
67 Value *Upper, *Lower;
68 if (!match(I->getOperand(0),
71 m_Value(Lower)))))
72 return nullptr;
73
74 if (!isPowerOf2_64(ShlAmt))
75 return nullptr;
76
77 const uint64_t DemandedBitWidth = DemandedMask.getActiveBits();
78 if (DemandedBitWidth > ShlAmt)
79 return nullptr;
80
81 // Check that upper demanded bits are not lost from lshift.
82 if (Upper->getType()->getScalarSizeInBits() < ShlAmt + DemandedBitWidth)
83 return nullptr;
84
85 KnownBits KnownLowerBits = IC.computeKnownBits(Lower, I, Depth);
86 if (!KnownLowerBits.getMaxValue().isIntN(ShlAmt))
87 return nullptr;
88
89 Value *ShrAmt = I->getOperand(1);
90 KnownBits KnownShrBits = IC.computeKnownBits(ShrAmt, I, Depth);
91
92 // Verify that ShrAmt is either exactly ShlAmt (which is a power of 2) or
93 // zero.
94 if (~KnownShrBits.Zero != ShlAmt)
95 return nullptr;
96
99 Value *ShrAmtZ =
101 ShrAmt->getName() + ".z");
102 // There is no existing !prof metadata we can derive the !prof metadata for
103 // this select.
106 Select->takeName(I);
107 return Select;
108}
109
110/// Returns the bitwidth of the given scalar or pointer type. For vector types,
111/// returns the element type's bitwidth.
112static unsigned getBitWidth(Type *Ty, const DataLayout &DL) {
113 if (unsigned BitWidth = Ty->getScalarSizeInBits())
114 return BitWidth;
115
116 return DL.getPointerTypeSizeInBits(Ty);
117}
118
119/// Inst is an integer instruction that SimplifyDemandedBits knows about. See if
120/// the instruction has any properties that allow us to simplify its operands.
122 KnownBits &Known) {
123 APInt DemandedMask(APInt::getAllOnes(Known.getBitWidth()));
124 Value *V = SimplifyDemandedUseBits(&Inst, DemandedMask, Known,
125 SQ.getWithInstruction(&Inst));
126 if (!V) return false;
127 if (V == &Inst) return true;
128 replaceInstUsesWith(Inst, V);
129 return true;
130}
131
132/// Inst is an integer instruction that SimplifyDemandedBits knows about. See if
133/// the instruction has any properties that allow us to simplify its operands.
138
141
143 SQ.getWithInstruction(&Inst));
144 if (!V)
145 return false;
146 if (V == &Inst)
147 return true;
148 replaceInstUsesWith(Inst, V);
149 return true;
150}
151
152/// This form of SimplifyDemandedBits simplifies the specified instruction
153/// operand if possible, updating it in place. It returns true if it made any
154/// change and false otherwise.
156 const APInt &DemandedMask,
158 const SimplifyQuery &Q,
159 unsigned Depth) {
160 Use &U = I->getOperandUse(OpNo);
161 Value *V = U.get();
162 if (isa<Constant>(V)) {
164 return false;
165 }
166
167 Known.resetAll();
168 if (DemandedMask.isZero()) {
169 // Not demanding any bits from V.
170 replaceUse(U, UndefValue::get(V->getType()));
171 return true;
172 }
173
175 if (!VInst) {
177 return false;
178 }
179
181 return false;
182
183 Value *NewVal;
184 if (VInst->hasOneUse()) {
185 // If the instruction has one use, we can directly simplify it.
186 NewVal = SimplifyDemandedUseBits(VInst, DemandedMask, Known, Q, Depth);
187 } else {
188 // If there are multiple uses of this instruction, then we can simplify
189 // VInst to some other value, but not modify the instruction.
190 NewVal =
191 SimplifyMultipleUseDemandedBits(VInst, DemandedMask, Known, Q, Depth);
192 }
193 if (!NewVal) return false;
194 if (Instruction* OpInst = dyn_cast<Instruction>(U))
195 salvageDebugInfo(*OpInst);
196
197 replaceUse(U, NewVal);
198 return true;
199}
200
201/// This function attempts to replace V with a simpler value based on the
202/// demanded bits. When this function is called, it is known that only the bits
203/// set in DemandedMask of the result of V are ever used downstream.
204/// Consequently, depending on the mask and V, it may be possible to replace V
205/// with a constant or one of its operands. In such cases, this function does
206/// the replacement and returns true. In all other cases, it returns false after
207/// analyzing the expression and setting KnownOne and known to be one in the
208/// expression. Known.Zero contains all the bits that are known to be zero in
209/// the expression. These are provided to potentially allow the caller (which
210/// might recursively be SimplifyDemandedBits itself) to simplify the
211/// expression.
212/// Known.One and Known.Zero always follow the invariant that:
213/// Known.One & Known.Zero == 0.
214/// That is, a bit can't be both 1 and 0. The bits in Known.One and Known.Zero
215/// are accurate even for bits not in DemandedMask. Note
216/// also that the bitwidth of V, DemandedMask, Known.Zero and Known.One must all
217/// be the same.
218///
219/// This returns null if it did not change anything and it permits no
220/// simplification. This returns V itself if it did some simplification of V's
221/// operands based on the information about what bits are demanded. This returns
222/// some other non-null value if it found out that V is equal to another value
223/// in the context where the specified bits are demanded, but not for all users.
225 const APInt &DemandedMask,
227 const SimplifyQuery &Q,
228 unsigned Depth) {
229 assert(I != nullptr && "Null pointer of Value???");
230 assert(Depth <= MaxAnalysisRecursionDepth && "Limit Search Depth");
231 uint32_t BitWidth = DemandedMask.getBitWidth();
232 Type *VTy = I->getType();
233 assert(
234 (!VTy->isIntOrIntVectorTy() || VTy->getScalarSizeInBits() == BitWidth) &&
235 Known.getBitWidth() == BitWidth &&
236 "Value *V, DemandedMask and Known must have same BitWidth");
237
238 KnownBits LHSKnown(BitWidth), RHSKnown(BitWidth);
239
240 // Update flags after simplifying an operand based on the fact that some high
241 // order bits are not demanded.
242 auto disableWrapFlagsBasedOnUnusedHighBits = [](Instruction *I,
243 unsigned NLZ) {
244 if (NLZ > 0) {
245 // Disable the nsw and nuw flags here: We can no longer guarantee that
246 // we won't wrap after simplification. Removing the nsw/nuw flags is
247 // legal here because the top bit is not demanded.
248 I->setHasNoSignedWrap(false);
249 I->setHasNoUnsignedWrap(false);
250 }
251 return I;
252 };
253
254 // If the high-bits of an ADD/SUB/MUL are not demanded, then we do not care
255 // about the high bits of the operands.
256 auto simplifyOperandsBasedOnUnusedHighBits = [&](APInt &DemandedFromOps) {
257 unsigned NLZ = DemandedMask.countl_zero();
258 // Right fill the mask of bits for the operands to demand the most
259 // significant bit and all those below it.
260 DemandedFromOps = APInt::getLowBitsSet(BitWidth, BitWidth - NLZ);
261 if (ShrinkDemandedConstant(I, 0, DemandedFromOps) ||
262 SimplifyDemandedBits(I, 0, DemandedFromOps, LHSKnown, Q, Depth + 1) ||
263 ShrinkDemandedConstant(I, 1, DemandedFromOps) ||
264 SimplifyDemandedBits(I, 1, DemandedFromOps, RHSKnown, Q, Depth + 1)) {
265 disableWrapFlagsBasedOnUnusedHighBits(I, NLZ);
266 return true;
267 }
268 return false;
269 };
270
271 switch (I->getOpcode()) {
272 default:
274 break;
275 case Instruction::And: {
276 // If either the LHS or the RHS are Zero, the result is zero.
277 if (SimplifyDemandedBits(I, 1, DemandedMask, RHSKnown, Q, Depth + 1) ||
278 SimplifyDemandedBits(I, 0, DemandedMask & ~RHSKnown.Zero, LHSKnown, Q,
279 Depth + 1))
280 return I;
281
282 Known = analyzeKnownBitsFromAndXorOr(cast<Operator>(I), LHSKnown, RHSKnown,
283 Q, Depth);
284
285 // If the client is only demanding bits that we know, return the known
286 // constant.
287 if (DemandedMask.isSubsetOf(Known.Zero | Known.One))
288 return Constant::getIntegerValue(VTy, Known.One);
289
290 // If all of the demanded bits are known 1 on one side, return the other.
291 // These bits cannot contribute to the result of the 'and'.
292 if (DemandedMask.isSubsetOf(LHSKnown.Zero | RHSKnown.One))
293 return I->getOperand(0);
294 if (DemandedMask.isSubsetOf(RHSKnown.Zero | LHSKnown.One))
295 return I->getOperand(1);
296
297 // If the RHS is a constant, see if we can simplify it.
298 if (ShrinkDemandedConstant(I, 1, DemandedMask & ~LHSKnown.Zero))
299 return I;
300
301 break;
302 }
303 case Instruction::Or: {
304 // If either the LHS or the RHS are One, the result is One.
305 if (SimplifyDemandedBits(I, 1, DemandedMask, RHSKnown, Q, Depth + 1) ||
306 SimplifyDemandedBits(I, 0, DemandedMask & ~RHSKnown.One, LHSKnown, Q,
307 Depth + 1)) {
308 // Disjoint flag may not longer hold.
309 I->dropPoisonGeneratingFlags();
310 return I;
311 }
312
313 Known = analyzeKnownBitsFromAndXorOr(cast<Operator>(I), LHSKnown, RHSKnown,
314 Q, Depth);
315
316 // If the client is only demanding bits that we know, return the known
317 // constant.
318 if (DemandedMask.isSubsetOf(Known.Zero | Known.One))
319 return Constant::getIntegerValue(VTy, Known.One);
320
321 // If all of the demanded bits are known zero on one side, return the other.
322 // These bits cannot contribute to the result of the 'or'.
323 if (DemandedMask.isSubsetOf(LHSKnown.One | RHSKnown.Zero))
324 return I->getOperand(0);
325 if (DemandedMask.isSubsetOf(RHSKnown.One | LHSKnown.Zero))
326 return I->getOperand(1);
327
328 // If the RHS is a constant, see if we can simplify it.
329 if (ShrinkDemandedConstant(I, 1, DemandedMask))
330 return I;
331
332 // Infer disjoint flag if no common bits are set.
333 if (!cast<PossiblyDisjointInst>(I)->isDisjoint()) {
334 WithCache<const Value *> LHSCache(I->getOperand(0), LHSKnown),
335 RHSCache(I->getOperand(1), RHSKnown);
336 if (haveNoCommonBitsSet(LHSCache, RHSCache, Q)) {
337 cast<PossiblyDisjointInst>(I)->setIsDisjoint(true);
338 return I;
339 }
340 }
341
342 break;
343 }
344 case Instruction::Xor: {
345 if (SimplifyDemandedBits(I, 1, DemandedMask, RHSKnown, Q, Depth + 1) ||
346 SimplifyDemandedBits(I, 0, DemandedMask, LHSKnown, Q, Depth + 1))
347 return I;
348 Value *LHS, *RHS;
349 if (DemandedMask == 1 && match(I->getOperand(0), m_Ctpop(m_Value(LHS))) &&
350 match(I->getOperand(1), m_Ctpop(m_Value(RHS)))) {
351 // (ctpop(X) ^ ctpop(Y)) & 1 --> ctpop(X^Y) & 1
353 Builder.SetInsertPoint(I);
354 auto *Xor = Builder.CreateXor(LHS, RHS);
355 return Builder.CreateUnaryIntrinsic(Intrinsic::ctpop, Xor);
356 }
357
358 Known = analyzeKnownBitsFromAndXorOr(cast<Operator>(I), LHSKnown, RHSKnown,
359 Q, Depth);
360
361 // If the client is only demanding bits that we know, return the known
362 // constant.
363 if (DemandedMask.isSubsetOf(Known.Zero | Known.One))
364 return Constant::getIntegerValue(VTy, Known.One);
365
366 // If all of the demanded bits are known zero on one side, return the other.
367 // These bits cannot contribute to the result of the 'xor'.
368 if (DemandedMask.isSubsetOf(RHSKnown.Zero))
369 return I->getOperand(0);
370 if (DemandedMask.isSubsetOf(LHSKnown.Zero))
371 return I->getOperand(1);
372
373 // If all of the demanded bits are known to be zero on one side or the
374 // other, turn this into an *inclusive* or.
375 // e.g. (A & C1)^(B & C2) -> (A & C1)|(B & C2) iff C1&C2 == 0
376 if (DemandedMask.isSubsetOf(RHSKnown.Zero | LHSKnown.Zero)) {
377 Instruction *Or =
378 BinaryOperator::CreateOr(I->getOperand(0), I->getOperand(1));
379 if (DemandedMask.isAllOnes())
380 cast<PossiblyDisjointInst>(Or)->setIsDisjoint(true);
381 Or->takeName(I);
382 return InsertNewInstWith(Or, I->getIterator());
383 }
384
385 // If all of the demanded bits on one side are known, and all of the set
386 // bits on that side are also known to be set on the other side, turn this
387 // into an AND, as we know the bits will be cleared.
388 // e.g. (X | C1) ^ C2 --> (X | C1) & ~C2 iff (C1&C2) == C2
389 if (DemandedMask.isSubsetOf(RHSKnown.Zero|RHSKnown.One) &&
390 RHSKnown.One.isSubsetOf(LHSKnown.One)) {
392 ~RHSKnown.One & DemandedMask);
393 Instruction *And = BinaryOperator::CreateAnd(I->getOperand(0), AndC);
394 return InsertNewInstWith(And, I->getIterator());
395 }
396
397 // If the RHS is a constant, see if we can change it. Don't alter a -1
398 // constant because that's a canonical 'not' op, and that is better for
399 // combining, SCEV, and codegen.
400 const APInt *C;
401 if (match(I->getOperand(1), m_APInt(C)) && !C->isAllOnes()) {
402 if ((*C | ~DemandedMask).isAllOnes()) {
403 // Force bits to 1 to create a 'not' op.
404 I->setOperand(1, ConstantInt::getAllOnesValue(VTy));
405 return I;
406 }
407 // If we can't turn this into a 'not', try to shrink the constant.
408 if (ShrinkDemandedConstant(I, 1, DemandedMask))
409 return I;
410 }
411
412 // If our LHS is an 'and' and if it has one use, and if any of the bits we
413 // are flipping are known to be set, then the xor is just resetting those
414 // bits to zero. We can just knock out bits from the 'and' and the 'xor',
415 // simplifying both of them.
416 if (Instruction *LHSInst = dyn_cast<Instruction>(I->getOperand(0))) {
417 ConstantInt *AndRHS, *XorRHS;
418 if (LHSInst->getOpcode() == Instruction::And && LHSInst->hasOneUse() &&
419 match(I->getOperand(1), m_ConstantInt(XorRHS)) &&
420 match(LHSInst->getOperand(1), m_ConstantInt(AndRHS)) &&
421 (LHSKnown.One & RHSKnown.One & DemandedMask) != 0) {
422 APInt NewMask = ~(LHSKnown.One & RHSKnown.One & DemandedMask);
423
424 Constant *AndC = ConstantInt::get(VTy, NewMask & AndRHS->getValue());
425 Instruction *NewAnd = BinaryOperator::CreateAnd(I->getOperand(0), AndC);
426 InsertNewInstWith(NewAnd, I->getIterator());
427
428 Constant *XorC = ConstantInt::get(VTy, NewMask & XorRHS->getValue());
429 Instruction *NewXor = BinaryOperator::CreateXor(NewAnd, XorC);
430 return InsertNewInstWith(NewXor, I->getIterator());
431 }
432 }
433 break;
434 }
435 case Instruction::Select: {
436 if (SimplifyDemandedBits(I, 2, DemandedMask, RHSKnown, Q, Depth + 1) ||
437 SimplifyDemandedBits(I, 1, DemandedMask, LHSKnown, Q, Depth + 1))
438 return I;
439
440 // If the operands are constants, see if we can simplify them.
441 // This is similar to ShrinkDemandedConstant, but for a select we want to
442 // try to keep the selected constants the same as icmp value constants, if
443 // we can. This helps not break apart (or helps put back together)
444 // canonical patterns like min and max.
445 auto CanonicalizeSelectConstant = [](Instruction *I, unsigned OpNo,
446 const APInt &DemandedMask) {
447 const APInt *SelC;
448 if (!match(I->getOperand(OpNo), m_APInt(SelC)))
449 return false;
450
451 // Get the constant out of the ICmp, if there is one.
452 // Only try this when exactly 1 operand is a constant (if both operands
453 // are constant, the icmp should eventually simplify). Otherwise, we may
454 // invert the transform that reduces set bits and infinite-loop.
455 Value *X;
456 const APInt *CmpC;
457 if (!match(I->getOperand(0), m_ICmp(m_Value(X), m_APInt(CmpC))) ||
458 isa<Constant>(X) || CmpC->getBitWidth() != SelC->getBitWidth())
459 return ShrinkDemandedConstant(I, OpNo, DemandedMask);
460
461 // If the constant is already the same as the ICmp, leave it as-is.
462 if (*CmpC == *SelC)
463 return false;
464 // If the constants are not already the same, but can be with the demand
465 // mask, use the constant value from the ICmp.
466 if ((*CmpC & DemandedMask) == (*SelC & DemandedMask)) {
467 I->setOperand(OpNo, ConstantInt::get(I->getType(), *CmpC));
468 return true;
469 }
470 return ShrinkDemandedConstant(I, OpNo, DemandedMask);
471 };
472 if (CanonicalizeSelectConstant(I, 1, DemandedMask) ||
473 CanonicalizeSelectConstant(I, 2, DemandedMask))
474 return I;
475
476 // Only known if known in both the LHS and RHS.
477 adjustKnownBitsForSelectArm(LHSKnown, I->getOperand(0), I->getOperand(1),
478 /*Invert=*/false, Q, Depth);
479 adjustKnownBitsForSelectArm(RHSKnown, I->getOperand(0), I->getOperand(2),
480 /*Invert=*/true, Q, Depth);
481 Known = LHSKnown.intersectWith(RHSKnown);
482 break;
483 }
484 case Instruction::Trunc: {
485 // If we do not demand the high bits of a right-shifted and truncated value,
486 // then we may be able to truncate it before the shift.
487 Value *X;
488 const APInt *C;
489 if (match(I->getOperand(0), m_OneUse(m_LShr(m_Value(X), m_APInt(C))))) {
490 // The shift amount must be valid (not poison) in the narrow type, and
491 // it must not be greater than the high bits demanded of the result.
492 if (C->ult(VTy->getScalarSizeInBits()) &&
493 C->ule(DemandedMask.countl_zero())) {
494 // trunc (lshr X, C) --> lshr (trunc X), C
496 Builder.SetInsertPoint(I);
497 Value *Trunc = Builder.CreateTrunc(X, VTy);
498 return Builder.CreateLShr(Trunc, C->getZExtValue());
499 }
500 }
501 }
502 [[fallthrough]];
503 case Instruction::ZExt: {
504 unsigned SrcBitWidth = I->getOperand(0)->getType()->getScalarSizeInBits();
505
506 APInt InputDemandedMask = DemandedMask.zextOrTrunc(SrcBitWidth);
507 KnownBits InputKnown(SrcBitWidth);
508 if (SimplifyDemandedBits(I, 0, InputDemandedMask, InputKnown, Q,
509 Depth + 1)) {
510 // For zext nneg, we may have dropped the instruction which made the
511 // input non-negative.
512 I->dropPoisonGeneratingFlags();
513 return I;
514 }
515 assert(InputKnown.getBitWidth() == SrcBitWidth && "Src width changed?");
516 if (I->getOpcode() == Instruction::ZExt && I->hasNonNeg() &&
517 !InputKnown.isNegative())
518 InputKnown.makeNonNegative();
519 Known = InputKnown.zextOrTrunc(BitWidth);
520
521 break;
522 }
523 case Instruction::SExt: {
524 // Compute the bits in the result that are not present in the input.
525 unsigned SrcBitWidth = I->getOperand(0)->getType()->getScalarSizeInBits();
526
527 APInt InputDemandedBits = DemandedMask.trunc(SrcBitWidth);
528
529 // If any of the sign extended bits are demanded, we know that the sign
530 // bit is demanded.
531 if (DemandedMask.getActiveBits() > SrcBitWidth)
532 InputDemandedBits.setBit(SrcBitWidth-1);
533
534 KnownBits InputKnown(SrcBitWidth);
535 if (SimplifyDemandedBits(I, 0, InputDemandedBits, InputKnown, Q, Depth + 1))
536 return I;
537
538 // If the input sign bit is known zero, or if the NewBits are not demanded
539 // convert this into a zero extension.
540 if (InputKnown.isNonNegative() ||
541 DemandedMask.getActiveBits() <= SrcBitWidth) {
542 // Convert to ZExt cast.
543 CastInst *NewCast = new ZExtInst(I->getOperand(0), VTy);
544 NewCast->takeName(I);
545 return InsertNewInstWith(NewCast, I->getIterator());
546 }
547
548 // If the sign bit of the input is known set or clear, then we know the
549 // top bits of the result.
550 Known = InputKnown.sext(BitWidth);
551 break;
552 }
553 case Instruction::Add: {
554 if ((DemandedMask & 1) == 0) {
555 // If we do not need the low bit, try to convert bool math to logic:
556 // add iN (zext i1 X), (sext i1 Y) --> sext (~X & Y) to iN
557 Value *X, *Y;
559 m_OneUse(m_SExt(m_Value(Y))))) &&
560 X->getType()->isIntOrIntVectorTy(1) && X->getType() == Y->getType()) {
561 // Truth table for inputs and output signbits:
562 // X:0 | X:1
563 // ----------
564 // Y:0 | 0 | 0 |
565 // Y:1 | -1 | 0 |
566 // ----------
568 Builder.SetInsertPoint(I);
569 Value *AndNot = Builder.CreateAnd(Builder.CreateNot(X), Y);
570 return Builder.CreateSExt(AndNot, VTy);
571 }
572
573 // add iN (sext i1 X), (sext i1 Y) --> sext (X | Y) to iN
574 if (match(I, m_Add(m_SExt(m_Value(X)), m_SExt(m_Value(Y)))) &&
575 X->getType()->isIntOrIntVectorTy(1) && X->getType() == Y->getType() &&
576 (I->getOperand(0)->hasOneUse() || I->getOperand(1)->hasOneUse())) {
577
578 // Truth table for inputs and output signbits:
579 // X:0 | X:1
580 // -----------
581 // Y:0 | 0 | -1 |
582 // Y:1 | -1 | -1 |
583 // -----------
585 Builder.SetInsertPoint(I);
586 Value *Or = Builder.CreateOr(X, Y);
587 return Builder.CreateSExt(Or, VTy);
588 }
589 }
590
591 // Right fill the mask of bits for the operands to demand the most
592 // significant bit and all those below it.
593 unsigned NLZ = DemandedMask.countl_zero();
594 APInt DemandedFromOps = APInt::getLowBitsSet(BitWidth, BitWidth - NLZ);
595 if (ShrinkDemandedConstant(I, 1, DemandedFromOps) ||
596 SimplifyDemandedBits(I, 1, DemandedFromOps, RHSKnown, Q, Depth + 1))
597 return disableWrapFlagsBasedOnUnusedHighBits(I, NLZ);
598
599 // If low order bits are not demanded and known to be zero in one operand,
600 // then we don't need to demand them from the other operand, since they
601 // can't cause overflow into any bits that are demanded in the result.
602 unsigned NTZ = (~DemandedMask & RHSKnown.Zero).countr_one();
603 APInt DemandedFromLHS = DemandedFromOps;
604 DemandedFromLHS.clearLowBits(NTZ);
605 if (ShrinkDemandedConstant(I, 0, DemandedFromLHS) ||
606 SimplifyDemandedBits(I, 0, DemandedFromLHS, LHSKnown, Q, Depth + 1))
607 return disableWrapFlagsBasedOnUnusedHighBits(I, NLZ);
608
609 unsigned NtzLHS = (~DemandedMask & LHSKnown.Zero).countr_one();
610 APInt DemandedFromRHS = DemandedFromOps;
611 DemandedFromRHS.clearLowBits(NtzLHS);
612 if (ShrinkDemandedConstant(I, 1, DemandedFromRHS))
613 return disableWrapFlagsBasedOnUnusedHighBits(I, NLZ);
614
615 // If we are known to be adding zeros to every bit below
616 // the highest demanded bit, we just return the other side.
617 if (DemandedFromOps.isSubsetOf(RHSKnown.Zero))
618 return I->getOperand(0);
619 if (DemandedFromOps.isSubsetOf(LHSKnown.Zero))
620 return I->getOperand(1);
621
622 // (add X, C) --> (xor X, C) IFF C is equal to the top bit of the DemandMask
623 {
624 const APInt *C;
625 if (match(I->getOperand(1), m_APInt(C)) &&
626 C->isOneBitSet(DemandedMask.getActiveBits() - 1)) {
628 Builder.SetInsertPoint(I);
629 return Builder.CreateXor(I->getOperand(0), ConstantInt::get(VTy, *C));
630 }
631 }
632
633 // Otherwise just compute the known bits of the result.
634 bool NSW = cast<OverflowingBinaryOperator>(I)->hasNoSignedWrap();
635 bool NUW = cast<OverflowingBinaryOperator>(I)->hasNoUnsignedWrap();
636 Known = KnownBits::add(LHSKnown, RHSKnown, NSW, NUW);
637 break;
638 }
639 case Instruction::Sub: {
640 // Right fill the mask of bits for the operands to demand the most
641 // significant bit and all those below it.
642 unsigned NLZ = DemandedMask.countl_zero();
643 APInt DemandedFromOps = APInt::getLowBitsSet(BitWidth, BitWidth - NLZ);
644 if (ShrinkDemandedConstant(I, 1, DemandedFromOps) ||
645 SimplifyDemandedBits(I, 1, DemandedFromOps, RHSKnown, Q, Depth + 1))
646 return disableWrapFlagsBasedOnUnusedHighBits(I, NLZ);
647
648 // If low order bits are not demanded and are known to be zero in RHS,
649 // then we don't need to demand them from LHS, since they can't cause a
650 // borrow from any bits that are demanded in the result.
651 unsigned NTZ = (~DemandedMask & RHSKnown.Zero).countr_one();
652 APInt DemandedFromLHS = DemandedFromOps;
653 DemandedFromLHS.clearLowBits(NTZ);
654 if (ShrinkDemandedConstant(I, 0, DemandedFromLHS) ||
655 SimplifyDemandedBits(I, 0, DemandedFromLHS, LHSKnown, Q, Depth + 1))
656 return disableWrapFlagsBasedOnUnusedHighBits(I, NLZ);
657
658 // If we are known to be subtracting zeros from every bit below
659 // the highest demanded bit, we just return the other side.
660 if (DemandedFromOps.isSubsetOf(RHSKnown.Zero))
661 return I->getOperand(0);
662 // We can't do this with the LHS for subtraction, unless we are only
663 // demanding the LSB.
664 if (DemandedFromOps.isOne() && DemandedFromOps.isSubsetOf(LHSKnown.Zero))
665 return I->getOperand(1);
666
667 // Canonicalize sub mask, X -> ~X
668 const APInt *LHSC;
669 if (match(I->getOperand(0), m_LowBitMask(LHSC)) &&
670 DemandedFromOps.isSubsetOf(*LHSC)) {
672 Builder.SetInsertPoint(I);
673 return Builder.CreateNot(I->getOperand(1));
674 }
675
676 // Otherwise just compute the known bits of the result.
677 bool NSW = cast<OverflowingBinaryOperator>(I)->hasNoSignedWrap();
678 bool NUW = cast<OverflowingBinaryOperator>(I)->hasNoUnsignedWrap();
679 Known = KnownBits::sub(LHSKnown, RHSKnown, NSW, NUW);
680 break;
681 }
682 case Instruction::Mul: {
683 APInt DemandedFromOps;
684 if (simplifyOperandsBasedOnUnusedHighBits(DemandedFromOps))
685 return I;
686
687 if (DemandedMask.isPowerOf2()) {
688 // The LSB of X*Y is set only if (X & 1) == 1 and (Y & 1) == 1.
689 // If we demand exactly one bit N and we have "X * (C' << N)" where C' is
690 // odd (has LSB set), then the left-shifted low bit of X is the answer.
691 unsigned CTZ = DemandedMask.countr_zero();
692 const APInt *C;
693 if (match(I->getOperand(1), m_APInt(C)) && C->countr_zero() == CTZ) {
694 Constant *ShiftC = ConstantInt::get(VTy, CTZ);
695 Instruction *Shl = BinaryOperator::CreateShl(I->getOperand(0), ShiftC);
696 return InsertNewInstWith(Shl, I->getIterator());
697 }
698 }
699 // For a squared value "X * X", the bottom 2 bits are 0 and X[0] because:
700 // X * X is odd iff X is odd.
701 // 'Quadratic Reciprocity': X * X -> 0 for bit[1]
702 if (I->getOperand(0) == I->getOperand(1) && DemandedMask.ult(4)) {
703 Constant *One = ConstantInt::get(VTy, 1);
704 Instruction *And1 = BinaryOperator::CreateAnd(I->getOperand(0), One);
705 return InsertNewInstWith(And1, I->getIterator());
706 }
707
709 break;
710 }
711 case Instruction::Shl: {
712 const APInt *SA;
713 if (match(I->getOperand(1), m_APInt(SA))) {
714 const APInt *ShrAmt;
715 if (match(I->getOperand(0), m_Shr(m_Value(), m_APInt(ShrAmt))))
716 if (Instruction *Shr = dyn_cast<Instruction>(I->getOperand(0)))
717 if (Value *R = simplifyShrShlDemandedBits(Shr, *ShrAmt, I, *SA,
718 DemandedMask, Known))
719 return R;
720
721 // Do not simplify if shl is part of funnel-shift pattern
722 if (I->hasOneUse()) {
723 Instruction *Inst = I->user_back();
724 if (Inst->getOpcode() == BinaryOperator::Or) {
725 if (auto Opt = convertOrOfShiftsToFunnelShift(*Inst)) {
726 auto [IID, FShiftArgs] = *Opt;
727 if ((IID == Intrinsic::fshl || IID == Intrinsic::fshr) &&
728 FShiftArgs[0] == FShiftArgs[1]) {
730 break;
731 }
732 }
733 }
734 }
735
736 // We only want bits that already match the signbit then we don't
737 // need to shift.
738 uint64_t ShiftAmt = SA->getLimitedValue(BitWidth - 1);
739 if (DemandedMask.countr_zero() >= ShiftAmt) {
740 if (I->hasNoSignedWrap()) {
741 unsigned NumHiDemandedBits = BitWidth - DemandedMask.countr_zero();
742 unsigned SignBits =
743 ComputeNumSignBits(I->getOperand(0), Q.CtxI, Depth + 1);
744 if (SignBits > ShiftAmt && SignBits - ShiftAmt >= NumHiDemandedBits)
745 return I->getOperand(0);
746 }
747
748 // If we can pre-shift a right-shifted constant to the left without
749 // losing any high bits and we don't demand the low bits, then eliminate
750 // the left-shift:
751 // (C >> X) << LeftShiftAmtC --> (C << LeftShiftAmtC) >> X
752 Value *X;
753 Constant *C;
754 if (match(I->getOperand(0), m_LShr(m_ImmConstant(C), m_Value(X)))) {
755 Constant *LeftShiftAmtC = ConstantInt::get(VTy, ShiftAmt);
756 Constant *NewC = ConstantFoldBinaryOpOperands(Instruction::Shl, C,
757 LeftShiftAmtC, DL);
758 if (ConstantFoldBinaryOpOperands(Instruction::LShr, NewC,
759 LeftShiftAmtC, DL) == C) {
760 Instruction *Lshr = BinaryOperator::CreateLShr(NewC, X);
761 return InsertNewInstWith(Lshr, I->getIterator());
762 }
763 }
764 }
765
766 APInt DemandedMaskIn(DemandedMask.lshr(ShiftAmt));
767
768 // If the shift is NUW/NSW, then it does demand the high bits.
770 if (IOp->hasNoSignedWrap())
771 DemandedMaskIn.setHighBits(ShiftAmt+1);
772 else if (IOp->hasNoUnsignedWrap())
773 DemandedMaskIn.setHighBits(ShiftAmt);
774
775 if (SimplifyDemandedBits(I, 0, DemandedMaskIn, Known, Q, Depth + 1))
776 return I;
777
780 /* NUW */ IOp->hasNoUnsignedWrap(),
781 /* NSW */ IOp->hasNoSignedWrap());
782 } else {
783 // This is a variable shift, so we can't shift the demand mask by a known
784 // amount. But if we are not demanding high bits, then we are not
785 // demanding those bits from the pre-shifted operand either.
786 if (unsigned CTLZ = DemandedMask.countl_zero()) {
787 APInt DemandedFromOp(APInt::getLowBitsSet(BitWidth, BitWidth - CTLZ));
788 if (SimplifyDemandedBits(I, 0, DemandedFromOp, Known, Q, Depth + 1)) {
789 // We can't guarantee that nsw/nuw hold after simplifying the operand.
790 I->dropPoisonGeneratingFlags();
791 return I;
792 }
793 }
795 }
796 break;
797 }
798 case Instruction::LShr: {
799 const APInt *SA;
800 if (match(I->getOperand(1), m_APInt(SA))) {
801 uint64_t ShiftAmt = SA->getLimitedValue(BitWidth-1);
802
803 // Do not simplify if lshr is part of funnel-shift pattern
804 if (I->hasOneUse()) {
805 Instruction *Inst = I->user_back();
806 if (Inst->getOpcode() == BinaryOperator::Or) {
807 if (auto Opt = convertOrOfShiftsToFunnelShift(*Inst)) {
808 auto [IID, FShiftArgs] = *Opt;
809 if ((IID == Intrinsic::fshl || IID == Intrinsic::fshr) &&
810 FShiftArgs[0] == FShiftArgs[1]) {
812 break;
813 }
814 }
815 }
816 }
817
818 // If we are just demanding the shifted sign bit and below, then this can
819 // be treated as an ASHR in disguise.
820 if (DemandedMask.countl_zero() >= ShiftAmt) {
821 // If we only want bits that already match the signbit then we don't
822 // need to shift.
823 unsigned NumHiDemandedBits = BitWidth - DemandedMask.countr_zero();
824 unsigned SignBits =
825 ComputeNumSignBits(I->getOperand(0), Q.CtxI, Depth + 1);
826 if (SignBits >= NumHiDemandedBits)
827 return I->getOperand(0);
828
829 // If we can pre-shift a left-shifted constant to the right without
830 // losing any low bits (we already know we don't demand the high bits),
831 // then eliminate the right-shift:
832 // (C << X) >> RightShiftAmtC --> (C >> RightShiftAmtC) << X
833 Value *X;
834 Constant *C;
835 if (match(I->getOperand(0), m_Shl(m_ImmConstant(C), m_Value(X)))) {
836 Constant *RightShiftAmtC = ConstantInt::get(VTy, ShiftAmt);
837 Constant *NewC = ConstantFoldBinaryOpOperands(Instruction::LShr, C,
838 RightShiftAmtC, DL);
839 if (ConstantFoldBinaryOpOperands(Instruction::Shl, NewC,
840 RightShiftAmtC, DL) == C) {
841 Instruction *Shl = BinaryOperator::CreateShl(NewC, X);
842 return InsertNewInstWith(Shl, I->getIterator());
843 }
844 }
845
846 const APInt *Factor;
847 if (match(I->getOperand(0),
848 m_OneUse(m_Mul(m_Value(X), m_APInt(Factor)))) &&
849 Factor->countr_zero() >= ShiftAmt) {
850 BinaryOperator *Mul = BinaryOperator::CreateMul(
851 X, ConstantInt::get(X->getType(), Factor->lshr(ShiftAmt)));
852 return InsertNewInstWith(Mul, I->getIterator());
853 }
854 }
855
856 // Unsigned shift right.
857 APInt DemandedMaskIn(DemandedMask.shl(ShiftAmt));
858 if (SimplifyDemandedBits(I, 0, DemandedMaskIn, Known, Q, Depth + 1)) {
859 // exact flag may not longer hold.
860 I->dropPoisonGeneratingFlags();
861 return I;
862 }
863 Known >>= ShiftAmt;
864 if (ShiftAmt)
865 Known.Zero.setHighBits(ShiftAmt); // high bits known zero.
866 break;
867 }
868 if (Value *V =
869 simplifyShiftSelectingPackedElement(I, DemandedMask, *this, Depth))
870 return V;
871
873 break;
874 }
875 case Instruction::AShr: {
876 unsigned SignBits = ComputeNumSignBits(I->getOperand(0), Q.CtxI, Depth + 1);
877
878 // If we only want bits that already match the signbit then we don't need
879 // to shift.
880 unsigned NumHiDemandedBits = BitWidth - DemandedMask.countr_zero();
881 if (SignBits >= NumHiDemandedBits)
882 return I->getOperand(0);
883
884 // If this is an arithmetic shift right and only the low-bit is set, we can
885 // always convert this into a logical shr, even if the shift amount is
886 // variable. The low bit of the shift cannot be an input sign bit unless
887 // the shift amount is >= the size of the datatype, which is undefined.
888 if (DemandedMask.isOne()) {
889 // Perform the logical shift right.
890 Instruction *NewVal = BinaryOperator::CreateLShr(
891 I->getOperand(0), I->getOperand(1), I->getName());
892 return InsertNewInstWith(NewVal, I->getIterator());
893 }
894
895 const APInt *SA;
896 if (match(I->getOperand(1), m_APInt(SA))) {
897 uint32_t ShiftAmt = SA->getLimitedValue(BitWidth-1);
898
899 // Signed shift right.
900 APInt DemandedMaskIn(DemandedMask.shl(ShiftAmt));
901 // If any of the bits being shifted in are demanded, then we should set
902 // the sign bit as demanded.
903 bool ShiftedInBitsDemanded = DemandedMask.countl_zero() < ShiftAmt;
904 if (ShiftedInBitsDemanded)
905 DemandedMaskIn.setSignBit();
906 if (SimplifyDemandedBits(I, 0, DemandedMaskIn, Known, Q, Depth + 1)) {
907 // exact flag may not longer hold.
908 I->dropPoisonGeneratingFlags();
909 return I;
910 }
911
912 // If the input sign bit is known to be zero, or if none of the shifted in
913 // bits are demanded, turn this into an unsigned shift right.
914 if (Known.Zero[BitWidth - 1] || !ShiftedInBitsDemanded) {
915 BinaryOperator *LShr = BinaryOperator::CreateLShr(I->getOperand(0),
916 I->getOperand(1));
917 LShr->setIsExact(cast<BinaryOperator>(I)->isExact());
918 LShr->takeName(I);
919 return InsertNewInstWith(LShr, I->getIterator());
920 }
921
924 ShiftAmt != 0, I->isExact());
925 } else {
927 }
928 break;
929 }
930 case Instruction::UDiv: {
931 // UDiv doesn't demand low bits that are zero in the divisor.
932 const APInt *SA;
933 if (match(I->getOperand(1), m_APInt(SA))) {
934 // TODO: Take the demanded mask of the result into account.
935 unsigned RHSTrailingZeros = SA->countr_zero();
936 APInt DemandedMaskIn =
937 APInt::getHighBitsSet(BitWidth, BitWidth - RHSTrailingZeros);
938 if (SimplifyDemandedBits(I, 0, DemandedMaskIn, LHSKnown, Q, Depth + 1)) {
939 // We can't guarantee that "exact" is still true after changing the
940 // the dividend.
941 I->dropPoisonGeneratingFlags();
942 return I;
943 }
944
946 cast<BinaryOperator>(I)->isExact());
947 } else {
949 }
950 break;
951 }
952 case Instruction::SRem: {
953 const APInt *Rem;
954 if (match(I->getOperand(1), m_APInt(Rem)) && Rem->isPowerOf2()) {
955 if (DemandedMask.ult(*Rem)) // srem won't affect demanded bits
956 return I->getOperand(0);
957
958 APInt LowBits = *Rem - 1;
959 APInt Mask2 = LowBits | APInt::getSignMask(BitWidth);
960 if (SimplifyDemandedBits(I, 0, Mask2, LHSKnown, Q, Depth + 1))
961 return I;
963 break;
964 }
965
967 break;
968 }
969 case Instruction::Call: {
970 bool KnownBitsComputed = false;
972 switch (II->getIntrinsicID()) {
973 case Intrinsic::abs: {
974 if (DemandedMask == 1)
975 return II->getArgOperand(0);
976 break;
977 }
978 case Intrinsic::ctpop: {
979 // Checking if the number of clear bits is odd (parity)? If the type has
980 // an even number of bits, that's the same as checking if the number of
981 // set bits is odd, so we can eliminate the 'not' op.
982 Value *X;
983 if (DemandedMask == 1 && VTy->getScalarSizeInBits() % 2 == 0 &&
984 match(II->getArgOperand(0), m_Not(m_Value(X)))) {
986 II->getModule(), Intrinsic::ctpop, VTy);
987 return InsertNewInstWith(CallInst::Create(Ctpop, {X}), I->getIterator());
988 }
989 break;
990 }
991 case Intrinsic::bswap: {
992 // If the only bits demanded come from one byte of the bswap result,
993 // just shift the input byte into position to eliminate the bswap.
994 unsigned NLZ = DemandedMask.countl_zero();
995 unsigned NTZ = DemandedMask.countr_zero();
996
997 // Round NTZ down to the next byte. If we have 11 trailing zeros, then
998 // we need all the bits down to bit 8. Likewise, round NLZ. If we
999 // have 14 leading zeros, round to 8.
1000 NLZ = alignDown(NLZ, 8);
1001 NTZ = alignDown(NTZ, 8);
1002 // If we need exactly one byte, we can do this transformation.
1003 if (BitWidth - NLZ - NTZ == 8) {
1004 // Replace this with either a left or right shift to get the byte into
1005 // the right place.
1006 Instruction *NewVal;
1007 if (NLZ > NTZ)
1008 NewVal = BinaryOperator::CreateLShr(
1009 II->getArgOperand(0), ConstantInt::get(VTy, NLZ - NTZ));
1010 else
1011 NewVal = BinaryOperator::CreateShl(
1012 II->getArgOperand(0), ConstantInt::get(VTy, NTZ - NLZ));
1013 NewVal->takeName(I);
1014 return InsertNewInstWith(NewVal, I->getIterator());
1015 }
1016 break;
1017 }
1018 case Intrinsic::ptrmask: {
1019 unsigned MaskWidth = I->getOperand(1)->getType()->getScalarSizeInBits();
1020 RHSKnown = KnownBits(MaskWidth);
1021 // If either the LHS or the RHS are Zero, the result is zero.
1022 if (SimplifyDemandedBits(I, 0, DemandedMask, LHSKnown, Q, Depth + 1) ||
1024 I, 1, (DemandedMask & ~LHSKnown.Zero).zextOrTrunc(MaskWidth),
1025 RHSKnown, Q, Depth + 1))
1026 return I;
1027
1028 // TODO: Should be 1-extend
1029 RHSKnown = RHSKnown.anyextOrTrunc(BitWidth);
1030
1031 Known = LHSKnown & RHSKnown;
1032 KnownBitsComputed = true;
1033
1034 // If the client is only demanding bits we know to be zero, return
1035 // `llvm.ptrmask(p, 0)`. We can't return `null` here due to pointer
1036 // provenance, but making the mask zero will be easily optimizable in
1037 // the backend.
1038 if (DemandedMask.isSubsetOf(Known.Zero) &&
1039 !match(I->getOperand(1), m_Zero()))
1040 return replaceOperand(
1041 *I, 1, Constant::getNullValue(I->getOperand(1)->getType()));
1042
1043 // Mask in demanded space does nothing.
1044 // NOTE: We may have attributes associated with the return value of the
1045 // llvm.ptrmask intrinsic that will be lost when we just return the
1046 // operand. We should try to preserve them.
1047 if (DemandedMask.isSubsetOf(RHSKnown.One | LHSKnown.Zero))
1048 return I->getOperand(0);
1049
1050 // If the RHS is a constant, see if we can simplify it.
1052 I, 1, (DemandedMask & ~LHSKnown.Zero).zextOrTrunc(MaskWidth)))
1053 return I;
1054
1055 // Combine:
1056 // (ptrmask (getelementptr i8, ptr p, imm i), imm mask)
1057 // -> (ptrmask (getelementptr i8, ptr p, imm (i & mask)), imm mask)
1058 // where only the low bits known to be zero in the pointer are changed
1059 Value *InnerPtr;
1060 uint64_t GEPIndex;
1061 uint64_t PtrMaskImmediate;
1063 m_PtrAdd(m_Value(InnerPtr), m_ConstantInt(GEPIndex)),
1064 m_ConstantInt(PtrMaskImmediate)))) {
1065
1066 LHSKnown = computeKnownBits(InnerPtr, I, Depth + 1);
1067 if (!LHSKnown.isZero()) {
1068 const unsigned trailingZeros = LHSKnown.countMinTrailingZeros();
1069 uint64_t PointerAlignBits = (uint64_t(1) << trailingZeros) - 1;
1070
1071 uint64_t HighBitsGEPIndex = GEPIndex & ~PointerAlignBits;
1072 uint64_t MaskedLowBitsGEPIndex =
1073 GEPIndex & PointerAlignBits & PtrMaskImmediate;
1074
1075 uint64_t MaskedGEPIndex = HighBitsGEPIndex | MaskedLowBitsGEPIndex;
1076
1077 if (MaskedGEPIndex != GEPIndex) {
1078 auto *GEP = cast<GEPOperator>(II->getArgOperand(0));
1079 Builder.SetInsertPoint(I);
1080 Type *GEPIndexType =
1081 DL.getIndexType(GEP->getPointerOperand()->getType());
1082 Value *MaskedGEP = Builder.CreateGEP(
1083 GEP->getSourceElementType(), InnerPtr,
1084 ConstantInt::get(GEPIndexType, MaskedGEPIndex),
1085 GEP->getName(), GEP->isInBounds());
1086
1087 replaceOperand(*I, 0, MaskedGEP);
1088 return I;
1089 }
1090 }
1091 }
1092
1093 break;
1094 }
1095
1096 case Intrinsic::fshr:
1097 case Intrinsic::fshl: {
1098 const APInt *SA;
1099 if (!match(I->getOperand(2), m_APInt(SA)))
1100 break;
1101
1102 // Normalize to funnel shift left. APInt shifts of BitWidth are well-
1103 // defined, so no need to special-case zero shifts here.
1104 uint64_t ShiftAmt = SA->urem(BitWidth);
1105 if (II->getIntrinsicID() == Intrinsic::fshr)
1106 ShiftAmt = BitWidth - ShiftAmt;
1107
1108 APInt DemandedMaskLHS(DemandedMask.lshr(ShiftAmt));
1109 APInt DemandedMaskRHS(DemandedMask.shl(BitWidth - ShiftAmt));
1110 if (I->getOperand(0) != I->getOperand(1)) {
1111 if (SimplifyDemandedBits(I, 0, DemandedMaskLHS, LHSKnown, Q,
1112 Depth + 1) ||
1113 SimplifyDemandedBits(I, 1, DemandedMaskRHS, RHSKnown, Q,
1114 Depth + 1)) {
1115 // Range attribute or metadata may no longer hold.
1116 I->dropPoisonGeneratingAnnotations();
1117 return I;
1118 }
1119 } else { // fshl is a rotate
1120 // Avoid converting rotate into funnel shift.
1121 // Only simplify if one operand is constant.
1122 LHSKnown = computeKnownBits(I->getOperand(0), I, Depth + 1);
1123 if (DemandedMaskLHS.isSubsetOf(LHSKnown.Zero | LHSKnown.One) &&
1124 !match(I->getOperand(0), m_SpecificInt(LHSKnown.One))) {
1125 replaceOperand(*I, 0, Constant::getIntegerValue(VTy, LHSKnown.One));
1126 // Range attribute or metadata may no longer hold.
1127 I->dropPoisonGeneratingAnnotations();
1128 return I;
1129 }
1130
1131 RHSKnown = computeKnownBits(I->getOperand(1), I, Depth + 1);
1132 if (DemandedMaskRHS.isSubsetOf(RHSKnown.Zero | RHSKnown.One) &&
1133 !match(I->getOperand(1), m_SpecificInt(RHSKnown.One))) {
1134 replaceOperand(*I, 1, Constant::getIntegerValue(VTy, RHSKnown.One));
1135 // Range attribute or metadata may no longer hold.
1136 I->dropPoisonGeneratingAnnotations();
1137 return I;
1138 }
1139 }
1140
1141 LHSKnown <<= ShiftAmt;
1142 RHSKnown >>= BitWidth - ShiftAmt;
1143 Known = LHSKnown.unionWith(RHSKnown);
1144 KnownBitsComputed = true;
1145 break;
1146 }
1147 case Intrinsic::umax: {
1148 // UMax(A, C) == A if ...
1149 // The lowest non-zero bit of DemandMask is higher than the highest
1150 // non-zero bit of C.
1151 const APInt *C;
1152 unsigned CTZ = DemandedMask.countr_zero();
1153 if (match(II->getArgOperand(1), m_APInt(C)) &&
1154 CTZ >= C->getActiveBits())
1155 return II->getArgOperand(0);
1156 break;
1157 }
1158 case Intrinsic::umin: {
1159 // UMin(A, C) == A if ...
1160 // The lowest non-zero bit of DemandMask is higher than the highest
1161 // non-one bit of C.
1162 // This comes from using DeMorgans on the above umax example.
1163 const APInt *C;
1164 unsigned CTZ = DemandedMask.countr_zero();
1165 if (match(II->getArgOperand(1), m_APInt(C)) &&
1166 CTZ >= C->getBitWidth() - C->countl_one())
1167 return II->getArgOperand(0);
1168 break;
1169 }
1170 default: {
1171 // Handle target specific intrinsics
1172 std::optional<Value *> V = targetSimplifyDemandedUseBitsIntrinsic(
1173 *II, DemandedMask, Known, KnownBitsComputed);
1174 if (V)
1175 return *V;
1176 break;
1177 }
1178 }
1179 }
1180
1181 if (!KnownBitsComputed)
1183 break;
1184 }
1185 }
1186
1187 if (I->getType()->isPointerTy()) {
1188 Align Alignment = I->getPointerAlignment(DL);
1189 Known.Zero.setLowBits(Log2(Alignment));
1190 }
1191
1192 // If the client is only demanding bits that we know, return the known
1193 // constant. We can't directly simplify pointers as a constant because of
1194 // pointer provenance.
1195 // TODO: We could return `(inttoptr const)` for pointers.
1196 if (!I->getType()->isPointerTy() &&
1197 DemandedMask.isSubsetOf(Known.Zero | Known.One))
1198 return Constant::getIntegerValue(VTy, Known.One);
1199
1200 if (CLOpts.verify_known_bits) {
1201 KnownBits ReferenceKnown = llvm::computeKnownBits(I, Q, Depth);
1202 if (Known != ReferenceKnown) {
1203 errs() << "Mismatched known bits for " << *I << " in "
1204 << I->getFunction()->getName() << "\n";
1205 errs() << "computeKnownBits(): " << ReferenceKnown << "\n";
1206 errs() << "SimplifyDemandedBits(): " << Known << "\n";
1207 std::abort();
1208 }
1209 }
1210
1211 return nullptr;
1212}
1213
1214/// Helper routine of SimplifyDemandedUseBits. It computes Known
1215/// bits. It also tries to handle simplifications that can be done based on
1216/// DemandedMask, but without modifying the Instruction.
1218 Instruction *I, const APInt &DemandedMask, KnownBits &Known,
1219 const SimplifyQuery &Q, unsigned Depth) {
1220 unsigned BitWidth = DemandedMask.getBitWidth();
1221 Type *ITy = I->getType();
1222
1223 KnownBits LHSKnown(BitWidth);
1224 KnownBits RHSKnown(BitWidth);
1225
1226 // Despite the fact that we can't simplify this instruction in all User's
1227 // context, we can at least compute the known bits, and we can
1228 // do simplifications that apply to *just* the one user if we know that
1229 // this instruction has a simpler value in that context.
1230 switch (I->getOpcode()) {
1231 case Instruction::And: {
1232 llvm::computeKnownBits(I->getOperand(1), RHSKnown, Q, Depth + 1);
1233 llvm::computeKnownBits(I->getOperand(0), LHSKnown, Q, Depth + 1);
1234 Known = analyzeKnownBitsFromAndXorOr(cast<Operator>(I), LHSKnown, RHSKnown,
1235 Q, Depth);
1237
1238 // If the client is only demanding bits that we know, return the known
1239 // constant.
1240 if (DemandedMask.isSubsetOf(Known.Zero | Known.One))
1241 return Constant::getIntegerValue(ITy, Known.One);
1242
1243 // If all of the demanded bits are known 1 on one side, return the other.
1244 // These bits cannot contribute to the result of the 'and' in this context.
1245 if (DemandedMask.isSubsetOf(LHSKnown.Zero | RHSKnown.One))
1246 return I->getOperand(0);
1247 if (DemandedMask.isSubsetOf(RHSKnown.Zero | LHSKnown.One))
1248 return I->getOperand(1);
1249
1250 break;
1251 }
1252 case Instruction::Or: {
1253 llvm::computeKnownBits(I->getOperand(1), RHSKnown, Q, Depth + 1);
1254 llvm::computeKnownBits(I->getOperand(0), LHSKnown, Q, Depth + 1);
1255 Known = analyzeKnownBitsFromAndXorOr(cast<Operator>(I), LHSKnown, RHSKnown,
1256 Q, Depth);
1258
1259 // If the client is only demanding bits that we know, return the known
1260 // constant.
1261 if (DemandedMask.isSubsetOf(Known.Zero | Known.One))
1262 return Constant::getIntegerValue(ITy, Known.One);
1263
1264 // We can simplify (X|Y) -> X or Y in the user's context if we know that
1265 // only bits from X or Y are demanded.
1266 // If all of the demanded bits are known zero on one side, return the other.
1267 // These bits cannot contribute to the result of the 'or' in this context.
1268 if (DemandedMask.isSubsetOf(LHSKnown.One | RHSKnown.Zero))
1269 return I->getOperand(0);
1270 if (DemandedMask.isSubsetOf(RHSKnown.One | LHSKnown.Zero))
1271 return I->getOperand(1);
1272
1273 break;
1274 }
1275 case Instruction::Xor: {
1276 llvm::computeKnownBits(I->getOperand(1), RHSKnown, Q, Depth + 1);
1277 llvm::computeKnownBits(I->getOperand(0), LHSKnown, Q, Depth + 1);
1278 Known = analyzeKnownBitsFromAndXorOr(cast<Operator>(I), LHSKnown, RHSKnown,
1279 Q, Depth);
1281
1282 // If the client is only demanding bits that we know, return the known
1283 // constant.
1284 if (DemandedMask.isSubsetOf(Known.Zero | Known.One))
1285 return Constant::getIntegerValue(ITy, Known.One);
1286
1287 // We can simplify (X^Y) -> X or Y in the user's context if we know that
1288 // only bits from X or Y are demanded.
1289 // If all of the demanded bits are known zero on one side, return the other.
1290 if (DemandedMask.isSubsetOf(RHSKnown.Zero))
1291 return I->getOperand(0);
1292 if (DemandedMask.isSubsetOf(LHSKnown.Zero))
1293 return I->getOperand(1);
1294
1295 break;
1296 }
1297 case Instruction::Add: {
1298 unsigned NLZ = DemandedMask.countl_zero();
1299 APInt DemandedFromOps = APInt::getLowBitsSet(BitWidth, BitWidth - NLZ);
1300
1301 // If an operand adds zeros to every bit below the highest demanded bit,
1302 // that operand doesn't change the result. Return the other side.
1303 llvm::computeKnownBits(I->getOperand(1), RHSKnown, Q, Depth + 1);
1304 if (DemandedFromOps.isSubsetOf(RHSKnown.Zero))
1305 return I->getOperand(0);
1306
1307 llvm::computeKnownBits(I->getOperand(0), LHSKnown, Q, Depth + 1);
1308 if (DemandedFromOps.isSubsetOf(LHSKnown.Zero))
1309 return I->getOperand(1);
1310
1311 bool NSW = cast<OverflowingBinaryOperator>(I)->hasNoSignedWrap();
1312 bool NUW = cast<OverflowingBinaryOperator>(I)->hasNoUnsignedWrap();
1313 Known = KnownBits::add(LHSKnown, RHSKnown, NSW, NUW);
1315 break;
1316 }
1317 case Instruction::Sub: {
1318 unsigned NLZ = DemandedMask.countl_zero();
1319 APInt DemandedFromOps = APInt::getLowBitsSet(BitWidth, BitWidth - NLZ);
1320
1321 // If an operand subtracts zeros from every bit below the highest demanded
1322 // bit, that operand doesn't change the result. Return the other side.
1323 llvm::computeKnownBits(I->getOperand(1), RHSKnown, Q, Depth + 1);
1324 if (DemandedFromOps.isSubsetOf(RHSKnown.Zero))
1325 return I->getOperand(0);
1326
1327 bool NSW = cast<OverflowingBinaryOperator>(I)->hasNoSignedWrap();
1328 bool NUW = cast<OverflowingBinaryOperator>(I)->hasNoUnsignedWrap();
1329 llvm::computeKnownBits(I->getOperand(0), LHSKnown, Q, Depth + 1);
1330 Known = KnownBits::sub(LHSKnown, RHSKnown, NSW, NUW);
1332 break;
1333 }
1334 case Instruction::AShr: {
1335 // Compute the Known bits to simplify things downstream.
1337
1338 // If this user is only demanding bits that we know, return the known
1339 // constant.
1340 if (DemandedMask.isSubsetOf(Known.Zero | Known.One))
1341 return Constant::getIntegerValue(ITy, Known.One);
1342
1343 // If the right shift operand 0 is a result of a left shift by the same
1344 // amount, this is probably a zero/sign extension, which may be unnecessary,
1345 // if we do not demand any of the new sign bits. So, return the original
1346 // operand instead.
1347 const APInt *ShiftRC;
1348 const APInt *ShiftLC;
1349 Value *X;
1350 unsigned BitWidth = DemandedMask.getBitWidth();
1351 if (match(I,
1352 m_AShr(m_Shl(m_Value(X), m_APInt(ShiftLC)), m_APInt(ShiftRC))) &&
1353 ShiftLC == ShiftRC && ShiftLC->ult(BitWidth) &&
1354 DemandedMask.isSubsetOf(APInt::getLowBitsSet(
1355 BitWidth, BitWidth - ShiftRC->getZExtValue()))) {
1356 return X;
1357 }
1358
1359 break;
1360 }
1361 default:
1362 // Compute the Known bits to simplify things downstream.
1364
1365 // If this user is only demanding bits that we know, return the known
1366 // constant.
1367 if (DemandedMask.isSubsetOf(Known.Zero|Known.One))
1368 return Constant::getIntegerValue(ITy, Known.One);
1369
1370 break;
1371 }
1372
1373 return nullptr;
1374}
1375
1376/// Helper routine of SimplifyDemandedUseBits. It tries to simplify
1377/// "E1 = (X lsr C1) << C2", where the C1 and C2 are constant, into
1378/// "E2 = X << (C2 - C1)" or "E2 = X >> (C1 - C2)", depending on the sign
1379/// of "C2-C1".
1380///
1381/// Suppose E1 and E2 are generally different in bits S={bm, bm+1,
1382/// ..., bn}, without considering the specific value X is holding.
1383/// This transformation is legal iff one of following conditions is hold:
1384/// 1) All the bit in S are 0, in this case E1 == E2.
1385/// 2) We don't care those bits in S, per the input DemandedMask.
1386/// 3) Combination of 1) and 2). Some bits in S are 0, and we don't care the
1387/// rest bits.
1388///
1389/// Currently we only test condition 2).
1390///
1391/// As with SimplifyDemandedUseBits, it returns NULL if the simplification was
1392/// not successful.
1394 Instruction *Shr, const APInt &ShrOp1, Instruction *Shl,
1395 const APInt &ShlOp1, const APInt &DemandedMask, KnownBits &Known) {
1396 if (!ShlOp1 || !ShrOp1)
1397 return nullptr; // No-op.
1398
1399 Value *VarX = Shr->getOperand(0);
1400 Type *Ty = VarX->getType();
1401 unsigned BitWidth = Ty->getScalarSizeInBits();
1402 if (ShlOp1.uge(BitWidth) || ShrOp1.uge(BitWidth))
1403 return nullptr; // Undef.
1404
1405 unsigned ShlAmt = ShlOp1.getZExtValue();
1406 unsigned ShrAmt = ShrOp1.getZExtValue();
1407
1408 Known.One.clearAllBits();
1409 Known.Zero.setLowBits(ShlAmt - 1);
1410 Known.Zero &= DemandedMask;
1411
1412 APInt BitMask1(APInt::getAllOnes(BitWidth));
1413 APInt BitMask2(APInt::getAllOnes(BitWidth));
1414
1415 bool isLshr = (Shr->getOpcode() == Instruction::LShr);
1416 BitMask1 = isLshr ? (BitMask1.lshr(ShrAmt) << ShlAmt) :
1417 (BitMask1.ashr(ShrAmt) << ShlAmt);
1418
1419 if (ShrAmt <= ShlAmt) {
1420 BitMask2 <<= (ShlAmt - ShrAmt);
1421 } else {
1422 BitMask2 = isLshr ? BitMask2.lshr(ShrAmt - ShlAmt):
1423 BitMask2.ashr(ShrAmt - ShlAmt);
1424 }
1425
1426 // Check if condition-2 (see the comment to this function) is satified.
1427 if ((BitMask1 & DemandedMask) == (BitMask2 & DemandedMask)) {
1428 if (ShrAmt == ShlAmt)
1429 return VarX;
1430
1431 if (!Shr->hasOneUse())
1432 return nullptr;
1433
1434 BinaryOperator *New;
1435 if (ShrAmt < ShlAmt) {
1436 Constant *Amt = ConstantInt::get(VarX->getType(), ShlAmt - ShrAmt);
1437 New = BinaryOperator::CreateShl(VarX, Amt);
1439 New->setHasNoSignedWrap(Orig->hasNoSignedWrap());
1440 New->setHasNoUnsignedWrap(Orig->hasNoUnsignedWrap());
1441 } else {
1442 Constant *Amt = ConstantInt::get(VarX->getType(), ShrAmt - ShlAmt);
1443 New = isLshr ? BinaryOperator::CreateLShr(VarX, Amt) :
1444 BinaryOperator::CreateAShr(VarX, Amt);
1445 if (cast<BinaryOperator>(Shr)->isExact())
1446 New->setIsExact(true);
1447 }
1448
1449 return InsertNewInstWith(New, Shl->getIterator());
1450 }
1451
1452 return nullptr;
1453}
1454
1455/// Return true if the top-level all-lanes demanded-elements query can be
1456/// skipped for an intermediate insertelement chain node. This is limited to a
1457/// bounded one-use chain with distinct in-range constant indices, where SDVE
1458/// cannot remove a dead insert before hitting its depth limit.
1460 unsigned VWidth,
1461 unsigned DepthLimit) {
1462 // Only skip chain nodes that feed another insertelement; the final chain root
1463 // still runs the full query.
1464 if (!IE.hasOneUse())
1465 return false;
1466 auto *UserIE = dyn_cast<InsertElementInst>(IE.user_back());
1467 if (!UserIE || UserIE->getOperand(0) != &IE)
1468 return false;
1469
1470 SmallBitVector SeenIndices(VWidth);
1471 auto HasNewIndexInRange = [&](InsertElementInst &Insert) {
1472 auto *Idx = dyn_cast<ConstantInt>(Insert.getOperand(2));
1473 // Let the normal SDVE path handle variable or out-of-range indices. The
1474 // latter may simplify the chain and must not be passed to getZExtValue().
1475 if (!Idx || Idx->getValue().uge(VWidth))
1476 return false;
1477
1478 unsigned Index = Idx->getZExtValue();
1479 if (SeenIndices.test(Index))
1480 return false;
1481
1482 SeenIndices.set(Index);
1483 return true;
1484 };
1485
1486 auto *Cur = &IE;
1487 for (unsigned I = 0; I != DepthLimit; ++I) {
1488 // This loop scans the same base-chain window that the SDVE query would
1489 // inspect before hitting its depth limit. With distinct insert indices in
1490 // that window, the all-lanes query cannot remove a dead insert; with
1491 // VWidth > DepthLimit, it also cannot narrow demand to a single lane.
1492 if (!HasNewIndexInRange(*Cur))
1493 return false;
1494
1495 Value *Base = Cur->getOperand(0);
1496 if (match(Base, m_Poison()))
1497 return true;
1498
1500 if (!Cur || !Cur->hasOneUse())
1501 return false;
1502 }
1503
1504 return true;
1505}
1506
1507/// The specified value produces a vector with any number of elements.
1508/// This method analyzes which elements of the operand are poison and
1509/// returns that information in PoisonElts.
1510///
1511/// DemandedElts contains the set of elements that are actually used by the
1512/// caller, and by default (AllowMultipleUsers equals false) the value is
1513/// simplified only if it has a single caller. If AllowMultipleUsers is set
1514/// to true, DemandedElts refers to the union of sets of elements that are
1515/// used by all callers.
1516///
1517/// If the information about demanded elements can be used to simplify the
1518/// operation, the operation is simplified, then the resultant value is
1519/// returned. This returns null if no change was made.
1521 APInt DemandedElts,
1522 APInt &PoisonElts,
1523 unsigned Depth,
1524 bool AllowMultipleUsers) {
1525 // Cannot analyze scalable type. The number of vector elements is not a
1526 // compile-time constant.
1527 if (isa<ScalableVectorType>(V->getType()))
1528 return nullptr;
1529
1530 unsigned VWidth = cast<FixedVectorType>(V->getType())->getNumElements();
1531 APInt EltMask(APInt::getAllOnes(VWidth));
1532 assert((DemandedElts & ~EltMask) == 0 && "Invalid DemandedElts!");
1533
1534 if (match(V, m_Poison())) {
1535 // If the entire vector is poison, just return this info.
1536 PoisonElts = EltMask;
1537 return nullptr;
1538 }
1539
1540 if (DemandedElts.isZero()) { // If nothing is demanded, provide poison.
1541 PoisonElts = EltMask;
1542 return PoisonValue::get(V->getType());
1543 }
1544
1545 PoisonElts = 0;
1546
1547 if (auto *C = dyn_cast<Constant>(V)) {
1548 // Check if this is identity. If so, return 0 since we are not simplifying
1549 // anything.
1550 if (DemandedElts.isAllOnes())
1551 return nullptr;
1552
1553 Type *EltTy = cast<VectorType>(V->getType())->getElementType();
1554 Constant *Poison = PoisonValue::get(EltTy);
1556 for (unsigned i = 0; i != VWidth; ++i) {
1557 if (!DemandedElts[i]) { // If not demanded, set to poison.
1558 Elts.push_back(Poison);
1559 PoisonElts.setBit(i);
1560 continue;
1561 }
1562
1563 Constant *Elt = C->getAggregateElement(i);
1564 if (!Elt) return nullptr;
1565
1566 Elts.push_back(Elt);
1567 if (isa<PoisonValue>(Elt)) // Already poison.
1568 PoisonElts.setBit(i);
1569 }
1570
1571 // If we changed the constant, return it.
1572 Constant *NewCV = ConstantVector::get(Elts);
1573 return NewCV != C ? NewCV : nullptr;
1574 }
1575
1576 // Limit search depth.
1577 if (Depth == CLOpts.simplify_vector_elts_depth)
1578 return nullptr;
1579
1580 if (!AllowMultipleUsers) {
1581 // If multiple users are using the root value, proceed with
1582 // simplification conservatively assuming that all elements
1583 // are needed.
1584 if (!V->hasOneUse()) {
1585 // Quit if we find multiple users of a non-root value though.
1586 // They'll be handled when it's their turn to be visited by
1587 // the main instcombine process.
1588 if (Depth != 0)
1589 // TODO: Just compute the PoisonElts information recursively.
1590 return nullptr;
1591
1592 // Conservatively assume that all elements are needed.
1593 DemandedElts = EltMask;
1594 }
1595 }
1596
1598 if (!I) return nullptr; // Only analyze instructions.
1599
1600 bool MadeChange = false;
1601 auto simplifyAndSetOp = [&](Instruction *Inst, unsigned OpNum,
1602 APInt Demanded, APInt &Undef) {
1603 auto *II = dyn_cast<IntrinsicInst>(Inst);
1604 Value *Op = II ? II->getArgOperand(OpNum) : Inst->getOperand(OpNum);
1605 if (Value *V = SimplifyDemandedVectorElts(Op, Demanded, Undef, Depth + 1)) {
1606 replaceOperand(*Inst, OpNum, V);
1607 MadeChange = true;
1608 }
1609 };
1610
1611 APInt PoisonElts2(VWidth, 0);
1612 APInt PoisonElts3(VWidth, 0);
1613 switch (I->getOpcode()) {
1614 default: break;
1615
1616 case Instruction::GetElementPtr: {
1617 // The LangRef requires that struct geps have all constant indices. As
1618 // such, we can't convert any operand to partial undef.
1619 auto mayIndexStructType = [](GetElementPtrInst &GEP) {
1620 for (auto I = gep_type_begin(GEP), E = gep_type_end(GEP);
1621 I != E; I++)
1622 if (I.isStruct())
1623 return true;
1624 return false;
1625 };
1626 if (mayIndexStructType(cast<GetElementPtrInst>(*I)))
1627 break;
1628
1629 // Conservatively track the demanded elements back through any vector
1630 // operands we may have. We know there must be at least one, or we
1631 // wouldn't have a vector result to get here. Note that we intentionally
1632 // merge the undef bits here since gepping with either an poison base or
1633 // index results in poison.
1634 for (unsigned i = 0; i < I->getNumOperands(); i++) {
1635 if (i == 0 ? match(I->getOperand(i), m_Undef())
1636 : match(I->getOperand(i), m_Poison())) {
1637 // If the entire vector is undefined, just return this info.
1638 PoisonElts = EltMask;
1639 return nullptr;
1640 }
1641 if (I->getOperand(i)->getType()->isVectorTy()) {
1642 APInt PoisonEltsOp(VWidth, 0);
1643 simplifyAndSetOp(I, i, DemandedElts, PoisonEltsOp);
1644 // gep(x, undef) is not undef, so skip considering idx ops here
1645 // Note that we could propagate poison, but we can't distinguish between
1646 // undef & poison bits ATM
1647 if (i == 0)
1648 PoisonElts |= PoisonEltsOp;
1649 }
1650 }
1651
1652 break;
1653 }
1654 case Instruction::InsertElement: {
1655 unsigned DepthLimit = CLOpts.simplify_vector_elts_depth;
1656 auto *IE = cast<InsertElementInst>(I);
1657 // Skip only when SDVE cannot simplify this insert chain before the limit.
1658 if (Depth == 0 && DemandedElts.isAllOnes() && VWidth > DepthLimit &&
1659 canSkipDemandedEltsInInsertChain(*IE, VWidth, DepthLimit))
1660 return nullptr;
1661
1662 // If this is a variable index, we don't know which element it overwrites.
1663 // demand exactly the same input as we produce.
1664 ConstantInt *Idx = dyn_cast<ConstantInt>(I->getOperand(2));
1665 if (!Idx) {
1666 // Note that we can't propagate undef elt info, because we don't know
1667 // which elt is getting updated.
1668 simplifyAndSetOp(I, 0, DemandedElts, PoisonElts2);
1669 break;
1670 }
1671
1672 // The element inserted overwrites whatever was there, so the input demanded
1673 // set is simpler than the output set.
1674 unsigned IdxNo = Idx->getZExtValue();
1675 APInt PreInsertDemandedElts = DemandedElts;
1676 if (IdxNo < VWidth)
1677 PreInsertDemandedElts.clearBit(IdxNo);
1678
1679 // If we only demand the element that is being inserted and that element
1680 // was extracted from the same index in another vector with the same type,
1681 // replace this insert with that other vector.
1682 // Note: This is attempted before the call to simplifyAndSetOp because that
1683 // may change PoisonElts to a value that does not match with Vec.
1684 Value *Vec;
1685 if (PreInsertDemandedElts == 0 &&
1686 match(I->getOperand(1),
1687 m_ExtractElt(m_Value(Vec), m_SpecificInt(IdxNo))) &&
1688 Vec->getType() == I->getType()) {
1689 return Vec;
1690 }
1691
1692 simplifyAndSetOp(I, 0, PreInsertDemandedElts, PoisonElts);
1693
1694 // If this is inserting an element that isn't demanded, remove this
1695 // insertelement.
1696 if (IdxNo >= VWidth || !DemandedElts[IdxNo]) {
1697 Worklist.push(I);
1698 return I->getOperand(0);
1699 }
1700
1701 // The inserted element is defined.
1702 PoisonElts.clearBit(IdxNo);
1703 break;
1704 }
1705 case Instruction::ShuffleVector: {
1706 auto *Shuffle = cast<ShuffleVectorInst>(I);
1707 assert(Shuffle->getOperand(0)->getType() ==
1708 Shuffle->getOperand(1)->getType() &&
1709 "Expected shuffle operands to have same type");
1710 unsigned OpWidth = cast<FixedVectorType>(Shuffle->getOperand(0)->getType())
1711 ->getNumElements();
1712 // Handle trivial case of a splat. Only check the first element of LHS
1713 // operand.
1714 if (all_of(Shuffle->getShuffleMask(), equal_to(0)) &&
1715 DemandedElts.isAllOnes()) {
1716 if (!isa<PoisonValue>(I->getOperand(1))) {
1717 I->setOperand(1, PoisonValue::get(I->getOperand(1)->getType()));
1718 MadeChange = true;
1719 }
1720 APInt LeftDemanded(OpWidth, 1);
1721 APInt LHSPoisonElts(OpWidth, 0);
1722 simplifyAndSetOp(I, 0, LeftDemanded, LHSPoisonElts);
1723 if (LHSPoisonElts[0])
1724 PoisonElts = EltMask;
1725 else
1726 PoisonElts.clearAllBits();
1727 break;
1728 }
1729
1730 APInt LeftDemanded(OpWidth, 0), RightDemanded(OpWidth, 0);
1731 for (unsigned i = 0; i < VWidth; i++) {
1732 if (DemandedElts[i]) {
1733 unsigned MaskVal = Shuffle->getMaskValue(i);
1734 if (MaskVal != -1u) {
1735 assert(MaskVal < OpWidth * 2 &&
1736 "shufflevector mask index out of range!");
1737 if (MaskVal < OpWidth)
1738 LeftDemanded.setBit(MaskVal);
1739 else
1740 RightDemanded.setBit(MaskVal - OpWidth);
1741 }
1742 }
1743 }
1744
1745 APInt LHSPoisonElts(OpWidth, 0);
1746 simplifyAndSetOp(I, 0, LeftDemanded, LHSPoisonElts);
1747
1748 APInt RHSPoisonElts(OpWidth, 0);
1749 simplifyAndSetOp(I, 1, RightDemanded, RHSPoisonElts);
1750
1751 // If this shuffle does not change the vector length and the elements
1752 // demanded by this shuffle are an identity mask, then this shuffle is
1753 // unnecessary.
1754 //
1755 // We are assuming canonical form for the mask, so the source vector is
1756 // operand 0 and operand 1 is not used.
1757 //
1758 // Note that if an element is demanded and this shuffle mask is undefined
1759 // for that element, then the shuffle is not considered an identity
1760 // operation. The shuffle prevents poison from the operand vector from
1761 // leaking to the result by replacing poison with an undefined value.
1762 if (VWidth == OpWidth) {
1763 bool IsIdentityShuffle = true;
1764 for (unsigned i = 0; i < VWidth; i++) {
1765 unsigned MaskVal = Shuffle->getMaskValue(i);
1766 if (DemandedElts[i] && i != MaskVal) {
1767 IsIdentityShuffle = false;
1768 break;
1769 }
1770 }
1771 if (IsIdentityShuffle)
1772 return Shuffle->getOperand(0);
1773 }
1774
1775 bool NewPoisonElts = false;
1776 unsigned LHSIdx = -1u, LHSValIdx = -1u;
1777 unsigned RHSIdx = -1u, RHSValIdx = -1u;
1778 bool LHSUniform = true;
1779 bool RHSUniform = true;
1780 for (unsigned i = 0; i < VWidth; i++) {
1781 unsigned MaskVal = Shuffle->getMaskValue(i);
1782 if (MaskVal == -1u) {
1783 PoisonElts.setBit(i);
1784 } else if (!DemandedElts[i]) {
1785 NewPoisonElts = true;
1786 PoisonElts.setBit(i);
1787 } else if (MaskVal < OpWidth) {
1788 if (LHSPoisonElts[MaskVal]) {
1789 NewPoisonElts = true;
1790 PoisonElts.setBit(i);
1791 } else {
1792 LHSIdx = LHSIdx == -1u ? i : OpWidth;
1793 LHSValIdx = LHSValIdx == -1u ? MaskVal : OpWidth;
1794 LHSUniform = LHSUniform && (MaskVal == i);
1795 }
1796 } else {
1797 if (RHSPoisonElts[MaskVal - OpWidth]) {
1798 NewPoisonElts = true;
1799 PoisonElts.setBit(i);
1800 } else {
1801 RHSIdx = RHSIdx == -1u ? i : OpWidth;
1802 RHSValIdx = RHSValIdx == -1u ? MaskVal - OpWidth : OpWidth;
1803 RHSUniform = RHSUniform && (MaskVal - OpWidth == i);
1804 }
1805 }
1806 }
1807
1808 // Try to transform shuffle with constant vector and single element from
1809 // this constant vector to single insertelement instruction.
1810 // shufflevector V, C, <v1, v2, .., ci, .., vm> ->
1811 // insertelement V, C[ci], ci-n
1812 if (OpWidth ==
1813 cast<FixedVectorType>(Shuffle->getType())->getNumElements()) {
1814 Value *Op = nullptr;
1815 Constant *Value = nullptr;
1816 unsigned Idx = -1u;
1817
1818 // Find constant vector with the single element in shuffle (LHS or RHS).
1819 if (LHSIdx < OpWidth && RHSUniform) {
1820 if (auto *CV = dyn_cast<ConstantVector>(Shuffle->getOperand(0))) {
1821 Op = Shuffle->getOperand(1);
1822 Value = CV->getOperand(LHSValIdx);
1823 Idx = LHSIdx;
1824 }
1825 }
1826 if (RHSIdx < OpWidth && LHSUniform) {
1827 if (auto *CV = dyn_cast<ConstantVector>(Shuffle->getOperand(1))) {
1828 Op = Shuffle->getOperand(0);
1829 Value = CV->getOperand(RHSValIdx);
1830 Idx = RHSIdx;
1831 }
1832 }
1833 // Found constant vector with single element - convert to insertelement.
1834 if (Op && Value) {
1836 Op, Value, ConstantInt::get(Type::getInt64Ty(I->getContext()), Idx),
1837 Shuffle->getName());
1838 InsertNewInstWith(New, Shuffle->getIterator());
1839 return New;
1840 }
1841 }
1842 if (NewPoisonElts) {
1843 // Add additional discovered undefs.
1845 for (unsigned i = 0; i < VWidth; ++i) {
1846 if (PoisonElts[i])
1848 else
1849 Elts.push_back(Shuffle->getMaskValue(i));
1850 }
1851 Shuffle->setShuffleMask(Elts);
1852 MadeChange = true;
1853 }
1854 break;
1855 }
1856 case Instruction::Select: {
1857 // If this is a vector select, try to transform the select condition based
1858 // on the current demanded elements.
1860 if (Sel->getCondition()->getType()->isVectorTy()) {
1861 // TODO: We are not doing anything with PoisonElts based on this call.
1862 // It is overwritten below based on the other select operands. If an
1863 // element of the select condition is known undef, then we are free to
1864 // choose the output value from either arm of the select. If we know that
1865 // one of those values is undef, then the output can be undef.
1866 simplifyAndSetOp(I, 0, DemandedElts, PoisonElts);
1867 }
1868
1869 // Next, see if we can transform the arms of the select.
1870 APInt DemandedLHS(DemandedElts), DemandedRHS(DemandedElts);
1871 if (auto *CV = dyn_cast<ConstantVector>(Sel->getCondition())) {
1872 for (unsigned i = 0; i < VWidth; i++) {
1873 Constant *CElt = CV->getAggregateElement(i);
1874
1875 // isNullValue() always returns false when called on a ConstantExpr.
1876 if (CElt->isNullValue())
1877 DemandedLHS.clearBit(i);
1878 else if (CElt->isOneValue())
1879 DemandedRHS.clearBit(i);
1880 }
1881 }
1882
1883 simplifyAndSetOp(I, 1, DemandedLHS, PoisonElts2);
1884 simplifyAndSetOp(I, 2, DemandedRHS, PoisonElts3);
1885
1886 // Output elements are undefined if the element from each arm is undefined.
1887 // TODO: This can be improved. See comment in select condition handling.
1888 PoisonElts = PoisonElts2 & PoisonElts3;
1889 break;
1890 }
1891 case Instruction::BitCast: {
1892 // Vector->vector casts only.
1893 VectorType *VTy = dyn_cast<VectorType>(I->getOperand(0)->getType());
1894 if (!VTy) break;
1895 unsigned InVWidth = cast<FixedVectorType>(VTy)->getNumElements();
1896 APInt InputDemandedElts(InVWidth, 0);
1897 PoisonElts2 = APInt(InVWidth, 0);
1898 unsigned Ratio;
1899
1900 if (VWidth == InVWidth) {
1901 // If we are converting from <4 x i32> -> <4 x f32>, we demand the same
1902 // elements as are demanded of us.
1903 Ratio = 1;
1904 InputDemandedElts = DemandedElts;
1905 } else if ((VWidth % InVWidth) == 0) {
1906 // If the number of elements in the output is a multiple of the number of
1907 // elements in the input then an input element is live if any of the
1908 // corresponding output elements are live.
1909 Ratio = VWidth / InVWidth;
1910 for (unsigned OutIdx = 0; OutIdx != VWidth; ++OutIdx)
1911 if (DemandedElts[OutIdx])
1912 InputDemandedElts.setBit(OutIdx / Ratio);
1913 } else if ((InVWidth % VWidth) == 0) {
1914 // If the number of elements in the input is a multiple of the number of
1915 // elements in the output then an input element is live if the
1916 // corresponding output element is live.
1917 Ratio = InVWidth / VWidth;
1918 for (unsigned InIdx = 0; InIdx != InVWidth; ++InIdx)
1919 if (DemandedElts[InIdx / Ratio])
1920 InputDemandedElts.setBit(InIdx);
1921 } else {
1922 // Unsupported so far.
1923 break;
1924 }
1925
1926 simplifyAndSetOp(I, 0, InputDemandedElts, PoisonElts2);
1927
1928 if (VWidth == InVWidth) {
1929 PoisonElts = PoisonElts2;
1930 } else if ((VWidth % InVWidth) == 0) {
1931 // If the number of elements in the output is a multiple of the number of
1932 // elements in the input then an output element is undef if the
1933 // corresponding input element is undef.
1934 for (unsigned OutIdx = 0; OutIdx != VWidth; ++OutIdx)
1935 if (PoisonElts2[OutIdx / Ratio])
1936 PoisonElts.setBit(OutIdx);
1937 } else if ((InVWidth % VWidth) == 0) {
1938 // If the number of elements in the input is a multiple of the number of
1939 // elements in the output then an output element is undef if all of the
1940 // corresponding input elements are undef.
1941 for (unsigned OutIdx = 0; OutIdx != VWidth; ++OutIdx) {
1942 APInt SubUndef = PoisonElts2.lshr(OutIdx * Ratio).zextOrTrunc(Ratio);
1943 if (SubUndef.popcount() == Ratio)
1944 PoisonElts.setBit(OutIdx);
1945 }
1946 } else {
1947 llvm_unreachable("Unimp");
1948 }
1949 break;
1950 }
1951 case Instruction::FPTrunc:
1952 case Instruction::FPExt:
1953 simplifyAndSetOp(I, 0, DemandedElts, PoisonElts);
1954 break;
1955
1956 case Instruction::Call: {
1958 if (!II) break;
1959 switch (II->getIntrinsicID()) {
1960 case Intrinsic::masked_gather: // fallthrough
1961 case Intrinsic::masked_load: {
1962 // Subtlety: If we load from a pointer, the pointer must be valid
1963 // regardless of whether the element is demanded. Doing otherwise risks
1964 // segfaults which didn't exist in the original program.
1965 APInt DemandedPtrs(APInt::getAllOnes(VWidth)),
1966 DemandedPassThrough(DemandedElts);
1967 if (auto *CMask = dyn_cast<Constant>(II->getOperand(1))) {
1968 for (unsigned i = 0; i < VWidth; i++) {
1969 if (Constant *CElt = CMask->getAggregateElement(i)) {
1970 if (CElt->isNullValue())
1971 DemandedPtrs.clearBit(i);
1972 else if (CElt->isAllOnesValue())
1973 DemandedPassThrough.clearBit(i);
1974 }
1975 }
1976 }
1977
1978 if (II->getIntrinsicID() == Intrinsic::masked_gather)
1979 simplifyAndSetOp(II, 0, DemandedPtrs, PoisonElts2);
1980 simplifyAndSetOp(II, 2, DemandedPassThrough, PoisonElts3);
1981
1982 // Output elements are undefined if the element from both sources are.
1983 // TODO: can strengthen via mask as well.
1984 PoisonElts = PoisonElts2 & PoisonElts3;
1985 break;
1986 }
1987 default: {
1988 // Handle target specific intrinsics
1989 std::optional<Value *> V = targetSimplifyDemandedVectorEltsIntrinsic(
1990 *II, DemandedElts, PoisonElts, PoisonElts2, PoisonElts3,
1991 simplifyAndSetOp);
1992 if (V)
1993 return *V;
1994
1995 // Trivially vectorizable intrinsics operate elementwise: each result lane
1996 // uses only the matching lane of the (vector) operands, so the demand
1997 // passes through unchanged to every vector operand.
1998 Intrinsic::ID IID = II->getIntrinsicID();
1999 if (isTriviallyVectorizable(IID)) {
2000 APInt PoisonEltsAcc(VWidth, 0);
2001 for (Use &Arg : II->args()) {
2002 unsigned OpNo = Arg.getOperandNo();
2003 // Scalar operands do not carry per-lane demand.
2004 if (isVectorIntrinsicWithScalarOpAtArg(IID, OpNo, /*TTI=*/nullptr))
2005 continue;
2006 APInt OpPoisonElts(VWidth, 0);
2007 simplifyAndSetOp(II, OpNo, DemandedElts, OpPoisonElts);
2008 PoisonEltsAcc |= OpPoisonElts;
2009 }
2010 // A result lane is poison if any operand lane is poison, but only for
2011 // intrinsics that are known to propagate poison elementwise.
2013 PoisonElts = PoisonEltsAcc;
2014 }
2015 break;
2016 }
2017 } // switch on IntrinsicID
2018 break;
2019 } // case Call
2020 } // switch on Opcode
2021
2022 // TODO: We bail completely on integer div/rem and shifts because they have
2023 // UB/poison potential, but that should be refined.
2024 BinaryOperator *BO;
2025 if (match(I, m_BinOp(BO)) && !BO->isIntDivRem() && !BO->isShift()) {
2026 Value *X = BO->getOperand(0);
2027 Value *Y = BO->getOperand(1);
2028
2029 // Look for an equivalent binop except that one operand has been shuffled.
2030 // If the demand for this binop only includes elements that are the same as
2031 // the other binop, then we may be able to replace this binop with a use of
2032 // the earlier one.
2033 //
2034 // Example:
2035 // %other_bo = bo (shuf X, {0}), Y
2036 // %this_extracted_bo = extelt (bo X, Y), 0
2037 // -->
2038 // %other_bo = bo (shuf X, {0}), Y
2039 // %this_extracted_bo = extelt %other_bo, 0
2040 //
2041 // TODO: Handle demand of an arbitrary single element or more than one
2042 // element instead of just element 0.
2043 // TODO: Unlike general demanded elements transforms, this should be safe
2044 // for any (div/rem/shift) opcode too.
2045 if (DemandedElts == 1 && !X->hasOneUse() && !Y->hasOneUse() &&
2046 BO->hasOneUse() ) {
2047
2048 auto findShufBO = [&](bool MatchShufAsOp0) -> User * {
2049 // Try to use shuffle-of-operand in place of an operand:
2050 // bo X, Y --> bo (shuf X), Y
2051 // bo X, Y --> bo X, (shuf Y)
2052
2053 Value *OtherOp = MatchShufAsOp0 ? Y : X;
2054 if (!OtherOp->hasUseList())
2055 return nullptr;
2056
2057 BinaryOperator::BinaryOps Opcode = BO->getOpcode();
2058 Value *ShufOp = MatchShufAsOp0 ? X : Y;
2059
2060 for (User *U : OtherOp->users()) {
2061 ArrayRef<int> Mask;
2062 auto Shuf = m_Shuffle(m_Specific(ShufOp), m_Value(), m_Mask(Mask));
2063 if (BO->isCommutative()
2064 ? match(U, m_c_BinOp(Opcode, Shuf, m_Specific(OtherOp)))
2065 : MatchShufAsOp0
2066 ? match(U, m_BinOp(Opcode, Shuf, m_Specific(OtherOp)))
2067 : match(U, m_BinOp(Opcode, m_Specific(OtherOp), Shuf)))
2068 if (match(Mask, m_ZeroMask()) && Mask[0] != PoisonMaskElem)
2069 if (DT.dominates(U, I))
2070 return U;
2071 }
2072 return nullptr;
2073 };
2074
2075 User *ShufBO = findShufBO(/* MatchShufAsOp0 */ true);
2076 if (!ShufBO)
2077 ShufBO = findShufBO(/* MatchShufAsOp0 */ false);
2078 if (ShufBO) {
2079 auto *ShufBOI = cast<Instruction>(ShufBO);
2080 ShufBOI->andIRFlags(BO);
2081 Worklist.add(ShufBOI);
2082 return ShufBO;
2083 }
2084 }
2085
2086 simplifyAndSetOp(I, 0, DemandedElts, PoisonElts);
2087 simplifyAndSetOp(I, 1, DemandedElts, PoisonElts2);
2088
2089 // Output elements are undefined if both are undefined. Consider things
2090 // like undef & 0. The result is known zero, not undef.
2091 PoisonElts &= PoisonElts2;
2092 }
2093
2094 // If we've proven all of the lanes poison, return a poison value.
2095 // TODO: Intersect w/demanded lanes
2096 if (PoisonElts.isAllOnes())
2097 return PoisonValue::get(I->getType());
2098
2099 return MadeChange ? I : nullptr;
2100}
2101
2102/// For floating-point classes that resolve to a single bit pattern, return that
2103/// value.
2105 bool IsCanonicalizing = false) {
2106 if (Mask == fcNone)
2107 return PoisonValue::get(Ty);
2108
2109 if (Mask == fcPosZero)
2110 return Constant::getNullValue(Ty);
2111
2112 // TODO: Support aggregate types that are allowed by FPMathOperator.
2113 if (Ty->isAggregateType())
2114 return nullptr;
2115
2116 // Turn any possible snans into quiet if we can.
2117 if (Mask == fcNan && IsCanonicalizing)
2118 return ConstantFP::getQNaN(Ty);
2119
2120 switch (Mask) {
2121 case fcNegZero:
2122 return ConstantFP::getZero(Ty, true);
2123 case fcPosInf:
2124 return ConstantFP::getInfinity(Ty);
2125 case fcNegInf:
2126 return ConstantFP::getInfinity(Ty, true);
2127 case fcQNan:
2128 // Payload bits cannot be dropped for pure signbit operations.
2129 return IsCanonicalizing ? ConstantFP::getQNaN(Ty) : nullptr;
2130 default:
2131 return nullptr;
2132 }
2133}
2134
2135/// Perform multiple-use aware simplfications for fabs(\p Src). Returns a
2136/// replacement value if it's simplified, otherwise nullptr. Updates \p Known
2137/// with the known fpclass if not simplified.
2139 FPClassTest DemandedMask,
2140 KnownFPClass KnownSrc, bool NSZ) {
2141 if ((DemandedMask & fcNan) == fcNone)
2142 KnownSrc.knownNot(fcNan);
2143 if ((DemandedMask & fcInf) == fcNone)
2144 KnownSrc.knownNot(fcInf);
2145
2146 if (KnownSrc.getSignBit() == false ||
2147 ((DemandedMask & fcNan) == fcNone && KnownSrc.isKnownNever(fcNegative)))
2148 return Src;
2149
2150 // If the only sign bit difference is due to -0, ignore it with nsz
2151 if (NSZ &&
2153 return Src;
2154
2155 Known = KnownFPClass::fabs(KnownSrc);
2156 Known.knownNot(~DemandedMask);
2157 return nullptr;
2158}
2159
2160/// Try to set an inferred no-nans or no-infs in \p FMF. \p ValidResults is a
2161/// mask of known valid results for the operator (already computed from the
2162/// result, and the known operand inputs in \p Known)
2164 FPClassTest ValidResults,
2166 if (!FMF.noNaNs() && (ValidResults & fcNan) == fcNone) {
2167 if (all_of(Known, [](const KnownFPClass KnownSrc) {
2168 return KnownSrc.isKnownNeverNaN();
2169 }))
2170 FMF.setNoNaNs();
2171 }
2172
2173 if (!FMF.noInfs() && (ValidResults & fcInf) == fcNone) {
2174 if (all_of(Known, [](const KnownFPClass KnownSrc) {
2175 return KnownSrc.isKnownNeverInfinity();
2176 }))
2177 FMF.setNoInfs();
2178 }
2179
2180 return FMF;
2181}
2182
2184 FastMathFlags FMF) {
2185 if (FMF.noNaNs())
2186 DemandedMask &= ~fcNan;
2187
2188 if (FMF.noInfs())
2189 DemandedMask &= ~fcInf;
2190 return DemandedMask;
2191}
2192
2193/// Apply epilog fixups to a floating-point intrinsic. See if the result can
2194/// fold to a constant, or apply fast math flags.
2196 FastMathFlags FMF,
2197 FPClassTest DemandedMask,
2199 ArrayRef<KnownFPClass> KnownSrcs) {
2200 FPClassTest ValidResults = DemandedMask & Known.getKnownFPClasses();
2201 Constant *SingleVal = getFPClassConstant(FPOp->getType(), ValidResults,
2202 /*IsCanonicalizing=*/true);
2203 if (SingleVal)
2204 return SingleVal;
2205
2206 FastMathFlags InferredFMF =
2207 inferFastMathValueFlags(FMF, ValidResults, KnownSrcs);
2208 if (InferredFMF != FMF) {
2210 FPOp->setFastMathFlags(InferredFMF);
2211 return FPOp;
2212 }
2213
2214 return nullptr;
2215}
2216
2217/// Perform multiple-use aware simplfications for fneg(fabs(\p Src)). Returns a
2218/// replacement value if it's simplified, otherwise nullptr. Updates \p Known
2219/// with the known fpclass if not simplified.
2221 FPClassTest DemandedMask,
2222 KnownFPClass KnownSrc, bool NSZ) {
2223 if ((DemandedMask & fcNan) == fcNone)
2224 KnownSrc.knownNot(fcNan);
2225 if ((DemandedMask & fcInf) == fcNone)
2226 KnownSrc.knownNot(fcInf);
2227
2228 // If the source value is known negative, we can directly fold to it.
2229 if (KnownSrc.getSignBit() == true)
2230 return Src;
2231
2232 // If the only sign bit difference is for 0, ignore it with nsz.
2233 if (NSZ &&
2235 return Src;
2236
2238 Known.knownNot(~DemandedMask);
2239 return nullptr;
2240}
2241
2243 FPClassTest DemandedMask,
2244 KnownFPClass KnownSrc,
2245 bool NSZ) {
2246 if (NSZ) {
2247 constexpr FPClassTest NegOrZero = fcNegative | fcPosZero;
2248 constexpr FPClassTest PosOrZero = fcPositive | fcNegZero;
2249
2250 if ((DemandedMask & ~NegOrZero) == fcNone &&
2251 KnownSrc.isKnownAlways(NegOrZero))
2252 return MagSrc;
2253
2254 if ((DemandedMask & ~PosOrZero) == fcNone &&
2255 KnownSrc.isKnownAlways(PosOrZero))
2256 return MagSrc;
2257 } else {
2258 if ((DemandedMask & ~fcNegative) == fcNone && KnownSrc.getSignBit() == true)
2259 return MagSrc;
2260
2261 if ((DemandedMask & ~fcPositive) == fcNone &&
2262 KnownSrc.getSignBit() == false)
2263 return MagSrc;
2264 }
2265
2266 return nullptr;
2267}
2268
2269static Value *
2271 const CallInst *CI, FPClassTest DemandedMask,
2272 KnownFPClass KnownLHS, KnownFPClass KnownRHS,
2273 const Function &F, bool NSZ) {
2274 bool OrderedZeroSign = !NSZ;
2275
2277 switch (IID) {
2278 case Intrinsic::maximum: {
2280
2281 // If one operand is known greater than the other, it must be that
2282 // operand unless the other is a nan.
2284 KnownRHS.getKnownFPClasses(),
2285 OrderedZeroSign) &&
2286 KnownRHS.isKnownNever(fcNan))
2287 return CI->getArgOperand(0);
2288
2290 KnownRHS.getKnownFPClasses(),
2291 OrderedZeroSign) &&
2292 KnownLHS.isKnownNever(fcNan))
2293 return CI->getArgOperand(1);
2294
2295 break;
2296 }
2297 case Intrinsic::minimum: {
2299
2300 // If one operand is known less than the other, it must be that operand
2301 // unless the other is a nan.
2303 KnownRHS.getKnownFPClasses(),
2304 OrderedZeroSign) &&
2305 KnownRHS.isKnownNever(fcNan))
2306 return CI->getArgOperand(0);
2307
2309 KnownRHS.getKnownFPClasses(),
2310 OrderedZeroSign) &&
2311 KnownLHS.isKnownNever(fcNan))
2312 return CI->getArgOperand(1);
2313
2314 break;
2315 }
2316 case Intrinsic::maxnum:
2317 case Intrinsic::maximumnum: {
2318 OpKind = IID == Intrinsic::maxnum ? KnownFPClass::MinMaxKind::maxnum
2320
2322 KnownRHS.getKnownFPClasses(),
2323 OrderedZeroSign) &&
2324 KnownLHS.isKnownNever(fcNan))
2325 return CI->getArgOperand(0);
2326
2328 KnownRHS.getKnownFPClasses(),
2329 OrderedZeroSign) &&
2330 KnownRHS.isKnownNever(fcNan))
2331 return CI->getArgOperand(1);
2332
2333 break;
2334 }
2335 case Intrinsic::minnum:
2336 case Intrinsic::minimumnum: {
2337 OpKind = IID == Intrinsic::minnum ? KnownFPClass::MinMaxKind::minnum
2339
2341 KnownRHS.getKnownFPClasses(),
2342 OrderedZeroSign) &&
2343 KnownLHS.isKnownNever(fcNan))
2344 return CI->getArgOperand(0);
2345
2347 KnownRHS.getKnownFPClasses(),
2348 OrderedZeroSign) &&
2349 KnownRHS.isKnownNever(fcNan))
2350 return CI->getArgOperand(1);
2351
2352 break;
2353 }
2354 default:
2355 llvm_unreachable("not a min/max intrinsic");
2356 }
2357
2358 Type *EltTy = CI->getType()->getScalarType();
2359 DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
2360 Known = KnownFPClass::minMaxLike(KnownLHS, KnownRHS, OpKind, Mode);
2361 Known.knownNot(~DemandedMask);
2362
2363 return getFPClassConstant(CI->getType(), Known.getKnownFPClasses(),
2364 /*IsCanonicalizing=*/true);
2365}
2366
2367static Value *
2369 FastMathFlags FMF, FPClassTest DemandedMask,
2370 KnownFPClass &Known, const SimplifyQuery &SQ,
2371 unsigned Depth) {
2372
2373 FPClassTest SrcDemandedMask = DemandedMask;
2374 if (DemandedMask & fcNan)
2375 SrcDemandedMask |= fcNan;
2376
2377 // Zero results may have been rounded from subnormal or normal sources.
2378 if (DemandedMask & fcNegZero)
2379 SrcDemandedMask |= fcNegSubnormal | fcNegNormal;
2380 if (DemandedMask & fcPosZero)
2381 SrcDemandedMask |= fcPosSubnormal | fcPosNormal;
2382
2383 // Subnormal results may have been normal in the source type
2384 if (DemandedMask & fcNegSubnormal)
2385 SrcDemandedMask |= fcNegNormal;
2386 if (DemandedMask & fcPosSubnormal)
2387 SrcDemandedMask |= fcPosNormal;
2388
2389 if (DemandedMask & fcPosInf)
2390 SrcDemandedMask |= fcPosNormal;
2391 if (DemandedMask & fcNegInf)
2392 SrcDemandedMask |= fcNegNormal;
2393
2394 KnownFPClass KnownSrc;
2395 if (IC.SimplifyDemandedFPClass(&I, 0, SrcDemandedMask, KnownSrc, SQ,
2396 Depth + 1))
2397 return &I;
2398
2399 const fltSemantics &DstTy = I.getType()->getScalarType()->getFltSemantics();
2400 const fltSemantics &SrcTy =
2401 I.getOperand(0)->getType()->getScalarType()->getFltSemantics();
2402
2403 const Function *Fn = I.getFunction();
2404 DenormalMode DstMode =
2405 Fn ? Fn->getDenormalMode(DstTy) : DenormalMode::getDynamic();
2406 DenormalMode SrcMode =
2407 Fn ? Fn->getDenormalMode(SrcTy) : DenormalMode::getDynamic();
2408
2409 Known = KnownFPClass::fptrunc(KnownSrc, DstTy, SrcTy, DstMode, SrcMode);
2410 Known.knownNot(~DemandedMask);
2411
2412 return simplifyDemandedFPClassResult(&I, FMF, DemandedMask, Known,
2413 {KnownSrc});
2414}
2415
2417 FPClassTest DemandedMask,
2419 const SimplifyQuery &SQ,
2420 unsigned Depth) {
2421 assert(Depth <= MaxAnalysisRecursionDepth && "Limit Search Depth");
2422 assert(Known == KnownFPClass() && "expected uninitialized state");
2423
2424 Type *VTy = I->getType();
2425
2426 FastMathFlags FMF;
2427 if (auto *FPOp = dyn_cast<FPMathOperator>(I)) {
2428 FMF = FPOp->getFastMathFlags();
2429 DemandedMask = adjustDemandedMaskFromFlags(DemandedMask, FMF);
2430 }
2431
2432 switch (I->getOpcode()) {
2433 case Instruction::FNeg: {
2434 // Special case fneg(fabs(x))
2435
2436 Value *FNegSrc = I->getOperand(0);
2437 Value *FNegFAbsSrc;
2438 if (match(FNegSrc, m_OneUse(m_FAbs(m_Value(FNegFAbsSrc))))) {
2439 KnownFPClass KnownSrc;
2441 llvm::unknown_sign(DemandedMask), KnownSrc,
2442 SQ, Depth + 1))
2443 return I;
2444
2445 FastMathFlags FabsFMF = cast<FPMathOperator>(FNegSrc)->getFastMathFlags();
2446 FPClassTest ThisDemandedMask =
2447 adjustDemandedMaskFromFlags(DemandedMask, FabsFMF);
2448
2449 bool IsNSZ = FMF.noSignedZeros() || FabsFMF.noSignedZeros();
2450 if (Value *Simplified = simplifyDemandedFPClassFnegFabs(
2451 Known, FNegFAbsSrc, ThisDemandedMask, KnownSrc, IsNSZ))
2452 return Simplified;
2453
2454 if ((ThisDemandedMask & fcNan) == fcNone)
2455 KnownSrc.knownNot(fcNan);
2456 if ((ThisDemandedMask & fcInf) == fcNone)
2457 KnownSrc.knownNot(fcInf);
2458
2459 // fneg(fabs(x)) => fneg(x)
2460 if (KnownSrc.getSignBit() == false)
2461 return replaceOperand(*I, 0, FNegFAbsSrc);
2462
2463 // fneg(fabs(x)) => fneg(x), ignoring -0 if nsz.
2464 if (IsNSZ &&
2466 return replaceOperand(*I, 0, FNegFAbsSrc);
2467
2468 break;
2469 }
2470
2471 if (SimplifyDemandedFPClass(I, 0, llvm::fneg(DemandedMask), Known, SQ,
2472 Depth + 1))
2473 return I;
2474 Known.fneg();
2475 Known.knownNot(~DemandedMask);
2476 break;
2477 }
2478 case Instruction::FAdd:
2479 case Instruction::FSub: {
2480 KnownFPClass KnownLHS, KnownRHS;
2481
2482 // fadd x, x can be handled more aggressively.
2483 if (I->getOperand(0) == I->getOperand(1) &&
2484 I->getOpcode() == Instruction::FAdd &&
2485 isGuaranteedNotToBeUndef(I->getOperand(0), SQ.AC, SQ.CtxI, SQ.DT,
2486 Depth + 1)) {
2487 Type *EltTy = VTy->getScalarType();
2488 DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
2489
2490 FPClassTest SrcDemandedMask = DemandedMask;
2491 if (DemandedMask & fcNan)
2492 SrcDemandedMask |= fcNan;
2493
2494 // Doubling a subnormal could have resulted in a normal value.
2495 if (DemandedMask & fcPosNormal)
2496 SrcDemandedMask |= fcPosSubnormal;
2497 if (DemandedMask & fcNegNormal)
2498 SrcDemandedMask |= fcNegSubnormal;
2499
2500 // Doubling a subnormal may produce 0 if FTZ/DAZ.
2501 if (Mode != DenormalMode::getIEEE()) {
2502 if (DemandedMask & fcPosZero) {
2503 SrcDemandedMask |= fcPosSubnormal;
2504
2505 if (Mode.inputsMayBePositiveZero() || Mode.outputsMayBePositiveZero())
2506 SrcDemandedMask |= fcNegSubnormal;
2507 }
2508
2509 if (DemandedMask & fcNegZero)
2510 SrcDemandedMask |= fcNegSubnormal;
2511 }
2512
2513 // Doubling a normal could have resulted in an infinity.
2514 if (DemandedMask & fcPosInf)
2515 SrcDemandedMask |= fcPosNormal;
2516 if (DemandedMask & fcNegInf)
2517 SrcDemandedMask |= fcNegNormal;
2518
2519 if (SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownLHS, SQ,
2520 Depth + 1))
2521 return I;
2522
2523 Known = KnownFPClass::fadd_self(KnownLHS, Mode);
2524 KnownRHS = KnownLHS;
2525 } else {
2526 FPClassTest SrcDemandedMask = fcFinite;
2527
2528 // inf + (-inf) = nan
2529 if (DemandedMask & fcNan)
2530 SrcDemandedMask |= fcNan | fcInf;
2531
2532 if (DemandedMask & fcInf)
2533 SrcDemandedMask |= fcInf;
2534
2535 if (SimplifyDemandedFPClass(I, 1, SrcDemandedMask, KnownRHS, SQ,
2536 Depth + 1) ||
2537 SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownLHS, SQ,
2538 Depth + 1))
2539 return I;
2540
2541 Type *EltTy = VTy->getScalarType();
2542 DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
2543
2544 Known = I->getOpcode() == Instruction::FAdd
2545 ? KnownFPClass::fadd(KnownLHS, KnownRHS, Mode)
2546 : KnownFPClass::fsub(KnownLHS, KnownRHS, Mode);
2547 }
2548
2549 Known.knownNot(~DemandedMask);
2550
2551 if (Constant *SingleVal = getFPClassConstant(VTy, Known.getKnownFPClasses(),
2552 /*IsCanonicalizing=*/true))
2553 return SingleVal;
2554
2555 // Propagate known result to simplify edge case checks.
2556 bool ResultNotNan = (DemandedMask & fcNan) == fcNone;
2557
2558 // With nnan: X + {+/-}Inf --> {+/-}Inf
2559 if (ResultNotNan && I->getOpcode() == Instruction::FAdd &&
2560 KnownRHS.isKnownAlways(fcInf | fcNan) && KnownLHS.isKnownNever(fcNan))
2561 return I->getOperand(1);
2562
2563 // With nnan: {+/-}Inf + X --> {+/-}Inf
2564 // With nnan: {+/-}Inf - X --> {+/-}Inf
2565 if (ResultNotNan && KnownLHS.isKnownAlways(fcInf | fcNan) &&
2566 KnownRHS.isKnownNever(fcNan))
2567 return I->getOperand(0);
2568
2570 FMF, Known.getKnownFPClasses(), {KnownLHS, KnownRHS});
2571 if (InferredFMF != FMF) {
2572 I->setFastMathFlags(InferredFMF);
2573 return I;
2574 }
2575
2576 return nullptr;
2577 }
2578 case Instruction::FMul: {
2579 KnownFPClass KnownLHS, KnownRHS;
2580
2581 Value *X = I->getOperand(0);
2582 Value *Y = I->getOperand(1);
2583
2584 FPClassTest SrcDemandedMask =
2585 DemandedMask & (fcNan | fcZero | fcSubnormal | fcNormal);
2586
2587 if (DemandedMask & fcInf) {
2588 // mul x, inf = inf
2589 // mul large_x, large_y = inf
2590 SrcDemandedMask |= fcSubnormal | fcNormal | fcInf;
2591 }
2592
2593 if (DemandedMask & fcNan) {
2594 // mul +/-inf, 0 => nan
2595 SrcDemandedMask |= fcZero | fcInf | fcNan;
2596
2597 // TODO: Mode check
2598 // mul +/-inf, sub => nan if daz
2599 SrcDemandedMask |= fcSubnormal;
2600 }
2601
2602 // mul normal, subnormal = normal
2603 // Normal inputs may result in underflow.
2604 if (DemandedMask & (fcNormal | fcSubnormal))
2605 SrcDemandedMask |= fcNormal | fcSubnormal;
2606
2607 if (DemandedMask & fcZero)
2608 SrcDemandedMask |= fcNormal | fcSubnormal;
2609
2610 if (X == Y &&
2611 isGuaranteedNotToBeUndef(X, SQ.AC, SQ.CtxI, SQ.DT, Depth + 1)) {
2612 if (SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownLHS, SQ,
2613 Depth + 1))
2614 return I;
2615 Type *EltTy = VTy->getScalarType();
2616
2617 DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
2618 Known = KnownFPClass::square(KnownLHS, Mode);
2619 Known.knownNot(~DemandedMask);
2620
2621 if (Constant *Folded = getFPClassConstant(VTy, Known.getKnownFPClasses(),
2622 /*IsCanonicalizing=*/true))
2623 return Folded;
2624
2625 if (Known.isKnownAlways(fcPosZero | fcPosInf | fcNan) &&
2626 KnownLHS.isKnownNever(fcSubnormal | fcNormal)) {
2627 // We can skip the fabs if the source was already known positive.
2628 if (KnownLHS.isKnownAlways(fcPositive))
2629 return X;
2630
2631 // => fabs(x), in case this was a -inf or -0.
2632 // Note: Dropping canonicalize.
2634 Builder.SetInsertPoint(I);
2635 Value *Fabs = Builder.CreateFAbs(X, FMF);
2636 Fabs->takeName(I);
2637 return Fabs;
2638 }
2639
2640 return nullptr;
2641 }
2642
2643 if (SimplifyDemandedFPClass(I, 1, SrcDemandedMask, KnownRHS, SQ,
2644 Depth + 1) ||
2645 SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownLHS, SQ, Depth + 1))
2646 return I;
2647
2648 if (FMF.noInfs()) {
2649 // Flag implies inputs cannot be infinity.
2650 KnownLHS.knownNot(fcInf);
2651 KnownRHS.knownNot(fcInf);
2652 }
2653
2654 bool NonNanResult = (DemandedMask & fcNan) == fcNone;
2655
2656 // With no-nans/no-infs:
2657 // X * 0.0 --> copysign(0.0, X)
2658 // X * -0.0 --> copysign(0.0, -X)
2659 if ((NonNanResult || KnownLHS.isKnownNeverInfOrNaN()) &&
2660 KnownRHS.isKnownAlways(fcPosZero | fcNan)) {
2662 Builder.SetInsertPoint(I);
2663
2664 // => copysign(+0, lhs)
2665 // Note: Dropping canonicalize
2666 Value *Copysign = Builder.CreateCopySign(Y, X, FMF);
2667 Copysign->takeName(I);
2668 return Copysign;
2669 }
2670
2671 if (KnownLHS.isKnownAlways(fcPosZero | fcNan) &&
2672 (NonNanResult || KnownRHS.isKnownNeverInfOrNaN())) {
2674 Builder.SetInsertPoint(I);
2675
2676 // => copysign(+0, rhs)
2677 // Note: Dropping canonicalize
2678 Value *Copysign = Builder.CreateCopySign(X, Y, FMF);
2679 Copysign->takeName(I);
2680 return Copysign;
2681 }
2682
2683 if ((NonNanResult || KnownLHS.isKnownNeverInfOrNaN()) &&
2684 KnownRHS.isKnownAlways(fcNegZero | fcNan)) {
2686 Builder.SetInsertPoint(I);
2687
2688 // => copysign(0, fneg(lhs))
2689 // Note: Dropping canonicalize
2690 Value *Copysign =
2691 Builder.CreateCopySign(Y, Builder.CreateFNegFMF(X, FMF), FMF);
2692 Copysign->takeName(I);
2693 return Copysign;
2694 }
2695
2696 if (KnownLHS.isKnownAlways(fcNegZero | fcNan) &&
2697 (NonNanResult || KnownRHS.isKnownNeverInfOrNaN())) {
2699 Builder.SetInsertPoint(I);
2700
2701 // => copysign(+0, fneg(rhs))
2702 // Note: Dropping canonicalize
2703 Value *Copysign =
2704 Builder.CreateCopySign(X, Builder.CreateFNegFMF(Y, FMF), FMF);
2705 Copysign->takeName(I);
2706 return Copysign;
2707 }
2708
2709 Type *EltTy = VTy->getScalarType();
2710 DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
2711
2712 if (KnownLHS.isKnownAlways(fcInf | fcNan) &&
2713 (KnownRHS.isKnownNeverNaN() &&
2714 KnownRHS.cannotBeOrderedGreaterEqZero(Mode))) {
2716 Builder.SetInsertPoint(I);
2717
2718 // Note: Dropping canonicalize
2719 Value *Neg = Builder.CreateFNegFMF(X, FMF);
2720 Neg->takeName(I);
2721 return Neg;
2722 }
2723
2724 if (KnownRHS.isKnownAlways(fcInf | fcNan) &&
2725 (KnownLHS.isKnownNeverNaN() &&
2726 KnownLHS.cannotBeOrderedGreaterEqZero(Mode))) {
2728 Builder.SetInsertPoint(I);
2729
2730 // Note: Dropping canonicalize
2731 Value *Neg = Builder.CreateFNegFMF(Y, FMF);
2732 Neg->takeName(I);
2733 return Neg;
2734 }
2735
2736 Known = KnownFPClass::fmul(KnownLHS, KnownRHS, Mode);
2737 Known.knownNot(~DemandedMask);
2738
2739 if (Constant *SingleVal = getFPClassConstant(VTy, Known.getKnownFPClasses(),
2740 /*IsCanonicalizing=*/true))
2741 return SingleVal;
2742
2744 FMF, Known.getKnownFPClasses(), {KnownLHS, KnownRHS});
2745 if (InferredFMF != FMF) {
2746 I->setFastMathFlags(InferredFMF);
2747 return I;
2748 }
2749
2750 return nullptr;
2751 }
2752 case Instruction::FDiv: {
2753 Value *X = I->getOperand(0);
2754 Value *Y = I->getOperand(1);
2755 if (X == Y &&
2756 isGuaranteedNotToBeUndef(X, SQ.AC, SQ.CtxI, SQ.DT, Depth + 1)) {
2757 // If the source is 0, inf or nan, the result is a nan
2759 Builder.SetInsertPoint(I);
2760
2761 Value *IsZeroOrNan = Builder.CreateFCmpFMF(
2762 FCmpInst::FCMP_UEQ, I->getOperand(0), ConstantFP::getZero(VTy), FMF);
2763
2764 Value *Fabs = Builder.CreateFAbs(I->getOperand(0), FMF);
2765 Value *IsInfOrNan = Builder.CreateFCmpFMF(
2767
2768 Value *IsInfOrZeroOrNan = Builder.CreateOr(IsInfOrNan, IsZeroOrNan);
2769
2770 return Builder.CreateSelectFMFWithUnknownProfile(
2771 IsInfOrZeroOrNan, ConstantFP::getQNaN(VTy),
2772 ConstantFP::get(
2774 FMF, DEBUG_TYPE);
2775 }
2776
2777 Type *EltTy = VTy->getScalarType();
2778 DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
2779
2780 // Every output class could require denormal inputs (except for the
2781 // degenerate case of only-nan results, without DAZ).
2782 FPClassTest SrcDemandedMask = (DemandedMask & fcNan) | fcSubnormal;
2783
2784 // Normal inputs may result in underflow.
2785 // x / x = 1.0 for non0/inf/nan
2786 // -x = +y / -z
2787 // -x = -y / +z
2788 if (DemandedMask & (fcSubnormal | fcNormal))
2789 SrcDemandedMask |= fcNormal;
2790
2791 if (DemandedMask & fcNan) {
2792 // 0 / 0 = nan
2793 // inf / inf = nan
2794
2795 // Subnormal is added in case of DAZ, but this isn't strictly
2796 // necessary. Every other input class implies a possible subnormal source,
2797 // so this only could matter in the degenerate case of only-nan results.
2798 SrcDemandedMask |= fcZero | fcInf | fcNan;
2799 }
2800
2801 // Zero outputs may be the result of underflow.
2802 if (DemandedMask & fcZero)
2803 SrcDemandedMask |= fcNormal | fcSubnormal;
2804
2805 FPClassTest LHSDemandedMask = SrcDemandedMask;
2806 FPClassTest RHSDemandedMask = SrcDemandedMask;
2807
2808 // 0 / inf = 0
2809 if (DemandedMask & fcZero) {
2810 assert((LHSDemandedMask & fcSubnormal) &&
2811 "should not have to worry about daz here");
2812 LHSDemandedMask |= fcZero;
2813 RHSDemandedMask |= fcInf;
2814 }
2815
2816 // x / 0 = inf
2817 // large_normal / small_normal = inf
2818 // inf / 1 = inf
2819 // large_normal / subnormal = inf
2820 if (DemandedMask & fcInf) {
2821 LHSDemandedMask |= fcInf | fcNormal | fcSubnormal;
2822 RHSDemandedMask |= fcZero | fcSubnormal | fcNormal;
2823 }
2824
2825 KnownFPClass KnownLHS, KnownRHS;
2826 if (SimplifyDemandedFPClass(I, 0, LHSDemandedMask, KnownLHS, SQ,
2827 Depth + 1) ||
2828 SimplifyDemandedFPClass(I, 1, RHSDemandedMask, KnownRHS, SQ, Depth + 1))
2829 return I;
2830
2831 bool ResultNotNan = (DemandedMask & fcNan) == fcNone;
2832 bool ResultNotInf = (DemandedMask & fcInf) == fcNone;
2833
2834 // Replacing 0/x with a zero is only valid when the divisor can't be
2835 // (logical) zero, since 0/0 is NaN -- unless NaN results aren't demanded. A
2836 // subnormal divisor can flush to zero under a flushing denormal mode.
2837 bool CanIgnoreZeroByZeroNan =
2838 ResultNotNan || KnownRHS.isKnownNeverLogicalZero(Mode);
2839
2840 // nsz [+-]0 / x -> 0
2841 if (FMF.noSignedZeros() && KnownLHS.isKnownAlways(fcZero) &&
2842 KnownRHS.isKnownNeverNaN() && CanIgnoreZeroByZeroNan)
2843 return ConstantFP::getZero(VTy);
2844
2845 if (KnownLHS.isKnownAlways(fcPosZero) && KnownRHS.isKnownNeverNaN() &&
2846 CanIgnoreZeroByZeroNan) {
2848 Builder.SetInsertPoint(I);
2849
2850 // nnan +0 / x -> copysign(0, rhs)
2851 // TODO: -0 / x => copysign(0, fneg(rhs))
2852 Value *Copysign = Builder.CreateCopySign(X, Y, FMF);
2853 Copysign->takeName(I);
2854 return Copysign;
2855 }
2856
2857 if (!ResultNotInf &&
2858 ((ResultNotNan || (KnownLHS.isKnownNeverNaN() &&
2859 KnownLHS.isKnownNeverLogicalZero(Mode))) &&
2860 (KnownRHS.isKnownAlways(fcPosZero) ||
2861 (FMF.noSignedZeros() && KnownRHS.isKnownAlways(fcZero))))) {
2863 Builder.SetInsertPoint(I);
2864
2865 // nnan x / 0 => copysign(inf, x);
2866 // nnan nsz x / -0 => copysign(inf, x);
2867 Value *Copysign =
2868 Builder.CreateCopySign(ConstantFP::getInfinity(VTy), X, FMF);
2869 Copysign->takeName(I);
2870 return Copysign;
2871 }
2872
2873 // nnan ninf X / [-]0.0 -> poison
2874 if (ResultNotNan && ResultNotInf && KnownRHS.isKnownAlways(fcZero))
2875 return PoisonValue::get(VTy);
2876
2877 Known = KnownFPClass::fdiv(KnownLHS, KnownRHS, Mode);
2878 Known.knownNot(~DemandedMask);
2879
2880 if (Constant *SingleVal = getFPClassConstant(VTy, Known.getKnownFPClasses(),
2881 /*IsCanonicalizing=*/true))
2882 return SingleVal;
2883
2885 FMF, Known.getKnownFPClasses(), {KnownLHS, KnownRHS});
2886 if (InferredFMF != FMF) {
2887 I->setFastMathFlags(InferredFMF);
2888 return I;
2889 }
2890
2891 return nullptr;
2892 }
2893 case Instruction::FPTrunc:
2894 return simplifyDemandedUseFPClassFPTrunc(*this, *I, FMF, DemandedMask,
2895 Known, SQ, Depth);
2896 case Instruction::FPExt: {
2897 FPClassTest SrcDemandedMask = DemandedMask;
2898 if (DemandedMask & fcNan)
2899 SrcDemandedMask |= fcNan;
2900
2901 // No subnormal result does not imply not-subnormal in the source type.
2902 if ((DemandedMask & fcNegNormal) != fcNone)
2903 SrcDemandedMask |= fcNegSubnormal;
2904 if ((DemandedMask & fcPosNormal) != fcNone)
2905 SrcDemandedMask |= fcPosSubnormal;
2906
2907 // TODO: Properly handle ppcf128 = fpext(f80) (since f80 has a larger
2908 // exponent range than ppcf128).
2909
2910 KnownFPClass KnownSrc;
2911 if (SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownSrc, SQ, Depth + 1))
2912 return I;
2913
2914 const fltSemantics &DstTy = VTy->getScalarType()->getFltSemantics();
2915 const fltSemantics &SrcTy =
2916 I->getOperand(0)->getType()->getScalarType()->getFltSemantics();
2917
2918 Known =
2919 KnownFPClass::fpext(KnownSrc, DstTy, SrcTy, F.getDenormalMode(DstTy),
2920 F.getDenormalMode(SrcTy));
2921 Known.knownNot(~DemandedMask);
2922
2923 return simplifyDemandedFPClassResult(I, FMF, DemandedMask, Known,
2924 {KnownSrc});
2925 }
2926 case Instruction::Call: {
2927 CallInst *CI = cast<CallInst>(I);
2928 const Intrinsic::ID IID = CI->getIntrinsicID();
2929 switch (IID) {
2930 case Intrinsic::fabs: {
2931 KnownFPClass KnownSrc;
2932 if (SimplifyDemandedFPClass(I, 0, llvm::inverse_fabs(DemandedMask),
2933 KnownSrc, SQ, Depth + 1))
2934 return I;
2935
2936 if (Value *Simplified = simplifyDemandedFPClassFabs(
2937 Known, CI->getArgOperand(0), DemandedMask, KnownSrc,
2938 FMF.noSignedZeros()))
2939 return Simplified;
2940 break;
2941 }
2942 case Intrinsic::arithmetic_fence:
2943 if (SimplifyDemandedFPClass(I, 0, DemandedMask, Known, SQ, Depth + 1))
2944 return I;
2945 break;
2946 case Intrinsic::copysign: {
2947 // Flip on more potentially demanded classes
2948 const FPClassTest DemandedMaskAnySign = llvm::unknown_sign(DemandedMask);
2949 KnownFPClass KnownMag;
2950 if (SimplifyDemandedFPClass(CI, 0, DemandedMaskAnySign, KnownMag, SQ,
2951 Depth + 1))
2952 return I;
2953
2954 if ((DemandedMask & fcNegative) == DemandedMask) {
2955 // Roundabout way of replacing with fneg(fabs)
2956 CI->setOperand(1, ConstantFP::get(VTy, -1.0));
2957 return I;
2958 }
2959
2960 if ((DemandedMask & fcPositive) == DemandedMask) {
2961 // Roundabout way of replacing with fabs
2962 CI->setOperand(1, ConstantFP::getZero(VTy));
2963 return I;
2964 }
2965
2966 if (Value *Simplified = simplifyDemandedFPClassCopysignMag(
2967 CI->getArgOperand(0), DemandedMask, KnownMag,
2968 FMF.noSignedZeros()))
2969 return Simplified;
2970
2971 KnownFPClass KnownSign =
2973 if (KnownMag.getSignBit() && KnownSign.getSignBit() &&
2974 *KnownMag.getSignBit() == *KnownSign.getSignBit())
2975 return CI->getOperand(0);
2976
2977 // TODO: Call argument attribute not considered
2978 // Input implied not-nan from flag.
2979 if (FMF.noNaNs())
2980 KnownSign.knownNot(fcNan);
2981
2982 if (KnownSign.getSignBit() == false) {
2984 CI->setOperand(1, ConstantFP::getZero(VTy));
2985 return I;
2986 }
2987
2988 if (KnownSign.getSignBit() == true) {
2990 CI->setOperand(1, ConstantFP::get(VTy, -1.0));
2991 return I;
2992 }
2993
2994 Known = KnownFPClass::copysign(KnownMag, KnownSign);
2995 Known.knownNot(~DemandedMask);
2996 break;
2997 }
2998 case Intrinsic::fma:
2999 case Intrinsic::fmuladd: {
3000 // We can't do any simplification on the source besides stripping out
3001 // unneeded nans.
3002 FPClassTest SrcDemandedMask = DemandedMask | ~fcNan;
3003 if (DemandedMask & fcNan)
3004 SrcDemandedMask |= fcNan;
3005
3006 KnownFPClass KnownSrc[3];
3007
3008 Type *EltTy = VTy->getScalarType();
3009 if (CI->getArgOperand(0) == CI->getArgOperand(1) &&
3010 isGuaranteedNotToBeUndef(CI->getArgOperand(0), SQ.AC, SQ.CtxI, SQ.DT,
3011 Depth + 1)) {
3012 if (SimplifyDemandedFPClass(CI, 0, SrcDemandedMask, KnownSrc[0], SQ,
3013 Depth + 1) ||
3014 SimplifyDemandedFPClass(CI, 2, SrcDemandedMask, KnownSrc[2], SQ,
3015 Depth + 1))
3016 return I;
3017
3018 KnownSrc[1] = KnownSrc[0];
3019 DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
3020 Known = KnownFPClass::fma_square(KnownSrc[0], KnownSrc[2], Mode);
3021 } else {
3022 for (int OpIdx = 0; OpIdx != 3; ++OpIdx) {
3023 if (SimplifyDemandedFPClass(CI, OpIdx, SrcDemandedMask,
3024 KnownSrc[OpIdx], SQ, Depth + 1))
3025 return CI;
3026 }
3027
3028 DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
3029 Known = KnownFPClass::fma(KnownSrc[0], KnownSrc[1], KnownSrc[2], Mode);
3030 }
3031
3032 return simplifyDemandedFPClassResult(CI, FMF, DemandedMask, Known,
3033 {KnownSrc});
3034 }
3035 case Intrinsic::maximum:
3036 case Intrinsic::minimum:
3037 case Intrinsic::maximumnum:
3038 case Intrinsic::minimumnum:
3039 case Intrinsic::maxnum:
3040 case Intrinsic::minnum: {
3041 const bool PropagateNaN =
3042 IID == Intrinsic::maximum || IID == Intrinsic::minimum;
3043
3044 // We can't tell much based on the demanded result without inspecting the
3045 // operands (e.g., a known-positive result could have been clamped), but
3046 // we can still prune known-nan inputs.
3047 FPClassTest SrcDemandedMask =
3048 PropagateNaN && ((DemandedMask & fcNan) == fcNone)
3049 ? DemandedMask | ~fcNan
3050 : fcAllFlags;
3051
3052 KnownFPClass KnownLHS, KnownRHS;
3053 if (SimplifyDemandedFPClass(CI, 1, SrcDemandedMask, KnownRHS, SQ,
3054 Depth + 1) ||
3055 SimplifyDemandedFPClass(CI, 0, SrcDemandedMask, KnownLHS, SQ,
3056 Depth + 1))
3057 return I;
3058
3059 Value *Simplified =
3060 simplifyDemandedFPClassMinMax(Known, IID, CI, DemandedMask, KnownLHS,
3061 KnownRHS, F, FMF.noSignedZeros());
3062 if (Simplified)
3063 return Simplified;
3064
3065 auto *FPOp = cast<FPMathOperator>(CI);
3066
3067 FPClassTest ValidResults = DemandedMask & Known.getKnownFPClasses();
3068 FastMathFlags InferredFMF = FMF;
3069
3070 if (!FMF.noSignedZeros()) {
3071 // Add NSZ flag if we know the result will not be sensitive to the sign
3072 // of 0.
3073 FPClassTest ZeroMask = fcZero;
3074
3075 Type *EltTy = VTy->getScalarType();
3076 DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
3077 if (Mode != DenormalMode::getIEEE())
3078 ZeroMask |= fcSubnormal;
3079
3080 bool ResultNotLogical0 = (ValidResults & ZeroMask) == fcNone;
3081 if (ResultNotLogical0 || ((KnownLHS.isKnownNeverLogicalNegZero(Mode) ||
3082 KnownRHS.isKnownNeverLogicalPosZero(Mode)) &&
3083 (KnownLHS.isKnownNeverLogicalPosZero(Mode) ||
3084 KnownRHS.isKnownNeverLogicalNegZero(Mode))))
3085 InferredFMF.setNoSignedZeros(true);
3086 }
3087
3088 if (!FMF.noNaNs() &&
3089 ((PropagateNaN && (ValidResults & fcNan) == fcNone) ||
3090 (KnownLHS.isKnownNeverNaN() && KnownRHS.isKnownNeverNaN()))) {
3092 InferredFMF.setNoNaNs(true);
3093 }
3094
3095 if (InferredFMF != FMF) {
3096 CI->setFastMathFlags(InferredFMF);
3097 return FPOp;
3098 }
3099
3100 return nullptr;
3101 }
3102 case Intrinsic::exp:
3103 case Intrinsic::exp2:
3104 case Intrinsic::exp10: {
3105 if ((DemandedMask & fcPositive) == fcNone) {
3106 // Only returns positive values or nans.
3107 if ((DemandedMask & fcNan) == fcNone)
3108 return PoisonValue::get(VTy);
3109
3110 // Only need nan propagation.
3111 if ((DemandedMask & ~fcNan) == fcNone)
3112 return ConstantFP::getQNaN(VTy);
3113
3114 return CI->getArgOperand(0);
3115 }
3116
3117 FPClassTest SrcDemandedMask = DemandedMask & fcNan;
3118 if (DemandedMask & fcNan)
3119 SrcDemandedMask |= fcNan;
3120
3121 if (DemandedMask & fcZero) {
3122 // exp(-infinity) = 0
3123 SrcDemandedMask |= fcNegInf;
3124
3125 // exp(-largest_normal) = 0
3126 //
3127 // Negative numbers of sufficiently large magnitude underflow to 0. No
3128 // subnormal input has a 0 result.
3129 SrcDemandedMask |= fcNegNormal;
3130 }
3131
3132 if (DemandedMask & fcPosSubnormal) {
3133 // Negative numbers of sufficiently large magnitude underflow to 0. No
3134 // subnormal input has a 0 result.
3135 SrcDemandedMask |= fcNegNormal;
3136 }
3137
3138 if (DemandedMask & fcPosNormal) {
3139 // exp(0) = 1
3140 // exp(+/- smallest_normal) = 1
3141 // exp(+/- largest_denormal) = 1
3142 // exp(+/- smallest_denormal) = 1
3143 // exp(-1) = pos normal
3144 SrcDemandedMask |= fcNormal | fcSubnormal | fcZero;
3145 }
3146
3147 // exp(inf), exp(largest_normal) = inf
3148 if (DemandedMask & fcPosInf)
3149 SrcDemandedMask |= fcPosInf | fcPosNormal;
3150
3151 KnownFPClass KnownSrc;
3152
3153 // TODO: This could really make use of KnownFPClass of specific value
3154 // range, (i.e., close enough to 1)
3155 if (SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownSrc, SQ,
3156 Depth + 1))
3157 return I;
3158
3159 // exp(+/-0) = 1
3160 if (KnownSrc.isKnownAlways(fcZero))
3161 return ConstantFP::get(VTy, 1.0);
3162
3163 // Only perform nan propagation.
3164 // Note: Dropping canonicalize / quiet of signaling nan.
3165 if (KnownSrc.isKnownAlways(fcNan))
3166 return CI->getArgOperand(0);
3167
3168 // exp(0 | nan) => x == 0.0 ? 1.0 : x
3169 if (KnownSrc.isKnownAlways(fcZero | fcNan)) {
3171 Builder.SetInsertPoint(CI);
3172
3173 // fadd +/-0, 1.0 => 1.0
3174 // fadd nan, 1.0 => nan
3175 return Builder.CreateFAddFMF(CI->getArgOperand(0),
3176 ConstantFP::get(VTy, 1.0), FMF);
3177 }
3178
3179 if (KnownSrc.isKnownAlways(fcInf | fcNan)) {
3180 // exp(-inf) = 0
3181 // exp(+inf) = +inf
3183 Builder.SetInsertPoint(CI);
3184
3185 // Note: Dropping canonicalize / quiet of signaling nan.
3186 Value *X = CI->getArgOperand(0);
3187 Value *IsPosInfOrNan = Builder.CreateFCmpFMF(
3189 // We do not know whether an infinity or a NaN is more likely here,
3190 // so mark the branch weights as unkown.
3191 Value *ZeroOrInf = Builder.CreateSelectFMFWithUnknownProfile(
3192 IsPosInfOrNan, X, ConstantFP::getZero(VTy), FMF, DEBUG_TYPE);
3193 return ZeroOrInf;
3194 }
3195
3196 Known = KnownFPClass::exp(KnownSrc);
3197 Known.knownNot(~DemandedMask);
3198
3199 return simplifyDemandedFPClassResult(CI, FMF, DemandedMask, Known,
3200 KnownSrc);
3201 }
3202 case Intrinsic::log:
3203 case Intrinsic::log2:
3204 case Intrinsic::log10: {
3205 Type *EltTy = VTy->getScalarType();
3206 bool IsMultiUnitFPType = EltTy->isMultiUnitFPType();
3207
3208 FPClassTest DemandedSrcMask = DemandedMask & (fcNan | fcPosInf);
3209 if (DemandedMask & fcNan)
3210 DemandedSrcMask |= fcNan;
3211
3212 DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
3213
3214 // log(x) can be negative zero or subnormal if x is close to +1.0 for the
3215 // PPCDoubleDouble type.
3216 if (IsMultiUnitFPType && (DemandedMask & (fcNegZero | fcSubnormal))) {
3217 DemandedSrcMask |= fcPosNormal;
3218 // Note that DoubleAPFloat::isDenormal considers 1.0 + DBL_TRUE_MIN to
3219 // be denormal, which APFloat::classify treats as fcSubnormal.
3220 DemandedSrcMask |= fcPosSubnormal;
3221 }
3222
3223 // log(x < 0) = nan
3224 if (DemandedMask & fcNan)
3225 DemandedSrcMask |= (fcNegative & ~fcNegZero);
3226
3227 // log(0) = -inf
3228 if (DemandedMask & fcNegInf) {
3229 DemandedSrcMask |= fcZero;
3230
3231 // Subnormals may be treated as logical zero.
3232 if (Mode.inputsMayBeZero())
3233 DemandedSrcMask |= fcSubnormal;
3234 }
3235
3236 if (DemandedMask & fcNormal)
3237 DemandedSrcMask |= fcNormal | fcSubnormal;
3238
3239 // log(1) = 0
3240 if (DemandedMask & fcZero)
3241 DemandedSrcMask |= fcPosNormal;
3242
3243 KnownFPClass KnownSrc;
3244 if (SimplifyDemandedFPClass(I, 0, DemandedSrcMask, KnownSrc, SQ,
3245 Depth + 1))
3246 return I;
3247
3248 Known = KnownFPClass::log(KnownSrc, Mode, IsMultiUnitFPType);
3249 Known.knownNot(~DemandedMask);
3250
3251 return simplifyDemandedFPClassResult(CI, FMF, DemandedMask, Known,
3252 KnownSrc);
3253 }
3254 case Intrinsic::sqrt: {
3255 Type *EltTy = VTy->getScalarType();
3256 DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
3257
3258 // Be explicit about the DemandedSrcMask so we do not miss anything.
3259 FPClassTest DemandedSrcMask = fcNone;
3260 if (DemandedMask & fcSNan)
3261 DemandedSrcMask |= fcSNan;
3262 if (DemandedMask & fcQNan)
3263 DemandedSrcMask |=
3265 if (DemandedMask & fcNegZero) {
3266 DemandedSrcMask |= fcNegZero;
3267 if (Mode.Input == DenormalMode::PreserveSign ||
3268 Mode.Input == DenormalMode::Dynamic)
3269 DemandedSrcMask |= fcNegSubnormal;
3270 }
3271 if (DemandedMask & fcPosZero) {
3272 DemandedSrcMask |= fcPosZero;
3273 if (Mode.inputsMayBeZero())
3274 DemandedSrcMask |= fcPosSubnormal;
3275 if (Mode.inputsMayBePositiveZero())
3276 DemandedSrcMask |= fcNegSubnormal;
3277 }
3278 if (DemandedMask & fcPosNormal)
3279 DemandedSrcMask |= fcPosSubnormal | fcPosNormal;
3280 if (DemandedMask & fcPosInf)
3281 DemandedSrcMask |= fcPosInf;
3282
3283 KnownFPClass KnownSrc;
3284 if (SimplifyDemandedFPClass(I, 0, DemandedSrcMask, KnownSrc, SQ,
3285 Depth + 1))
3286 return I;
3287
3288 KnownSrc.knownNot(~DemandedSrcMask);
3289
3290 // sqrt(-x) = nan, but be careful of negative subnormals flushed to 0.
3291 // TODO: This becomes redundant if KnownFPClass::sqrt rules out
3292 // fcPosNormal.
3293 if (KnownSrc.isKnownNever(fcPositive) &&
3294 KnownSrc.isKnownNeverLogicalZero(Mode))
3295 return ConstantFP::getQNaN(VTy);
3296
3297 Known = KnownFPClass::sqrt(KnownSrc, Mode);
3298 Known.knownNot(~DemandedMask);
3299
3300 if (Known.getKnownFPClasses() == fcZero) {
3301 if (FMF.noSignedZeros())
3302 return ConstantFP::getZero(VTy);
3304 Builder.SetInsertPoint(CI);
3305
3306 Value *Copysign = Builder.CreateCopySign(ConstantFP::getZero(VTy),
3307 CI->getArgOperand(0), FMF);
3308 Copysign->takeName(CI);
3309 return Copysign;
3310 }
3311
3312 // TODO: fold sqrt(x) -> x when x is nan | pinf | zero
3313
3314 return simplifyDemandedFPClassResult(CI, FMF, DemandedMask, Known,
3315 {KnownSrc});
3316 }
3317 case Intrinsic::ldexp: {
3318 FPClassTest SrcDemandedMask = DemandedMask & fcInf;
3319 if (DemandedMask & fcNan)
3320 SrcDemandedMask |= fcNan;
3321
3322 if (DemandedMask & fcPosInf)
3323 SrcDemandedMask |= fcPosNormal | fcPosSubnormal;
3324 if (DemandedMask & fcNegInf)
3325 SrcDemandedMask |= fcNegNormal | fcNegSubnormal;
3326
3327 if (DemandedMask & (fcPosNormal | fcPosSubnormal))
3328 SrcDemandedMask |= fcPosNormal | fcPosSubnormal;
3329 if (DemandedMask & (fcNegNormal | fcNegSubnormal))
3330 SrcDemandedMask |= fcNegNormal | fcNegSubnormal;
3331
3332 if (DemandedMask & fcPosZero)
3333 SrcDemandedMask |= fcPosFinite;
3334 if (DemandedMask & fcNegZero)
3335 SrcDemandedMask |= fcNegFinite;
3336
3337 KnownFPClass KnownSrc;
3338 if (SimplifyDemandedFPClass(CI, 0, SrcDemandedMask, KnownSrc, SQ,
3339 Depth + 1))
3340 return CI;
3341
3342 Type *EltTy = VTy->getScalarType();
3343 const fltSemantics &FltSem = EltTy->getFltSemantics();
3344 DenormalMode Mode = F.getDenormalMode(FltSem);
3345
3346 KnownBits KnownExpBits =
3348
3349 Known = KnownFPClass::ldexp(KnownSrc, KnownExpBits, FltSem, Mode);
3350 Known.knownNot(~DemandedMask);
3351
3352 return simplifyDemandedFPClassResult(CI, FMF, DemandedMask, Known,
3353 {KnownSrc});
3354 }
3355 case Intrinsic::trunc:
3356 case Intrinsic::floor:
3357 case Intrinsic::ceil:
3358 case Intrinsic::rint:
3359 case Intrinsic::nearbyint:
3360 case Intrinsic::round:
3361 case Intrinsic::roundeven: {
3362 Type *EltTy = VTy->getScalarType();
3363 DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
3364
3365 FPClassTest DemandedSrcMask = DemandedMask;
3366 if (DemandedMask & fcNan)
3367 DemandedSrcMask |= fcNan;
3368
3369 const bool IsMultiUnitFPType = EltTy->isMultiUnitFPType();
3370 // Rounding a finite multi-unit value may overflow to an infinity.
3371 if (IsMultiUnitFPType) {
3372 if (IID != Intrinsic::trunc && IID != Intrinsic::floor &&
3373 (DemandedMask & fcPosInf))
3374 DemandedSrcMask |= fcPosNormal;
3375 if (IID != Intrinsic::trunc && IID != Intrinsic::ceil &&
3376 (DemandedMask & fcNegInf))
3377 DemandedSrcMask |= fcNegNormal;
3378 }
3379
3380 // Zero results imply valid subnormal sources.
3381 if (DemandedMask & fcNegZero)
3382 DemandedSrcMask |= fcNegSubnormal | fcNegNormal;
3383
3384 if (DemandedMask & fcPosZero) {
3385 DemandedSrcMask |= fcPosSubnormal | fcPosNormal;
3386 if (Mode.inputsMayBePositiveZero())
3387 DemandedSrcMask |= fcNegSubnormal;
3388 }
3389
3390 // Rounding a subnormal away from zero may produce a normal value.
3391 if (DemandedMask & fcNegNormal)
3392 DemandedSrcMask |= fcNegSubnormal;
3393 if (DemandedMask & fcPosNormal)
3394 DemandedSrcMask |= fcPosSubnormal;
3395
3396 KnownFPClass KnownSrc;
3397 if (SimplifyDemandedFPClass(CI, 0, DemandedSrcMask, KnownSrc, SQ,
3398 Depth + 1))
3399 return I;
3400
3401 // Note: Possibly dropping snan quiet.
3402 if (KnownSrc.isKnownAlways(fcInf | fcNan | fcZero))
3403 return CI->getArgOperand(0);
3404
3405 bool IsRoundNearestOrTrunc =
3406 IID == Intrinsic::round || IID == Intrinsic::roundeven ||
3407 IID == Intrinsic::nearbyint || IID == Intrinsic::rint ||
3408 IID == Intrinsic::trunc;
3409
3410 // Ignore denormals-as-zero, as canonicalization is not mandated.
3411 if ((IID == Intrinsic::floor || IsRoundNearestOrTrunc) &&
3413 return ConstantFP::getZero(VTy);
3414
3415 if ((IID == Intrinsic::ceil || IsRoundNearestOrTrunc) &&
3417 return ConstantFP::getZero(VTy, true);
3418
3419 if (IID == Intrinsic::floor && KnownSrc.isKnownAlways(fcNegSubnormal))
3420 return ConstantFP::get(VTy, -1.0);
3421
3422 if (IID == Intrinsic::ceil && KnownSrc.isKnownAlways(fcPosSubnormal))
3423 return ConstantFP::get(VTy, 1.0);
3424
3425 switch (IID) {
3426 case Intrinsic::trunc:
3427 Known = KnownFPClass::trunc(KnownSrc, Mode);
3428 break;
3429 case Intrinsic::floor:
3430 Known = KnownFPClass::floor(KnownSrc, IsMultiUnitFPType, Mode);
3431 break;
3432 case Intrinsic::ceil:
3433 Known = KnownFPClass::ceil(KnownSrc, IsMultiUnitFPType, Mode);
3434 break;
3435 default:
3436 Known =
3437 KnownFPClass::roundToIntegral(KnownSrc, IsMultiUnitFPType, Mode);
3438 break;
3439 }
3440
3441 Known.knownNot(~DemandedMask);
3442
3443 if (Constant *SingleVal =
3444 getFPClassConstant(VTy, Known.getKnownFPClasses(),
3445 /*IsCanonicalizing=*/true))
3446 return SingleVal;
3447
3448 if ((IID == Intrinsic::trunc || IsRoundNearestOrTrunc) &&
3449 KnownSrc.isKnownAlways(fcZero | fcSubnormal)) {
3451 Builder.SetInsertPoint(CI);
3452
3453 Value *Copysign = Builder.CreateCopySign(ConstantFP::getZero(VTy),
3454 CI->getArgOperand(0));
3455 Copysign->takeName(CI);
3456 return Copysign;
3457 }
3458
3459 FastMathFlags InferredFMF =
3460 inferFastMathValueFlags(FMF, Known.getKnownFPClasses(), KnownSrc);
3461 if (InferredFMF != FMF) {
3463 CI->setFastMathFlags(InferredFMF);
3464 return CI;
3465 }
3466
3467 return nullptr;
3468 }
3469 case Intrinsic::fptrunc_round:
3470 return simplifyDemandedUseFPClassFPTrunc(*this, *CI, FMF, DemandedMask,
3471 Known, SQ, Depth);
3472 case Intrinsic::canonicalize: {
3473 Type *EltTy = VTy->getScalarType();
3474
3475 // TODO: This could have more refined support for PositiveZero denormal
3476 // mode.
3477 if (EltTy->isIEEELikeFPTy()) {
3478 DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
3479
3480 FPClassTest SrcDemandedMask = DemandedMask;
3481
3482 // A demanded quiet nan result may have come from a signaling nan, so we
3483 // need to expand the demanded mask.
3484 if ((DemandedMask & fcQNan) != fcNone)
3485 SrcDemandedMask |= fcSNan;
3486
3487 if (Mode != DenormalMode::getIEEE()) {
3488 // Any zero results may have come from flushed denormals.
3489 if (DemandedMask & fcPosZero)
3490 SrcDemandedMask |= fcPosSubnormal;
3491 if (DemandedMask & fcNegZero)
3492 SrcDemandedMask |= fcNegSubnormal;
3493 }
3494
3495 if (Mode == DenormalMode::getPreserveSign()) {
3496 // If a denormal input will be flushed, and we don't need zeros, we
3497 // don't need denormals either.
3498 if ((DemandedMask & fcPosZero) == fcNone)
3499 SrcDemandedMask &= ~fcPosSubnormal;
3500
3501 if ((DemandedMask & fcNegZero) == fcNone)
3502 SrcDemandedMask &= ~fcNegSubnormal;
3503 }
3504
3505 KnownFPClass KnownSrc;
3506
3507 // Simplify upstream operations before trying to simplify this call.
3508 if (SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownSrc, SQ,
3509 Depth + 1))
3510 return I;
3511
3512 // Perform the canonicalization to see if this folded to a constant.
3513 Known = KnownFPClass::canonicalize(KnownSrc, Mode);
3514 Known.knownNot(~DemandedMask);
3515
3516 if (Constant *SingleVal =
3517 getFPClassConstant(VTy, Known.getKnownFPClasses()))
3518 return SingleVal;
3519
3520 // For IEEE handling, there is only a bit change for nan inputs, so we
3521 // can drop it if we do not demand nan results or we know the input
3522 // isn't a nan.
3523 // Otherwise, we also need to avoid denormal inputs to drop the
3524 // canonicalize.
3525 if (KnownSrc.isKnownNeverNaN() && (Mode == DenormalMode::getIEEE() ||
3526 KnownSrc.isKnownNeverSubnormal()))
3527 return CI->getArgOperand(0);
3528
3529 FastMathFlags InferredFMF =
3530 inferFastMathValueFlags(FMF, Known.getKnownFPClasses(), KnownSrc);
3531 if (InferredFMF != FMF) {
3533 CI->setFastMathFlags(InferredFMF);
3534 return CI;
3535 }
3536
3537 return nullptr;
3538 }
3539
3540 [[fallthrough]];
3541 }
3542 default:
3543 Known = computeKnownFPClass(I, DemandedMask, SQ, Depth + 1);
3544 Known.knownNot(~DemandedMask);
3545 break;
3546 }
3547
3548 break;
3549 }
3550 case Instruction::Select: {
3551 KnownFPClass KnownLHS, KnownRHS;
3552 if (SimplifyDemandedFPClass(I, 2, DemandedMask, KnownRHS, SQ, Depth + 1) ||
3553 SimplifyDemandedFPClass(I, 1, DemandedMask, KnownLHS, SQ, Depth + 1))
3554 return I;
3555
3556 if (KnownLHS.isKnownNever(DemandedMask))
3557 return I->getOperand(2);
3558 if (KnownRHS.isKnownNever(DemandedMask))
3559 return I->getOperand(1);
3560
3561 adjustKnownFPClassForSelectArm(KnownLHS, I->getOperand(0), I->getOperand(1),
3562 /*Invert=*/false, SQ, Depth);
3563 adjustKnownFPClassForSelectArm(KnownRHS, I->getOperand(0), I->getOperand(2),
3564 /*Invert=*/true, SQ, Depth);
3565 Known = KnownLHS.intersectWith(KnownRHS);
3566 Known.knownNot(~DemandedMask);
3567 break;
3568 }
3569 case Instruction::ExtractElement: {
3570 // TODO: Handle demanded element mask
3571 if (SimplifyDemandedFPClass(I, 0, DemandedMask, Known, SQ, Depth + 1))
3572 return I;
3573 Known.knownNot(~DemandedMask);
3574 break;
3575 }
3576 case Instruction::InsertElement: {
3577 KnownFPClass KnownInserted, KnownVec;
3578 if (SimplifyDemandedFPClass(I, 1, DemandedMask, KnownInserted, SQ,
3579 Depth + 1) ||
3580 SimplifyDemandedFPClass(I, 0, DemandedMask, KnownVec, SQ, Depth + 1))
3581 return I;
3582
3583 // TODO: Use demanded elements logic from computeKnownFPClass
3584 Known = KnownVec | KnownInserted;
3585 Known.knownNot(~DemandedMask);
3586 break;
3587 }
3588 case Instruction::ShuffleVector: {
3589 KnownFPClass KnownLHS, KnownRHS;
3590 if (SimplifyDemandedFPClass(I, 1, DemandedMask, KnownRHS, SQ, Depth + 1) ||
3591 SimplifyDemandedFPClass(I, 0, DemandedMask, KnownLHS, SQ, Depth + 1))
3592 return I;
3593
3594 // TODO: This is overly conservative and should consider demanded elements,
3595 // and splats.
3596 Known = KnownLHS | KnownRHS;
3597 Known.knownNot(~DemandedMask);
3598 break;
3599 }
3600 case Instruction::InsertValue: {
3601 KnownFPClass KnownAgg, KnownElt;
3602 if (SimplifyDemandedFPClass(I, 0, DemandedMask, KnownAgg, SQ, Depth + 1) ||
3603 SimplifyDemandedFPClass(I, 1, DemandedMask, KnownElt, SQ, Depth + 1))
3604 return I;
3605
3606 Known = KnownAgg | KnownElt;
3607 break;
3608 }
3609 case Instruction::ExtractValue: {
3610 Value *ExtractSrc;
3611 if (match(I, m_ExtractValue<0>(m_OneUse(m_Value(ExtractSrc))))) {
3612 if (auto *II = dyn_cast<IntrinsicInst>(ExtractSrc)) {
3613 const Intrinsic::ID IID = II->getIntrinsicID();
3614 switch (IID) {
3615 case Intrinsic::frexp: {
3616 FPClassTest SrcDemandedMask = fcNone;
3617
3618 if (DemandedMask & fcNan)
3619 SrcDemandedMask |= fcNan;
3620
3621 // Positive subnormals and negative subnormals could become positive
3622 // zero.
3623 if (DemandedMask & fcPosZero)
3624 SrcDemandedMask |= fcPosZero | fcSubnormal;
3625
3626 // Negative subnormals could become negative zero.
3627 if (DemandedMask & fcNegZero)
3628 SrcDemandedMask |= fcNegZero | fcNegSubnormal;
3629
3630 if (DemandedMask & (fcNegNormal | fcNegSubnormal))
3631 SrcDemandedMask |= fcNegNormal | fcNegSubnormal;
3632 if (DemandedMask & (fcPosNormal | fcPosSubnormal))
3633 SrcDemandedMask |= fcPosNormal | fcPosSubnormal;
3634
3635 if (DemandedMask & fcPosInf)
3636 SrcDemandedMask |= fcPosInf;
3637 if (DemandedMask & fcNegInf)
3638 SrcDemandedMask |= fcNegInf;
3639
3640 KnownFPClass KnownSrc;
3641 if (SimplifyDemandedFPClass(II, 0, SrcDemandedMask, KnownSrc, SQ,
3642 Depth + 1))
3643 return I;
3644
3645 Type *EltTy = VTy->getScalarType();
3646 DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
3647
3648 Known = KnownFPClass::frexp_mant(KnownSrc, Mode);
3649 Known.setKnownFPClasses(Known.getKnownFPClasses() & DemandedMask);
3650
3651 if (Constant *SingleVal =
3652 getFPClassConstant(VTy, Known.getKnownFPClasses(),
3653 /*IsCanonicalizing=*/true))
3654 return SingleVal;
3655
3656 // frexp returns zero, infinity, and NaN inputs unchanged.
3657 if (KnownSrc.isKnownAlways(fcZero | fcInf | fcNan))
3658 return II->getArgOperand(0);
3659
3660 return nullptr;
3661 }
3662 default:
3663 break;
3664 }
3665 }
3666 }
3667
3668 KnownFPClass KnownSrc;
3669 if (SimplifyDemandedFPClass(I, 0, DemandedMask, KnownSrc, SQ, Depth + 1))
3670 return I;
3671 Known = KnownSrc;
3672 break;
3673 }
3674 case Instruction::PHI: {
3675 const unsigned PhiRecursionLimit = MaxAnalysisRecursionDepth - 2;
3676 if (Depth >= PhiRecursionLimit)
3677 break;
3678
3680 SimplifyQuery ContextSQ = SQ.getWithoutCondContext();
3681
3682 bool First = true;
3683 bool Changed = false;
3684 for (unsigned I = 0, E = P->getNumIncomingValues(); I != E; ++I) {
3685 // TODO: Better support for self recursive phi
3686 BasicBlock *PredBB = P->getIncomingBlock(I);
3687 const Instruction *CtxI = PredBB->getTerminator();
3688
3689 // Attempt to simplify all incoming edges at a time. If we simplify one
3690 // incoming edge, the phi may fold away, losing information on a later
3691 // visit.
3692 KnownFPClass KnownSrc;
3694 P, P->getOperandNumForIncomingValue(I), DemandedMask, KnownSrc,
3695 ContextSQ.getWithInstruction(CtxI), Depth + 1)) {
3696 // Fixup the other block references to the simplified value.
3697 P->setIncomingValueForBlock(PredBB, P->getIncomingValue(I));
3698 Changed = true;
3699 }
3700
3701 if (First) {
3702 Known = KnownSrc;
3703 First = false;
3704 } else {
3705 Known |= KnownSrc;
3706 }
3707 }
3708
3709 if (Changed)
3710 return P;
3711
3712 Known.knownNot(~DemandedMask);
3713 break;
3714 }
3715 default:
3716 Known = computeKnownFPClass(I, DemandedMask, SQ, Depth + 1);
3717 Known.knownNot(~DemandedMask);
3718 break;
3719 }
3720
3721 return getFPClassConstant(VTy, Known.getKnownFPClasses());
3722}
3723
3724/// Helper routine of SimplifyDemandedUseFPClass. It computes Known
3725/// floating-point classes. It also tries to handle simplifications that can be
3726/// done based on DemandedMask, but without modifying the Instruction.
3728 Instruction *I, FPClassTest DemandedMask, KnownFPClass &Known,
3729 const SimplifyQuery &SQ, unsigned Depth) {
3730 FastMathFlags FMF;
3731 if (auto *FPOp = dyn_cast<FPMathOperator>(I)) {
3732 FMF = FPOp->getFastMathFlags();
3733 DemandedMask = adjustDemandedMaskFromFlags(DemandedMask, FMF);
3734 }
3735
3736 switch (I->getOpcode()) {
3737 case Instruction::Select: {
3738 // TODO: Can we infer which side it came from based on adjusted result
3739 // class?
3740 KnownFPClass KnownRHS =
3741 computeKnownFPClass(I->getOperand(2), DemandedMask, SQ, Depth + 1);
3742 if (KnownRHS.isKnownNever(DemandedMask))
3743 return I->getOperand(1);
3744
3745 KnownFPClass KnownLHS =
3746 computeKnownFPClass(I->getOperand(1), DemandedMask, SQ, Depth + 1);
3747 if (KnownLHS.isKnownNever(DemandedMask))
3748 return I->getOperand(2);
3749
3750 adjustKnownFPClassForSelectArm(KnownLHS, I->getOperand(0), I->getOperand(1),
3751 /*Invert=*/false, SQ, Depth);
3752 adjustKnownFPClassForSelectArm(KnownRHS, I->getOperand(0), I->getOperand(2),
3753 /*Invert=*/true, SQ, Depth);
3754 Known = KnownLHS.intersectWith(KnownRHS);
3755 Known.knownNot(~DemandedMask);
3756 break;
3757 }
3758 case Instruction::FNeg: {
3759 // Special case fneg(fabs(x))
3760 Value *Src;
3761
3762 Value *FNegSrc = I->getOperand(0);
3763 if (!match(FNegSrc, m_FAbs(m_Value(Src)))) {
3764 Known = computeKnownFPClass(I, DemandedMask, SQ, Depth + 1);
3765 break;
3766 }
3767
3768 KnownFPClass KnownSrc = computeKnownFPClass(Src, fcAllFlags, SQ, Depth + 1);
3769
3770 FastMathFlags FabsFMF = cast<FPMathOperator>(FNegSrc)->getFastMathFlags();
3771 FPClassTest ThisDemandedMask =
3772 adjustDemandedMaskFromFlags(DemandedMask, FabsFMF);
3773
3774 // We cannot apply the NSZ logic with multiple uses. We can apply it if the
3775 // inner fabs has it and this is the only use.
3776 if (Value *Simplified = simplifyDemandedFPClassFnegFabs(
3777 Known, Src, ThisDemandedMask, KnownSrc, /*NSZ=*/false))
3778 return Simplified;
3779 break;
3780 }
3781 case Instruction::Call: {
3782 const CallInst *CI = cast<CallInst>(I);
3783 const Intrinsic::ID IID = CI->getIntrinsicID();
3784 switch (IID) {
3785 case Intrinsic::fabs: {
3786 Value *Src = CI->getArgOperand(0);
3787 KnownFPClass KnownSrc =
3789
3790 // NSZ cannot be applied in multiple use case (maybe it could if all uses
3791 // were known nsz)
3792 if (Value *Simplified = simplifyDemandedFPClassFabs(
3793 Known, CI->getArgOperand(0), DemandedMask, KnownSrc,
3794 /*NSZ=*/false))
3795 return Simplified;
3796 break;
3797 }
3798 case Intrinsic::copysign: {
3799 Value *Mag = CI->getArgOperand(0);
3800 Value *Sign = CI->getArgOperand(1);
3801 KnownFPClass KnownMag =
3803
3804 // Rule out some cases by magnitude, which may help prove the sign bit is
3805 // one direction or the other.
3806 KnownMag.knownNot(~llvm::unknown_sign(DemandedMask));
3807
3808 // Cannot use nsz in the multiple use case.
3809 if (Value *Simplified = simplifyDemandedFPClassCopysignMag(
3810 Mag, DemandedMask, KnownMag, /*NSZ=*/false))
3811 return Simplified;
3812
3813 KnownFPClass KnownSign =
3815
3816 if (FMF.noInfs())
3817 KnownSign.knownNot(fcInf);
3818 if (FMF.noNaNs())
3819 KnownSign.knownNot(fcNan);
3820
3821 if (KnownSign.getSignBit() && KnownMag.getSignBit() &&
3822 *KnownSign.getSignBit() == *KnownMag.getSignBit())
3823 return Mag;
3824
3825 Known = KnownFPClass::copysign(KnownMag, KnownSign);
3826 break;
3827 }
3828 case Intrinsic::maxnum:
3829 case Intrinsic::minnum:
3830 case Intrinsic::maximum:
3831 case Intrinsic::minimum:
3832 case Intrinsic::maximumnum:
3833 case Intrinsic::minimumnum: {
3835 DemandedMask, SQ, Depth + 1);
3836 if (KnownRHS.isUnknown())
3837 return nullptr;
3838
3840 DemandedMask, SQ, Depth + 1);
3841
3842 // Cannot use NSZ in the multiple use case.
3843 return simplifyDemandedFPClassMinMax(Known, IID, CI, DemandedMask,
3844 KnownLHS, KnownRHS, F,
3845 /*NSZ=*/false);
3846 }
3847 default:
3848 break;
3849 }
3850
3851 [[fallthrough]];
3852 }
3853 default:
3854 Known = computeKnownFPClass(I, DemandedMask, SQ, Depth + 1);
3855 Known.knownNot(~DemandedMask);
3856 break;
3857 }
3858
3859 return getFPClassConstant(I->getType(), Known.getKnownFPClasses());
3860}
3861
3863 FPClassTest DemandedMask,
3865 const SimplifyQuery &SQ,
3866 unsigned Depth) {
3867 Use &U = I->getOperandUse(OpNo);
3868 Value *V = U.get();
3869 Type *VTy = V->getType();
3870
3871 if (DemandedMask == fcNone) {
3872 if (isa<PoisonValue>(V))
3873 return false;
3875 return true;
3876 }
3877
3878 // Handle constant
3880 if (!VInst) {
3881 // Handle constants and arguments
3883 Known.knownNot(~DemandedMask);
3884
3885 if (Known.getKnownFPClasses() == fcNone) {
3886 if (isa<PoisonValue>(V))
3887 return false;
3889 return true;
3890 }
3891
3892 // Do not try to replace values which are already constants (unless we are
3893 // folding to poison). Doing so could promote poison elements to non-poison
3894 // constants.
3895 if (isa<Constant>(V))
3896 return false;
3897
3898 Value *FoldedToConst = getFPClassConstant(VTy, Known.getKnownFPClasses());
3899 if (!FoldedToConst || FoldedToConst == V)
3900 return false;
3901
3902 replaceUse(U, FoldedToConst);
3903 return true;
3904 }
3905
3907 Known.knownNot(~DemandedMask);
3908 return false;
3909 }
3910
3911 Value *NewVal;
3912
3913 if (VInst->hasOneUse()) {
3914 // If the instruction has one use, we can directly simplify it.
3915 NewVal = SimplifyDemandedUseFPClass(VInst, DemandedMask, Known, SQ, Depth);
3916 } else {
3917 // If there are multiple uses of this instruction, then we can simplify
3918 // VInst to some other value, but not modify the instruction.
3919 NewVal = SimplifyMultipleUseDemandedFPClass(VInst, DemandedMask, Known, SQ,
3920 Depth);
3921 }
3922
3923 if (!NewVal)
3924 return false;
3925 if (Instruction *OpInst = dyn_cast<Instruction>(U))
3926 salvageDebugInfo(*OpInst);
3927
3928 replaceUse(U, NewVal);
3929 return true;
3930}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
uint64_t uint64_t
AMDGPU Register Bank Select
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define X(NUM, ENUM, NAME)
Definition ELF.h:665
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
#define DEBUG_TYPE
Hexagon Common GEP
This file provides internal interfaces used to implement the InstCombine.
static Constant * getFPClassConstant(Type *Ty, FPClassTest Mask, bool IsCanonicalizing=false)
For floating-point classes that resolve to a single bit pattern, return that value.
static unsigned getBitWidth(Type *Ty, const DataLayout &DL)
Returns the bitwidth of the given scalar or pointer type.
static Value * simplifyDemandedFPClassFabs(KnownFPClass &Known, Value *Src, FPClassTest DemandedMask, KnownFPClass KnownSrc, bool NSZ)
Perform multiple-use aware simplfications for fabs(Src).
static Value * simplifyDemandedUseFPClassFPTrunc(InstCombinerImpl &IC, Instruction &I, FastMathFlags FMF, FPClassTest DemandedMask, KnownFPClass &Known, const SimplifyQuery &SQ, unsigned Depth)
static Value * simplifyDemandedFPClassFnegFabs(KnownFPClass &Known, Value *Src, FPClassTest DemandedMask, KnownFPClass KnownSrc, bool NSZ)
Perform multiple-use aware simplfications for fneg(fabs(Src)).
static bool ShrinkDemandedConstant(Instruction *I, unsigned OpNo, const APInt &Demanded)
Check to see if the specified operand of the specified instruction is a constant integer.
static Value * simplifyShiftSelectingPackedElement(Instruction *I, const APInt &DemandedMask, InstCombinerImpl &IC, unsigned Depth)
Let N = 2 * M.
static Value * simplifyDemandedFPClassMinMax(KnownFPClass &Known, Intrinsic::ID IID, const CallInst *CI, FPClassTest DemandedMask, KnownFPClass KnownLHS, KnownFPClass KnownRHS, const Function &F, bool NSZ)
static bool canSkipDemandedEltsInInsertChain(InsertElementInst &IE, unsigned VWidth, unsigned DepthLimit)
Return true if the top-level all-lanes demanded-elements query can be skipped for an intermediate ins...
static Value * simplifyDemandedFPClassCopysignMag(Value *MagSrc, FPClassTest DemandedMask, KnownFPClass KnownSrc, bool NSZ)
static FPClassTest adjustDemandedMaskFromFlags(FPClassTest DemandedMask, FastMathFlags FMF)
static FastMathFlags inferFastMathValueFlags(FastMathFlags FMF, FPClassTest ValidResults, ArrayRef< KnownFPClass > Known)
Try to set an inferred no-nans or no-infs in FMF.
static Value * simplifyDemandedFPClassResult(Instruction *FPOp, FastMathFlags FMF, FPClassTest DemandedMask, KnownFPClass &Known, ArrayRef< KnownFPClass > KnownSrcs)
Apply epilog fixups to a floating-point intrinsic.
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
uint64_t IntrinsicInst * II
#define P(N)
MachineBasicBlock * Folded
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
This file implements the SmallBitVector class.
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static unsigned getBitWidth(Type *Ty, const DataLayout &DL)
Returns the bitwidth of the given scalar or pointer type.
static APFloat getOne(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative One.
Definition APFloat.h:1192
Class for arbitrary precision integers.
Definition APInt.h:78
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:230
void clearBit(unsigned BitPosition)
Set a given bit to 0.
Definition APInt.h:1426
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:225
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1560
void setHighBits(unsigned hiBits)
Set the top hiBits bits.
Definition APInt.h:1411
unsigned popcount() const
Count the number of bits set.
Definition APInt.h:1690
LLVM_ABI APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
Definition APInt.cpp:1078
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1532
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:970
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition APInt.h:1350
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
void setSignBit()
Set the sign bit to 1.
Definition APInt.h:1360
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1508
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1115
void clearAllBits()
Set every bit to 0.
Definition APInt.h:1416
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1659
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1618
void clearLowBits(unsigned loBits)
Set bottom loBits bits to 0.
Definition APInt.h:1455
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
Definition APInt.h:471
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:829
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:875
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition APInt.h:1261
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:436
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
bool isIntN(unsigned N) const
Check if this APInt has an N-bits unsigned integer value.
Definition APInt.h:428
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:385
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:853
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1225
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
LLVM Basic Block Representation.
Definition BasicBlock.h:62
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
BinaryOps getOpcode() const
Definition InstrTypes.h:409
Value * getArgOperand(unsigned i) const
LLVM_ABI Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
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
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition InstrTypes.h:751
static LLVM_ABI ConstantFP * getZero(Type *Ty, bool Negative=false)
static LLVM_ABI ConstantFP * getQNaN(Type *Ty, bool Negative=false, APInt *Payload=nullptr)
static LLVM_ABI ConstantFP * getInfinity(Type *Ty, bool Negative=false)
This is the shared class of boolean and integer constants.
Definition Constants.h:87
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
static LLVM_ABI Constant * get(ArrayRef< Constant * > V)
This is an important base class in LLVM.
Definition Constant.h:44
static LLVM_ABI Constant * getIntegerValue(Type *Ty, const APInt &V)
Return the value for an integer or pointer constant, or a vector thereof, with the given scalar value...
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition Constant.h:65
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
LLVM_ABI bool isOneValue() const
Returns true if the value is one.
Definition Constants.cpp:83
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
LLVM_ABI Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
Convenience struct for specifying and reasoning about fast-math flags.
Definition FMF.h:23
bool noSignedZeros() const
Definition FMF.h:67
bool noInfs() const
Definition FMF.h:66
void setNoSignedZeros(bool B=true)
Definition FMF.h:84
void setNoNaNs(bool B=true)
Definition FMF.h:78
bool noNaNs() const
Definition FMF.h:65
void setNoInfs(bool B=true)
Definition FMF.h:81
DenormalMode getDenormalMode(const fltSemantics &FPType) const
Returns the denormal handling type for the default rounding mode of the function.
Definition Function.cpp:807
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
Value * CreateICmpEQ(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2382
LLVM_ABI Value * CreateSelectWithUnknownProfile(Value *C, Value *True, Value *False, StringRef PassName, const Twine &Name="")
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Definition IRBuilder.h:196
This instruction inserts a single (scalar) element into a VectorType value.
static InsertElementInst * Create(Value *Vec, Value *NewElt, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
bool SimplifyDemandedInstructionFPClass(Instruction &Inst)
Value * SimplifyDemandedVectorElts(Value *V, APInt DemandedElts, APInt &PoisonElts, unsigned Depth=0, bool AllowMultipleUsers=false) override
The specified value produces a vector with any number of elements.
Value * SimplifyDemandedUseFPClass(Instruction *I, FPClassTest DemandedMask, KnownFPClass &Known, const SimplifyQuery &Q, unsigned Depth=0)
Attempts to replace V with a simpler value based on the demanded floating-point classes.
bool SimplifyDemandedBits(Instruction *I, unsigned Op, const APInt &DemandedMask, KnownBits &Known, const SimplifyQuery &Q, unsigned Depth=0) override
This form of SimplifyDemandedBits simplifies the specified instruction operand if possible,...
std::optional< std::pair< Intrinsic::ID, SmallVector< Value *, 3 > > > convertOrOfShiftsToFunnelShift(Instruction &Or)
Value * SimplifyMultipleUseDemandedFPClass(Instruction *I, FPClassTest DemandedMask, KnownFPClass &Known, const SimplifyQuery &Q, unsigned Depth)
Helper routine of SimplifyDemandedUseFPClass.
const InstCombineCLOptions & CLOpts
Value * simplifyShrShlDemandedBits(Instruction *Shr, const APInt &ShrOp1, Instruction *Shl, const APInt &ShlOp1, const APInt &DemandedMask, KnownBits &Known)
Helper routine of SimplifyDemandedUseBits.
bool SimplifyDemandedFPClass(Instruction *I, unsigned Op, FPClassTest DemandedMask, KnownFPClass &Known, const SimplifyQuery &Q, unsigned Depth=0)
Value * SimplifyDemandedUseBits(Instruction *I, const APInt &DemandedMask, KnownBits &Known, const SimplifyQuery &Q, unsigned Depth=0)
Attempts to replace I with a simpler value based on the demanded bits.
bool SimplifyDemandedInstructionBits(Instruction &Inst)
Tries to simplify operands to an integer instruction based on its demanded bits.
Value * SimplifyMultipleUseDemandedBits(Instruction *I, const APInt &DemandedMask, KnownBits &Known, const SimplifyQuery &Q, unsigned Depth=0)
Helper routine of SimplifyDemandedUseBits.
SimplifyQuery SQ
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
void replaceUse(Use &U, Value *NewValue)
Replace use and add the previously used value to the worklist.
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
LLVM_ABI std::optional< Value * > targetSimplifyDemandedVectorEltsIntrinsic(IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3, std::function< void(Instruction *, unsigned, APInt, APInt &)> SimplifyAndSetOp)
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
DominatorTree & DT
LLVM_ABI std::optional< Value * > targetSimplifyDemandedUseBitsIntrinsic(IntrinsicInst &II, APInt DemandedMask, KnownBits &Known, bool &KnownBitsComputed)
void computeKnownBits(const Value *V, KnownBits &Known, const Instruction *CtxI, unsigned Depth=0) const
LLVM_ABI void dropUBImplyingAttrsAndMetadata(ArrayRef< unsigned > Keep={})
Drop any attributes or metadata that can cause immediate undefined behavior.
LLVM_ABI bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
LLVM_ABI bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
LLVM_ABI bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
LLVM_ABI void setFastMathFlags(FastMathFlags FMF)
Convenience function for setting multiple fast-math flags on this instruction, which must be an opera...
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.
bool isShift() const
bool isIntDivRem() const
A wrapper class for inspecting calls to intrinsic functions.
bool isKnownNeverInfOrNaN() const
Return true if it's known this can never be an infinity or nan.
bool isKnownNeverInfinity() const
Return true if it's known this can never be an infinity.
static constexpr FPClassTest OrderedGreaterThanZeroMask
static constexpr FPClassTest OrderedLessThanZeroMask
static LLVM_ABI KnownFPClass fmul(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fmul.
static LLVM_ABI KnownFPClass ceil(const KnownFPClass &Src, bool IsMultiUnitFPType, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for ceil.
static LLVM_ABI KnownFPClass fadd_self(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fadd x, x.
void copysign(const KnownFPClass &Sign)
static KnownFPClass square(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
static LLVM_ABI KnownFPClass fsub(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fsub.
bool isKnownNeverSubnormal() const
Return true if it's known this can never be a subnormal.
static LLVM_ABI KnownFPClass canonicalize(const KnownFPClass &Src, DenormalMode DenormMode=DenormalMode::getDynamic())
Apply the canonicalize intrinsic to this value.
LLVM_ABI bool isKnownNeverLogicalZero(DenormalMode Mode) const
Return true if it's known this can never be interpreted as a zero.
static LLVM_ABI KnownFPClass fdiv(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fdiv.
static LLVM_ABI KnownFPClass fpext(const KnownFPClass &KnownSrc, const fltSemantics &DstTy, const fltSemantics &SrcTy, DenormalMode DstMode, DenormalMode SrcMode)
Propagate known class for fpext.
static LLVM_ABI KnownFPClass fptrunc(const KnownFPClass &KnownSrc, const fltSemantics &DstTy, const fltSemantics &SrcTy, DenormalMode DstMode, DenormalMode SrcMode)
Propagate known class for fptrunc and fptrunc_round.
static LLVM_ABI KnownFPClass minMaxLike(const KnownFPClass &LHS, const KnownFPClass &RHS, MinMaxKind Kind, DenormalMode DenormMode=DenormalMode::getDynamic())
bool isUnknown() const
KnownFPClass intersectWith(const KnownFPClass &RHS) const
static LLVM_ABI KnownFPClass exp(const KnownFPClass &Src)
Report known values for exp, exp2 and exp10.
static LLVM_ABI KnownFPClass frexp_mant(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for mantissa component of frexp.
bool isKnownNeverNaN() const
Return true if it's known this can never be a nan.
void knownNot(FPClassMask RuleOut)
std::optional< bool > getSignBit() const
std::nullopt if the sign bit is unknown, true if the sign bit is definitely set or false if the sign ...
FPClassTest getKnownFPClasses() const
Floating-point classes the value could be one of.
static LLVM_ABI KnownFPClass roundToIntegral(const KnownFPClass &Src, bool IsMultiUnitFPType, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for rounding intrinsics (rint, nearbyint, round, roundeven).
static LLVM_ABI KnownFPClass fma(const KnownFPClass &LHS, const KnownFPClass &RHS, const KnownFPClass &Addend, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fma.
static LLVM_ABI KnownFPClass sqrt(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for sqrt.
bool isKnownAlways(FPClassMask Mask) const
LLVM_ABI bool isKnownNeverLogicalPosZero(DenormalMode Mode) const
Return true if it's known this can never be interpreted as a positive zero.
bool isKnownNever(FPClassMask Mask) const
Return true if it's known this can never be one of the mask entries.
bool cannotBeOrderedGreaterEqZero(DenormalMode Mode) const
Return true if it's know this can never be a negative value or a logical 0.
static LLVM_ABI KnownFPClass fadd(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fadd.
static LLVM_ABI KnownFPClass trunc(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for trunc.
LLVM_ABI bool isKnownNeverLogicalNegZero(DenormalMode Mode) const
Return true if it's known this can never be interpreted as a negative zero.
static LLVM_ABI KnownFPClass fma_square(const KnownFPClass &Squared, const KnownFPClass &Addend, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fma squared, squared, addend.
static LLVM_ABI KnownFPClass log(const KnownFPClass &Src, DenormalMode Mode, bool IsMultiUnitFPType)
Propagate known class for log/log2/log10.
static LLVM_ABI KnownFPClass floor(const KnownFPClass &Src, bool IsMultiUnitFPType, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for floor.
static LLVM_ABI KnownFPClass ldexp(const KnownFPClass &Src, const APInt &ConstantRangeMin, const APInt &ConstantRangeMax, const fltSemantics &Flt, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for ldexp, assuming the exponent is known to be within [ConstantRangeMin,...
bool hasNoSignedWrap() const
Test whether this operation is known to never undergo signed overflow, aka the nsw property.
Definition Operator.h:113
bool hasNoUnsignedWrap() const
Test whether this operation is known to never undergo unsigned overflow, aka the nuw property.
Definition Operator.h:107
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
This class represents the LLVM 'select' instruction.
const Value * getCondition() const
This is a 'bitvector' (really, a variable-sized bit array), optimized for the case when the array is ...
SmallBitVector & set()
bool test(unsigned Idx) const
Returns true if bit Idx is set.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
Definition Type.cpp:300
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
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:363
bool isMultiUnitFPType() const
Returns true if this is a floating-point type that is an unevaluated sum of multiple floating-point u...
Definition Type.h:195
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 isIEEELikeFPTy() const
Return true if this is a well-behaved IEEE-like type, which has a IEEE compatible layout,...
Definition Type.h:172
LLVM_ABI const fltSemantics & getFltSemantics() const
Definition Type.cpp:96
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
void setOperand(unsigned i, Value *Val)
Definition User.h:212
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
iterator_range< user_iterator > users()
Definition Value.h:428
bool hasUseList() const
Check if this Value has a use-list.
Definition Value.h:346
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:315
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:396
Base class of all SIMD vector types.
This class represents zero extension of integer types.
self_iterator getIterator()
Definition ilist_node.h:123
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > OverloadTys={})
Look up the Function declaration of the intrinsic id in the Module M.
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
cst_pred_ty< is_lowbit_mask > m_LowBitMask()
Match an integer or vector with only the low bit(s) set.
PtrAdd_match< PointerOpTy, OffsetOpTy > m_PtrAdd(const PointerOpTy &PointerOp, const OffsetOpTy &OffsetOp)
Matches GEP with i8 source element type.
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::AShr > m_AShr(const LHS &L, const RHS &R)
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.
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)
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.
TwoOps_match< Val_t, Idx_t, Instruction::ExtractElement > m_ExtractElt(const Val_t &Val, const Idx_t &Idx)
Matches ExtractElementInst.
auto m_BinOp()
Match an arbitrary binary operation and ignore it.
ExtractValue_match< Ind, Val_t > m_ExtractValue(const Val_t &V)
Match a single index ExtractValue instruction.
auto m_Value()
Match an arbitrary value and ignore it.
auto m_Ctpop(const Opnd0 &Op0)
BinaryOp_match< LHS, RHS, Instruction::Mul > m_Mul(const LHS &L, const RHS &R)
TwoOps_match< V1_t, V2_t, Instruction::ShuffleVector > m_Shuffle(const V1_t &v1, const V2_t &v2)
Matches ShuffleVectorInst independently of mask value.
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
is_zero< true > m_Zero()
Match any null constant or a vector with all elements equal to 0.
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
DisjointOr_match< LHS, RHS, true > m_c_DisjointOr(const LHS &L, const RHS &R)
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.
auto m_Intrinsic(const Ts &...Ops)
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
auto m_FAbs(const Opnd0 &Op0)
AnyBinaryOp_match< LHS, RHS, true > m_c_BinOp(const LHS &L, const RHS &R)
Matches a BinaryOperator with LHS and RHS in either order.
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)
BinaryOp_match< LHS, RHS, Instruction::Shl > m_Shl(const LHS &L, const RHS &R)
auto m_Undef()
Match an arbitrary undef constant.
CastInst_match< OpTy, SExtInst > m_SExt(const OpTy &Op)
Matches SExt.
auto m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI bool haveNoCommonBitsSet(const WithCache< const Value * > &LHSCache, const WithCache< const Value * > &RHSCache, const SimplifyQuery &SQ)
Return true if LHS and RHS have no common bits set.
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 void computeKnownBitsFromContext(const Value *V, KnownBits &Known, const SimplifyQuery &Q, unsigned Depth=0)
Merge bits known from context-dependent facts into Known.
@ Known
Known to have no common set bits.
@ Undef
Value of the register doesn't matter.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition bit.h:315
LLVM_ABI void salvageDebugInfo(const MachineRegisterInfo &MRI, MachineInstr &MI)
Assuming the instruction MI is going to be deleted, attempt to salvage debug users of MI by writing t...
Definition Utils.cpp:1678
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 T alignDown(U Value, V Align, W Skew=0)
Returns the largest unsigned integer less than or equal to Value and is Skew mod Align.
Definition MathExtras.h:546
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
gep_type_iterator gep_type_end(const User *GEP)
constexpr auto equal_to(T &&Arg)
Functor variant of std::equal_to that can be used as a UnaryPredicate in functional algorithms like a...
Definition STLExtras.h:2189
LLVM_ABI bool isGuaranteedNotToBeUndef(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be undef, but may be poison.
LLVM_ABI bool cannotOrderStrictlyLess(FPClassTest LHS, FPClassTest RHS, bool OrderedZeroSign=false)
Returns true if all values in LHS must be greater than or equal to those in RHS.
LLVM_ABI bool cannotOrderStrictlyGreater(FPClassTest LHS, FPClassTest RHS, bool OrderedZeroSign=false)
Returns true if all values in LHS must be less than or equal to those in RHS.
constexpr unsigned MaxAnalysisRecursionDepth
LLVM_ABI void adjustKnownBitsForSelectArm(KnownBits &Known, Value *Cond, Value *Arm, bool Invert, const SimplifyQuery &Q, unsigned Depth=0)
Adjust Known for the given select Arm to include information from the select Cond.
LLVM_ABI FPClassTest fneg(FPClassTest Mask)
Return the test mask which returns true if the value's sign bit is flipped.
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI void adjustKnownFPClassForSelectArm(KnownFPClass &Known, Value *Cond, Value *Arm, bool Invert, const SimplifyQuery &Q, unsigned Depth=0)
Adjust Known for the given select Arm to include information from the select Cond.
LLVM_ABI FPClassTest inverse_fabs(FPClassTest Mask)
Return the test mask which returns true after fabs is applied to the value.
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 intrinsicPropagatesPoison(Intrinsic::ID IID)
Return whether this intrinsic propagates poison for all operands.
LLVM_ABI Constant * ConstantFoldBinaryOpOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL)
Attempt to constant fold a binary operation with the specified operands.
constexpr int PoisonMaskElem
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
@ Mul
Product of integers.
@ Xor
Bitwise or logical XOR of integers.
LLVM_ABI bool isVectorIntrinsicWithScalarOpAtArg(Intrinsic::ID ID, unsigned ScalarOpdIdx, const TargetTransformInfo *TTI)
Identifies if the vector form of the intrinsic has a scalar operand.
LLVM_ABI FPClassTest unknown_sign(FPClassTest Mask)
Return the test mask which returns true if the value could have the same set of classes,...
DWARFExpression::Operation Op
constexpr unsigned BitWidth
LLVM_ABI KnownBits analyzeKnownBitsFromAndXorOr(const Operator *I, const KnownBits &KnownLHS, const KnownBits &KnownRHS, const SimplifyQuery &SQ, unsigned Depth=0)
Using KnownBits LHS/RHS produce the known bits for logic op (and/xor/or).
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
gep_type_iterator gep_type_begin(const User *GEP)
unsigned Log2(Align A)
Returns the log2 of the alignment.
Definition Alignment.h:202
LLVM_ABI bool isTriviallyVectorizable(Intrinsic::ID ID)
Identify if the intrinsic is trivially vectorizable.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Represent subnormal handling kind for floating point instruction inputs and outputs.
@ PreserveSign
The sign of a flushed-to-zero number is preserved in the sign of 0.
@ Dynamic
Denormals have unknown treatment.
static constexpr DenormalMode getPreserveSign()
static constexpr DenormalMode getDynamic()
static constexpr DenormalMode getIEEE()
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
Definition KnownBits.h:315
KnownBits anyextOrTrunc(unsigned BitWidth) const
Return known bits for an "any" extension or truncation of the value we're tracking.
Definition KnownBits.h:190
bool isNonNegative() const
Returns true if this value is known to be non-negative.
Definition KnownBits.h:106
void makeNonNegative()
Make this value non-negative.
Definition KnownBits.h:125
static LLVM_ABI KnownBits ashr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for ashr(LHS, RHS).
unsigned getBitWidth() const
Get the bit width of this value.
Definition KnownBits.h:44
static KnownBits add(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false, bool SelfAdd=false)
Compute knownbits resulting from addition of LHS and RHS.
Definition KnownBits.h:361
KnownBits sext(unsigned BitWidth) const
Return known bits for a sign extension of the value we're tracking.
Definition KnownBits.h:184
KnownBits zextOrTrunc(unsigned BitWidth) const
Return known bits for a zero extension or truncation of the value we're tracking.
Definition KnownBits.h:200
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:146
static LLVM_ABI KnownBits srem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for srem(LHS, RHS).
static LLVM_ABI KnownBits udiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for udiv(LHS, RHS).
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:103
static KnownBits sub(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false)
Compute knownbits resulting from subtraction of LHS and RHS.
Definition KnownBits.h:376
static LLVM_ABI KnownBits shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW=false, bool NSW=false, bool ShAmtNonZero=false)
Compute known bits for shl(LHS, RHS).
Matching combinators.
SimplifyQuery getWithInstruction(const Instruction *I) const
const Instruction * CtxI