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