LLVM 24.0.0git
GISelValueTracking.cpp
Go to the documentation of this file.
1//===- lib/CodeGen/GlobalISel/GISelValueTracking.cpp --------------*- C++
2//*-===//
3//
4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7//
8//===----------------------------------------------------------------------===//
9//
10/// Provides analysis for querying information about KnownBits during GISel
11/// passes.
12//
13//===----------------------------------------------------------------------===//
15#include "llvm/ADT/APFloat.h"
17#include "llvm/ADT/ScopeExit.h"
35#include "llvm/IR/FMF.h"
41
42#define DEBUG_TYPE "gisel-known-bits"
43
44using namespace llvm;
45using namespace MIPatternMatch;
46
48
50 "Analysis for ComputingKnownBits", false, true)
51
53 : MF(MF), MRI(MF.getRegInfo()), TL(*MF.getSubtarget().getTargetLowering()),
54 DL(MF.getFunction().getDataLayout()), MaxDepth(MaxDepth) {}
55
57 const MachineInstr *MI = MRI.getVRegDef(R);
58 switch (MI->getOpcode()) {
59 case TargetOpcode::COPY:
60 return computeKnownAlignment(MI->getOperand(1).getReg(), Depth);
61 case TargetOpcode::G_ASSERT_ALIGN: {
62 // TODO: Min with source
63 return Align(MI->getOperand(2).getImm());
64 }
65 case TargetOpcode::G_FRAME_INDEX: {
66 int FrameIdx = MI->getOperand(1).getIndex();
67 return MF.getFrameInfo().getObjectAlign(FrameIdx);
68 }
69 case TargetOpcode::G_INTRINSIC:
70 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
71 case TargetOpcode::G_INTRINSIC_CONVERGENT:
72 case TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS:
73 default:
74 return TL.computeKnownAlignForTargetInstr(*this, R, MRI, Depth + 1);
75 }
76}
77
79 const LLT Ty = MRI.getType(R);
80 // Since the number of lanes in a scalable vector is unknown at compile time,
81 // we track one bit which is implicitly broadcast to all lanes. This means
82 // that all lanes in a scalable vector are considered demanded.
83 APInt DemandedElts =
84 Ty.isFixedVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1);
85 return getKnownBits(R, DemandedElts);
86}
87
89 const APInt &DemandedElts,
90 unsigned Depth) {
92 computeKnownBitsImpl(R, Known, DemandedElts, Depth);
93 return Known;
94}
95
97 LLT Ty = MRI.getType(R);
98 unsigned BitWidth = Ty.getScalarSizeInBits();
100}
101
103 LLT Ty = MRI.getType(R);
104 const APInt ScalarDemandedElts(1, 1);
105 APInt DemandedElts = Ty.isFixedVector()
106 ? APInt::getAllOnes(Ty.getNumElements())
107 : ScalarDemandedElts;
108 return isKnownNeverZero(R, DemandedElts, Depth);
109}
110
112 unsigned Depth) {
113 if (Depth >= getMaxDepth())
114 return false;
115
116 const APInt ScalarDemandedElts(1, 1);
117 MachineInstr &MI = *MRI.getVRegDef(R);
118
119 switch (MI.getOpcode()) {
120 default:
121 break;
122
123 case TargetOpcode::G_BUILD_VECTOR: {
124 for (const auto &[I, MO] : enumerate(drop_begin(MI.operands()))) {
125 if (!DemandedElts[I])
126 continue;
127 if (!isKnownNeverZero(MO.getReg(), ScalarDemandedElts, Depth + 1))
128 return false;
129 }
130 return true;
131 }
132
133 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
135 Register InVec = Extract.getVectorReg();
136 LLT VecTy = MRI.getType(InVec);
137 if (VecTy.isScalableVector())
138 break;
139 unsigned NumSrcElts = VecTy.getNumElements();
140 // An out-of-range constant index produces poison. Keep all lanes demanded,
141 // which is poison-safe and matches SelectionDAG's conservative behavior.
142 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
143 if (auto Idx = getIConstantVRegVal(Extract.getIndexReg(), MRI)) {
144 if (Idx->ult(NumSrcElts))
145 DemandedSrcElts = APInt::getOneBitSet(NumSrcElts, Idx->getZExtValue());
146 }
147 return isKnownNeverZero(InVec, DemandedSrcElts, Depth + 1);
148 }
149
150 case TargetOpcode::G_SHUFFLE_VECTOR: {
152 LLT SrcTy = MRI.getType(Shuf.getSrc1Reg());
153 if (SrcTy.isScalableVector())
154 break;
155 APInt DemandedLHS, DemandedRHS;
156 if (!getShuffleDemandedElts(SrcTy.getNumElements(), Shuf.getMask(),
157 DemandedElts, DemandedLHS, DemandedRHS))
158 break;
159 if (!DemandedLHS.isZero() &&
160 !isKnownNeverZero(Shuf.getSrc1Reg(), DemandedLHS, Depth + 1))
161 return false;
162 if (!DemandedRHS.isZero() &&
163 !isKnownNeverZero(Shuf.getSrc2Reg(), DemandedRHS, Depth + 1))
164 return false;
165 return true;
166 }
167
168 case TargetOpcode::G_OR:
169 return isKnownNeverZero(MI.getOperand(1).getReg(), DemandedElts,
170 Depth + 1) ||
171 isKnownNeverZero(MI.getOperand(2).getReg(), DemandedElts, Depth + 1);
172
173 case TargetOpcode::G_SELECT:
174 return isKnownNeverZero(MI.getOperand(2).getReg(), DemandedElts,
175 Depth + 1) &&
176 isKnownNeverZero(MI.getOperand(3).getReg(), DemandedElts, Depth + 1);
177
178 case TargetOpcode::G_SHL: {
179 Register LHSReg = MI.getOperand(1).getReg();
180 if (MI.getFlag(MachineInstr::NoSWrap) || MI.getFlag(MachineInstr::NoUWrap))
181 return isKnownNeverZero(LHSReg, DemandedElts, Depth + 1);
182 KnownBits ValKnown = getKnownBits(LHSReg, DemandedElts, Depth + 1);
183 if (ValKnown.One[0])
184 return true;
185 APInt MaxCnt =
186 getKnownBits(MI.getOperand(2).getReg(), DemandedElts, Depth + 1)
187 .getMaxValue();
188 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
189 !ValKnown.One.shl(MaxCnt).isZero())
190 return true;
191 break;
192 }
193 }
194
195 // Pass through this frame's Depth (not Depth+1) because we have not recursed
196 // into a child MI here: the fallback queries KnownBits for the same R.
197 return getKnownBits(R, DemandedElts, Depth).isNonZero();
198}
199
203
207
208[[maybe_unused]] static void
209dumpResult(const MachineInstr &MI, const KnownBits &Known, unsigned Depth) {
210 dbgs() << "[" << Depth << "] Compute known bits: " << MI << "[" << Depth
211 << "] Computed for: " << MI << "[" << Depth << "] Known: 0x"
212 << toString(Known.Zero | Known.One, 16, false) << "\n"
213 << "[" << Depth << "] Zero: 0x" << toString(Known.Zero, 16, false)
214 << "\n"
215 << "[" << Depth << "] One: 0x" << toString(Known.One, 16, false)
216 << "\n";
217}
218
219/// Compute known bits for the intersection of \p Src0 and \p Src1
220void GISelValueTracking::computeKnownBitsMin(Register Src0, Register Src1,
222 const APInt &DemandedElts,
223 unsigned Depth) {
224 // Test src1 first, since we canonicalize simpler expressions to the RHS.
225 computeKnownBitsImpl(Src1, Known, DemandedElts, Depth);
226
227 // If we don't know any bits, early out.
228 if (Known.isUnknown())
229 return;
230
231 KnownBits Known2;
232 computeKnownBitsImpl(Src0, Known2, DemandedElts, Depth);
233
234 // Only known if known in both the LHS and RHS.
235 Known = Known.intersectWith(Known2);
236}
237
238// Bitfield extract is computed as (Src >> Offset) & Mask, where Mask is
239// created using Width. Use this function when the inputs are KnownBits
240// objects. TODO: Move this KnownBits.h if this is usable in more cases.
241static KnownBits extractBits(unsigned BitWidth, const KnownBits &SrcOpKnown,
242 const KnownBits &OffsetKnown,
243 const KnownBits &WidthKnown) {
244 KnownBits Mask(BitWidth);
245 Mask.Zero = APInt::getBitsSetFrom(
247 Mask.One = APInt::getLowBitsSet(
249 return KnownBits::lshr(SrcOpKnown, OffsetKnown) & Mask;
250}
251
252void GISelValueTracking::computeKnownBits(Register R, KnownBits &Known,
253 const APInt &DemandedElts,
254 unsigned Depth) {
255 MachineInstr &MI = *MRI.getVRegDef(R);
256 unsigned Opcode = MI.getOpcode();
257 LLT DstTy = MRI.getType(R);
258
259 // Handle the case where this is called on a register that does not have a
260 // type constraint. For example, it may be post-ISel or this target might not
261 // preserve the type when early-selecting instructions.
262 if (!DstTy.isValid()) {
263 Known = KnownBits();
264 return;
265 }
266
267#ifndef NDEBUG
268 if (DstTy.isFixedVector()) {
269 assert(
270 DstTy.getNumElements() == DemandedElts.getBitWidth() &&
271 "DemandedElt width should equal the fixed vector number of elements");
272 } else {
273 assert(DemandedElts.getBitWidth() == 1 && DemandedElts == APInt(1, 1) &&
274 "DemandedElt width should be 1 for scalars or scalable vectors");
275 }
276#endif
277
278 unsigned BitWidth = DstTy.getScalarSizeInBits();
279 Known = KnownBits(BitWidth); // Don't know anything
280
281 // Depth may get bigger than max depth if it gets passed to a different
282 // GISelValueTracking object.
283 // This may happen when say a generic part uses a GISelValueTracking object
284 // with some max depth, but then we hit TL.computeKnownBitsForTargetInstr
285 // which creates a new GISelValueTracking object with a different and smaller
286 // depth. If we just check for equality, we would never exit if the depth
287 // that is passed down to the target specific GISelValueTracking object is
288 // already bigger than its max depth.
289 if (Depth >= getMaxDepth())
290 return;
291
292 if (!DemandedElts)
293 return; // No demanded elts, better to assume we don't know anything.
294
295 KnownBits Known2;
296
297 switch (Opcode) {
298 default:
299 TL.computeKnownBitsForTargetInstr(*this, R, Known, DemandedElts, MRI,
300 Depth);
301 break;
302 case TargetOpcode::G_BUILD_VECTOR: {
303 // Collect the known bits that are shared by every demanded vector element.
304 Known.Zero.setAllBits();
305 Known.One.setAllBits();
306 for (const auto &[I, MO] : enumerate(drop_begin(MI.operands()))) {
307 if (!DemandedElts[I])
308 continue;
309
310 computeKnownBitsImpl(MO.getReg(), Known2, APInt(1, 1), Depth + 1);
311
312 // Known bits are the values that are shared by every demanded element.
313 Known = Known.intersectWith(Known2);
314
315 // If we don't know any bits, early out.
316 if (Known.isUnknown())
317 break;
318 }
319 break;
320 }
321 case TargetOpcode::G_SPLAT_VECTOR: {
322 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, APInt(1, 1),
323 Depth + 1);
324 // Implicitly truncate the bits to match the official semantics of
325 // G_SPLAT_VECTOR.
326 Known = Known.trunc(BitWidth);
327 break;
328 }
329 case TargetOpcode::G_FREEZE: {
330 Register Src = MI.getOperand(1).getReg();
331 // freeze of undef/poison is an arbitrary noundef bit pattern, so the known
332 // bits of the source only carry over when it cannot be undef or poison.
333 if (isGuaranteedNotToBeUndefOrPoison(Src, MRI, Depth + 1))
334 computeKnownBitsImpl(Src, Known, DemandedElts, Depth + 1);
335 break;
336 }
337 case TargetOpcode::COPY:
338 case TargetOpcode::G_PHI:
339 case TargetOpcode::PHI: {
342 // Destination registers should not have subregisters at this
343 // point of the pipeline, otherwise the main live-range will be
344 // defined more than once, which is against SSA.
345 assert(MI.getOperand(0).getSubReg() == 0 && "Is this code in SSA?");
346 // PHI's operand are a mix of registers and basic blocks interleaved.
347 // We only care about the register ones.
348 for (unsigned Idx = 1; Idx < MI.getNumOperands(); Idx += 2) {
349 const MachineOperand &Src = MI.getOperand(Idx);
350 Register SrcReg = Src.getReg();
351 LLT SrcTy = MRI.getType(SrcReg);
352 // Look through trivial copies and phis but don't look through trivial
353 // copies or phis of the form `%1:(s32) = OP %0:gpr32`, known-bits
354 // analysis is currently unable to determine the bit width of a
355 // register class.
356 //
357 // We can't use NoSubRegister by name as it's defined by each target but
358 // it's always defined to be 0 by tablegen.
359 if (SrcReg.isVirtual() && Src.getSubReg() == 0 /*NoSubRegister*/ &&
360 SrcTy.isValid()) {
361 APInt NowDemandedElts;
362 if (!SrcTy.isFixedVector()) {
363 NowDemandedElts = APInt(1, 1);
364 } else if (DstTy.isFixedVector() &&
365 SrcTy.getNumElements() == DstTy.getNumElements()) {
366 NowDemandedElts = DemandedElts;
367 } else {
368 NowDemandedElts = APInt::getAllOnes(SrcTy.getNumElements());
369 }
370
371 // For COPYs we don't do anything, don't increase the depth.
372 computeKnownBitsImpl(SrcReg, Known2, NowDemandedElts,
373 Depth + (Opcode != TargetOpcode::COPY));
374 Known2 = Known2.anyextOrTrunc(BitWidth);
375 Known = Known.intersectWith(Known2);
376 // If we reach a point where we don't know anything
377 // just stop looking through the operands.
378 if (Known.isUnknown())
379 break;
380 } else {
381 // We know nothing.
382 Known = KnownBits(BitWidth);
383 break;
384 }
385 }
386 break;
387 }
388 case TargetOpcode::G_STEP_VECTOR: {
389 APInt Step = MI.getOperand(1).getCImm()->getValue();
390
391 if (Step.isPowerOf2())
392 Known.Zero.setLowBits(Step.logBase2());
393
395 break;
396
397 const APInt MinNumElts =
398 APInt(BitWidth, DstTy.getElementCount().getKnownMinValue());
400 bool Overflow;
401 const APInt MaxNumElts = getVScaleRange(&F, BitWidth)
403 .umul_ov(MinNumElts, Overflow);
404 if (Overflow)
405 break;
406 const APInt MaxValue = (MaxNumElts - 1).umul_ov(Step, Overflow);
407 if (Overflow)
408 break;
409 Known.Zero.setHighBits(MaxValue.countl_zero());
410 break;
411 }
412 case TargetOpcode::G_VSCALE: {
414 const APInt &Multiplier = MI.getOperand(1).getCImm()->getValue();
416 break;
417 }
418 case TargetOpcode::G_CONSTANT: {
419 Known = KnownBits::makeConstant(MI.getOperand(1).getCImm()->getValue());
420 break;
421 }
422 case TargetOpcode::G_FRAME_INDEX: {
423 int FrameIdx = MI.getOperand(1).getIndex();
424 TL.computeKnownBitsForStackObjectPointer(
425 Known, MF, MF.getFrameInfo().getObjectAlign(FrameIdx));
426 break;
427 }
428 case TargetOpcode::G_SUB: {
429 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
430 Depth + 1);
431 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
432 Depth + 1);
434 MI.getFlag(MachineInstr::NoUWrap));
435 break;
436 }
437 case TargetOpcode::G_XOR: {
438 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
439 Depth + 1);
440 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
441 Depth + 1);
442
443 Known ^= Known2;
444 break;
445 }
446 case TargetOpcode::G_PTR_ADD: {
447 if (DstTy.isVector())
448 break;
449 // G_PTR_ADD is like G_ADD. FIXME: Is this true for all targets?
450 LLT Ty = MRI.getType(MI.getOperand(1).getReg());
451 if (DL.isNonIntegralAddressSpace(Ty.getAddressSpace()))
452 break;
453 [[fallthrough]];
454 }
455 case TargetOpcode::G_ADD: {
456 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
457 Depth + 1);
458 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
459 Depth + 1);
460 Known = KnownBits::add(Known, Known2);
461 break;
462 }
463 case TargetOpcode::G_AND: {
464 // If either the LHS or the RHS are Zero, the result is zero.
465 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
466 Depth + 1);
467 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
468 Depth + 1);
469
470 Known &= Known2;
471 break;
472 }
473 case TargetOpcode::G_OR: {
474 // If either the LHS or the RHS are Zero, the result is zero.
475 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
476 Depth + 1);
477 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
478 Depth + 1);
479
480 Known |= Known2;
481 break;
482 }
483 case TargetOpcode::G_MUL: {
484 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
485 Depth + 1);
486 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
487 Depth + 1);
488 Known = KnownBits::mul(Known, Known2);
489 break;
490 }
491 case TargetOpcode::G_UMULH: {
492 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
493 Depth + 1);
494 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
495 Depth + 1);
496 Known = KnownBits::mulhu(Known, Known2);
497 break;
498 }
499 case TargetOpcode::G_SMULH: {
500 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
501 Depth + 1);
502 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
503 Depth + 1);
504 Known = KnownBits::mulhs(Known, Known2);
505 break;
506 }
507 case TargetOpcode::G_CLMUL: {
508 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
509 Depth + 1);
510 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
511 Depth + 1);
512 Known = KnownBits::clmul(Known, Known2);
513 break;
514 }
515 case TargetOpcode::G_UAVGFLOOR: {
516 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
517 Depth + 1);
518 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
519 Depth + 1);
521 break;
522 }
523 case TargetOpcode::G_UAVGCEIL: {
524 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
525 Depth + 1);
526 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
527 Depth + 1);
529 break;
530 }
531 case TargetOpcode::G_SAVGFLOOR: {
532 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
533 Depth + 1);
534 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
535 Depth + 1);
537 break;
538 }
539 case TargetOpcode::G_SAVGCEIL: {
540 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
541 Depth + 1);
542 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
543 Depth + 1);
545 break;
546 }
547 case TargetOpcode::G_ABDU: {
548 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
549 Depth + 1);
550 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
551 Depth + 1);
552 Known = KnownBits::abdu(Known, Known2);
553 break;
554 }
555 case TargetOpcode::G_ABDS: {
556 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
557 Depth + 1);
558 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
559 Depth + 1);
560 Known = KnownBits::abds(Known, Known2);
561
562 unsigned SignBits1 =
563 computeNumSignBits(MI.getOperand(2).getReg(), DemandedElts, Depth + 1);
564 if (SignBits1 == 1) {
565 break;
566 }
567 unsigned SignBits0 =
568 computeNumSignBits(MI.getOperand(1).getReg(), DemandedElts, Depth + 1);
569
570 Known.Zero.setHighBits(std::min(SignBits0, SignBits1) - 1);
571 break;
572 }
573 case TargetOpcode::G_SADDSAT: {
574 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
575 Depth + 1);
576 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
577 Depth + 1);
579 break;
580 }
581 case TargetOpcode::G_UADDSAT: {
582 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
583 Depth + 1);
584 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
585 Depth + 1);
587 break;
588 }
589 case TargetOpcode::G_SSUBSAT: {
590 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
591 Depth + 1);
592 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
593 Depth + 1);
595 break;
596 }
597 case TargetOpcode::G_USUBSAT: {
598 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
599 Depth + 1);
600 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
601 Depth + 1);
603 break;
604 }
605 case TargetOpcode::G_UDIV: {
606 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
607 Depth + 1);
608 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
609 Depth + 1);
610 Known = KnownBits::udiv(Known, Known2,
612 break;
613 }
614 case TargetOpcode::G_SDIV: {
615 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
616 Depth + 1);
617 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
618 Depth + 1);
619 Known = KnownBits::sdiv(Known, Known2,
621 break;
622 }
623 case TargetOpcode::G_UREM: {
624 KnownBits LHSKnown(Known.getBitWidth());
625 KnownBits RHSKnown(Known.getBitWidth());
626
627 computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts,
628 Depth + 1);
629 computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts,
630 Depth + 1);
631
632 Known = KnownBits::urem(LHSKnown, RHSKnown);
633 break;
634 }
635 case TargetOpcode::G_SREM: {
636 KnownBits LHSKnown(Known.getBitWidth());
637 KnownBits RHSKnown(Known.getBitWidth());
638
639 computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts,
640 Depth + 1);
641 computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts,
642 Depth + 1);
643
644 Known = KnownBits::srem(LHSKnown, RHSKnown);
645 break;
646 }
647 case TargetOpcode::G_SELECT: {
648 computeKnownBitsMin(MI.getOperand(2).getReg(), MI.getOperand(3).getReg(),
649 Known, DemandedElts, Depth + 1);
650 break;
651 }
652 case TargetOpcode::G_SMIN: {
653 // TODO: Handle clamp pattern with number of sign bits
654 KnownBits KnownRHS;
655 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
656 Depth + 1);
657 computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, DemandedElts,
658 Depth + 1);
659 Known = KnownBits::smin(Known, KnownRHS);
660 break;
661 }
662 case TargetOpcode::G_SMAX: {
663 // TODO: Handle clamp pattern with number of sign bits
664 KnownBits KnownRHS;
665 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
666 Depth + 1);
667 computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, DemandedElts,
668 Depth + 1);
669 Known = KnownBits::smax(Known, KnownRHS);
670 break;
671 }
672 case TargetOpcode::G_UMIN: {
673 KnownBits KnownRHS;
674 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
675 Depth + 1);
676 computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, DemandedElts,
677 Depth + 1);
678 Known = KnownBits::umin(Known, KnownRHS);
679 break;
680 }
681 case TargetOpcode::G_UMAX: {
682 KnownBits KnownRHS;
683 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
684 Depth + 1);
685 computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, DemandedElts,
686 Depth + 1);
687 Known = KnownBits::umax(Known, KnownRHS);
688 break;
689 }
690 case TargetOpcode::G_FCMP:
691 case TargetOpcode::G_ICMP: {
692 if (DstTy.isVector())
693 break;
694 if (TL.getBooleanContents(DstTy.isVector(),
695 Opcode == TargetOpcode::G_FCMP) ==
697 BitWidth > 1)
698 Known.Zero.setBitsFrom(1);
699 break;
700 }
701 case TargetOpcode::G_SEXT: {
702 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
703 Depth + 1);
704 // If the sign bit is known to be zero or one, then sext will extend
705 // it to the top bits, else it will just zext.
706 Known = Known.sext(BitWidth);
707 break;
708 }
709 case TargetOpcode::G_ASSERT_SEXT:
710 case TargetOpcode::G_SEXT_INREG: {
711 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
712 Depth + 1);
713 Known = Known.sextInReg(MI.getOperand(2).getImm());
714 break;
715 }
716 case TargetOpcode::G_ANYEXT: {
717 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
718 Depth + 1);
719 Known = Known.anyext(BitWidth);
720 break;
721 }
722 case TargetOpcode::G_LOAD: {
723 const MachineMemOperand *MMO = *MI.memoperands_begin();
724 KnownBits KnownRange(MMO->getMemoryType().getScalarSizeInBits());
725 if (const MDNode *Ranges = MMO->getRanges())
726 computeKnownBitsFromRangeMetadata(*Ranges, KnownRange);
727 Known = KnownRange.anyext(Known.getBitWidth());
728 break;
729 }
730 case TargetOpcode::G_SEXTLOAD:
731 case TargetOpcode::G_ZEXTLOAD: {
732 if (DstTy.isVector())
733 break;
734 const MachineMemOperand *MMO = *MI.memoperands_begin();
735 KnownBits KnownRange(MMO->getMemoryType().getScalarSizeInBits());
736 if (const MDNode *Ranges = MMO->getRanges())
737 computeKnownBitsFromRangeMetadata(*Ranges, KnownRange);
738 Known = Opcode == TargetOpcode::G_SEXTLOAD
739 ? KnownRange.sext(Known.getBitWidth())
740 : KnownRange.zext(Known.getBitWidth());
741 break;
742 }
743 case TargetOpcode::G_ASHR: {
744 KnownBits LHSKnown, RHSKnown;
745 computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts,
746 Depth + 1);
747 computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts,
748 Depth + 1);
749 Known = KnownBits::ashr(LHSKnown, RHSKnown);
750 break;
751 }
752 case TargetOpcode::G_LSHR: {
753 KnownBits LHSKnown, RHSKnown;
754 computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts,
755 Depth + 1);
756 computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts,
757 Depth + 1);
758 Known = KnownBits::lshr(LHSKnown, RHSKnown);
759 break;
760 }
761 case TargetOpcode::G_SHL: {
762 KnownBits LHSKnown, RHSKnown;
763 computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts,
764 Depth + 1);
765 computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts,
766 Depth + 1);
767 Known = KnownBits::shl(LHSKnown, RHSKnown);
768 break;
769 }
770 case TargetOpcode::G_ROTL:
771 case TargetOpcode::G_ROTR: {
772 auto MaybeAmtOp =
773 isConstantOrConstantSplatVector(MI.getOperand(2).getReg(), MRI);
774 if (!MaybeAmtOp)
775 break;
776
777 Register SrcReg = MI.getOperand(1).getReg();
778 computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
779
780 unsigned Amt = MaybeAmtOp->urem(BitWidth);
781
782 // Canonicalize to ROTR.
783 if (Opcode == TargetOpcode::G_ROTL)
784 Amt = BitWidth - Amt;
785
786 Known.Zero = Known.Zero.rotr(Amt);
787 Known.One = Known.One.rotr(Amt);
788 break;
789 }
790 case TargetOpcode::G_FSHL:
791 case TargetOpcode::G_FSHR: {
792 auto MaybeAmtOp =
793 isConstantOrConstantSplatVector(MI.getOperand(3).getReg(), MRI);
794 if (!MaybeAmtOp)
795 break;
796
797 const APInt Amt = *MaybeAmtOp;
798 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
799 Depth + 1);
800 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
801 Depth + 1);
802 Known = Opcode == TargetOpcode::G_FSHL
803 ? KnownBits::fshl(Known, Known2, Amt)
804 : KnownBits::fshr(Known, Known2, Amt);
805 break;
806 }
807 case TargetOpcode::G_INTTOPTR:
808 case TargetOpcode::G_PTRTOINT:
809 if (DstTy.isVector())
810 break;
811 // Fall through and handle them the same as zext/trunc.
812 [[fallthrough]];
813 case TargetOpcode::G_ZEXT:
814 case TargetOpcode::G_TRUNC: {
815 Register SrcReg = MI.getOperand(1).getReg();
816 computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
817 Known = Known.zextOrTrunc(BitWidth);
818 break;
819 }
820 case TargetOpcode::G_TRUNC_SSAT_S: {
821 Register SrcReg = MI.getOperand(1).getReg();
822 computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
823 Known = Known.truncSSat(BitWidth);
824 break;
825 }
826 case TargetOpcode::G_TRUNC_SSAT_U: {
827 Register SrcReg = MI.getOperand(1).getReg();
828 computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
829 Known = Known.truncSSatU(BitWidth);
830 break;
831 }
832 case TargetOpcode::G_TRUNC_USAT_U: {
833 Register SrcReg = MI.getOperand(1).getReg();
834 computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
835 Known = Known.truncUSat(BitWidth);
836 break;
837 }
838 case TargetOpcode::G_ASSERT_ZEXT: {
839 Register SrcReg = MI.getOperand(1).getReg();
840 computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
841
842 unsigned SrcBitWidth = MI.getOperand(2).getImm();
843 assert(SrcBitWidth && "SrcBitWidth can't be zero");
844 APInt InMask = APInt::getLowBitsSet(BitWidth, SrcBitWidth);
845 Known.Zero |= (~InMask);
846 Known.One &= (~Known.Zero);
847 break;
848 }
849 case TargetOpcode::G_ASSERT_ALIGN: {
850 int64_t LogOfAlign = Log2_64(MI.getOperand(2).getImm());
851
852 // TODO: Should use maximum with source
853 // If a node is guaranteed to be aligned, set low zero bits accordingly as
854 // well as clearing one bits.
855 Known.Zero.setLowBits(LogOfAlign);
856 Known.One.clearLowBits(LogOfAlign);
857 break;
858 }
859 case TargetOpcode::G_MERGE_VALUES: {
860 unsigned NumOps = MI.getNumOperands();
861 unsigned OpSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits();
862
863 for (unsigned I = 0; I != NumOps - 1; ++I) {
864 KnownBits SrcOpKnown;
865 computeKnownBitsImpl(MI.getOperand(I + 1).getReg(), SrcOpKnown,
866 DemandedElts, Depth + 1);
867 Known.insertBits(SrcOpKnown, I * OpSize);
868 }
869 break;
870 }
871 case TargetOpcode::G_UNMERGE_VALUES: {
872 unsigned NumOps = MI.getNumOperands();
873 Register SrcReg = MI.getOperand(NumOps - 1).getReg();
874 LLT SrcTy = MRI.getType(SrcReg);
875
876 if (SrcTy.isVector() && SrcTy.getScalarType() != DstTy.getScalarType())
877 return; // TODO: Handle vector->subelement unmerges
878
879 // Figure out the result operand index
880 unsigned DstIdx = MI.findRegisterDefOperandIdx(R, nullptr);
881
882 APInt SubDemandedElts = DemandedElts;
883 if (SrcTy.isVector()) {
884 unsigned DstLanes = DstTy.isVector() ? DstTy.getNumElements() : 1;
885 SubDemandedElts =
886 DemandedElts.zext(SrcTy.getNumElements()).shl(DstIdx * DstLanes);
887 }
888
889 KnownBits SrcOpKnown;
890 computeKnownBitsImpl(SrcReg, SrcOpKnown, SubDemandedElts, Depth + 1);
891
892 if (SrcTy.isVector())
893 Known = std::move(SrcOpKnown);
894 else
895 Known = SrcOpKnown.extractBits(BitWidth, BitWidth * DstIdx);
896 break;
897 }
898 case TargetOpcode::G_BSWAP: {
899 Register SrcReg = MI.getOperand(1).getReg();
900 computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
901 Known = Known.byteSwap();
902 break;
903 }
904 case TargetOpcode::G_BITREVERSE: {
905 Register SrcReg = MI.getOperand(1).getReg();
906 computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
907 Known = Known.reverseBits();
908 break;
909 }
910 case TargetOpcode::G_CTPOP: {
911 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
912 Depth + 1);
913 // We can bound the space the count needs. Also, bits known to be zero
914 // can't contribute to the population.
915 unsigned BitsPossiblySet = Known2.countMaxPopulation();
916 unsigned LowBits = llvm::bit_width(BitsPossiblySet);
917 Known.Zero.setBitsFrom(LowBits);
918 // TODO: we could bound Known.One using the lower bound on the number of
919 // bits which might be set provided by popcnt KnownOne2.
920 break;
921 }
922 case TargetOpcode::G_UBFX: {
923 KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
924 computeKnownBitsImpl(MI.getOperand(1).getReg(), SrcOpKnown, DemandedElts,
925 Depth + 1);
926 computeKnownBitsImpl(MI.getOperand(2).getReg(), OffsetKnown, DemandedElts,
927 Depth + 1);
928 computeKnownBitsImpl(MI.getOperand(3).getReg(), WidthKnown, DemandedElts,
929 Depth + 1);
930 Known = extractBits(BitWidth, SrcOpKnown, OffsetKnown, WidthKnown);
931 break;
932 }
933 case TargetOpcode::G_SBFX: {
934 KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
935 computeKnownBitsImpl(MI.getOperand(1).getReg(), SrcOpKnown, DemandedElts,
936 Depth + 1);
937 computeKnownBitsImpl(MI.getOperand(2).getReg(), OffsetKnown, DemandedElts,
938 Depth + 1);
939 computeKnownBitsImpl(MI.getOperand(3).getReg(), WidthKnown, DemandedElts,
940 Depth + 1);
941 OffsetKnown = OffsetKnown.sext(BitWidth);
942 WidthKnown = WidthKnown.sext(BitWidth);
943 Known = extractBits(BitWidth, SrcOpKnown, OffsetKnown, WidthKnown);
944 // Sign extend the extracted value using shift left and arithmetic shift
945 // right.
946 KnownBits ExtKnown = KnownBits::makeConstant(APInt(BitWidth, BitWidth));
947 KnownBits ShiftKnown = KnownBits::sub(ExtKnown, WidthKnown);
948 Known = KnownBits::ashr(KnownBits::shl(Known, ShiftKnown), ShiftKnown);
949 break;
950 }
951 case TargetOpcode::G_UADDO:
952 case TargetOpcode::G_UADDE:
953 case TargetOpcode::G_SADDO:
954 case TargetOpcode::G_SADDE: {
955 if (MI.getOperand(1).getReg() == R) {
956 // If we know the result of a compare has the top bits zero, use this
957 // info.
958 if (TL.getBooleanContents(DstTy.isVector(), false) ==
960 BitWidth > 1)
961 Known.Zero.setBitsFrom(1);
962 break;
963 }
964
965 assert(MI.getOperand(0).getReg() == R &&
966 "We only compute knownbits for the sum here.");
967 // With [US]ADDE, a carry bit may be added in.
968 KnownBits Carry(1);
969 if (Opcode == TargetOpcode::G_UADDE || Opcode == TargetOpcode::G_SADDE) {
970 computeKnownBitsImpl(MI.getOperand(4).getReg(), Carry, DemandedElts,
971 Depth + 1);
972 // Carry has bit width 1
973 Carry = Carry.trunc(1);
974 } else {
975 Carry.setAllZero();
976 }
977
978 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
979 Depth + 1);
980 computeKnownBitsImpl(MI.getOperand(3).getReg(), Known2, DemandedElts,
981 Depth + 1);
982 Known = KnownBits::computeForAddCarry(Known, Known2, Carry);
983 break;
984 }
985 case TargetOpcode::G_USUBO:
986 case TargetOpcode::G_USUBE:
987 case TargetOpcode::G_SSUBO:
988 case TargetOpcode::G_SSUBE:
989 case TargetOpcode::G_UMULO:
990 case TargetOpcode::G_SMULO: {
991 if (MI.getOperand(1).getReg() == R) {
992 // If we know the result of a compare has the top bits zero, use this
993 // info.
994 if (TL.getBooleanContents(DstTy.isVector(), false) ==
996 BitWidth > 1)
997 Known.Zero.setBitsFrom(1);
998 }
999 break;
1000 }
1001 case TargetOpcode::G_CTTZ:
1002 case TargetOpcode::G_CTTZ_ZERO_POISON: {
1003 KnownBits SrcOpKnown;
1004 computeKnownBitsImpl(MI.getOperand(1).getReg(), SrcOpKnown, DemandedElts,
1005 Depth + 1);
1006 // If we have a known 1, its position is our upper bound
1007 unsigned PossibleTZ = SrcOpKnown.countMaxTrailingZeros();
1008 unsigned LowBits = llvm::bit_width(PossibleTZ);
1009 Known.Zero.setBitsFrom(LowBits);
1010 break;
1011 }
1012 case TargetOpcode::G_CTLZ:
1013 case TargetOpcode::G_CTLZ_ZERO_POISON: {
1014 KnownBits SrcOpKnown;
1015 computeKnownBitsImpl(MI.getOperand(1).getReg(), SrcOpKnown, DemandedElts,
1016 Depth + 1);
1017 // If we have a known 1, its position is our upper bound.
1018 unsigned PossibleLZ = SrcOpKnown.countMaxLeadingZeros();
1019 unsigned LowBits = llvm::bit_width(PossibleLZ);
1020 Known.Zero.setBitsFrom(LowBits);
1021 break;
1022 }
1023 case TargetOpcode::G_CTLS: {
1024 Register Reg = MI.getOperand(1).getReg();
1025 unsigned MinRedundantSignBits =
1026 computeNumSignBits(Reg, DemandedElts, Depth + 1) - 1;
1027
1028 unsigned MaxUpperRedundantSignBits = MRI.getType(Reg).getScalarSizeInBits();
1029
1030 ConstantRange Range(APInt(BitWidth, MinRedundantSignBits),
1031 APInt(BitWidth, MaxUpperRedundantSignBits));
1032
1034 break;
1035 }
1036 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
1037 GExtractVectorElement &Extract = cast<GExtractVectorElement>(MI);
1038 Register InVec = Extract.getVectorReg();
1039 Register EltNo = Extract.getIndexReg();
1040
1041 auto ConstEltNo = getIConstantVRegVal(EltNo, MRI);
1042
1043 LLT VecVT = MRI.getType(InVec);
1044 // computeKnownBits not yet implemented for scalable vectors.
1045 if (VecVT.isScalableVector())
1046 break;
1047
1048 const unsigned EltBitWidth = VecVT.getScalarSizeInBits();
1049 const unsigned NumSrcElts = VecVT.getNumElements();
1050 // A return type different from the vector's element type may lead to
1051 // issues with pattern selection. Bail out to avoid that.
1052 if (BitWidth > EltBitWidth)
1053 break;
1054
1055 Known.Zero.setAllBits();
1056 Known.One.setAllBits();
1057
1058 // If we know the element index, just demand that vector element, else for
1059 // an unknown element index, ignore DemandedElts and demand them all.
1060 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
1061 if (ConstEltNo && ConstEltNo->ult(NumSrcElts))
1062 DemandedSrcElts =
1063 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
1064
1065 computeKnownBitsImpl(InVec, Known, DemandedSrcElts, Depth + 1);
1066 break;
1067 }
1068 case TargetOpcode::G_INSERT_VECTOR_ELT: {
1069 GInsertVectorElement &Insert = cast<GInsertVectorElement>(MI);
1070 Register InVec = Insert.getVectorReg();
1071 Register InVal = Insert.getElementReg();
1072 Register EltNo = Insert.getIndexReg();
1073 LLT VecVT = MRI.getType(InVec);
1074
1075 if (VecVT.isScalableVector())
1076 break;
1077
1078 auto ConstEltNo = getIConstantVRegVal(EltNo, MRI);
1079 unsigned NumElts = VecVT.getNumElements();
1080
1081 bool DemandedVal = true;
1082 APInt DemandedVecElts = DemandedElts;
1083 if (ConstEltNo && ConstEltNo->ult(NumElts)) {
1084 unsigned EltIdx = ConstEltNo->getZExtValue();
1085 DemandedVal = !!DemandedElts[EltIdx];
1086 DemandedVecElts.clearBit(EltIdx);
1087 }
1088 Known.setAllConflict();
1089 if (DemandedVal) {
1090 computeKnownBitsImpl(InVal, Known2, APInt(1, 1), Depth + 1);
1091 Known = Known.intersectWith(Known2.zextOrTrunc(BitWidth));
1092 }
1093 if (!!DemandedVecElts) {
1094 computeKnownBitsImpl(InVec, Known2, DemandedVecElts, Depth + 1);
1095 Known = Known.intersectWith(Known2);
1096 }
1097 break;
1098 }
1099 case TargetOpcode::G_INSERT_SUBVECTOR: {
1100 GInsertSubvector &Insert = cast<GInsertSubvector>(MI);
1101 Register Src = Insert.getBigVec();
1102 Register Sub = Insert.getSubVec();
1103 uint64_t Idx = Insert.getIndexImm();
1104 LLT SrcTy = MRI.getType(Src);
1105 LLT SubTy = MRI.getType(Sub);
1106 APInt DemandedSubElts;
1107 APInt DemandedSrcElts;
1108
1109 if (SrcTy.isScalableVector()) {
1110 DemandedSubElts = SubTy.isScalableVector()
1111 ? APInt(1, 1)
1112 : APInt::getAllOnes(SubTy.getNumElements());
1113 DemandedSrcElts = APInt(1, 1);
1114 } else {
1115 unsigned NumSubElts = SubTy.getNumElements();
1116 DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
1117 DemandedSrcElts = DemandedElts;
1118 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
1119 }
1120
1121 Known.setAllConflict();
1122 if (!!DemandedSubElts) {
1123 computeKnownBitsImpl(Sub, Known2, DemandedSubElts, Depth + 1);
1124 Known = Known.intersectWith(Known2);
1125 if (Known.isUnknown())
1126 break;
1127 }
1128
1129 if (!!DemandedSrcElts) {
1130 computeKnownBitsImpl(Src, Known2, DemandedSrcElts, Depth + 1);
1131 Known = Known.intersectWith(Known2);
1132 }
1133
1134 break;
1135 }
1136 case TargetOpcode::G_EXTRACT_SUBVECTOR: {
1137 Register SrcReg = MI.getOperand(1).getReg();
1138 LLT SrcTy = MRI.getType(SrcReg);
1139 APInt DemandedSrcElts;
1140 if (SrcTy.isScalableVector()) {
1141 DemandedSrcElts = APInt(1, 1);
1142 } else {
1143 uint64_t Idx = MI.getOperand(2).getImm();
1144 unsigned NumSrcElts = SrcTy.getNumElements();
1145 DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
1146 }
1147 computeKnownBitsImpl(SrcReg, Known, DemandedSrcElts, Depth + 1);
1148 break;
1149 }
1150 case TargetOpcode::G_SHUFFLE_VECTOR: {
1151 APInt DemandedLHS, DemandedRHS;
1152 // Collect the known bits that are shared by every vector element referenced
1153 // by the shuffle.
1154 unsigned NumElts = MRI.getType(MI.getOperand(1).getReg()).getNumElements();
1155 if (!getShuffleDemandedElts(NumElts, MI.getOperand(3).getShuffleMask(),
1156 DemandedElts, DemandedLHS, DemandedRHS))
1157 break;
1158
1159 // Known bits are the values that are shared by every demanded element.
1160 Known.Zero.setAllBits();
1161 Known.One.setAllBits();
1162 if (!!DemandedLHS) {
1163 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedLHS,
1164 Depth + 1);
1165 Known = Known.intersectWith(Known2);
1166 }
1167 // If we don't know any bits, early out.
1168 if (Known.isUnknown())
1169 break;
1170 if (!!DemandedRHS) {
1171 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedRHS,
1172 Depth + 1);
1173 Known = Known.intersectWith(Known2);
1174 }
1175 break;
1176 }
1177 case TargetOpcode::G_CONCAT_VECTORS: {
1178 if (MRI.getType(MI.getOperand(0).getReg()).isScalableVector())
1179 break;
1180 // Split DemandedElts and test each of the demanded subvectors.
1181 Known.Zero.setAllBits();
1182 Known.One.setAllBits();
1183 unsigned NumSubVectorElts =
1184 MRI.getType(MI.getOperand(1).getReg()).getNumElements();
1185
1186 for (const auto &[I, MO] : enumerate(drop_begin(MI.operands()))) {
1187 APInt DemandedSub =
1188 DemandedElts.extractBits(NumSubVectorElts, I * NumSubVectorElts);
1189 if (!!DemandedSub) {
1190 computeKnownBitsImpl(MO.getReg(), Known2, DemandedSub, Depth + 1);
1191
1192 Known = Known.intersectWith(Known2);
1193 }
1194 // If we don't know any bits, early out.
1195 if (Known.isUnknown())
1196 break;
1197 }
1198 break;
1199 }
1200 case TargetOpcode::G_VECTOR_COMPRESS: {
1201 // Each result lane is either a lane of the source vector or the passthru,
1202 // so the known bits are those shared by both.
1203 Register Vec = MI.getOperand(1).getReg();
1204 Register PassThru = MI.getOperand(3).getReg();
1205 computeKnownBitsImpl(PassThru, Known, DemandedElts, Depth + 1);
1206 // If we don't know any bits, early out.
1207 if (Known.isUnknown())
1208 break;
1209 // Compression can move any source lane to any result position, so all
1210 // source lanes are demanded.
1211 APInt DemandedSrcElts = APInt::getAllOnes(DemandedElts.getBitWidth());
1212 computeKnownBitsImpl(Vec, Known2, DemandedSrcElts, Depth + 1);
1213 Known = Known.intersectWith(Known2);
1214 break;
1215 }
1216 case TargetOpcode::G_ABS: {
1217 Register SrcReg = MI.getOperand(1).getReg();
1218 computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
1219 Known = Known.abs();
1220 Known.Zero.setHighBits(computeNumSignBits(SrcReg, DemandedElts, Depth + 1) -
1221 1);
1222 break;
1223 }
1224 }
1225
1227}
1228
1230 KnownBits &Known) {
1231 LLT Ty = MRI.getType(Reg);
1232 if (!Ty.isValid()) {
1233 Known = KnownBits();
1234 return;
1235 }
1236 unsigned BitWidth = Ty.getScalarSizeInBits();
1238}
1239
1240/// Evaluate a known-bits query with an explicit worklist instead of recursive
1241/// descent.
1243 const APInt &DemandedElts,
1244 unsigned Depth) {
1245 // Nested queries only consult the per-query cache. If the result is not
1246 // available yet, enqueue the request and return an unknown placeholder.
1247 if (!Stack.empty()) {
1248 if (!getKnownBitsResult(R, DemandedElts, Depth, Known)) {
1249 Stack.push_back({R, DemandedElts, Depth});
1250 genUnknown(MRI, R, Known);
1251 }
1252 return;
1253 }
1254
1255 // Top-level queries drive evaluation iteratively until every queued item has
1256 // either been computed or found in the cache.
1257 Stack.push_back({R, DemandedElts, Depth});
1258 while (!Stack.empty()) {
1259 WorkItem Item = Stack.back();
1260 size_t StackSize = Stack.size();
1261 Register ItemReg = std::get<0>(Item);
1262 const APInt &ItemDemandedElts = std::get<1>(Item);
1263 const unsigned ItemDepth = std::get<2>(Item);
1264 KnownBits ItemKnown;
1265
1266 if (getKnownBitsResult(ItemReg, ItemDemandedElts, ItemDepth, ItemKnown)) {
1267 Stack.pop_back();
1268 continue;
1269 }
1270
1271 // Evaluate this item with the per-instruction known-bits logic. Dependent
1272 // queries issued from there re-enter this worklist driver and take the
1273 // nested-query path to enqueue more work.
1274 computeKnownBits(ItemReg, ItemKnown, ItemDemandedElts, ItemDepth);
1275
1276 // If evaluating this item did not queue more work, its dependencies are
1277 // resolved and the result can be memoized immediately.
1278 if (Stack.size() == StackSize) {
1279 assert((std::get<0>(Stack.back()) == ItemReg &&
1280 std::get<1>(Stack.back()) == ItemDemandedElts &&
1281 std::get<2>(Stack.back()) == ItemDepth) &&
1282 "The item we just evaluated must still be the top one.");
1283
1284 setKnownBitsResult(ItemReg, ItemDemandedElts, ItemDepth, ItemKnown);
1285 Stack.pop_back();
1286 }
1287 }
1288
1289 // The original query must have been computed by the time the worklist is
1290 // drained.
1291 if (!getKnownBitsResult(R, DemandedElts, Depth, Known))
1293 "Top level query must be in `results` after iteration is complete.");
1294
1295 Results.clear();
1296}
1297
1298void GISelValueTracking::computeKnownFPClass(Register R, KnownFPClass &Known,
1299 FPClassTest InterestedClasses,
1300 unsigned Depth) {
1301 LLT Ty = MRI.getType(R);
1302 APInt DemandedElts =
1303 Ty.isFixedVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1);
1304 computeKnownFPClass(R, DemandedElts, InterestedClasses, Known, Depth);
1305}
1306
1307/// Return true if this value is known to be the fractional part x - floor(x),
1308/// which lies in [0, 1). This implies the value cannot introduce overflow in a
1309/// fmul when the other operand is known finite.
1311 using namespace MIPatternMatch;
1312 Register SubX;
1313 return mi_match(R, MRI, m_GFSub(m_Reg(SubX), m_GFFloor(m_DeferredReg(SubX))));
1314}
1315
1316void GISelValueTracking::computeKnownFPClassForFPTrunc(
1317 const MachineInstr &MI, const APInt &DemandedElts,
1318 FPClassTest InterestedClasses, KnownFPClass &Known, unsigned Depth) {
1319 if ((InterestedClasses & (KnownFPClass::OrderedLessThanZeroMask | fcNan)) ==
1320 fcNone)
1321 return;
1322
1323 Register Val = MI.getOperand(1).getReg();
1324 KnownFPClass KnownSrc;
1325 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1326 Depth + 1);
1327
1328 const fltSemantics &DstSem = getFltSemanticForLLT(
1329 MRI.getType(MI.getOperand(0).getReg()).getScalarType());
1330 const fltSemantics &SrcSem =
1331 getFltSemanticForLLT(MRI.getType(Val).getScalarType());
1332
1333 Known = KnownFPClass::fptrunc(KnownSrc, DstSem, SrcSem,
1334 MF.getDenormalMode(DstSem),
1335 MF.getDenormalMode(SrcSem));
1336}
1337
1338void GISelValueTracking::computeKnownFPClass(Register R,
1339 const APInt &DemandedElts,
1340 FPClassTest InterestedClasses,
1342 unsigned Depth) {
1343 assert(Known.isUnknown() && "should not be called with known information");
1344
1345 if (!DemandedElts) {
1346 // No demanded elts, better to assume we don't know anything.
1347 Known.resetAll();
1348 return;
1349 }
1350
1351 assert(Depth <= MaxAnalysisRecursionDepth && "Limit Search Depth");
1352
1353 MachineInstr &MI = *MRI.getVRegDef(R);
1354 unsigned Opcode = MI.getOpcode();
1355 LLT DstTy = MRI.getType(R);
1356
1357 if (!DstTy.isValid()) {
1358 Known.resetAll();
1359 return;
1360 }
1361
1362 if (auto Cst = GFConstant::getConstant(R, MRI)) {
1363 switch (Cst->getKind()) {
1365 Known = KnownFPClass(Cst->getScalarValue());
1366 break;
1367 }
1370
1371 for (const APFloat &C : *Cst)
1372 Known |= KnownFPClass(C);
1373
1374 break;
1375 }
1377 Known.resetAll();
1378 break;
1379 }
1380 }
1381
1382 return;
1383 }
1384
1385 FPClassTest KnownNotFromFlags = fcNone;
1387 KnownNotFromFlags |= fcNan;
1389 KnownNotFromFlags |= fcInf;
1390
1391 // We no longer need to find out about these bits from inputs if we can
1392 // assume this from flags/attributes.
1393 InterestedClasses &= ~KnownNotFromFlags;
1394
1395 llvm::scope_exit ClearClassesFromFlags(
1396 [=, &Known] { Known.knownNot(KnownNotFromFlags); });
1397
1398 // All recursive calls that increase depth must come after this.
1400 return;
1401
1402 const MachineFunction *MF = MI.getMF();
1403
1404 switch (Opcode) {
1405 default:
1406 TL.computeKnownFPClassForTargetInstr(*this, R, Known, DemandedElts, MRI,
1407 Depth);
1408 break;
1409 case TargetOpcode::G_FNEG: {
1410 Register Val = MI.getOperand(1).getReg();
1411 computeKnownFPClass(Val, DemandedElts, InterestedClasses, Known, Depth + 1);
1412 Known.fneg();
1413 break;
1414 }
1415 case TargetOpcode::G_SELECT: {
1416 GSelect &SelMI = cast<GSelect>(MI);
1417 Register Cond = SelMI.getCondReg();
1418 Register LHS = SelMI.getTrueReg();
1419 Register RHS = SelMI.getFalseReg();
1420
1421 FPClassTest FilterLHS = fcAllFlags;
1422 FPClassTest FilterRHS = fcAllFlags;
1423
1424 Register TestedValue;
1425 FPClassTest MaskIfTrue = fcAllFlags;
1426 FPClassTest MaskIfFalse = fcAllFlags;
1427 FPClassTest ClassVal = fcNone;
1428
1429 CmpInst::Predicate Pred;
1430 Register CmpLHS, CmpRHS;
1431 if (mi_match(Cond, MRI,
1432 m_GFCmp(m_Pred(Pred), m_Reg(CmpLHS), m_Reg(CmpRHS)))) {
1433 // If the select filters out a value based on the class, it no longer
1434 // participates in the class of the result
1435
1436 // TODO: In some degenerate cases we can infer something if we try again
1437 // without looking through sign operations.
1438 bool LookThroughFAbsFNeg = CmpLHS != LHS && CmpLHS != RHS;
1439 std::tie(TestedValue, MaskIfTrue, MaskIfFalse) =
1440 fcmpImpliesClass(Pred, *MF, CmpLHS, CmpRHS, LookThroughFAbsFNeg);
1441 } else if (mi_match(
1442 Cond, MRI,
1443 m_GIsFPClass(m_Reg(TestedValue), m_FPClassTest(ClassVal)))) {
1444 FPClassTest TestedMask = ClassVal;
1445 MaskIfTrue = TestedMask;
1446 MaskIfFalse = ~TestedMask;
1447 }
1448
1449 if (TestedValue == LHS) {
1450 // match !isnan(x) ? x : y
1451 FilterLHS = MaskIfTrue;
1452 } else if (TestedValue == RHS) { // && IsExactClass
1453 // match !isnan(x) ? y : x
1454 FilterRHS = MaskIfFalse;
1455 }
1456
1457 KnownFPClass Known2;
1458 computeKnownFPClass(LHS, DemandedElts, InterestedClasses & FilterLHS, Known,
1459 Depth + 1);
1460 Known.setKnownFPClasses(Known.getKnownFPClasses() & FilterLHS);
1461
1462 computeKnownFPClass(RHS, DemandedElts, InterestedClasses & FilterRHS,
1463 Known2, Depth + 1);
1464 Known2.setKnownFPClasses(Known2.getKnownFPClasses() & FilterRHS);
1465
1466 Known |= Known2;
1467 break;
1468 }
1469 case TargetOpcode::G_FCOPYSIGN: {
1470 Register Magnitude = MI.getOperand(1).getReg();
1471 Register Sign = MI.getOperand(2).getReg();
1472
1473 KnownFPClass KnownSign;
1474
1475 computeKnownFPClass(Magnitude, DemandedElts, InterestedClasses, Known,
1476 Depth + 1);
1477 computeKnownFPClass(Sign, DemandedElts, InterestedClasses, KnownSign,
1478 Depth + 1);
1479 Known.copysign(KnownSign);
1480 break;
1481 }
1482 case TargetOpcode::G_FMA:
1483 case TargetOpcode::G_FMAD: {
1484 if ((InterestedClasses & (fcNegative | fcNan)) == fcNone)
1485 break;
1486
1487 const bool IsFMA = Opcode == TargetOpcode::G_FMA;
1488
1489 Register A = MI.getOperand(1).getReg();
1490 Register B = MI.getOperand(2).getReg();
1491 Register C = MI.getOperand(3).getReg();
1492
1493 DenormalMode Mode =
1494 MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType()));
1495
1496 if (A == B && isGuaranteedNotToBeUndef(A, MRI, Depth + 1)) {
1497 FPClassTest InterestedSquared = InterestedClasses;
1498 FPClassTest InterestedAddend = InterestedClasses;
1499 // Only fma(+inf, +inf, -inf) and fma(-inf, -inf, -inf) produce NaN when
1500 // squaring.
1501 if (InterestedClasses & fcQNan) {
1502 InterestedSquared |= fcSNan | fcInf;
1503 InterestedAddend |= fcSNan | fcNegInf;
1504 }
1505
1506 KnownFPClass KnownSrc, KnownAddend;
1507 computeKnownFPClass(C, DemandedElts, InterestedAddend, KnownAddend,
1508 Depth + 1);
1509 computeKnownFPClass(A, DemandedElts, InterestedSquared, KnownSrc,
1510 Depth + 1);
1511 if (KnownNotFromFlags) {
1512 KnownSrc.knownNot(KnownNotFromFlags);
1513 KnownAddend.knownNot(KnownNotFromFlags);
1514 }
1515 Known = IsFMA ? KnownFPClass::fma_square(KnownSrc, KnownAddend, Mode)
1516 : KnownFPClass::fmuladd_square(KnownSrc, KnownAddend, Mode);
1517 } else {
1518 KnownFPClass KnownSrc[3];
1519 computeKnownFPClass(A, DemandedElts, InterestedClasses, KnownSrc[0],
1520 Depth + 1);
1521 if (KnownSrc[0].isUnknown())
1522 break;
1523 computeKnownFPClass(B, DemandedElts, InterestedClasses, KnownSrc[1],
1524 Depth + 1);
1525 if (KnownSrc[1].isUnknown())
1526 break;
1527 computeKnownFPClass(C, DemandedElts, InterestedClasses, KnownSrc[2],
1528 Depth + 1);
1529 if (KnownSrc[2].isUnknown())
1530 break;
1531 if (KnownNotFromFlags) {
1532 KnownSrc[0].knownNot(KnownNotFromFlags);
1533 KnownSrc[1].knownNot(KnownNotFromFlags);
1534 KnownSrc[2].knownNot(KnownNotFromFlags);
1535 }
1536 Known =
1537 IsFMA ? KnownFPClass::fma(KnownSrc[0], KnownSrc[1], KnownSrc[2], Mode)
1538 : KnownFPClass::fmuladd(KnownSrc[0], KnownSrc[1], KnownSrc[2],
1539 Mode);
1540 }
1541 break;
1542 }
1543 case TargetOpcode::G_FSQRT:
1544 case TargetOpcode::G_STRICT_FSQRT: {
1545 KnownFPClass KnownSrc;
1546 FPClassTest InterestedSrcs = InterestedClasses;
1547 if (InterestedClasses & fcQNan)
1549 // Subnormals may flush to zero.
1550 if (InterestedClasses & fcZero)
1551 InterestedSrcs |= fcSubnormal;
1552
1553 Register Val = MI.getOperand(1).getReg();
1554 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc, Depth + 1);
1555
1556 DenormalMode Mode =
1557 MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType()));
1558 Known = KnownFPClass::sqrt(KnownSrc, Mode);
1559 if (MI.getFlag(MachineInstr::MIFlag::FmNsz))
1560 Known.knownNot(fcNegZero);
1561 break;
1562 }
1563 case TargetOpcode::G_FABS: {
1564 if ((InterestedClasses & (fcNan | fcPositive)) != fcNone) {
1565 Register Val = MI.getOperand(1).getReg();
1566 // If we only care about the sign bit we don't need to inspect the
1567 // operand.
1568 computeKnownFPClass(Val, DemandedElts, InterestedClasses, Known,
1569 Depth + 1);
1570 }
1571 Known.fabs();
1572 break;
1573 }
1574 case TargetOpcode::G_FATAN2: {
1575 FPClassTest InterestedY = InterestedClasses;
1576 FPClassTest InterestedX = InterestedClasses;
1577
1578 // We can rule out negative values if y cannot have a negative value.
1579 if ((InterestedClasses & fcNegFinite) != fcNone)
1580 InterestedY |= fcNegative;
1581
1582 // We can rule out positive values if y cannot have a positive value.
1583 if ((InterestedClasses & fcPosFinite) != fcNone)
1584 InterestedY |= fcPositive | fcNegSubnormal;
1585
1586 // We can rule out zero and subnormal if x cannot have a positive value.
1587 if ((InterestedClasses & (fcZero | fcSubnormal)) != fcNone)
1588 InterestedX |= fcPositive | fcNegSubnormal;
1589
1590 Register Y = MI.getOperand(1).getReg();
1591 Register X = MI.getOperand(2).getReg();
1592 KnownFPClass KnownY, KnownX;
1593 computeKnownFPClass(Y, DemandedElts, InterestedY, KnownY, Depth + 1);
1594 computeKnownFPClass(X, DemandedElts, InterestedX, KnownX, Depth + 1);
1595 DenormalMode Mode =
1596 MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType()));
1597 Known = KnownFPClass::atan2(KnownY, KnownX, Mode);
1598 break;
1599 }
1600 case TargetOpcode::G_FSINH: {
1601 Register Val = MI.getOperand(1).getReg();
1602 KnownFPClass KnownSrc;
1603 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1604 Depth + 1);
1605 Known = KnownFPClass::sinh(KnownSrc);
1606 break;
1607 }
1608 case TargetOpcode::G_FCOSH: {
1609 Register Val = MI.getOperand(1).getReg();
1610 KnownFPClass KnownSrc;
1611 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1612 Depth + 1);
1613 Known = KnownFPClass::cosh(KnownSrc);
1614 break;
1615 }
1616 case TargetOpcode::G_FTANH: {
1617 Register Val = MI.getOperand(1).getReg();
1618 KnownFPClass KnownSrc;
1619 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1620 Depth + 1);
1621 Known = KnownFPClass::tanh(KnownSrc);
1622 break;
1623 }
1624 case TargetOpcode::G_FASIN: {
1625 Register Val = MI.getOperand(1).getReg();
1626 KnownFPClass KnownSrc;
1627 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1628 Depth + 1);
1629 Known = KnownFPClass::asin(KnownSrc);
1630 break;
1631 }
1632 case TargetOpcode::G_FACOS: {
1633 Register Val = MI.getOperand(1).getReg();
1634 KnownFPClass KnownSrc;
1635 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1636 Depth + 1);
1637 Known = KnownFPClass::acos(KnownSrc);
1638 break;
1639 }
1640 case TargetOpcode::G_FATAN: {
1641 Register Val = MI.getOperand(1).getReg();
1642 KnownFPClass KnownSrc;
1643 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1644 Depth + 1);
1645 Known = KnownFPClass::atan(KnownSrc);
1646 break;
1647 }
1648 case TargetOpcode::G_FTAN: {
1649 Register Val = MI.getOperand(1).getReg();
1650 KnownFPClass KnownSrc;
1651 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1652 Depth + 1);
1653 Known = KnownFPClass::tan(KnownSrc);
1654 break;
1655 }
1656 case TargetOpcode::G_FSIN:
1657 case TargetOpcode::G_FCOS: {
1658 // Return NaN on infinite inputs.
1659 Register Val = MI.getOperand(1).getReg();
1660 KnownFPClass KnownSrc;
1661 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1662 Depth + 1);
1663 Known = Opcode == TargetOpcode::G_FCOS ? KnownFPClass::cos(KnownSrc)
1664 : KnownFPClass::sin(KnownSrc);
1665 break;
1666 }
1667 case TargetOpcode::G_FSINCOS: {
1668 // Operand layout: (sin_dst, cos_dst, src)
1669 Register Src = MI.getOperand(2).getReg();
1670 KnownFPClass KnownSrc;
1671 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
1672 Depth + 1);
1673 if (R == MI.getOperand(0).getReg())
1674 Known = KnownFPClass::sin(KnownSrc);
1675 else
1676 Known = KnownFPClass::cos(KnownSrc);
1677 break;
1678 }
1679 case TargetOpcode::G_FMAXNUM:
1680 case TargetOpcode::G_FMINNUM:
1681 case TargetOpcode::G_FMINNUM_IEEE:
1682 case TargetOpcode::G_FMAXIMUM:
1683 case TargetOpcode::G_FMINIMUM:
1684 case TargetOpcode::G_FMAXNUM_IEEE:
1685 case TargetOpcode::G_FMAXIMUMNUM:
1686 case TargetOpcode::G_FMINIMUMNUM: {
1687 Register LHS = MI.getOperand(1).getReg();
1688 Register RHS = MI.getOperand(2).getReg();
1689 KnownFPClass KnownLHS, KnownRHS;
1690
1691 computeKnownFPClass(LHS, DemandedElts, InterestedClasses, KnownLHS,
1692 Depth + 1);
1693 computeKnownFPClass(RHS, DemandedElts, InterestedClasses, KnownRHS,
1694 Depth + 1);
1695
1697 switch (Opcode) {
1698 case TargetOpcode::G_FMINIMUM:
1700 break;
1701 case TargetOpcode::G_FMAXIMUM:
1703 break;
1704 case TargetOpcode::G_FMINIMUMNUM:
1706 break;
1707 case TargetOpcode::G_FMAXIMUMNUM:
1709 break;
1710 case TargetOpcode::G_FMINNUM:
1711 case TargetOpcode::G_FMINNUM_IEEE:
1713 break;
1714 case TargetOpcode::G_FMAXNUM:
1715 case TargetOpcode::G_FMAXNUM_IEEE:
1717 break;
1718 default:
1719 llvm_unreachable("unhandled min/max opcode");
1720 }
1721
1722 DenormalMode Mode =
1723 MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType()));
1724 Known = KnownFPClass::minMaxLike(KnownLHS, KnownRHS, Kind, Mode);
1725 break;
1726 }
1727 case TargetOpcode::G_FCANONICALIZE: {
1728 Register Val = MI.getOperand(1).getReg();
1729 KnownFPClass KnownSrc;
1730 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1731 Depth + 1);
1732
1733 LLT Ty = MRI.getType(Val).getScalarType();
1734 const fltSemantics &FPType = getFltSemanticForLLT(Ty);
1735 DenormalMode DenormMode = MF->getDenormalMode(FPType);
1736 Known = KnownFPClass::canonicalize(KnownSrc, DenormMode);
1737 break;
1738 }
1739 case TargetOpcode::G_VECREDUCE_FMAX:
1740 case TargetOpcode::G_VECREDUCE_FMIN:
1741 case TargetOpcode::G_VECREDUCE_FMAXIMUM:
1742 case TargetOpcode::G_VECREDUCE_FMINIMUM:
1743 case TargetOpcode::G_VECREDUCE_FMAXIMUMNUM:
1744 case TargetOpcode::G_VECREDUCE_FMINIMUMNUM: {
1745 Register Val = MI.getOperand(1).getReg();
1746 // reduce min/max will choose an element from one of the vector elements,
1747 // so we can infer and class information that is common to all elements.
1748
1749 Known =
1750 computeKnownFPClass(Val, MI.getFlags(), InterestedClasses, Depth + 1);
1751 // Can only propagate sign if output is never NaN.
1752 if (!Known.isKnownNeverNaN())
1753 Known.setSignBit(std::nullopt);
1754 break;
1755 }
1756 case TargetOpcode::G_FFLOOR:
1757 case TargetOpcode::G_FCEIL:
1758 case TargetOpcode::G_FRINT:
1759 case TargetOpcode::G_FNEARBYINT:
1760 case TargetOpcode::G_INTRINSIC_ROUND:
1761 case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
1762 case TargetOpcode::G_INTRINSIC_TRUNC: {
1763 Register Val = MI.getOperand(1).getReg();
1764 KnownFPClass KnownSrc;
1765 FPClassTest InterestedSrcs = InterestedClasses;
1766
1767 // Negative round ups towards zero produce negative zero.
1768 if (InterestedSrcs & fcNegFinite)
1769 InterestedSrcs |= fcNegFinite;
1770
1771 // Negative subnormals may flush to positive zero.
1772 if (InterestedSrcs & fcPosFinite)
1773 InterestedSrcs |= fcPosFinite | fcNegSubnormal;
1774
1775 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc, Depth + 1);
1776
1777 LLT Ty = MRI.getType(Val).getScalarType();
1778 const fltSemantics &FltSem = getFltSemanticForLLT(Ty);
1779 DenormalMode Mode = MF->getDenormalMode(FltSem);
1780 const bool IsMultiUnitFPType = &FltSem == &APFloat::PPCDoubleDouble();
1781
1782 switch (Opcode) {
1783 case TargetOpcode::G_INTRINSIC_TRUNC:
1784 Known = KnownFPClass::trunc(KnownSrc, Mode);
1785 break;
1786 case TargetOpcode::G_FFLOOR:
1787 Known = KnownFPClass::floor(KnownSrc, IsMultiUnitFPType, Mode);
1788 break;
1789 case TargetOpcode::G_FCEIL:
1790 Known = KnownFPClass::ceil(KnownSrc, IsMultiUnitFPType, Mode);
1791 break;
1792 default:
1793 Known = KnownFPClass::roundToIntegral(KnownSrc, IsMultiUnitFPType, Mode);
1794 break;
1795 }
1796 break;
1797 }
1798 case TargetOpcode::G_FEXP:
1799 case TargetOpcode::G_FEXP2:
1800 case TargetOpcode::G_FEXP10: {
1801 Register Val = MI.getOperand(1).getReg();
1802 KnownFPClass KnownSrc;
1803 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1804 Depth + 1);
1805 Known = KnownFPClass::exp(KnownSrc);
1806 break;
1807 }
1808 case TargetOpcode::G_FLOG:
1809 case TargetOpcode::G_FLOG2:
1810 case TargetOpcode::G_FLOG10: {
1811 FPClassTest InterestedSrcs = fcNone;
1812
1813 // log(negative) produces NaN.
1814 if ((InterestedClasses & fcNan) != fcNone)
1815 InterestedSrcs |= fcNan | fcNegative;
1816
1817 // log(logical-zero) produces negative infinity.
1818 if ((InterestedClasses & fcNegInf) != fcNone)
1819 InterestedSrcs |= fcZero | fcSubnormal;
1820
1821 // log(x) < -0.0 if x < +1.0
1822 if ((InterestedClasses & fcNegNormal) != fcNone)
1823 InterestedSrcs |= fcPosSubnormal | fcPosNormal;
1824
1825 // log(x) >= +0.0 if x >= +1.0
1826 if ((InterestedClasses & (fcPosZero | fcPosNormal)) != fcNone)
1827 InterestedSrcs |= fcPosNormal;
1828
1829 // log(x) is positive infinity iff x is positive infinity.
1830 if ((InterestedClasses & fcPosInf) != fcNone)
1831 InterestedSrcs |= fcPosInf;
1832
1833 Register Val = MI.getOperand(1).getReg();
1834 KnownFPClass KnownSrc;
1835 if (InterestedSrcs != fcNone)
1836 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
1837 Depth + 1);
1838
1839 LLT Ty = MRI.getType(Val).getScalarType();
1840 const fltSemantics &FltSem = getFltSemanticForLLT(Ty);
1841 DenormalMode Mode = MF->getDenormalMode(FltSem);
1842 bool IsMultiUnitFPType = &FltSem == &APFloat::PPCDoubleDouble();
1843 Known = KnownFPClass::log(KnownSrc, Mode, IsMultiUnitFPType);
1844 break;
1845 }
1846 case TargetOpcode::G_FPOW: {
1847 const bool WantNaN = (InterestedClasses & fcNan) != fcNone;
1848 const bool WantNegative = (InterestedClasses & fcNegative) != fcNone;
1849 if (!WantNaN && !WantNegative)
1850 break;
1851
1852 FPClassTest InterestedLHS = fcNone;
1853 FPClassTest InterestedRHS = fcNone;
1854 if (WantNaN) {
1855 // pow may return NaN if one of the arguments is NaN. NaN may be produced
1856 // from a non-zero-finite-negative base and a non-integer exponent.
1857 InterestedLHS |= fcNan | fcNegNormal | fcNegSubnormal;
1858 InterestedRHS |= fcNan;
1859 }
1860 if (WantNegative) {
1861 // A negative value is returned when a negative base is raised to an odd
1862 // integer power. Only normal values can be odd integers.
1863 InterestedLHS |= fcNegative;
1864 InterestedRHS |= fcNormal;
1865 }
1866
1867 KnownFPClass KnownLHS;
1868 computeKnownFPClass(MI.getOperand(1).getReg(), DemandedElts, InterestedLHS,
1869 KnownLHS, Depth + 1);
1870
1871 // If the LHS is unknown, then querying the RHS is only useful for rare edge
1872 // cases.
1873 if (KnownLHS.isUnknown())
1874 break;
1875
1876 KnownFPClass KnownRHS;
1877 computeKnownFPClass(MI.getOperand(2).getReg(), DemandedElts, InterestedRHS,
1878 KnownRHS, Depth + 1);
1879 Known = KnownFPClass::pow(KnownLHS, KnownRHS);
1880 break;
1881 }
1882 case TargetOpcode::G_FPOWI: {
1883 if ((InterestedClasses & (fcNan | fcInf | fcNegative)) == fcNone)
1884 break;
1885
1886 Register Exp = MI.getOperand(2).getReg();
1887 LLT ExpTy = MRI.getType(Exp);
1888 KnownBits ExponentKnownBits = getKnownBits(
1889 Exp, ExpTy.isVector() ? DemandedElts : APInt(1, 1), Depth + 1);
1890
1891 FPClassTest InterestedSrcs = fcNone;
1892 if (InterestedClasses & fcNan)
1893 InterestedSrcs |= fcNan;
1894 if (!ExponentKnownBits.isZero()) {
1895 if (InterestedClasses & fcInf)
1896 InterestedSrcs |= fcFinite | fcInf;
1897 if ((InterestedClasses & fcNegative) && !ExponentKnownBits.isEven())
1898 InterestedSrcs |= fcNegative;
1899 }
1900
1901 KnownFPClass KnownSrc;
1902 if (InterestedSrcs != fcNone) {
1903 Register Val = MI.getOperand(1).getReg();
1904 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc,
1905 Depth + 1);
1906 }
1907
1908 Known = KnownFPClass::powi(KnownSrc, ExponentKnownBits);
1909 break;
1910 }
1911 case TargetOpcode::G_FLDEXP: {
1912 Register Val = MI.getOperand(1).getReg();
1913 KnownFPClass KnownSrc;
1914 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1915 Depth + 1);
1916
1917 // Can refine inf/zero handling based on the exponent operand.
1918 const FPClassTest ExpInfoMask = fcZero | fcSubnormal | fcInf;
1919 KnownBits ExpBits;
1920 if ((KnownSrc.getKnownFPClasses() & ExpInfoMask) != fcNone) {
1921 Register ExpReg = MI.getOperand(2).getReg();
1922 LLT ExpTy = MRI.getType(ExpReg);
1923 ExpBits = getKnownBits(
1924 ExpReg, ExpTy.isVector() ? DemandedElts : APInt(1, 1), Depth + 1);
1925 }
1926
1927 LLT ScalarTy = DstTy.getScalarType();
1928 const fltSemantics &Flt = getFltSemanticForLLT(ScalarTy);
1929 DenormalMode Mode = MF->getDenormalMode(Flt);
1930 Known = KnownFPClass::ldexp(KnownSrc, ExpBits, Flt, Mode);
1931 break;
1932 }
1933 case TargetOpcode::G_FADD:
1934 case TargetOpcode::G_FSUB: {
1935 Register LHS = MI.getOperand(1).getReg();
1936 Register RHS = MI.getOperand(2).getReg();
1937 bool IsAdd = Opcode == TargetOpcode::G_FADD;
1938 bool WantNegative =
1939 IsAdd &&
1940 (InterestedClasses & KnownFPClass::OrderedLessThanZeroMask) != fcNone;
1941 bool WantNaN = (InterestedClasses & fcNan) != fcNone;
1942 bool WantNegZero = (InterestedClasses & fcNegZero) != fcNone;
1943
1944 if (!WantNaN && !WantNegative && !WantNegZero) {
1945 break;
1946 }
1947
1948 DenormalMode Mode =
1949 MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType()));
1950
1951 FPClassTest InterestedSrcs = InterestedClasses;
1952 if (WantNegative)
1953 InterestedSrcs |= KnownFPClass::OrderedLessThanZeroMask;
1954 if (InterestedClasses & fcNan)
1955 InterestedSrcs |= fcInf;
1956
1957 // Special case fadd x, x (canonical form of fmul x, 2).
1958 if (IsAdd && LHS == RHS && isGuaranteedNotToBeUndef(LHS, MRI, Depth + 1)) {
1959 KnownFPClass KnownSelf;
1960 computeKnownFPClass(LHS, DemandedElts, InterestedSrcs, KnownSelf,
1961 Depth + 1);
1962 Known = KnownFPClass::fadd_self(KnownSelf, Mode);
1963 break;
1964 }
1965
1966 KnownFPClass KnownLHS, KnownRHS;
1967 computeKnownFPClass(RHS, DemandedElts, InterestedSrcs, KnownRHS, Depth + 1);
1968
1969 if ((WantNaN && KnownRHS.isKnownNeverNaN()) ||
1970 (WantNegative && KnownRHS.cannotBeOrderedLessThanZero()) ||
1971 WantNegZero || !IsAdd) {
1972 // RHS is canonically cheaper to compute. Skip inspecting the LHS if
1973 // there's no point.
1974 computeKnownFPClass(LHS, DemandedElts, InterestedSrcs, KnownLHS,
1975 Depth + 1);
1976 }
1977
1978 if (IsAdd)
1979 Known = KnownFPClass::fadd(KnownLHS, KnownRHS, Mode);
1980 else
1981 Known = KnownFPClass::fsub(KnownLHS, KnownRHS, Mode);
1982 break;
1983 }
1984 case TargetOpcode::G_FMUL: {
1985 Register LHS = MI.getOperand(1).getReg();
1986 Register RHS = MI.getOperand(2).getReg();
1987 DenormalMode Mode =
1988 MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType()));
1989
1990 // X * X is always non-negative or a NaN (use square() for precision).
1991 if (LHS == RHS && isGuaranteedNotToBeUndef(LHS, MRI, Depth + 1)) {
1992 KnownFPClass KnownSrc;
1993 computeKnownFPClass(LHS, DemandedElts, fcAllFlags, KnownSrc, Depth + 1);
1994 Known = KnownFPClass::square(KnownSrc, Mode);
1995 } else {
1996 // If RHS is a scalar constant, use the more precise APFloat overload.
1997 auto RHSCst = GFConstant::getConstant(RHS, MRI);
1998 if (RHSCst && RHSCst->getKind() == GFConstant::GFConstantKind::Scalar) {
1999 KnownFPClass KnownLHS;
2000 computeKnownFPClass(LHS, DemandedElts, fcAllFlags, KnownLHS, Depth + 1);
2001 Known = KnownFPClass::fmul(KnownLHS, RHSCst->getScalarValue(), Mode);
2002 } else {
2003 KnownFPClass KnownLHS, KnownRHS;
2004 computeKnownFPClass(RHS, DemandedElts, fcAllFlags, KnownRHS, Depth + 1);
2005 computeKnownFPClass(LHS, DemandedElts, fcAllFlags, KnownLHS, Depth + 1);
2006 Known = KnownFPClass::fmul(KnownLHS, KnownRHS, Mode);
2007
2008 // If one operand is known |x| <= 1 and the other is finite, the
2009 // product cannot overflow to infinity.
2010 if (KnownLHS.isKnownNever(fcInf) && isAbsoluteValueULEOne(RHS, MRI))
2011 Known.knownNot(fcInf);
2012 else if (KnownRHS.isKnownNever(fcInf) &&
2014 Known.knownNot(fcInf);
2015 }
2016 }
2017 break;
2018 }
2019 case TargetOpcode::G_FDIV: {
2020 const bool WantNan = (InterestedClasses & fcNan) != fcNone;
2021
2022 Register LHS = MI.getOperand(1).getReg();
2023 Register RHS = MI.getOperand(2).getReg();
2024
2025 DenormalMode Mode =
2026 MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType()));
2027
2028 if (LHS == RHS && isGuaranteedNotToBeUndef(LHS, MRI, Depth + 1)) {
2029 // X / X is always exactly 1.0 or a NaN.
2030 Known.setKnownFPClasses(fcPosNormal | fcNan);
2031
2032 if (!WantNan)
2033 break;
2034
2035 KnownFPClass KnownSrc;
2036 computeKnownFPClass(LHS, DemandedElts,
2037 fcNan | fcInf | fcZero | fcSubnormal, KnownSrc,
2038 Depth + 1);
2039 Known = KnownFPClass::fdiv_self(KnownSrc, Mode);
2040 break;
2041 }
2042
2043 const bool WantNegative = (InterestedClasses & fcNegative) != fcNone;
2044 const bool WantPositive = (InterestedClasses & fcPositive) != fcNone;
2045 if (!WantNan && !WantNegative && !WantPositive)
2046 break;
2047
2048 KnownFPClass KnownLHS, KnownRHS;
2049 computeKnownFPClass(RHS, DemandedElts, fcAllFlags, KnownRHS, Depth + 1);
2050
2051 bool KnowSomethingUseful =
2052 KnownRHS.isKnownNever(fcSNan) ||
2055
2056 if (KnowSomethingUseful)
2057 computeKnownFPClass(LHS, DemandedElts, fcAllFlags, KnownLHS, Depth + 1);
2058
2059 Known = KnownFPClass::fdiv(KnownLHS, KnownRHS, Mode);
2060 break;
2061 }
2062 case TargetOpcode::G_FREM: {
2063 FPClassTest InterestedLHS = fcNone;
2064 FPClassTest InterestedRHS = fcNone;
2065
2066 // NaN is also generated for frem(Inf, x) and frem(x, 0.0).
2067 if (InterestedClasses & fcNan) {
2068 InterestedLHS |= fcNan | fcInf;
2069 InterestedRHS |= fcNan | fcZero | fcSubnormal;
2070 }
2071
2072 // The sign for frem is the same as the first operand.
2073 if (InterestedClasses & (fcPosNormal | fcPosSubnormal))
2074 InterestedLHS |= fcPosNormal | fcPosSubnormal;
2075 if (InterestedClasses & (fcNegNormal | fcNegSubnormal))
2076 InterestedLHS |= fcNegNormal | fcNegSubnormal;
2077
2078 // A negative zero result requires a negative finite first operand.
2079 if (InterestedClasses & fcNegZero)
2080 InterestedLHS |= fcNegFinite;
2081
2082 // A positive zero result can additionally come from a negative finite
2083 // result being flushed to positive zero.
2084 if (InterestedClasses & fcPosZero)
2085 InterestedLHS |= fcPosFinite | fcNegNormal | fcNegSubnormal;
2086
2087 Register LHS = MI.getOperand(1).getReg();
2088 Register RHS = MI.getOperand(2).getReg();
2089
2090 DenormalMode Mode =
2091 MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType()));
2092
2093 if (LHS == RHS && isGuaranteedNotToBeUndef(LHS, MRI, Depth + 1)) {
2094 // X % X is always exactly [+-]0.0 or a NaN.
2095 FPClassTest InterestedSrcs = InterestedLHS | InterestedRHS;
2096 KnownFPClass KnownSrc;
2097 if (InterestedSrcs != fcNone)
2098 computeKnownFPClass(LHS, DemandedElts, InterestedSrcs, KnownSrc,
2099 Depth + 1);
2100 Known = KnownFPClass::frem_self(KnownSrc, Mode);
2101 break;
2102 }
2103
2104 KnownFPClass KnownLHS;
2105 if (InterestedLHS != fcNone)
2106 computeKnownFPClass(LHS, DemandedElts, InterestedLHS, KnownLHS,
2107 Depth + 1);
2108
2109 KnownFPClass KnownRHS;
2110 // RHS is only useful for refining NaN classes.
2111 if (InterestedRHS != fcNone && KnownLHS.isKnownNever(fcSNan))
2112 computeKnownFPClass(RHS, DemandedElts, InterestedRHS, KnownRHS,
2113 Depth + 1);
2114
2115 Known = KnownFPClass::frem(KnownLHS, KnownRHS, Mode);
2116
2117 break;
2118 }
2119 case TargetOpcode::G_FFREXP: {
2120 // Only handle the mantissa output (operand 0); the exponent is an integer.
2121 if (R != MI.getOperand(0).getReg())
2122 break;
2123 Register Src = MI.getOperand(2).getReg();
2124 FPClassTest InterestedSrcs = InterestedClasses;
2125
2126 // Positive subnormals and negative subnormals could become positive zero.
2127 if (InterestedClasses & fcPosZero)
2128 InterestedSrcs |= fcSubnormal;
2129
2130 // Negative subnormals could become negative zero.
2131 if (InterestedClasses & fcNegZero)
2132 InterestedSrcs |= fcNegSubnormal;
2133
2134 if (InterestedClasses & fcPosNormal)
2135 InterestedSrcs |= fcPosSubnormal;
2136
2137 if (InterestedClasses & fcNegNormal)
2138 InterestedSrcs |= fcNegSubnormal;
2139
2140 KnownFPClass KnownSrc;
2141 computeKnownFPClass(Src, DemandedElts, InterestedSrcs, KnownSrc, Depth + 1);
2142 DenormalMode Mode =
2143 MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType()));
2144 Known = KnownFPClass::frexp_mant(KnownSrc, Mode);
2145 break;
2146 }
2147 case TargetOpcode::G_FPEXT: {
2148 Register Src = MI.getOperand(1).getReg();
2149 KnownFPClass KnownSrc;
2150 computeKnownFPClass(Src, DemandedElts, InterestedClasses, KnownSrc,
2151 Depth + 1);
2152
2153 LLT DstScalarTy = DstTy.getScalarType();
2154 const fltSemantics &DstSem = getFltSemanticForLLT(DstScalarTy);
2155 LLT SrcTy = MRI.getType(Src).getScalarType();
2156 const fltSemantics &SrcSem = getFltSemanticForLLT(SrcTy);
2157
2158 Known = KnownFPClass::fpext(KnownSrc, DstSem, SrcSem,
2159 MF->getDenormalMode(DstSem),
2160 MF->getDenormalMode(SrcSem));
2161 break;
2162 }
2163 case TargetOpcode::G_FPTRUNC:
2164 case TargetOpcode::G_INTRINSIC_FPTRUNC_ROUND: {
2165 computeKnownFPClassForFPTrunc(MI, DemandedElts, InterestedClasses, Known,
2166 Depth);
2167 break;
2168 }
2169 case TargetOpcode::G_SITOFP:
2170 case TargetOpcode::G_UITOFP: {
2171 // Cannot produce nan
2172 Known.knownNot(fcNan);
2173
2174 // Integers cannot be subnormal
2175 Known.knownNot(fcSubnormal);
2176
2177 // sitofp and uitofp turn into +0.0 for zero.
2178 Known.knownNot(fcNegZero);
2179
2180 // UIToFP is always non-negative regardless of known bits.
2181 if (Opcode == TargetOpcode::G_UITOFP)
2182 Known.signBitMustBeZero();
2183
2184 // Only compute known bits if we can learn something useful from them.
2185 if (!(InterestedClasses & (fcPosZero | fcNormal | fcInf)))
2186 break;
2187
2188 Register Val = MI.getOperand(1).getReg();
2189 LLT Ty = MRI.getType(Val);
2190 KnownBits IntKnown = getKnownBits(
2191 Val, Ty.isVector() ? DemandedElts : APInt(1, 1), Depth + 1);
2192
2193 // If the integer is non-zero, the result cannot be +0.0.
2194 if (IntKnown.isNonZero())
2195 Known.knownNot(fcPosZero);
2196
2197 if (Opcode == TargetOpcode::G_SITOFP) {
2198 // If the signed integer is known non-negative, the result is
2199 // non-negative. If the signed integer is known negative, the result is
2200 // negative.
2201 if (IntKnown.isNonNegative())
2202 Known.signBitMustBeZero();
2203 else if (IntKnown.isNegative())
2204 Known.signBitMustBeOne();
2205 }
2206
2207 if (InterestedClasses & fcInf) {
2208 LLT FPTy = DstTy.getScalarType();
2209 const fltSemantics &FltSem = getFltSemanticForLLT(FPTy);
2210
2211 // Compute the effective integer width after removing known-zero leading
2212 // bits, to check if the result can overflow to infinity.
2213 int IntSize = IntKnown.getBitWidth();
2214 if (Opcode == TargetOpcode::G_UITOFP)
2215 IntSize -= IntKnown.countMinLeadingZeros();
2216 else
2217 IntSize -= IntKnown.countMinSignBits();
2218
2219 // If the exponent of the largest finite FP value can hold the largest
2220 // integer, the result of the cast must be finite.
2221 if (ilogb(APFloat::getLargest(FltSem)) >= IntSize)
2222 Known.knownNot(fcInf);
2223 }
2224
2225 break;
2226 }
2227 // case TargetOpcode::G_MERGE_VALUES:
2228 case TargetOpcode::G_BUILD_VECTOR:
2229 case TargetOpcode::G_CONCAT_VECTORS: {
2230 GMergeLikeInstr &Merge = cast<GMergeLikeInstr>(MI);
2231
2232 if (!DstTy.isFixedVector())
2233 break;
2234
2235 bool First = true;
2236 for (unsigned Idx = 0; Idx < Merge.getNumSources(); ++Idx) {
2237 // We know the index we are inserting to, so clear it from Vec check.
2238 bool NeedsElt = DemandedElts[Idx];
2239
2240 // Do we demand the inserted element?
2241 if (NeedsElt) {
2242 Register Src = Merge.getSourceReg(Idx);
2243 if (First) {
2244 computeKnownFPClass(Src, Known, InterestedClasses, Depth + 1);
2245 First = false;
2246 } else {
2247 KnownFPClass Known2;
2248 computeKnownFPClass(Src, Known2, InterestedClasses, Depth + 1);
2249 Known |= Known2;
2250 }
2251
2252 // If we don't know any bits, early out.
2253 if (Known.isUnknown())
2254 break;
2255 }
2256 }
2257
2258 break;
2259 }
2260 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
2261 // Look through extract element. If the index is non-constant or
2262 // out-of-range demand all elements, otherwise just the extracted
2263 // element.
2264 GExtractVectorElement &Extract = cast<GExtractVectorElement>(MI);
2265 Register Vec = Extract.getVectorReg();
2266 Register Idx = Extract.getIndexReg();
2267
2268 auto CIdx = getIConstantVRegVal(Idx, MRI);
2269
2270 LLT VecTy = MRI.getType(Vec);
2271
2272 if (VecTy.isFixedVector()) {
2273 unsigned NumElts = VecTy.getNumElements();
2274 APInt DemandedVecElts = APInt::getAllOnes(NumElts);
2275 if (CIdx && CIdx->ult(NumElts))
2276 DemandedVecElts = APInt::getOneBitSet(NumElts, CIdx->getZExtValue());
2277 return computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known,
2278 Depth + 1);
2279 }
2280
2281 break;
2282 }
2283 case TargetOpcode::G_INSERT_VECTOR_ELT: {
2284 GInsertVectorElement &Insert = cast<GInsertVectorElement>(MI);
2285 Register Vec = Insert.getVectorReg();
2286 Register Elt = Insert.getElementReg();
2287 Register Idx = Insert.getIndexReg();
2288
2289 LLT VecTy = MRI.getType(Vec);
2290
2291 if (VecTy.isScalableVector())
2292 return;
2293
2294 auto CIdx = getIConstantVRegVal(Idx, MRI);
2295
2296 unsigned NumElts = DemandedElts.getBitWidth();
2297 APInt DemandedVecElts = DemandedElts;
2298 bool NeedsElt = true;
2299 // If we know the index we are inserting to, clear it from Vec check.
2300 if (CIdx && CIdx->ult(NumElts)) {
2301 DemandedVecElts.clearBit(CIdx->getZExtValue());
2302 NeedsElt = DemandedElts[CIdx->getZExtValue()];
2303 }
2304
2305 // Do we demand the inserted element?
2306 if (NeedsElt) {
2307 computeKnownFPClass(Elt, Known, InterestedClasses, Depth + 1);
2308 // If we don't know any bits, early out.
2309 if (Known.isUnknown())
2310 break;
2311 } else {
2313 }
2314
2315 // Do we need anymore elements from Vec?
2316 if (!DemandedVecElts.isZero()) {
2317 KnownFPClass Known2;
2318 computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known2,
2319 Depth + 1);
2320 Known |= Known2;
2321 }
2322
2323 break;
2324 }
2325 case TargetOpcode::G_SHUFFLE_VECTOR: {
2326 // For undef elements, we don't know anything about the common state of
2327 // the shuffle result.
2328 GShuffleVector &Shuf = cast<GShuffleVector>(MI);
2329 APInt DemandedLHS, DemandedRHS;
2330 if (DstTy.isScalableVector()) {
2331 assert(DemandedElts == APInt(1, 1));
2332 DemandedLHS = DemandedRHS = DemandedElts;
2333 } else {
2334 unsigned NumElts = MRI.getType(Shuf.getSrc1Reg()).getNumElements();
2335 if (!llvm::getShuffleDemandedElts(NumElts, Shuf.getMask(), DemandedElts,
2336 DemandedLHS, DemandedRHS)) {
2337 Known.resetAll();
2338 return;
2339 }
2340 }
2341
2342 if (!!DemandedLHS) {
2343 Register LHS = Shuf.getSrc1Reg();
2344 computeKnownFPClass(LHS, DemandedLHS, InterestedClasses, Known,
2345 Depth + 1);
2346
2347 // If we don't know any bits, early out.
2348 if (Known.isUnknown())
2349 break;
2350 } else {
2352 }
2353
2354 if (!!DemandedRHS) {
2355 KnownFPClass Known2;
2356 Register RHS = Shuf.getSrc2Reg();
2357 computeKnownFPClass(RHS, DemandedRHS, InterestedClasses, Known2,
2358 Depth + 1);
2359 Known |= Known2;
2360 }
2361 break;
2362 }
2363 case TargetOpcode::G_PHI: {
2364 // Cap PHI recursion below the global limit to avoid spending the entire
2365 // budget chasing loop back-edges (matches ValueTracking's
2366 // PhiRecursionLimit).
2368 break;
2369 // PHI's operands are a mix of registers and basic blocks interleaved.
2370 // We only care about the register ones.
2371 bool First = true;
2372 for (unsigned Idx = 1; Idx < MI.getNumOperands(); Idx += 2) {
2373 const MachineOperand &Src = MI.getOperand(Idx);
2374 Register SrcReg = Src.getReg();
2375 if (First) {
2376 computeKnownFPClass(SrcReg, DemandedElts, InterestedClasses, Known,
2377 Depth + 1);
2378 First = false;
2379 } else {
2380 KnownFPClass Known2;
2381 computeKnownFPClass(SrcReg, DemandedElts, InterestedClasses, Known2,
2382 Depth + 1);
2383 Known = Known.intersectWith(Known2);
2384 }
2385 if (Known.isUnknown())
2386 break;
2387 }
2388 break;
2389 }
2390 case TargetOpcode::G_FREEZE: {
2391 Register Src = MI.getOperand(1).getReg();
2392 if (isGuaranteedNotToBeUndefOrPoison(Src, MRI, Depth + 1)) {
2393 computeKnownFPClass(Src, DemandedElts, InterestedClasses, Known,
2394 Depth + 1);
2395 }
2396 break;
2397 }
2398 case TargetOpcode::COPY: {
2399 Register Src = MI.getOperand(1).getReg();
2400
2401 if (!Src.isVirtual())
2402 return;
2403
2404 computeKnownFPClass(Src, DemandedElts, InterestedClasses, Known, Depth + 1);
2405 break;
2406 }
2407 }
2408}
2409
2411GISelValueTracking::computeKnownFPClass(Register R, const APInt &DemandedElts,
2412 FPClassTest InterestedClasses,
2413 unsigned Depth) {
2414 KnownFPClass KnownClasses;
2415 computeKnownFPClass(R, DemandedElts, InterestedClasses, KnownClasses, Depth);
2416 return KnownClasses;
2417}
2418
2419KnownFPClass GISelValueTracking::computeKnownFPClass(
2420 Register R, FPClassTest InterestedClasses, unsigned Depth) {
2422 computeKnownFPClass(R, Known, InterestedClasses, Depth);
2423 return Known;
2424}
2425
2426KnownFPClass GISelValueTracking::computeKnownFPClass(
2427 Register R, const APInt &DemandedElts, uint32_t Flags,
2428 FPClassTest InterestedClasses, unsigned Depth) {
2430 InterestedClasses &= ~fcNan;
2432 InterestedClasses &= ~fcInf;
2433
2434 KnownFPClass Result =
2435 computeKnownFPClass(R, DemandedElts, InterestedClasses, Depth);
2436
2438 Result.setKnownFPClasses(Result.getKnownFPClasses() & ~fcNan);
2440 Result.setKnownFPClasses(Result.getKnownFPClasses() & ~fcInf);
2441 return Result;
2442}
2443
2444KnownFPClass GISelValueTracking::computeKnownFPClass(
2445 Register R, uint32_t Flags, FPClassTest InterestedClasses, unsigned Depth) {
2446 LLT Ty = MRI.getType(R);
2447 APInt DemandedElts =
2448 Ty.isFixedVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1);
2449 return computeKnownFPClass(R, DemandedElts, Flags, InterestedClasses, Depth);
2450}
2451
2453 const MachineInstr *DefMI = MRI.getVRegDef(Val);
2454 if (!DefMI)
2455 return false;
2456
2457 if (DefMI->getFlag(MachineInstr::FmNoNans))
2458 return true;
2459
2460 // IEEE 754 arithmetic operations always quiet signaling NaNs. Short-circuit
2461 // the value-tracking analysis for the SNaN-only case: if the defining op is
2462 // known to quiet sNaN, the output can never be an sNaN.
2463 if (SNaN) {
2464 switch (DefMI->getOpcode()) {
2465 default:
2466 break;
2467 case TargetOpcode::G_FADD:
2468 case TargetOpcode::G_STRICT_FADD:
2469 case TargetOpcode::G_FSUB:
2470 case TargetOpcode::G_STRICT_FSUB:
2471 case TargetOpcode::G_FMUL:
2472 case TargetOpcode::G_STRICT_FMUL:
2473 case TargetOpcode::G_FDIV:
2474 case TargetOpcode::G_FREM:
2475 case TargetOpcode::G_FMA:
2476 case TargetOpcode::G_STRICT_FMA:
2477 case TargetOpcode::G_FMAD:
2478 case TargetOpcode::G_FSQRT:
2479 case TargetOpcode::G_STRICT_FSQRT:
2480 // Note: G_FABS and G_FNEG are bit-manipulation ops that preserve sNaN
2481 // exactly (LLVM LangRef: "never change anything except possibly the sign
2482 // bit"). They must NOT be listed here.
2483 case TargetOpcode::G_FSIN:
2484 case TargetOpcode::G_FCOS:
2485 case TargetOpcode::G_FSINCOS:
2486 case TargetOpcode::G_FTAN:
2487 case TargetOpcode::G_FASIN:
2488 case TargetOpcode::G_FACOS:
2489 case TargetOpcode::G_FATAN:
2490 case TargetOpcode::G_FATAN2:
2491 case TargetOpcode::G_FSINH:
2492 case TargetOpcode::G_FCOSH:
2493 case TargetOpcode::G_FTANH:
2494 case TargetOpcode::G_FEXP:
2495 case TargetOpcode::G_FEXP2:
2496 case TargetOpcode::G_FEXP10:
2497 case TargetOpcode::G_FLOG:
2498 case TargetOpcode::G_FLOG2:
2499 case TargetOpcode::G_FLOG10:
2500 case TargetOpcode::G_FPOW:
2501 case TargetOpcode::G_FPOWI:
2502 case TargetOpcode::G_FLDEXP:
2503 case TargetOpcode::G_STRICT_FLDEXP:
2504 case TargetOpcode::G_FFREXP:
2505 case TargetOpcode::G_INTRINSIC_TRUNC:
2506 case TargetOpcode::G_INTRINSIC_ROUND:
2507 case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
2508 case TargetOpcode::G_FFLOOR:
2509 case TargetOpcode::G_FCEIL:
2510 case TargetOpcode::G_FRINT:
2511 case TargetOpcode::G_FNEARBYINT:
2512 case TargetOpcode::G_FPEXT:
2513 case TargetOpcode::G_FPTRUNC:
2514 case TargetOpcode::G_FCANONICALIZE:
2515 case TargetOpcode::G_FMINNUM:
2516 case TargetOpcode::G_FMAXNUM:
2517 case TargetOpcode::G_FMINNUM_IEEE:
2518 case TargetOpcode::G_FMAXNUM_IEEE:
2519 case TargetOpcode::G_FMINIMUM:
2520 case TargetOpcode::G_FMAXIMUM:
2521 case TargetOpcode::G_FMINIMUMNUM:
2522 case TargetOpcode::G_FMAXIMUMNUM:
2523 return true;
2524 }
2525 }
2526
2527 KnownFPClass FPClass = computeKnownFPClass(Val, SNaN ? fcSNan : fcNan);
2528
2529 if (SNaN)
2530 return FPClass.isKnownNever(fcSNan);
2531
2532 return FPClass.isKnownNeverNaN();
2533}
2534
2536 KnownFPClass Known = computeKnownFPClass(Val, fcZero | fcSubnormal, Depth);
2537 LLT Ty = MRI.getType(Val).getScalarType();
2538 return Known.isKnownNeverLogicalZero(
2539 MF.getDenormalMode(getFltSemanticForLLT(Ty)));
2540}
2541
2542/// Compute number of sign bits for the intersection of \p Src0 and \p Src1
2543unsigned GISelValueTracking::computeNumSignBitsMin(Register Src0, Register Src1,
2544 const APInt &DemandedElts,
2545 unsigned Depth) {
2546 // Test src1 first, since we canonicalize simpler expressions to the RHS.
2547 unsigned Src1SignBits = computeNumSignBits(Src1, DemandedElts, Depth);
2548 if (Src1SignBits == 1)
2549 return 1;
2550 return std::min(computeNumSignBits(Src0, DemandedElts, Depth), Src1SignBits);
2551}
2552
2553/// Compute the known number of sign bits with attached range metadata in the
2554/// memory operand. If this is an extending load, accounts for the behavior of
2555/// the high bits.
2557 unsigned TyBits) {
2558 const MDNode *Ranges = Ld->getRanges();
2559 if (!Ranges)
2560 return 1;
2561
2563 if (TyBits > CR.getBitWidth()) {
2564 switch (Ld->getOpcode()) {
2565 case TargetOpcode::G_SEXTLOAD:
2566 CR = CR.signExtend(TyBits);
2567 break;
2568 case TargetOpcode::G_ZEXTLOAD:
2569 CR = CR.zeroExtend(TyBits);
2570 break;
2571 default:
2572 break;
2573 }
2574 }
2575
2576 return std::min(CR.getSignedMin().getNumSignBits(),
2578}
2579
2581 const APInt &DemandedElts,
2582 unsigned Depth) {
2583 MachineInstr &MI = *MRI.getVRegDef(R);
2584 unsigned Opcode = MI.getOpcode();
2585
2586 if (Opcode == TargetOpcode::G_CONSTANT)
2587 return MI.getOperand(1).getCImm()->getValue().getNumSignBits();
2588
2589 if (Depth == getMaxDepth())
2590 return 1;
2591
2592 if (!DemandedElts)
2593 return 1; // No demanded elts, better to assume we don't know anything.
2594
2595 LLT DstTy = MRI.getType(R);
2596 const unsigned TyBits = DstTy.getScalarSizeInBits();
2597
2598 // Handle the case where this is called on a register that does not have a
2599 // type constraint. This is unlikely to occur except by looking through copies
2600 // but it is possible for the initial register being queried to be in this
2601 // state.
2602 if (!DstTy.isValid())
2603 return 1;
2604
2605 unsigned FirstAnswer = 1;
2606 switch (Opcode) {
2607 case TargetOpcode::COPY: {
2608 MachineOperand &Src = MI.getOperand(1);
2609 if (Src.getReg().isVirtual() && Src.getSubReg() == 0 &&
2610 MRI.getType(Src.getReg()).isValid()) {
2611 // Don't increment Depth for this one since we didn't do any work.
2612 return computeNumSignBits(Src.getReg(), DemandedElts, Depth);
2613 }
2614
2615 return 1;
2616 }
2617 case TargetOpcode::G_FREEZE: {
2618 Register Src = MI.getOperand(1).getReg();
2619 if (isGuaranteedNotToBeUndefOrPoison(Src, MRI, Depth + 1))
2620 return computeNumSignBits(Src, DemandedElts, Depth + 1);
2621 break;
2622 }
2623 case TargetOpcode::G_SEXT: {
2624 Register Src = MI.getOperand(1).getReg();
2625 LLT SrcTy = MRI.getType(Src);
2626 unsigned Tmp = TyBits - SrcTy.getScalarSizeInBits();
2627 return computeNumSignBits(Src, DemandedElts, Depth + 1) + Tmp;
2628 }
2629 case TargetOpcode::G_ASSERT_SEXT:
2630 case TargetOpcode::G_SEXT_INREG: {
2631 // Max of the input and what this extends.
2632 Register Src = MI.getOperand(1).getReg();
2633 unsigned SrcBits = MI.getOperand(2).getImm();
2634 unsigned InRegBits = TyBits - SrcBits + 1;
2635 return std::max(computeNumSignBits(Src, DemandedElts, Depth + 1),
2636 InRegBits);
2637 }
2638 case TargetOpcode::G_LOAD: {
2639 GLoad *Ld = cast<GLoad>(&MI);
2640 if (DemandedElts != 1 || !getDataLayout().isLittleEndian())
2641 break;
2642
2643 return computeNumSignBitsFromRangeMetadata(Ld, TyBits);
2644 }
2645 case TargetOpcode::G_SEXTLOAD: {
2647
2648 // FIXME: We need an in-memory type representation.
2649 if (DstTy.isVector())
2650 return 1;
2651
2652 unsigned NumBits = computeNumSignBitsFromRangeMetadata(Ld, TyBits);
2653 if (NumBits != 1)
2654 return NumBits;
2655
2656 // e.g. i16->i32 = '17' bits known.
2657 const MachineMemOperand *MMO = *MI.memoperands_begin();
2658 return TyBits - MMO->getSizeInBits().getValue() + 1;
2659 }
2660 case TargetOpcode::G_ZEXTLOAD: {
2662
2663 // FIXME: We need an in-memory type representation.
2664 if (DstTy.isVector())
2665 return 1;
2666
2667 unsigned NumBits = computeNumSignBitsFromRangeMetadata(Ld, TyBits);
2668 if (NumBits != 1)
2669 return NumBits;
2670
2671 // e.g. i16->i32 = '16' bits known.
2672 const MachineMemOperand *MMO = *MI.memoperands_begin();
2673 return TyBits - MMO->getSizeInBits().getValue();
2674 }
2675 case TargetOpcode::G_AND:
2676 case TargetOpcode::G_OR:
2677 case TargetOpcode::G_XOR: {
2678 Register Src1 = MI.getOperand(1).getReg();
2679 unsigned Src1NumSignBits =
2680 computeNumSignBits(Src1, DemandedElts, Depth + 1);
2681 if (Src1NumSignBits != 1) {
2682 Register Src2 = MI.getOperand(2).getReg();
2683 unsigned Src2NumSignBits =
2684 computeNumSignBits(Src2, DemandedElts, Depth + 1);
2685 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits);
2686 }
2687 break;
2688 }
2689 case TargetOpcode::G_ASHR: {
2690 Register Src1 = MI.getOperand(1).getReg();
2691 Register Src2 = MI.getOperand(2).getReg();
2692 FirstAnswer = computeNumSignBits(Src1, DemandedElts, Depth + 1);
2693 if (auto C = getValidMinimumShiftAmount(Src2, DemandedElts, Depth + 1))
2694 FirstAnswer = std::min<uint64_t>(FirstAnswer + *C, TyBits);
2695 break;
2696 }
2697 case TargetOpcode::G_SHL: {
2698 Register Src1 = MI.getOperand(1).getReg();
2699 Register Src2 = MI.getOperand(2).getReg();
2700 if (std::optional<ConstantRange> ShAmtRange =
2701 getValidShiftAmountRange(Src2, DemandedElts, Depth + 1)) {
2702 uint64_t MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
2703 uint64_t MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
2704
2705 MachineInstr &ExtMI = *MRI.getVRegDef(Src1);
2706 unsigned ExtOpc = ExtMI.getOpcode();
2707
2708 // Try to look through ZERO/SIGN/ANY_EXTEND. If all extended bits are
2709 // shifted out, then we can compute the number of sign bits for the
2710 // operand being extended. A future improvement could be to pass along the
2711 // "shifted left by" information in the recursive calls to
2712 // ComputeKnownSignBits. Allowing us to handle this more generically.
2713 if (ExtOpc == TargetOpcode::G_SEXT || ExtOpc == TargetOpcode::G_ZEXT ||
2714 ExtOpc == TargetOpcode::G_ANYEXT) {
2715 LLT ExtTy = MRI.getType(Src1);
2716 Register Extendee = ExtMI.getOperand(1).getReg();
2717 LLT ExtendeeTy = MRI.getType(Extendee);
2718 uint64_t SizeDiff =
2719 ExtTy.getScalarSizeInBits() - ExtendeeTy.getScalarSizeInBits();
2720
2721 if (SizeDiff <= MinShAmt) {
2722 unsigned Tmp =
2723 SizeDiff + computeNumSignBits(Extendee, DemandedElts, Depth + 1);
2724 if (MaxShAmt < Tmp)
2725 return Tmp - MaxShAmt;
2726 }
2727 }
2728 // shl destroys sign bits, ensure it doesn't shift out all sign bits.
2729 unsigned Tmp = computeNumSignBits(Src1, DemandedElts, Depth + 1);
2730 if (MaxShAmt < Tmp)
2731 return Tmp - MaxShAmt;
2732 }
2733 break;
2734 }
2735 case TargetOpcode::G_ROTL:
2736 case TargetOpcode::G_ROTR: {
2737 Register SrcReg = MI.getOperand(1).getReg();
2738 unsigned Tmp = computeNumSignBits(SrcReg, DemandedElts, Depth + 1);
2739 auto MaybeAmt =
2740 isConstantOrConstantSplatVector(MI.getOperand(2).getReg(), MRI);
2741 FirstAnswer =
2742 SignBitsOps::rot(Tmp, TyBits, MaybeAmt, Opcode == TargetOpcode::G_ROTR);
2743 break;
2744 }
2745 case TargetOpcode::G_SAVGFLOOR:
2746 case TargetOpcode::G_SAVGCEIL: {
2747 Register Src1 = MI.getOperand(1).getReg();
2748 Register Src2 = MI.getOperand(2).getReg();
2749 FirstAnswer = computeNumSignBitsMin(Src1, Src2, DemandedElts, Depth + 1);
2750 break;
2751 }
2752 case TargetOpcode::G_SREM: {
2753 // The sign bit is the LHS's sign bit, except when the result of the
2754 // remainder is zero. The magnitude of the result should be less than or
2755 // equal to the magnitude of the LHS. Therefore, the result should have
2756 // at least as many sign bits as the left hand side.
2757 Register Src = MI.getOperand(1).getReg();
2758 return computeNumSignBits(Src, DemandedElts, Depth + 1);
2759 }
2760 case TargetOpcode::G_TRUNC: {
2761 Register Src = MI.getOperand(1).getReg();
2762 LLT SrcTy = MRI.getType(Src);
2763
2764 // Check if the sign bits of source go down as far as the truncated value.
2765 unsigned NumSrcBits = SrcTy.getScalarSizeInBits();
2766 unsigned NumSrcSignBits = computeNumSignBits(Src, DemandedElts, Depth + 1);
2767 if (NumSrcSignBits > (NumSrcBits - TyBits))
2768 return NumSrcSignBits - (NumSrcBits - TyBits);
2769 break;
2770 }
2771 case TargetOpcode::G_SELECT: {
2772 return computeNumSignBitsMin(MI.getOperand(2).getReg(),
2773 MI.getOperand(3).getReg(), DemandedElts,
2774 Depth + 1);
2775 }
2776 case TargetOpcode::G_SMIN:
2777 case TargetOpcode::G_SMAX:
2778 case TargetOpcode::G_UMIN:
2779 case TargetOpcode::G_UMAX:
2780 // TODO: Handle clamp pattern with number of sign bits for SMIN/SMAX.
2781 return computeNumSignBitsMin(MI.getOperand(1).getReg(),
2782 MI.getOperand(2).getReg(), DemandedElts,
2783 Depth + 1);
2784 case TargetOpcode::G_SADDO:
2785 case TargetOpcode::G_SADDE:
2786 case TargetOpcode::G_UADDO:
2787 case TargetOpcode::G_UADDE:
2788 case TargetOpcode::G_SSUBO:
2789 case TargetOpcode::G_SSUBE:
2790 case TargetOpcode::G_USUBO:
2791 case TargetOpcode::G_USUBE:
2792 case TargetOpcode::G_SMULO:
2793 case TargetOpcode::G_UMULO: {
2794 // If compares returns 0/-1, all bits are sign bits.
2795 // We know that we have an integer-based boolean since these operations
2796 // are only available for integer.
2797 if (MI.getOperand(1).getReg() == R) {
2798 if (TL.getBooleanContents(DstTy.isVector(), false) ==
2800 return TyBits;
2801 }
2802
2803 break;
2804 }
2805 case TargetOpcode::G_SUB: {
2806 Register Src2 = MI.getOperand(2).getReg();
2807 unsigned Src2NumSignBits =
2808 computeNumSignBits(Src2, DemandedElts, Depth + 1);
2809 if (Src2NumSignBits == 1)
2810 return 1; // Early out.
2811
2812 // Handle NEG.
2813 Register Src1 = MI.getOperand(1).getReg();
2814 KnownBits Known1 = getKnownBits(Src1, DemandedElts, Depth);
2815 if (Known1.isZero()) {
2816 KnownBits Known2 = getKnownBits(Src2, DemandedElts, Depth);
2817 // If the input is known to be 0 or 1, the output is 0/-1, which is all
2818 // sign bits set.
2819 if ((Known2.Zero | 1).isAllOnes())
2820 return TyBits;
2821
2822 // If the input is known to be positive (the sign bit is known clear),
2823 // the output of the NEG has, at worst, the same number of sign bits as
2824 // the input.
2825 if (Known2.isNonNegative()) {
2826 FirstAnswer = Src2NumSignBits;
2827 break;
2828 }
2829
2830 // Otherwise, we treat this like a SUB.
2831 }
2832
2833 unsigned Src1NumSignBits =
2834 computeNumSignBits(Src1, DemandedElts, Depth + 1);
2835 if (Src1NumSignBits == 1)
2836 return 1; // Early Out.
2837
2838 // Sub can have at most one carry bit. Thus we know that the output
2839 // is, at worst, one more bit than the inputs.
2840 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2841 break;
2842 }
2843 case TargetOpcode::G_ADD: {
2844 Register Src2 = MI.getOperand(2).getReg();
2845 unsigned Src2NumSignBits =
2846 computeNumSignBits(Src2, DemandedElts, Depth + 1);
2847 if (Src2NumSignBits <= 2)
2848 return 1; // Early out.
2849
2850 Register Src1 = MI.getOperand(1).getReg();
2851 unsigned Src1NumSignBits =
2852 computeNumSignBits(Src1, DemandedElts, Depth + 1);
2853 if (Src1NumSignBits == 1)
2854 return 1; // Early Out.
2855
2856 // Special case decrementing a value (ADD X, -1):
2857 KnownBits Known2 = getKnownBits(Src2, DemandedElts, Depth);
2858 if (Known2.isAllOnes()) {
2859 KnownBits Known1 = getKnownBits(Src1, DemandedElts, Depth);
2860 // If the input is known to be 0 or 1, the output is 0/-1, which is all
2861 // sign bits set.
2862 if ((Known1.Zero | 1).isAllOnes())
2863 return TyBits;
2864
2865 // If we are subtracting one from a positive number, there is no carry
2866 // out of the result.
2867 if (Known1.isNonNegative()) {
2868 FirstAnswer = Src1NumSignBits;
2869 break;
2870 }
2871
2872 // Otherwise, we treat this like an ADD.
2873 }
2874
2875 // Add can have at most one carry bit. Thus we know that the output
2876 // is, at worst, one more bit than the inputs.
2877 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2878 break;
2879 }
2880 case TargetOpcode::G_MUL: {
2881 unsigned Src2NumSignBits =
2882 computeNumSignBits(MI.getOperand(2).getReg(), DemandedElts, Depth + 1);
2883 if (Src2NumSignBits == 1)
2884 break;
2885 unsigned Src1NumSignBits =
2886 computeNumSignBits(MI.getOperand(1).getReg(), DemandedElts, Depth + 1);
2887 if (Src1NumSignBits == 1)
2888 break;
2889
2890 // The product needs at most the sum of the operands' signed widths.
2891 unsigned OutValidBits =
2892 (TyBits - Src1NumSignBits + 1) + (TyBits - Src2NumSignBits + 1);
2893 if (OutValidBits <= TyBits)
2894 FirstAnswer = TyBits - OutValidBits + 1;
2895 break;
2896 }
2897 case TargetOpcode::G_FCMP:
2898 case TargetOpcode::G_ICMP: {
2899 bool IsFP = Opcode == TargetOpcode::G_FCMP;
2900 if (TyBits == 1)
2901 break;
2902 auto BC = TL.getBooleanContents(DstTy.isVector(), IsFP);
2904 return TyBits; // All bits are sign bits.
2906 return TyBits - 1; // Every always-zero bit is a sign bit.
2907 break;
2908 }
2909 case TargetOpcode::G_UNMERGE_VALUES: {
2910 unsigned NumOps = MI.getNumOperands();
2911 Register SrcReg = MI.getOperand(NumOps - 1).getReg();
2912 LLT SrcTy = MRI.getType(SrcReg);
2913
2914 if ((SrcTy.isVector() && SrcTy.getScalarType() != DstTy.getScalarType()) ||
2915 (SrcTy.isScalar() && DstTy.isVector()))
2916 break;
2917
2918 // Figure out the result operand index
2919 unsigned DstIdx = MI.findRegisterDefOperandIdx(R, nullptr);
2920
2921 APInt SubDemandedElts = DemandedElts;
2922 unsigned DstLanes = DstTy.isVector() ? DstTy.getNumElements() : 1;
2923 if (SrcTy.isVector()) {
2924 SubDemandedElts =
2925 DemandedElts.zext(SrcTy.getNumElements()).shl(DstIdx * DstLanes);
2926 }
2927
2928 unsigned SrcOpKnown =
2929 computeNumSignBits(SrcReg, SubDemandedElts, Depth + 1);
2930 if (SrcTy.isVector()) {
2931 FirstAnswer = SrcOpKnown;
2932 } else if (SrcOpKnown >= (MI.getNumOperands() - DstIdx - 2) * TyBits) {
2933 FirstAnswer = SrcOpKnown >= (MI.getNumOperands() - DstIdx - 1) * TyBits
2934 ? TyBits
2935 : SrcOpKnown % TyBits;
2936 }
2937 break;
2938 }
2939 case TargetOpcode::G_BUILD_VECTOR: {
2940 // Collect the known bits that are shared by every demanded vector element.
2941 FirstAnswer = TyBits;
2942 APInt SingleDemandedElt(1, 1);
2943 for (const auto &[I, MO] : enumerate(drop_begin(MI.operands()))) {
2944 if (!DemandedElts[I])
2945 continue;
2946
2947 unsigned Tmp2 =
2948 computeNumSignBits(MO.getReg(), SingleDemandedElt, Depth + 1);
2949 FirstAnswer = std::min(FirstAnswer, Tmp2);
2950
2951 // If we don't know any bits, early out.
2952 if (FirstAnswer == 1)
2953 break;
2954 }
2955 break;
2956 }
2957 case TargetOpcode::G_CONCAT_VECTORS: {
2958 if (MRI.getType(MI.getOperand(0).getReg()).isScalableVector())
2959 break;
2960 FirstAnswer = TyBits;
2961 // Determine the minimum number of sign bits across all demanded
2962 // elts of the input vectors. Early out if the result is already 1.
2963 unsigned NumSubVectorElts =
2964 MRI.getType(MI.getOperand(1).getReg()).getNumElements();
2965 for (const auto &[I, MO] : enumerate(drop_begin(MI.operands()))) {
2966 APInt DemandedSub =
2967 DemandedElts.extractBits(NumSubVectorElts, I * NumSubVectorElts);
2968 if (!DemandedSub)
2969 continue;
2970 unsigned Tmp2 = computeNumSignBits(MO.getReg(), DemandedSub, Depth + 1);
2971
2972 FirstAnswer = std::min(FirstAnswer, Tmp2);
2973
2974 // If we don't know any bits, early out.
2975 if (FirstAnswer == 1)
2976 break;
2977 }
2978 break;
2979 }
2980 case TargetOpcode::G_VECTOR_COMPRESS: {
2981 // Each result lane is either a lane of the source vector or the passthru,
2982 // so the number of sign bits is the minimum of the two.
2983 Register Vec = MI.getOperand(1).getReg();
2984 Register PassThru = MI.getOperand(3).getReg();
2985 unsigned Tmp = computeNumSignBits(PassThru, DemandedElts, Depth + 1);
2986 // If passthru contributes nothing, fall back to the KnownBits refinement.
2987 if (Tmp == 1)
2988 break;
2989 // Compression can move any source lane to any result position, so all
2990 // source lanes are demanded.
2991 APInt DemandedSrcElts = APInt::getAllOnes(DemandedElts.getBitWidth());
2992 unsigned Tmp2 = computeNumSignBits(Vec, DemandedSrcElts, Depth + 1);
2993 FirstAnswer = std::min(Tmp, Tmp2);
2994 break;
2995 }
2996 case TargetOpcode::G_INSERT_VECTOR_ELT: {
2998 Register InVec = Insert.getVectorReg();
2999 Register InVal = Insert.getElementReg();
3000 LLT VecVT = MRI.getType(InVec);
3001
3002 // If we know the element index, split the demand between the inserted
3003 // value and the source vector, otherwise assume we need both. Scalable
3004 // vectors carry no per-lane demand, so they always take the minimum of the
3005 // whole vector and the inserted value.
3006 bool DemandedVal = true;
3007 APInt DemandedVecElts = DemandedElts;
3008 if (!VecVT.isScalableVector()) {
3009 unsigned NumElts = VecVT.getNumElements();
3010 auto ConstEltNo = getIConstantVRegVal(Insert.getIndexReg(), MRI);
3011 if (ConstEltNo && ConstEltNo->ult(NumElts)) {
3012 unsigned EltIdx = ConstEltNo->getZExtValue();
3013 DemandedVal = !!DemandedElts[EltIdx];
3014 DemandedVecElts.clearBit(EltIdx);
3015 }
3016 }
3017
3018 unsigned Tmp = TyBits;
3019 if (DemandedVal) {
3020 // TODO: Handle implicit truncation of inserted elements.
3021 if (MRI.getType(InVal).getSizeInBits() != TyBits)
3022 break;
3023 unsigned ValSignBits = computeNumSignBits(InVal, APInt(1, 1), Depth + 1);
3024 Tmp = std::min(Tmp, ValSignBits);
3025 }
3026 if (!!DemandedVecElts) {
3027 unsigned VecSignBits =
3028 computeNumSignBits(InVec, DemandedVecElts, Depth + 1);
3029 Tmp = std::min(Tmp, VecSignBits);
3030 }
3031 return Tmp;
3032 }
3033 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
3035 Register InVec = Extract.getVectorReg();
3036 Register EltNo = Extract.getIndexReg();
3037 LLT VecVT = MRI.getType(InVec);
3038 if (VecVT.isScalableVector())
3039 return computeNumSignBits(InVec, APInt(1, 1), Depth + 1);
3040 unsigned NumSrcElts = VecVT.getNumElements();
3041 std::optional<APInt> ConstEltNo = getIConstantVRegVal(EltNo, MRI);
3042 APInt DemandedSrcElts =
3043 ConstEltNo && ConstEltNo->ult(NumSrcElts)
3044 ? APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue())
3045 : APInt::getAllOnes(NumSrcElts);
3046 return computeNumSignBits(InVec, DemandedSrcElts, Depth + 1);
3047 }
3048 case TargetOpcode::G_EXTRACT_SUBVECTOR: {
3049 // Offset the demanded elts by the subvector index.
3050 Register SrcReg = MI.getOperand(1).getReg();
3051 LLT SrcTy = MRI.getType(SrcReg);
3052 APInt DemandedSrcElts;
3053 if (SrcTy.isScalableVector()) {
3054 DemandedSrcElts = APInt(1, 1);
3055 } else {
3056 uint64_t Idx = MI.getOperand(2).getImm();
3057 unsigned NumSrcElts = SrcTy.getNumElements();
3058 DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3059 }
3060 return computeNumSignBits(SrcReg, DemandedSrcElts, Depth + 1);
3061 }
3062 case TargetOpcode::G_SHUFFLE_VECTOR: {
3063 // Collect the minimum number of sign bits that are shared by every vector
3064 // element referenced by the shuffle.
3065 APInt DemandedLHS, DemandedRHS;
3066 Register Src1 = MI.getOperand(1).getReg();
3067 unsigned NumElts = MRI.getType(Src1).getNumElements();
3068 if (!getShuffleDemandedElts(NumElts, MI.getOperand(3).getShuffleMask(),
3069 DemandedElts, DemandedLHS, DemandedRHS))
3070 return 1;
3071
3072 if (!!DemandedLHS)
3073 FirstAnswer = computeNumSignBits(Src1, DemandedLHS, Depth + 1);
3074 // If we don't know anything, early out and try computeKnownBits fall-back.
3075 if (FirstAnswer == 1)
3076 break;
3077 if (!!DemandedRHS) {
3078 unsigned Tmp2 =
3079 computeNumSignBits(MI.getOperand(2).getReg(), DemandedRHS, Depth + 1);
3080 FirstAnswer = std::min(FirstAnswer, Tmp2);
3081 }
3082 break;
3083 }
3084 case TargetOpcode::G_SPLAT_VECTOR: {
3085 // Check if the sign bits of source go down as far as the truncated value.
3086 Register Src = MI.getOperand(1).getReg();
3087 unsigned NumSrcSignBits = computeNumSignBits(Src, APInt(1, 1), Depth + 1);
3088 unsigned NumSrcBits = MRI.getType(Src).getSizeInBits();
3089 if (NumSrcSignBits > (NumSrcBits - TyBits))
3090 return NumSrcSignBits - (NumSrcBits - TyBits);
3091 break;
3092 }
3093 case TargetOpcode::G_INTRINSIC:
3094 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
3095 case TargetOpcode::G_INTRINSIC_CONVERGENT:
3096 case TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS:
3097 default: {
3098 unsigned NumBits =
3099 TL.computeNumSignBitsForTargetInstr(*this, R, DemandedElts, MRI, Depth);
3100 if (NumBits > 1)
3101 FirstAnswer = std::max(FirstAnswer, NumBits);
3102 break;
3103 }
3104 }
3105
3106 // Finally, if we can prove that the top bits of the result are 0's or 1's,
3107 // use this information.
3108 KnownBits Known = getKnownBits(R, DemandedElts, Depth);
3109 return std::max(FirstAnswer, Known.countMinSignBits());
3110}
3111
3113 LLT Ty = MRI.getType(R);
3114 APInt DemandedElts =
3115 Ty.isFixedVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1);
3116 return computeNumSignBits(R, DemandedElts, Depth);
3117}
3118
3120 Register R, const APInt &DemandedElts, unsigned Depth) {
3121 // Shifting more than the bitwidth is not valid.
3122 MachineInstr &MI = *MRI.getVRegDef(R);
3123 unsigned Opcode = MI.getOpcode();
3124
3125 LLT Ty = MRI.getType(R);
3126 unsigned BitWidth = Ty.getScalarSizeInBits();
3127
3128 if (Opcode == TargetOpcode::G_CONSTANT) {
3129 const APInt &ShAmt = MI.getOperand(1).getCImm()->getValue();
3130 if (ShAmt.uge(BitWidth))
3131 return std::nullopt;
3132 return ConstantRange(ShAmt);
3133 }
3134
3135 if (Opcode == TargetOpcode::G_BUILD_VECTOR) {
3136 const APInt *MinAmt = nullptr, *MaxAmt = nullptr;
3137 for (unsigned I = 0, E = MI.getNumOperands() - 1; I != E; ++I) {
3138 if (!DemandedElts[I])
3139 continue;
3140 MachineInstr *Op = MRI.getVRegDef(MI.getOperand(I + 1).getReg());
3141 if (Op->getOpcode() != TargetOpcode::G_CONSTANT) {
3142 MinAmt = MaxAmt = nullptr;
3143 break;
3144 }
3145
3146 const APInt &ShAmt = Op->getOperand(1).getCImm()->getValue();
3147 if (ShAmt.uge(BitWidth))
3148 return std::nullopt;
3149 if (!MinAmt || MinAmt->ugt(ShAmt))
3150 MinAmt = &ShAmt;
3151 if (!MaxAmt || MaxAmt->ult(ShAmt))
3152 MaxAmt = &ShAmt;
3153 }
3154 assert(((!MinAmt && !MaxAmt) || (MinAmt && MaxAmt)) &&
3155 "Failed to find matching min/max shift amounts");
3156 if (MinAmt && MaxAmt)
3157 return ConstantRange(*MinAmt, *MaxAmt + 1);
3158 }
3159
3160 // Use computeKnownBits to find a hidden constant/knownbits (usually type
3161 // legalized). e.g. Hidden behind multiple bitcasts/build_vector/casts etc.
3162 KnownBits KnownAmt = getKnownBits(R, DemandedElts, Depth);
3163 if (KnownAmt.getMaxValue().ult(BitWidth))
3164 return ConstantRange::fromKnownBits(KnownAmt, /*IsSigned=*/false);
3165
3166 return std::nullopt;
3167}
3168
3170 Register R, const APInt &DemandedElts, unsigned Depth) {
3171 if (std::optional<ConstantRange> AmtRange =
3172 getValidShiftAmountRange(R, DemandedElts, Depth))
3173 return AmtRange->getUnsignedMin().getZExtValue();
3174 return std::nullopt;
3175}
3176
3182
3187
3189 if (!Info) {
3190 unsigned MaxDepth =
3192 Info = std::make_unique<GISelValueTracking>(MF, MaxDepth);
3193 }
3194 return *Info;
3195}
3196
3197AnalysisKey GISelValueTrackingAnalysis::Key;
3198
3202 unsigned MaxDepth =
3204 return Result(MF, MaxDepth);
3205}
3206
3207static PreservedAnalyses
3210 bool PrintFPClass) {
3211 auto &VTA = MFAM.getResult<GISelValueTrackingAnalysis>(MF);
3212 const auto &MRI = MF.getRegInfo();
3213 OS << "name: ";
3214 MF.getFunction().printAsOperand(OS, /*PrintType=*/false);
3215 OS << '\n';
3216
3217 for (MachineBasicBlock &BB : MF) {
3218 for (MachineInstr &MI : BB) {
3219 for (MachineOperand &MO : MI.defs()) {
3220 if (!MO.isReg() || MO.getReg().isPhysical())
3221 continue;
3222 Register Reg = MO.getReg();
3223 if (!MRI.getType(Reg).isValid())
3224 continue;
3225 if (PrintFPClass) {
3226 KnownFPClass FPKnown = VTA.computeKnownFPClass(Reg);
3227 OS << " " << MO << " FPClasses:" << FPKnown.getKnownFPClasses()
3228 << " SignBitKnown:";
3229 if (FPKnown.getSignBit())
3230 OS << (*FPKnown.getSignBit() ? '1' : '0');
3231 else
3232 OS << '?';
3233 OS << '\n';
3234 } else {
3235 KnownBits Known = VTA.getKnownBits(Reg);
3236 unsigned SignedBits = VTA.computeNumSignBits(Reg);
3237 bool IsKnownNeverZero = VTA.isKnownNeverZero(Reg);
3238 OS << " " << MO << " KnownBits:" << Known
3239 << " SignBits:" << SignedBits
3240 << " IsKnownNeverZero:" << IsKnownNeverZero << '\n';
3241 }
3242 };
3243 }
3244 }
3245 return PreservedAnalyses::all();
3246}
3247
3253
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
uint64_t uint64_t
This file declares a class to represent arbitrary precision floating point values and provide a varie...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define X(NUM, ENUM, NAME)
Definition ELF.h:665
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Utilities for dealing with flags related to floating point properties and mode controls.
static void dumpResult(const MachineInstr &MI, const KnownBits &Known, unsigned Depth)
static void genUnknown(MachineRegisterInfo &MRI, Register Reg, KnownBits &Known)
static PreservedAnalyses printGISelValueTracking(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM, raw_ostream &OS, bool PrintFPClass)
static unsigned computeNumSignBitsFromRangeMetadata(const GAnyLoad *Ld, unsigned TyBits)
Compute the known number of sign bits with attached range metadata in the memory operand.
Provides analysis for querying information about KnownBits during GISel passes.
#define DEBUG_TYPE
Declares convenience wrapper classes for interpreting MachineInstr instances as specific generic oper...
IRTranslator LLVM IR MI
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
Implement a low-level type suitable for MachineInstr level instruction selection.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Contains matchers for matching SSA Machine Instructions.
Register Reg
Promote Memory to Register
Definition Mem2Reg.cpp:110
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Definition PassSupport.h:56
R600 Clause Merge
SmallVector< MachineOperand, 4 > Cond
MachineRegisterInfo & MRI
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 uint64_t umul_ov(uint64_t i, uint64_t j, bool &Overflow)
This file defines the scope_exit class, which executes user-defined cleanup logic at scope exit.
This file contains some functions that are useful when dealing with strings.
#define LLVM_DEBUG(...)
Definition Debug.h:119
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
This file describes how to lower LLVM code to machine code.
static bool isAbsoluteValueULEOne(const Value *V)
static Function * getFunction(FunctionType *Ty, const Twine &Name, Module *M)
Value * RHS
Value * LHS
static const fltSemantics & PPCDoubleDouble()
Definition APFloat.h:310
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1242
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt umul_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:2009
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:230
void clearBit(unsigned BitPosition)
Set a given bit to 0.
Definition APInt.h:1426
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1057
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:225
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1186
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:376
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1508
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1115
unsigned getNumSignBits() const
Computes the number of leading bits of this APInt that are equal to its sign bit.
Definition APInt.h:1648
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1618
unsigned logBase2() const
Definition APInt.h:1781
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
Definition APInt.h:471
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:875
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:436
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:302
void clearBits(unsigned LoBit, unsigned HiBit)
Clear the bits from LoBit (inclusive) to HiBit (exclusive) to 0.
Definition APInt.h:1437
LLVM_ABI APInt extractBits(unsigned numBits, unsigned bitPosition) const
Return an APInt with the extracted bits [bitPosition,bitPosition+numBits).
Definition APInt.cpp:478
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:282
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:235
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1225
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
void setPreservesAll()
Set by analyses that do not transform their input at all.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
This class represents a range of values.
static LLVM_ABI ConstantRange fromKnownBits(const KnownBits &Known, bool IsSigned)
Initialize a range based on a known bits constraint.
LLVM_ABI KnownBits toKnownBits() const
Return known bits for values in this range.
LLVM_ABI ConstantRange zeroExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
LLVM_ABI APInt getSignedMin() const
Return the smallest signed value contained in the ConstantRange.
LLVM_ABI ConstantRange signExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
LLVM_ABI ConstantRange multiply(const ConstantRange &Other, unsigned NoWrapKind=0) const
Return a new range representing the possible values resulting from a multiplication of a value in thi...
LLVM_ABI APInt getUnsignedMax() const
Return the largest unsigned value contained in the ConstantRange.
LLVM_ABI APInt getSignedMax() const
Return the largest signed value contained in the ConstantRange.
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
Represents any generic load, including sign/zero extending variants.
Represents an extract vector element.
static LLVM_ABI std::optional< GFConstant > getConstant(Register Const, const MachineRegisterInfo &MRI)
Definition Utils.cpp:2063
To use KnownBitsInfo analysis in a pass, KnownBitsInfo &Info = getAnalysis<GISelValueTrackingInfoAnal...
GISelValueTracking & get(MachineFunction &MF)
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
LLVM_ABI Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
LLVM_ABI PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
LLVM_ABI PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
KnownBits getKnownBits(Register R)
Align computeKnownAlignment(Register R, unsigned Depth=0)
std::optional< ConstantRange > getValidShiftAmountRange(Register R, const APInt &DemandedElts, unsigned Depth)
If a G_SHL/G_ASHR/G_LSHR node with shift operand R has shift amounts that are all less than the eleme...
bool maskedValueIsZero(Register Val, const APInt &Mask)
std::optional< uint64_t > getValidMinimumShiftAmount(Register R, const APInt &DemandedElts, unsigned Depth=0)
If a G_SHL/G_ASHR/G_LSHR node with shift operand R has shift amounts that are all less than the eleme...
const DataLayout & getDataLayout() const
unsigned computeNumSignBits(Register R, const APInt &DemandedElts, unsigned Depth=0)
const MachineFunction & getMachineFunction() const
bool isKnownNeverNaN(Register Val, bool SNaN=false)
Returns true if Val can be assumed to never be a NaN.
bool isKnownNeverLogicalZero(Register Val, unsigned Depth=0)
Returns true if Val can be assumed to never be a zero, accounting for denormal flushing of the contai...
void computeKnownBitsImpl(Register R, KnownBits &Known, const APInt &DemandedElts, unsigned Depth=0)
Evaluate a known-bits query with an explicit worklist instead of recursive descent.
bool isKnownNeverZero(Register R, unsigned Depth=0)
Return true if the value defined by R is provably never zero.
Represents an insert vector element.
Represents a G_LOAD.
Represents a G_SEXTLOAD.
Register getCondReg() const
Register getFalseReg() const
Register getTrueReg() const
Represents a G_SHUFFLE_VECTOR.
ArrayRef< int > getMask() const
Represents a G_ZEXTLOAD.
void setKnownFPClasses(FPClassTest Classes)
static LLVM_ABI KnownFPClass sin(const KnownFPClass &Src)
Report known values for sin.
static LLVM_ABI KnownFPClass frem(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for frem.
static LLVM_ABI KnownFPClass fdiv_self(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fdiv x, x.
static constexpr FPClassTest OrderedLessThanZeroMask
static LLVM_ABI KnownFPClass fmul(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fmul.
static LLVM_ABI KnownFPClass ceil(const KnownFPClass &Src, bool IsMultiUnitFPType, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for ceil.
static LLVM_ABI KnownFPClass fadd_self(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fadd x, x.
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.
static LLVM_ABI KnownFPClass canonicalize(const KnownFPClass &Src, DenormalMode DenormMode=DenormalMode::getDynamic())
Apply the canonicalize intrinsic to this value.
static LLVM_ABI KnownFPClass atan2(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for atan2.
static LLVM_ABI KnownFPClass atan(const KnownFPClass &Src)
Report known values for atan.
static LLVM_ABI KnownFPClass fdiv(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fdiv.
static LLVM_ABI KnownFPClass fpext(const KnownFPClass &KnownSrc, const fltSemantics &DstTy, const fltSemantics &SrcTy, DenormalMode DstMode, DenormalMode SrcMode)
Propagate known class for fpext.
static LLVM_ABI KnownFPClass cos(const KnownFPClass &Src)
Report known values for cos.
static LLVM_ABI KnownFPClass fptrunc(const KnownFPClass &KnownSrc, const fltSemantics &DstTy, const fltSemantics &SrcTy, DenormalMode DstMode, DenormalMode SrcMode)
Propagate known class for fptrunc and fptrunc_round.
static LLVM_ABI KnownFPClass cosh(const KnownFPClass &Src)
Report known values for cosh.
static LLVM_ABI KnownFPClass minMaxLike(const KnownFPClass &LHS, const KnownFPClass &RHS, MinMaxKind Kind, DenormalMode DenormMode=DenormalMode::getDynamic())
bool isUnknown() 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.
static LLVM_ABI KnownFPClass asin(const KnownFPClass &Src)
Report known values for asin.
bool isKnownNeverNaN() const
Return true if it's known this can never be a nan.
void knownNot(FPClassMask RuleOut)
std::optional< bool > getSignBit() const
std::nullopt if the sign bit is unknown, true if the sign bit is definitely set or false if the sign ...
FPClassTest getKnownFPClasses() const
Floating-point classes the value could be one of.
static KnownFPClass getEmpty()
static LLVM_ABI KnownFPClass roundToIntegral(const KnownFPClass &Src, bool IsMultiUnitFPType, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for rounding intrinsics (rint, nearbyint, round, roundeven).
static LLVM_ABI KnownFPClass fma(const KnownFPClass &LHS, const KnownFPClass &RHS, const KnownFPClass &Addend, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fma.
static LLVM_ABI KnownFPClass tan(const KnownFPClass &Src)
Report known values for tan.
bool cannotBeOrderedLessThanZero() const
Return true if we can prove that the analyzed floating-point value is either NaN or never less than -...
static LLVM_ABI KnownFPClass sqrt(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for sqrt.
bool isKnownNever(FPClassMask Mask) const
Return true if it's known this can never be one of the mask entries.
static LLVM_ABI KnownFPClass fadd(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fadd.
static LLVM_ABI KnownFPClass trunc(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for trunc.
static LLVM_ABI KnownFPClass fma_square(const KnownFPClass &Squared, const KnownFPClass &Addend, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fma squared, squared, addend.
static LLVM_ABI KnownFPClass acos(const KnownFPClass &Src)
Report known values for acos.
static LLVM_ABI KnownFPClass log(const KnownFPClass &Src, DenormalMode Mode, bool IsMultiUnitFPType)
Propagate known class for log/log2/log10.
static LLVM_ABI KnownFPClass frem_self(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for frem x, x.
static LLVM_ABI KnownFPClass powi(const KnownFPClass &Src, const KnownBits &N)
Propagate known class for powi.
static LLVM_ABI KnownFPClass floor(const KnownFPClass &Src, bool IsMultiUnitFPType, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for floor.
static LLVM_ABI KnownFPClass pow(const KnownFPClass &LHS, const KnownFPClass &RHS)
Propagate known class for pow.
static LLVM_ABI KnownFPClass ldexp(const KnownFPClass &Src, const APInt &ConstantRangeMin, const APInt &ConstantRangeMax, const fltSemantics &Flt, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for ldexp, assuming the exponent is known to be within [ConstantRangeMin,...
static LLVM_ABI KnownFPClass sinh(const KnownFPClass &Src)
Report known values for sinh.
static LLVM_ABI KnownFPClass tanh(const KnownFPClass &Src)
Report known values for tanh.
constexpr bool isScalableVector() const
Returns true if the LLT is a scalable vector.
constexpr unsigned getScalarSizeInBits() const
LLT getScalarType() const
constexpr bool isValid() const
constexpr uint16_t getNumElements() const
Returns the number of elements in a vector LLT.
constexpr bool isVector() const
constexpr ElementCount getElementCount() const
constexpr unsigned getAddressSpace() const
constexpr bool isFixedVector() const
Returns true if the LLT is a fixed vector.
TypeSize getValue() const
Metadata node.
Definition Metadata.h:1081
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
A description of a memory reference used in the backend.
LLT getMemoryType() const
Return the memory type of the memory reference.
const MDNode * getRanges() const
Return the range tag for the memory reference.
LocationSize getSizeInBits() const
Return the size in bits of the memory reference.
MachineOperand class - Representation of each machine instruction operand.
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
Wrapper class representing virtual and physical registers.
Definition Register.h:20
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:79
CodeGenOptLevel getOptLevel() const
Returns the optimization level: None, Less, Default, or Aggressive.
Value * getOperand(unsigned i) const
Definition User.h:207
LLVM_ABI void printAsOperand(raw_ostream &O, bool PrintType=true, const Module *M=nullptr) const
Print the name of this Value out to the specified raw_ostream.
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:166
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI APInt fshr(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift right.
Definition APInt.cpp:3226
operand_type_match m_Reg()
UnaryOp_match< SrcTy, TargetOpcode::G_FFLOOR > m_GFFloor(const SrcTy &Src)
operand_type_match m_Pred()
bind_ty< FPClassTest > m_FPClassTest(FPClassTest &T)
deferred_ty< Register > m_DeferredReg(Register &R)
Similar to m_SpecificReg/Type, but the specific value to match originated from an earlier sub-pattern...
BinaryOp_match< LHS, RHS, TargetOpcode::G_FSUB, false > m_GFSub(const LHS &L, const RHS &R)
bool mi_match(Reg R, const MachineRegisterInfo &MRI, Pattern &&P)
ClassifyOp_match< LHS, Test, TargetOpcode::G_IS_FPCLASS > m_GIsFPClass(const LHS &L, const Test &T)
Matches the register and immediate used in a fpclass test G_IS_FPCLASS val, 96.
CompareOp_match< Pred, LHS, RHS, TargetOpcode::G_FCMP > m_GFCmp(const Pred &P, const LHS &L, const RHS &R)
LLVM_ABI unsigned rot(unsigned SrcSignBits, unsigned BitWidth, std::optional< APInt > RotAmt, bool IsRotateRight)
Compute the number of sign bits after rotating a value.
unsigned getNumElements(Type *Ty)
Definition SLPUtils.cpp:110
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition STLExtras.h:316
LLVM_ABI std::optional< APInt > isConstantOrConstantSplatVector(Register Def, const MachineRegisterInfo &MRI)
Determines if Def defines a constant integer or a splat vector of constant integers.
Definition Utils.cpp:1537
LLVM_ABI KnownFPClass computeKnownFPClass(const Value *V, const APInt &DemandedElts, FPClassTest InterestedClasses, const SimplifyQuery &SQ, unsigned Depth=0)
Determine which floating-point classes are valid for V, and return them in KnownFPClass bit sets.
LLVM_ABI std::optional< APInt > getIConstantVRegVal(Register VReg, const MachineRegisterInfo &MRI)
If VReg is defined by a G_CONSTANT, return the corresponding value.
Definition Utils.cpp:297
@ Known
Known to have no common set bits.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2570
LLVM_ABI const llvm::fltSemantics & getFltSemanticForLLT(LLT Ty)
Get the appropriate floating point arithmetic semantic based on the bit size of the given scalar LLT.
scope_exit(Callable) -> scope_exit< Callable >
int bit_width(T Value)
Returns the number of bits needed to represent Value if Value is nonzero.
Definition bit.h:325
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition MathExtras.h:244
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
int ilogb(const APFloat &Arg)
Returns the exponent of the internal representation of the APFloat.
Definition APFloat.h:1692
unsigned Log2_64(uint64_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
Definition MathExtras.h:332
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 ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
std::tuple< Value *, FPClassTest, FPClassTest > fcmpImpliesClass(CmpInst::Predicate Pred, const Function &F, Value *LHS, FPClassTest RHSClass, bool LookThroughSrc=true)
LLVM_ABI bool getShuffleDemandedElts(int SrcWidth, ArrayRef< int > Mask, const APInt &DemandedElts, APInt &DemandedLHS, APInt &DemandedRHS, bool AllowUndefElts=false)
Transform a shuffle mask's output demanded element mask into demanded element masks for the 2 operand...
constexpr unsigned MaxAnalysisRecursionDepth
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
@ Sub
Subtraction of integers.
DWARFExpression::Operation Op
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Return true if this function can prove that V does not have undef bits and is never poison.
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
static uint32_t extractBits(uint64_t Val, uint32_t Hi, uint32_t Lo)
LLVM_ABI void computeKnownBitsFromRangeMetadata(const MDNode &Ranges, KnownBits &Known)
Compute known bits from the range metadata.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition Analysis.h:29
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
Definition KnownBits.h:315
static LLVM_ABI KnownBits sadd_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.sadd.sat(LHS, RHS)
KnownBits anyextOrTrunc(unsigned BitWidth) const
Return known bits for an "any" extension or truncation of the value we're tracking.
Definition KnownBits.h:190
static LLVM_ABI KnownBits mulhu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from zero-extended multiply-hi.
unsigned countMinSignBits() const
Returns the number of times the sign bit is replicated into the other bits.
Definition KnownBits.h:269
static LLVM_ABI KnownBits smax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smax(LHS, RHS).
bool isNonNegative() const
Returns true if this value is known to be non-negative.
Definition KnownBits.h:106
bool isZero() const
Returns true if value is all zero.
Definition KnownBits.h:78
static LLVM_ABI KnownBits usub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.usub.sat(LHS, RHS)
static LLVM_ABI KnownBits ashr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for ashr(LHS, RHS).
static LLVM_ABI KnownBits ssub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.ssub.sat(LHS, RHS)
static LLVM_ABI KnownBits urem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for urem(LHS, RHS).
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition KnownBits.h:288
static LLVM_ABI KnownBits fshl(const KnownBits &LHS, const KnownBits &RHS, const APInt &Amt)
Compute known bits for fshl(LHS, RHS, Amt).
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition KnownBits.h:303
unsigned getBitWidth() const
Get the bit width of this value.
Definition KnownBits.h:44
static LLVM_ABI KnownBits umax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umax(LHS, RHS).
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
static LLVM_ABI KnownBits lshr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for lshr(LHS, RHS).
bool isNonZero() const
Returns true if this value is known to be non-zero.
Definition KnownBits.h:109
static LLVM_ABI KnownBits abdu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for abdu(LHS, RHS).
bool isEven() const
Return if the value is known even (the low bit is 0).
Definition KnownBits.h:162
KnownBits extractBits(unsigned NumBits, unsigned BitPosition) const
Return a subset of the known bits from [bitPosition,bitPosition+numBits).
Definition KnownBits.h:239
static LLVM_ABI KnownBits avgFloorU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorU.
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
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
Definition KnownBits.h:262
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:146
static LLVM_ABI KnownBits abds(KnownBits LHS, KnownBits RHS)
Compute known bits for abds(LHS, RHS).
static LLVM_ABI KnownBits smin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smin(LHS, RHS).
static LLVM_ABI KnownBits mulhs(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from sign-extended multiply-hi.
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).
APInt getMinValue() const
Return the minimal unsigned value possible given these KnownBits.
Definition KnownBits.h:130
static LLVM_ABI KnownBits sdiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for sdiv(LHS, RHS).
static LLVM_ABI KnownBits avgFloorS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorS.
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:103
static LLVM_ABI KnownBits computeForAddCarry(const KnownBits &LHS, const KnownBits &RHS, const KnownBits &Carry)
Compute known bits resulting from adding LHS, RHS and a 1-bit Carry.
Definition KnownBits.cpp:54
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
unsigned countMaxLeadingZeros() const
Returns the maximum number of leading zero bits possible.
Definition KnownBits.h:294
static LLVM_ABI KnownBits avgCeilU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilU.
static LLVM_ABI KnownBits uadd_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.uadd.sat(LHS, RHS)
static LLVM_ABI KnownBits mul(const KnownBits &LHS, const KnownBits &RHS, bool NoUndefSelfMultiply=false)
Compute known bits resulting from multiplying LHS and RHS.
static LLVM_ABI KnownBits clmul(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for clmul(LHS, RHS).
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).
static LLVM_ABI KnownBits umin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umin(LHS, RHS).
bool isAllOnes() const
Returns true if value is all one bits.
Definition KnownBits.h:81
static LLVM_ABI KnownBits avgCeilS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilS.