LLVM 23.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 assert(MI.getNumExplicitDefs() == 1 &&
80 "expected single return generic instruction");
81 return getKnownBits(MI.getOperand(0).getReg());
82}
83
85 const LLT Ty = MRI.getType(R);
86 // Since the number of lanes in a scalable vector is unknown at compile time,
87 // we track one bit which is implicitly broadcast to all lanes. This means
88 // that all lanes in a scalable vector are considered demanded.
89 APInt DemandedElts =
90 Ty.isFixedVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1);
91 return getKnownBits(R, DemandedElts);
92}
93
95 const APInt &DemandedElts,
96 unsigned Depth) {
97 KnownBits Known;
98 computeKnownBitsImpl(R, Known, DemandedElts, Depth);
99 return Known;
100}
101
103 LLT Ty = MRI.getType(R);
104 unsigned BitWidth = Ty.getScalarSizeInBits();
106}
107
111
115
116[[maybe_unused]] static void
117dumpResult(const MachineInstr &MI, const KnownBits &Known, unsigned Depth) {
118 dbgs() << "[" << Depth << "] Compute known bits: " << MI << "[" << Depth
119 << "] Computed for: " << MI << "[" << Depth << "] Known: 0x"
120 << toString(Known.Zero | Known.One, 16, false) << "\n"
121 << "[" << Depth << "] Zero: 0x" << toString(Known.Zero, 16, false)
122 << "\n"
123 << "[" << Depth << "] One: 0x" << toString(Known.One, 16, false)
124 << "\n";
125}
126
127/// Compute known bits for the intersection of \p Src0 and \p Src1
128void GISelValueTracking::computeKnownBitsMin(Register Src0, Register Src1,
129 KnownBits &Known,
130 const APInt &DemandedElts,
131 unsigned Depth) {
132 // Test src1 first, since we canonicalize simpler expressions to the RHS.
133 computeKnownBitsImpl(Src1, Known, DemandedElts, Depth);
134
135 // If we don't know any bits, early out.
136 if (Known.isUnknown())
137 return;
138
139 KnownBits Known2;
140 computeKnownBitsImpl(Src0, Known2, DemandedElts, Depth);
141
142 // Only known if known in both the LHS and RHS.
143 Known = Known.intersectWith(Known2);
144}
145
146// Bitfield extract is computed as (Src >> Offset) & Mask, where Mask is
147// created using Width. Use this function when the inputs are KnownBits
148// objects. TODO: Move this KnownBits.h if this is usable in more cases.
149static KnownBits extractBits(unsigned BitWidth, const KnownBits &SrcOpKnown,
150 const KnownBits &OffsetKnown,
151 const KnownBits &WidthKnown) {
152 KnownBits Mask(BitWidth);
153 Mask.Zero = APInt::getBitsSetFrom(
155 Mask.One = APInt::getLowBitsSet(
157 return KnownBits::lshr(SrcOpKnown, OffsetKnown) & Mask;
158}
159
161 const APInt &DemandedElts,
162 unsigned Depth) {
163 MachineInstr &MI = *MRI.getVRegDef(R);
164 unsigned Opcode = MI.getOpcode();
165 LLT DstTy = MRI.getType(R);
166
167 // Handle the case where this is called on a register that does not have a
168 // type constraint. For example, it may be post-ISel or this target might not
169 // preserve the type when early-selecting instructions.
170 if (!DstTy.isValid()) {
171 Known = KnownBits();
172 return;
173 }
174
175#ifndef NDEBUG
176 if (DstTy.isFixedVector()) {
177 assert(
178 DstTy.getNumElements() == DemandedElts.getBitWidth() &&
179 "DemandedElt width should equal the fixed vector number of elements");
180 } else {
181 assert(DemandedElts.getBitWidth() == 1 && DemandedElts == APInt(1, 1) &&
182 "DemandedElt width should be 1 for scalars or scalable vectors");
183 }
184#endif
185
186 unsigned BitWidth = DstTy.getScalarSizeInBits();
187 Known = KnownBits(BitWidth); // Don't know anything
188
189 // Depth may get bigger than max depth if it gets passed to a different
190 // GISelValueTracking object.
191 // This may happen when say a generic part uses a GISelValueTracking object
192 // with some max depth, but then we hit TL.computeKnownBitsForTargetInstr
193 // which creates a new GISelValueTracking object with a different and smaller
194 // depth. If we just check for equality, we would never exit if the depth
195 // that is passed down to the target specific GISelValueTracking object is
196 // already bigger than its max depth.
197 if (Depth >= getMaxDepth())
198 return;
199
200 if (!DemandedElts)
201 return; // No demanded elts, better to assume we don't know anything.
202
203 KnownBits Known2;
204
205 switch (Opcode) {
206 default:
207 TL.computeKnownBitsForTargetInstr(*this, R, Known, DemandedElts, MRI,
208 Depth);
209 break;
210 case TargetOpcode::G_BUILD_VECTOR: {
211 // Collect the known bits that are shared by every demanded vector element.
212 Known.Zero.setAllBits();
213 Known.One.setAllBits();
214 for (const auto &[I, MO] : enumerate(drop_begin(MI.operands()))) {
215 if (!DemandedElts[I])
216 continue;
217
218 computeKnownBitsImpl(MO.getReg(), Known2, APInt(1, 1), Depth + 1);
219
220 // Known bits are the values that are shared by every demanded element.
221 Known = Known.intersectWith(Known2);
222
223 // If we don't know any bits, early out.
224 if (Known.isUnknown())
225 break;
226 }
227 break;
228 }
229 case TargetOpcode::G_SPLAT_VECTOR: {
230 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, APInt(1, 1),
231 Depth + 1);
232 // Implicitly truncate the bits to match the official semantics of
233 // G_SPLAT_VECTOR.
234 Known = Known.trunc(BitWidth);
235 break;
236 }
237 case TargetOpcode::COPY:
238 case TargetOpcode::G_PHI:
239 case TargetOpcode::PHI: {
242 // Destination registers should not have subregisters at this
243 // point of the pipeline, otherwise the main live-range will be
244 // defined more than once, which is against SSA.
245 assert(MI.getOperand(0).getSubReg() == 0 && "Is this code in SSA?");
246 // PHI's operand are a mix of registers and basic blocks interleaved.
247 // We only care about the register ones.
248 for (unsigned Idx = 1; Idx < MI.getNumOperands(); Idx += 2) {
249 const MachineOperand &Src = MI.getOperand(Idx);
250 Register SrcReg = Src.getReg();
251 LLT SrcTy = MRI.getType(SrcReg);
252 // Look through trivial copies and phis but don't look through trivial
253 // copies or phis of the form `%1:(s32) = OP %0:gpr32`, known-bits
254 // analysis is currently unable to determine the bit width of a
255 // register class.
256 //
257 // We can't use NoSubRegister by name as it's defined by each target but
258 // it's always defined to be 0 by tablegen.
259 if (SrcReg.isVirtual() && Src.getSubReg() == 0 /*NoSubRegister*/ &&
260 SrcTy.isValid()) {
261 APInt NowDemandedElts;
262 if (!SrcTy.isFixedVector()) {
263 NowDemandedElts = APInt(1, 1);
264 } else if (DstTy.isFixedVector() &&
265 SrcTy.getNumElements() == DstTy.getNumElements()) {
266 NowDemandedElts = DemandedElts;
267 } else {
268 NowDemandedElts = APInt::getAllOnes(SrcTy.getNumElements());
269 }
270
271 // For COPYs we don't do anything, don't increase the depth.
272 computeKnownBitsImpl(SrcReg, Known2, NowDemandedElts,
273 Depth + (Opcode != TargetOpcode::COPY));
274 Known2 = Known2.anyextOrTrunc(BitWidth);
275 Known = Known.intersectWith(Known2);
276 // If we reach a point where we don't know anything
277 // just stop looking through the operands.
278 if (Known.isUnknown())
279 break;
280 } else {
281 // We know nothing.
282 Known = KnownBits(BitWidth);
283 break;
284 }
285 }
286 break;
287 }
288 case TargetOpcode::G_STEP_VECTOR: {
289 APInt Step = MI.getOperand(1).getCImm()->getValue();
290
291 if (Step.isPowerOf2())
292 Known.Zero.setLowBits(Step.logBase2());
293
295 break;
296
297 const APInt MinNumElts =
300 bool Overflow;
301 const APInt MaxNumElts = getVScaleRange(&F, BitWidth)
303 .umul_ov(MinNumElts, Overflow);
304 if (Overflow)
305 break;
306 const APInt MaxValue = (MaxNumElts - 1).umul_ov(Step, Overflow);
307 if (Overflow)
308 break;
309 Known.Zero.setHighBits(MaxValue.countl_zero());
310 break;
311 }
312 case TargetOpcode::G_CONSTANT: {
313 Known = KnownBits::makeConstant(MI.getOperand(1).getCImm()->getValue());
314 break;
315 }
316 case TargetOpcode::G_FRAME_INDEX: {
317 int FrameIdx = MI.getOperand(1).getIndex();
318 TL.computeKnownBitsForFrameIndex(FrameIdx, Known, MF);
319 break;
320 }
321 case TargetOpcode::G_SUB: {
322 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
323 Depth + 1);
324 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
325 Depth + 1);
326 Known = KnownBits::sub(Known, Known2, MI.getFlag(MachineInstr::NoSWrap),
327 MI.getFlag(MachineInstr::NoUWrap));
328 break;
329 }
330 case TargetOpcode::G_XOR: {
331 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
332 Depth + 1);
333 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
334 Depth + 1);
335
336 Known ^= Known2;
337 break;
338 }
339 case TargetOpcode::G_PTR_ADD: {
340 if (DstTy.isVector())
341 break;
342 // G_PTR_ADD is like G_ADD. FIXME: Is this true for all targets?
343 LLT Ty = MRI.getType(MI.getOperand(1).getReg());
344 if (DL.isNonIntegralAddressSpace(Ty.getAddressSpace()))
345 break;
346 [[fallthrough]];
347 }
348 case TargetOpcode::G_ADD: {
349 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
350 Depth + 1);
351 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
352 Depth + 1);
353 Known = KnownBits::add(Known, Known2);
354 break;
355 }
356 case TargetOpcode::G_AND: {
357 // If either the LHS or the RHS are Zero, the result is zero.
358 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
359 Depth + 1);
360 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
361 Depth + 1);
362
363 Known &= Known2;
364 break;
365 }
366 case TargetOpcode::G_OR: {
367 // If either the LHS or the RHS are Zero, the result is zero.
368 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
369 Depth + 1);
370 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
371 Depth + 1);
372
373 Known |= Known2;
374 break;
375 }
376 case TargetOpcode::G_MUL: {
377 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
378 Depth + 1);
379 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
380 Depth + 1);
381 Known = KnownBits::mul(Known, Known2);
382 break;
383 }
384 case TargetOpcode::G_UMULH: {
385 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
386 Depth + 1);
387 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
388 Depth + 1);
389 Known = KnownBits::mulhu(Known, Known2);
390 break;
391 }
392 case TargetOpcode::G_SMULH: {
393 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
394 Depth + 1);
395 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
396 Depth + 1);
397 Known = KnownBits::mulhs(Known, Known2);
398 break;
399 }
400 case TargetOpcode::G_ABDU: {
401 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
402 Depth + 1);
403 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
404 Depth + 1);
405 Known = KnownBits::abdu(Known, Known2);
406 break;
407 }
408 case TargetOpcode::G_ABDS: {
409 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
410 Depth + 1);
411 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
412 Depth + 1);
413 Known = KnownBits::abds(Known, Known2);
414
415 unsigned SignBits1 =
416 computeNumSignBits(MI.getOperand(2).getReg(), DemandedElts, Depth + 1);
417 if (SignBits1 == 1) {
418 break;
419 }
420 unsigned SignBits0 =
421 computeNumSignBits(MI.getOperand(1).getReg(), DemandedElts, Depth + 1);
422
423 Known.Zero.setHighBits(std::min(SignBits0, SignBits1) - 1);
424 break;
425 }
426 case TargetOpcode::G_UDIV: {
427 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
428 Depth + 1);
429 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
430 Depth + 1);
431 Known = KnownBits::udiv(Known, Known2,
433 break;
434 }
435 case TargetOpcode::G_SDIV: {
436 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
437 Depth + 1);
438 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
439 Depth + 1);
440 Known = KnownBits::sdiv(Known, Known2,
442 break;
443 }
444 case TargetOpcode::G_SELECT: {
445 computeKnownBitsMin(MI.getOperand(2).getReg(), MI.getOperand(3).getReg(),
446 Known, DemandedElts, Depth + 1);
447 break;
448 }
449 case TargetOpcode::G_SMIN: {
450 // TODO: Handle clamp pattern with number of sign bits
451 KnownBits KnownRHS;
452 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
453 Depth + 1);
454 computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, DemandedElts,
455 Depth + 1);
456 Known = KnownBits::smin(Known, KnownRHS);
457 break;
458 }
459 case TargetOpcode::G_SMAX: {
460 // TODO: Handle clamp pattern with number of sign bits
461 KnownBits KnownRHS;
462 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
463 Depth + 1);
464 computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, DemandedElts,
465 Depth + 1);
466 Known = KnownBits::smax(Known, KnownRHS);
467 break;
468 }
469 case TargetOpcode::G_UMIN: {
470 KnownBits KnownRHS;
471 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
472 Depth + 1);
473 computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, DemandedElts,
474 Depth + 1);
475 Known = KnownBits::umin(Known, KnownRHS);
476 break;
477 }
478 case TargetOpcode::G_UMAX: {
479 KnownBits KnownRHS;
480 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
481 Depth + 1);
482 computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, DemandedElts,
483 Depth + 1);
484 Known = KnownBits::umax(Known, KnownRHS);
485 break;
486 }
487 case TargetOpcode::G_FCMP:
488 case TargetOpcode::G_ICMP: {
489 if (DstTy.isVector())
490 break;
491 if (TL.getBooleanContents(DstTy.isVector(),
492 Opcode == TargetOpcode::G_FCMP) ==
494 BitWidth > 1)
495 Known.Zero.setBitsFrom(1);
496 break;
497 }
498 case TargetOpcode::G_SEXT: {
499 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
500 Depth + 1);
501 // If the sign bit is known to be zero or one, then sext will extend
502 // it to the top bits, else it will just zext.
503 Known = Known.sext(BitWidth);
504 break;
505 }
506 case TargetOpcode::G_ASSERT_SEXT:
507 case TargetOpcode::G_SEXT_INREG: {
508 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
509 Depth + 1);
510 Known = Known.sextInReg(MI.getOperand(2).getImm());
511 break;
512 }
513 case TargetOpcode::G_ANYEXT: {
514 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
515 Depth + 1);
516 Known = Known.anyext(BitWidth);
517 break;
518 }
519 case TargetOpcode::G_LOAD: {
520 const MachineMemOperand *MMO = *MI.memoperands_begin();
521 KnownBits KnownRange(MMO->getMemoryType().getScalarSizeInBits());
522 if (const MDNode *Ranges = MMO->getRanges())
523 computeKnownBitsFromRangeMetadata(*Ranges, KnownRange);
524 Known = KnownRange.anyext(Known.getBitWidth());
525 break;
526 }
527 case TargetOpcode::G_SEXTLOAD:
528 case TargetOpcode::G_ZEXTLOAD: {
529 if (DstTy.isVector())
530 break;
531 const MachineMemOperand *MMO = *MI.memoperands_begin();
532 KnownBits KnownRange(MMO->getMemoryType().getScalarSizeInBits());
533 if (const MDNode *Ranges = MMO->getRanges())
534 computeKnownBitsFromRangeMetadata(*Ranges, KnownRange);
535 Known = Opcode == TargetOpcode::G_SEXTLOAD
536 ? KnownRange.sext(Known.getBitWidth())
537 : KnownRange.zext(Known.getBitWidth());
538 break;
539 }
540 case TargetOpcode::G_ASHR: {
541 KnownBits LHSKnown, RHSKnown;
542 computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts,
543 Depth + 1);
544 computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts,
545 Depth + 1);
546 Known = KnownBits::ashr(LHSKnown, RHSKnown);
547 break;
548 }
549 case TargetOpcode::G_LSHR: {
550 KnownBits LHSKnown, RHSKnown;
551 computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts,
552 Depth + 1);
553 computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts,
554 Depth + 1);
555 Known = KnownBits::lshr(LHSKnown, RHSKnown);
556 break;
557 }
558 case TargetOpcode::G_SHL: {
559 KnownBits LHSKnown, RHSKnown;
560 computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts,
561 Depth + 1);
562 computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts,
563 Depth + 1);
564 Known = KnownBits::shl(LHSKnown, RHSKnown);
565 break;
566 }
567 case TargetOpcode::G_ROTL:
568 case TargetOpcode::G_ROTR: {
569 MachineInstr *AmtOpMI = MRI.getVRegDef(MI.getOperand(2).getReg());
570 auto MaybeAmtOp = isConstantOrConstantSplatVector(*AmtOpMI, MRI);
571 if (!MaybeAmtOp)
572 break;
573
574 Register SrcReg = MI.getOperand(1).getReg();
575 computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
576
577 unsigned Amt = MaybeAmtOp->urem(BitWidth);
578
579 // Canonicalize to ROTR.
580 if (Opcode == TargetOpcode::G_ROTL)
581 Amt = BitWidth - Amt;
582
583 Known.Zero = Known.Zero.rotr(Amt);
584 Known.One = Known.One.rotr(Amt);
585 break;
586 }
587 case TargetOpcode::G_INTTOPTR:
588 case TargetOpcode::G_PTRTOINT:
589 if (DstTy.isVector())
590 break;
591 // Fall through and handle them the same as zext/trunc.
592 [[fallthrough]];
593 case TargetOpcode::G_ZEXT:
594 case TargetOpcode::G_TRUNC: {
595 Register SrcReg = MI.getOperand(1).getReg();
596 computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
597 Known = Known.zextOrTrunc(BitWidth);
598 break;
599 }
600 case TargetOpcode::G_ASSERT_ZEXT: {
601 Register SrcReg = MI.getOperand(1).getReg();
602 computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
603
604 unsigned SrcBitWidth = MI.getOperand(2).getImm();
605 assert(SrcBitWidth && "SrcBitWidth can't be zero");
606 APInt InMask = APInt::getLowBitsSet(BitWidth, SrcBitWidth);
607 Known.Zero |= (~InMask);
608 Known.One &= (~Known.Zero);
609 break;
610 }
611 case TargetOpcode::G_ASSERT_ALIGN: {
612 int64_t LogOfAlign = Log2_64(MI.getOperand(2).getImm());
613
614 // TODO: Should use maximum with source
615 // If a node is guaranteed to be aligned, set low zero bits accordingly as
616 // well as clearing one bits.
617 Known.Zero.setLowBits(LogOfAlign);
618 Known.One.clearLowBits(LogOfAlign);
619 break;
620 }
621 case TargetOpcode::G_MERGE_VALUES: {
622 unsigned NumOps = MI.getNumOperands();
623 unsigned OpSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits();
624
625 for (unsigned I = 0; I != NumOps - 1; ++I) {
626 KnownBits SrcOpKnown;
627 computeKnownBitsImpl(MI.getOperand(I + 1).getReg(), SrcOpKnown,
628 DemandedElts, Depth + 1);
629 Known.insertBits(SrcOpKnown, I * OpSize);
630 }
631 break;
632 }
633 case TargetOpcode::G_UNMERGE_VALUES: {
634 unsigned NumOps = MI.getNumOperands();
635 Register SrcReg = MI.getOperand(NumOps - 1).getReg();
636 LLT SrcTy = MRI.getType(SrcReg);
637
638 if (SrcTy.isVector() && SrcTy.getScalarType() != DstTy.getScalarType())
639 return; // TODO: Handle vector->subelement unmerges
640
641 // Figure out the result operand index
642 unsigned DstIdx = 0;
643 for (; DstIdx != NumOps - 1 && MI.getOperand(DstIdx).getReg() != R;
644 ++DstIdx)
645 ;
646
647 APInt SubDemandedElts = DemandedElts;
648 if (SrcTy.isVector()) {
649 unsigned DstLanes = DstTy.isVector() ? DstTy.getNumElements() : 1;
650 SubDemandedElts =
651 DemandedElts.zext(SrcTy.getNumElements()).shl(DstIdx * DstLanes);
652 }
653
654 KnownBits SrcOpKnown;
655 computeKnownBitsImpl(SrcReg, SrcOpKnown, SubDemandedElts, Depth + 1);
656
657 if (SrcTy.isVector())
658 Known = std::move(SrcOpKnown);
659 else
660 Known = SrcOpKnown.extractBits(BitWidth, BitWidth * DstIdx);
661 break;
662 }
663 case TargetOpcode::G_BSWAP: {
664 Register SrcReg = MI.getOperand(1).getReg();
665 computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
666 Known = Known.byteSwap();
667 break;
668 }
669 case TargetOpcode::G_BITREVERSE: {
670 Register SrcReg = MI.getOperand(1).getReg();
671 computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
672 Known = Known.reverseBits();
673 break;
674 }
675 case TargetOpcode::G_CTPOP: {
676 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
677 Depth + 1);
678 // We can bound the space the count needs. Also, bits known to be zero
679 // can't contribute to the population.
680 unsigned BitsPossiblySet = Known2.countMaxPopulation();
681 unsigned LowBits = llvm::bit_width(BitsPossiblySet);
682 Known.Zero.setBitsFrom(LowBits);
683 // TODO: we could bound Known.One using the lower bound on the number of
684 // bits which might be set provided by popcnt KnownOne2.
685 break;
686 }
687 case TargetOpcode::G_UBFX: {
688 KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
689 computeKnownBitsImpl(MI.getOperand(1).getReg(), SrcOpKnown, DemandedElts,
690 Depth + 1);
691 computeKnownBitsImpl(MI.getOperand(2).getReg(), OffsetKnown, DemandedElts,
692 Depth + 1);
693 computeKnownBitsImpl(MI.getOperand(3).getReg(), WidthKnown, DemandedElts,
694 Depth + 1);
695 Known = extractBits(BitWidth, SrcOpKnown, OffsetKnown, WidthKnown);
696 break;
697 }
698 case TargetOpcode::G_SBFX: {
699 KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
700 computeKnownBitsImpl(MI.getOperand(1).getReg(), SrcOpKnown, DemandedElts,
701 Depth + 1);
702 computeKnownBitsImpl(MI.getOperand(2).getReg(), OffsetKnown, DemandedElts,
703 Depth + 1);
704 computeKnownBitsImpl(MI.getOperand(3).getReg(), WidthKnown, DemandedElts,
705 Depth + 1);
706 OffsetKnown = OffsetKnown.sext(BitWidth);
707 WidthKnown = WidthKnown.sext(BitWidth);
708 Known = extractBits(BitWidth, SrcOpKnown, OffsetKnown, WidthKnown);
709 // Sign extend the extracted value using shift left and arithmetic shift
710 // right.
712 KnownBits ShiftKnown = KnownBits::sub(ExtKnown, WidthKnown);
713 Known = KnownBits::ashr(KnownBits::shl(Known, ShiftKnown), ShiftKnown);
714 break;
715 }
716 case TargetOpcode::G_UADDO:
717 case TargetOpcode::G_UADDE:
718 case TargetOpcode::G_SADDO:
719 case TargetOpcode::G_SADDE: {
720 if (MI.getOperand(1).getReg() == R) {
721 // If we know the result of a compare has the top bits zero, use this
722 // info.
723 if (TL.getBooleanContents(DstTy.isVector(), false) ==
725 BitWidth > 1)
726 Known.Zero.setBitsFrom(1);
727 break;
728 }
729
730 assert(MI.getOperand(0).getReg() == R &&
731 "We only compute knownbits for the sum here.");
732 // With [US]ADDE, a carry bit may be added in.
733 KnownBits Carry(1);
734 if (Opcode == TargetOpcode::G_UADDE || Opcode == TargetOpcode::G_SADDE) {
735 computeKnownBitsImpl(MI.getOperand(4).getReg(), Carry, DemandedElts,
736 Depth + 1);
737 // Carry has bit width 1
738 Carry = Carry.trunc(1);
739 } else {
740 Carry.setAllZero();
741 }
742
743 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
744 Depth + 1);
745 computeKnownBitsImpl(MI.getOperand(3).getReg(), Known2, DemandedElts,
746 Depth + 1);
747 Known = KnownBits::computeForAddCarry(Known, Known2, Carry);
748 break;
749 }
750 case TargetOpcode::G_USUBO:
751 case TargetOpcode::G_USUBE:
752 case TargetOpcode::G_SSUBO:
753 case TargetOpcode::G_SSUBE:
754 case TargetOpcode::G_UMULO:
755 case TargetOpcode::G_SMULO: {
756 if (MI.getOperand(1).getReg() == R) {
757 // If we know the result of a compare has the top bits zero, use this
758 // info.
759 if (TL.getBooleanContents(DstTy.isVector(), false) ==
761 BitWidth > 1)
762 Known.Zero.setBitsFrom(1);
763 }
764 break;
765 }
766 case TargetOpcode::G_CTTZ:
767 case TargetOpcode::G_CTTZ_ZERO_UNDEF: {
768 KnownBits SrcOpKnown;
769 computeKnownBitsImpl(MI.getOperand(1).getReg(), SrcOpKnown, DemandedElts,
770 Depth + 1);
771 // If we have a known 1, its position is our upper bound
772 unsigned PossibleTZ = SrcOpKnown.countMaxTrailingZeros();
773 unsigned LowBits = llvm::bit_width(PossibleTZ);
774 Known.Zero.setBitsFrom(LowBits);
775 break;
776 }
777 case TargetOpcode::G_CTLZ:
778 case TargetOpcode::G_CTLZ_ZERO_UNDEF: {
779 KnownBits SrcOpKnown;
780 computeKnownBitsImpl(MI.getOperand(1).getReg(), SrcOpKnown, DemandedElts,
781 Depth + 1);
782 // If we have a known 1, its position is our upper bound.
783 unsigned PossibleLZ = SrcOpKnown.countMaxLeadingZeros();
784 unsigned LowBits = llvm::bit_width(PossibleLZ);
785 Known.Zero.setBitsFrom(LowBits);
786 break;
787 }
788 case TargetOpcode::G_CTLS: {
789 Register Reg = MI.getOperand(1).getReg();
790 unsigned MinRedundantSignBits = computeNumSignBits(Reg, Depth + 1) - 1;
791
792 unsigned MaxUpperRedundantSignBits = MRI.getType(Reg).getScalarSizeInBits();
793
794 ConstantRange Range(APInt(BitWidth, MinRedundantSignBits),
795 APInt(BitWidth, MaxUpperRedundantSignBits));
796
797 Known = Range.toKnownBits();
798 break;
799 }
800 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
802 Register InVec = Extract.getVectorReg();
803 Register EltNo = Extract.getIndexReg();
804
805 auto ConstEltNo = getIConstantVRegVal(EltNo, MRI);
806
807 LLT VecVT = MRI.getType(InVec);
808 // computeKnownBits not yet implemented for scalable vectors.
809 if (VecVT.isScalableVector())
810 break;
811
812 const unsigned EltBitWidth = VecVT.getScalarSizeInBits();
813 const unsigned NumSrcElts = VecVT.getNumElements();
814 // A return type different from the vector's element type may lead to
815 // issues with pattern selection. Bail out to avoid that.
816 if (BitWidth > EltBitWidth)
817 break;
818
819 Known.Zero.setAllBits();
820 Known.One.setAllBits();
821
822 // If we know the element index, just demand that vector element, else for
823 // an unknown element index, ignore DemandedElts and demand them all.
824 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
825 if (ConstEltNo && ConstEltNo->ult(NumSrcElts))
826 DemandedSrcElts =
827 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
828
829 computeKnownBitsImpl(InVec, Known, DemandedSrcElts, Depth + 1);
830 break;
831 }
832 case TargetOpcode::G_SHUFFLE_VECTOR: {
833 APInt DemandedLHS, DemandedRHS;
834 // Collect the known bits that are shared by every vector element referenced
835 // by the shuffle.
836 unsigned NumElts = MRI.getType(MI.getOperand(1).getReg()).getNumElements();
837 if (!getShuffleDemandedElts(NumElts, MI.getOperand(3).getShuffleMask(),
838 DemandedElts, DemandedLHS, DemandedRHS))
839 break;
840
841 // Known bits are the values that are shared by every demanded element.
842 Known.Zero.setAllBits();
843 Known.One.setAllBits();
844 if (!!DemandedLHS) {
845 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedLHS,
846 Depth + 1);
847 Known = Known.intersectWith(Known2);
848 }
849 // If we don't know any bits, early out.
850 if (Known.isUnknown())
851 break;
852 if (!!DemandedRHS) {
853 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedRHS,
854 Depth + 1);
855 Known = Known.intersectWith(Known2);
856 }
857 break;
858 }
859 case TargetOpcode::G_CONCAT_VECTORS: {
860 if (MRI.getType(MI.getOperand(0).getReg()).isScalableVector())
861 break;
862 // Split DemandedElts and test each of the demanded subvectors.
863 Known.Zero.setAllBits();
864 Known.One.setAllBits();
865 unsigned NumSubVectorElts =
866 MRI.getType(MI.getOperand(1).getReg()).getNumElements();
867
868 for (const auto &[I, MO] : enumerate(drop_begin(MI.operands()))) {
869 APInt DemandedSub =
870 DemandedElts.extractBits(NumSubVectorElts, I * NumSubVectorElts);
871 if (!!DemandedSub) {
872 computeKnownBitsImpl(MO.getReg(), Known2, DemandedSub, Depth + 1);
873
874 Known = Known.intersectWith(Known2);
875 }
876 // If we don't know any bits, early out.
877 if (Known.isUnknown())
878 break;
879 }
880 break;
881 }
882 case TargetOpcode::G_ABS: {
883 Register SrcReg = MI.getOperand(1).getReg();
884 computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
885 Known = Known.abs();
886 Known.Zero.setHighBits(computeNumSignBits(SrcReg, DemandedElts, Depth + 1) -
887 1);
888 break;
889 }
890 }
891
892 LLVM_DEBUG(dumpResult(MI, Known, Depth));
893}
894
896 Ty = Ty.getScalarType();
898 return Mode.Output == DenormalMode::IEEE ||
900}
901
902void GISelValueTracking::computeKnownFPClass(Register R, KnownFPClass &Known,
903 FPClassTest InterestedClasses,
904 unsigned Depth) {
905 LLT Ty = MRI.getType(R);
906 APInt DemandedElts =
907 Ty.isFixedVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1);
908 computeKnownFPClass(R, DemandedElts, InterestedClasses, Known, Depth);
909}
910
911void GISelValueTracking::computeKnownFPClassForFPTrunc(
912 const MachineInstr &MI, const APInt &DemandedElts,
913 FPClassTest InterestedClasses, KnownFPClass &Known, unsigned Depth) {
914 if ((InterestedClasses & (KnownFPClass::OrderedLessThanZeroMask | fcNan)) ==
915 fcNone)
916 return;
917
918 Register Val = MI.getOperand(1).getReg();
919 KnownFPClass KnownSrc;
920 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
921 Depth + 1);
922
923 // Sign should be preserved
924 // TODO: Handle cannot be ordered greater than zero
925 if (KnownSrc.cannotBeOrderedLessThanZero())
927
928 Known.propagateNaN(KnownSrc, true);
929
930 // Infinity needs a range check.
931}
932
933void GISelValueTracking::computeKnownFPClass(Register R,
934 const APInt &DemandedElts,
935 FPClassTest InterestedClasses,
936 KnownFPClass &Known,
937 unsigned Depth) {
938 assert(Known.isUnknown() && "should not be called with known information");
939
940 if (!DemandedElts) {
941 // No demanded elts, better to assume we don't know anything.
942 Known.resetAll();
943 return;
944 }
945
946 assert(Depth <= MaxAnalysisRecursionDepth && "Limit Search Depth");
947
948 MachineInstr &MI = *MRI.getVRegDef(R);
949 unsigned Opcode = MI.getOpcode();
950 LLT DstTy = MRI.getType(R);
951
952 if (!DstTy.isValid()) {
953 Known.resetAll();
954 return;
955 }
956
957 if (auto Cst = GFConstant::getConstant(R, MRI)) {
958 switch (Cst->getKind()) {
960 auto APF = Cst->getScalarValue();
961 Known.KnownFPClasses = APF.classify();
962 Known.SignBit = APF.isNegative();
963 break;
964 }
966 Known.KnownFPClasses = fcNone;
967 bool SignBitAllZero = true;
968 bool SignBitAllOne = true;
969
970 for (auto C : *Cst) {
971 Known.KnownFPClasses |= C.classify();
972 if (C.isNegative())
973 SignBitAllZero = false;
974 else
975 SignBitAllOne = false;
976 }
977
978 if (SignBitAllOne != SignBitAllZero)
979 Known.SignBit = SignBitAllOne;
980
981 break;
982 }
984 Known.resetAll();
985 break;
986 }
987 }
988
989 return;
990 }
991
992 FPClassTest KnownNotFromFlags = fcNone;
994 KnownNotFromFlags |= fcNan;
996 KnownNotFromFlags |= fcInf;
997
998 // We no longer need to find out about these bits from inputs if we can
999 // assume this from flags/attributes.
1000 InterestedClasses &= ~KnownNotFromFlags;
1001
1002 llvm::scope_exit ClearClassesFromFlags(
1003 [=, &Known] { Known.knownNot(KnownNotFromFlags); });
1004
1005 // All recursive calls that increase depth must come after this.
1007 return;
1008
1009 const MachineFunction *MF = MI.getMF();
1010
1011 switch (Opcode) {
1012 default:
1013 TL.computeKnownFPClassForTargetInstr(*this, R, Known, DemandedElts, MRI,
1014 Depth);
1015 break;
1016 case TargetOpcode::G_FNEG: {
1017 Register Val = MI.getOperand(1).getReg();
1018 computeKnownFPClass(Val, DemandedElts, InterestedClasses, Known, Depth + 1);
1019 Known.fneg();
1020 break;
1021 }
1022 case TargetOpcode::G_SELECT: {
1023 GSelect &SelMI = cast<GSelect>(MI);
1024 Register Cond = SelMI.getCondReg();
1025 Register LHS = SelMI.getTrueReg();
1026 Register RHS = SelMI.getFalseReg();
1027
1028 FPClassTest FilterLHS = fcAllFlags;
1029 FPClassTest FilterRHS = fcAllFlags;
1030
1031 Register TestedValue;
1032 FPClassTest MaskIfTrue = fcAllFlags;
1033 FPClassTest MaskIfFalse = fcAllFlags;
1034 FPClassTest ClassVal = fcNone;
1035
1036 CmpInst::Predicate Pred;
1037 Register CmpLHS, CmpRHS;
1038 if (mi_match(Cond, MRI,
1039 m_GFCmp(m_Pred(Pred), m_Reg(CmpLHS), m_Reg(CmpRHS)))) {
1040 // If the select filters out a value based on the class, it no longer
1041 // participates in the class of the result
1042
1043 // TODO: In some degenerate cases we can infer something if we try again
1044 // without looking through sign operations.
1045 bool LookThroughFAbsFNeg = CmpLHS != LHS && CmpLHS != RHS;
1046 std::tie(TestedValue, MaskIfTrue, MaskIfFalse) =
1047 fcmpImpliesClass(Pred, *MF, CmpLHS, CmpRHS, LookThroughFAbsFNeg);
1048 } else if (mi_match(
1049 Cond, MRI,
1050 m_GIsFPClass(m_Reg(TestedValue), m_FPClassTest(ClassVal)))) {
1051 FPClassTest TestedMask = ClassVal;
1052 MaskIfTrue = TestedMask;
1053 MaskIfFalse = ~TestedMask;
1054 }
1055
1056 if (TestedValue == LHS) {
1057 // match !isnan(x) ? x : y
1058 FilterLHS = MaskIfTrue;
1059 } else if (TestedValue == RHS) { // && IsExactClass
1060 // match !isnan(x) ? y : x
1061 FilterRHS = MaskIfFalse;
1062 }
1063
1064 KnownFPClass Known2;
1065 computeKnownFPClass(LHS, DemandedElts, InterestedClasses & FilterLHS, Known,
1066 Depth + 1);
1067 Known.KnownFPClasses &= FilterLHS;
1068
1069 computeKnownFPClass(RHS, DemandedElts, InterestedClasses & FilterRHS,
1070 Known2, Depth + 1);
1071 Known2.KnownFPClasses &= FilterRHS;
1072
1073 Known |= Known2;
1074 break;
1075 }
1076 case TargetOpcode::G_FCOPYSIGN: {
1077 Register Magnitude = MI.getOperand(1).getReg();
1078 Register Sign = MI.getOperand(2).getReg();
1079
1080 KnownFPClass KnownSign;
1081
1082 computeKnownFPClass(Magnitude, DemandedElts, InterestedClasses, Known,
1083 Depth + 1);
1084 computeKnownFPClass(Sign, DemandedElts, InterestedClasses, KnownSign,
1085 Depth + 1);
1086 Known.copysign(KnownSign);
1087 break;
1088 }
1089 case TargetOpcode::G_FMA:
1090 case TargetOpcode::G_STRICT_FMA:
1091 case TargetOpcode::G_FMAD: {
1092 if ((InterestedClasses & fcNegative) == fcNone)
1093 break;
1094
1095 Register A = MI.getOperand(1).getReg();
1096 Register B = MI.getOperand(2).getReg();
1097 Register C = MI.getOperand(3).getReg();
1098
1099 if (A != B)
1100 break;
1101
1102 // The multiply cannot be -0 and therefore the add can't be -0
1103 Known.knownNot(fcNegZero);
1104
1105 // x * x + y is non-negative if y is non-negative.
1106 KnownFPClass KnownAddend;
1107 computeKnownFPClass(C, DemandedElts, InterestedClasses, KnownAddend,
1108 Depth + 1);
1109
1110 if (KnownAddend.cannotBeOrderedLessThanZero())
1111 Known.knownNot(fcNegative);
1112 break;
1113 }
1114 case TargetOpcode::G_FSQRT:
1115 case TargetOpcode::G_STRICT_FSQRT: {
1116 KnownFPClass KnownSrc;
1117 FPClassTest InterestedSrcs = InterestedClasses;
1118 if (InterestedClasses & fcNan)
1119 InterestedSrcs |= KnownFPClass::OrderedLessThanZeroMask;
1120
1121 Register Val = MI.getOperand(1).getReg();
1122
1123 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc, Depth + 1);
1124
1125 if (KnownSrc.isKnownNeverPosInfinity())
1126 Known.knownNot(fcPosInf);
1127 if (KnownSrc.isKnownNever(fcSNan))
1128 Known.knownNot(fcSNan);
1129
1130 // Any negative value besides -0 returns a nan.
1131 if (KnownSrc.isKnownNeverNaN() && KnownSrc.cannotBeOrderedLessThanZero())
1132 Known.knownNot(fcNan);
1133
1134 // The only negative value that can be returned is -0 for -0 inputs.
1136 break;
1137 }
1138 case TargetOpcode::G_FABS: {
1139 if ((InterestedClasses & (fcNan | fcPositive)) != fcNone) {
1140 Register Val = MI.getOperand(1).getReg();
1141 // If we only care about the sign bit we don't need to inspect the
1142 // operand.
1143 computeKnownFPClass(Val, DemandedElts, InterestedClasses, Known,
1144 Depth + 1);
1145 }
1146 Known.fabs();
1147 break;
1148 }
1149 case TargetOpcode::G_FSIN:
1150 case TargetOpcode::G_FCOS:
1151 case TargetOpcode::G_FSINCOS: {
1152 // Return NaN on infinite inputs.
1153 Register Val = MI.getOperand(1).getReg();
1154 KnownFPClass KnownSrc;
1155
1156 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1157 Depth + 1);
1158 Known.knownNot(fcInf);
1159
1160 if (KnownSrc.isKnownNeverNaN() && KnownSrc.isKnownNeverInfinity())
1161 Known.knownNot(fcNan);
1162 break;
1163 }
1164 case TargetOpcode::G_FMAXNUM:
1165 case TargetOpcode::G_FMINNUM:
1166 case TargetOpcode::G_FMINNUM_IEEE:
1167 case TargetOpcode::G_FMAXIMUM:
1168 case TargetOpcode::G_FMINIMUM:
1169 case TargetOpcode::G_FMAXNUM_IEEE:
1170 case TargetOpcode::G_FMAXIMUMNUM:
1171 case TargetOpcode::G_FMINIMUMNUM: {
1172 Register LHS = MI.getOperand(1).getReg();
1173 Register RHS = MI.getOperand(2).getReg();
1174 KnownFPClass KnownLHS, KnownRHS;
1175
1176 computeKnownFPClass(LHS, DemandedElts, InterestedClasses, KnownLHS,
1177 Depth + 1);
1178 computeKnownFPClass(RHS, DemandedElts, InterestedClasses, KnownRHS,
1179 Depth + 1);
1180
1181 bool NeverNaN = KnownLHS.isKnownNeverNaN() || KnownRHS.isKnownNeverNaN();
1182 Known = KnownLHS | KnownRHS;
1183
1184 // If either operand is not NaN, the result is not NaN.
1185 if (NeverNaN && (Opcode == TargetOpcode::G_FMINNUM ||
1186 Opcode == TargetOpcode::G_FMAXNUM ||
1187 Opcode == TargetOpcode::G_FMINIMUMNUM ||
1188 Opcode == TargetOpcode::G_FMAXIMUMNUM))
1189 Known.knownNot(fcNan);
1190
1191 if (Opcode == TargetOpcode::G_FMAXNUM ||
1192 Opcode == TargetOpcode::G_FMAXIMUMNUM ||
1193 Opcode == TargetOpcode::G_FMAXNUM_IEEE) {
1194 // If at least one operand is known to be positive, the result must be
1195 // positive.
1196 if ((KnownLHS.cannotBeOrderedLessThanZero() &&
1197 KnownLHS.isKnownNeverNaN()) ||
1198 (KnownRHS.cannotBeOrderedLessThanZero() &&
1199 KnownRHS.isKnownNeverNaN()))
1201 } else if (Opcode == TargetOpcode::G_FMAXIMUM) {
1202 // If at least one operand is known to be positive, the result must be
1203 // positive.
1204 if (KnownLHS.cannotBeOrderedLessThanZero() ||
1205 KnownRHS.cannotBeOrderedLessThanZero())
1207 } else if (Opcode == TargetOpcode::G_FMINNUM ||
1208 Opcode == TargetOpcode::G_FMINIMUMNUM ||
1209 Opcode == TargetOpcode::G_FMINNUM_IEEE) {
1210 // If at least one operand is known to be negative, the result must be
1211 // negative.
1212 if ((KnownLHS.cannotBeOrderedGreaterThanZero() &&
1213 KnownLHS.isKnownNeverNaN()) ||
1214 (KnownRHS.cannotBeOrderedGreaterThanZero() &&
1215 KnownRHS.isKnownNeverNaN()))
1217 } else if (Opcode == TargetOpcode::G_FMINIMUM) {
1218 // If at least one operand is known to be negative, the result must be
1219 // negative.
1220 if (KnownLHS.cannotBeOrderedGreaterThanZero() ||
1223 } else {
1224 llvm_unreachable("unhandled intrinsic");
1225 }
1226
1227 // Fixup zero handling if denormals could be returned as a zero.
1228 //
1229 // As there's no spec for denormal flushing, be conservative with the
1230 // treatment of denormals that could be flushed to zero. For older
1231 // subtargets on AMDGPU the min/max instructions would not flush the
1232 // output and return the original value.
1233 //
1234 if ((Known.KnownFPClasses & fcZero) != fcNone &&
1235 !Known.isKnownNeverSubnormal()) {
1236 DenormalMode Mode =
1237 MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType()));
1238 if (Mode != DenormalMode::getIEEE())
1239 Known.KnownFPClasses |= fcZero;
1240 }
1241
1242 if (Known.isKnownNeverNaN()) {
1243 if (KnownLHS.SignBit && KnownRHS.SignBit &&
1244 *KnownLHS.SignBit == *KnownRHS.SignBit) {
1245 if (*KnownLHS.SignBit)
1246 Known.signBitMustBeOne();
1247 else
1248 Known.signBitMustBeZero();
1249 } else if ((Opcode == TargetOpcode::G_FMAXIMUM ||
1250 Opcode == TargetOpcode::G_FMINIMUM) ||
1251 Opcode == TargetOpcode::G_FMAXIMUMNUM ||
1252 Opcode == TargetOpcode::G_FMINIMUMNUM ||
1253 Opcode == TargetOpcode::G_FMAXNUM_IEEE ||
1254 Opcode == TargetOpcode::G_FMINNUM_IEEE ||
1255 // FIXME: Should be using logical zero versions
1256 ((KnownLHS.isKnownNeverNegZero() ||
1257 KnownRHS.isKnownNeverPosZero()) &&
1258 (KnownLHS.isKnownNeverPosZero() ||
1259 KnownRHS.isKnownNeverNegZero()))) {
1260 if ((Opcode == TargetOpcode::G_FMAXIMUM ||
1261 Opcode == TargetOpcode::G_FMAXNUM ||
1262 Opcode == TargetOpcode::G_FMAXIMUMNUM ||
1263 Opcode == TargetOpcode::G_FMAXNUM_IEEE) &&
1264 (KnownLHS.SignBit == false || KnownRHS.SignBit == false))
1265 Known.signBitMustBeZero();
1266 else if ((Opcode == TargetOpcode::G_FMINIMUM ||
1267 Opcode == TargetOpcode::G_FMINNUM ||
1268 Opcode == TargetOpcode::G_FMINIMUMNUM ||
1269 Opcode == TargetOpcode::G_FMINNUM_IEEE) &&
1270 (KnownLHS.SignBit == true || KnownRHS.SignBit == true))
1271 Known.signBitMustBeOne();
1272 }
1273 }
1274 break;
1275 }
1276 case TargetOpcode::G_FCANONICALIZE: {
1277 Register Val = MI.getOperand(1).getReg();
1278 KnownFPClass KnownSrc;
1279 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1280 Depth + 1);
1281
1282 // This is essentially a stronger form of
1283 // propagateCanonicalizingSrc. Other "canonicalizing" operations don't
1284 // actually have an IR canonicalization guarantee.
1285
1286 // Canonicalize may flush denormals to zero, so we have to consider the
1287 // denormal mode to preserve known-not-0 knowledge.
1288 Known.KnownFPClasses = KnownSrc.KnownFPClasses | fcZero | fcQNan;
1289
1290 // Stronger version of propagateNaN
1291 // Canonicalize is guaranteed to quiet signaling nans.
1292 if (KnownSrc.isKnownNeverNaN())
1293 Known.knownNot(fcNan);
1294 else
1295 Known.knownNot(fcSNan);
1296
1297 // If the parent function flushes denormals, the canonical output cannot
1298 // be a denormal.
1299 LLT Ty = MRI.getType(Val).getScalarType();
1300 const fltSemantics &FPType = getFltSemanticForLLT(Ty);
1301 DenormalMode DenormMode = MF->getDenormalMode(FPType);
1302 if (DenormMode == DenormalMode::getIEEE()) {
1303 if (KnownSrc.isKnownNever(fcPosZero))
1304 Known.knownNot(fcPosZero);
1305 if (KnownSrc.isKnownNever(fcNegZero))
1306 Known.knownNot(fcNegZero);
1307 break;
1308 }
1309
1310 if (DenormMode.inputsAreZero() || DenormMode.outputsAreZero())
1311 Known.knownNot(fcSubnormal);
1312
1313 if (DenormMode.Input == DenormalMode::PositiveZero ||
1314 (DenormMode.Output == DenormalMode::PositiveZero &&
1315 DenormMode.Input == DenormalMode::IEEE))
1316 Known.knownNot(fcNegZero);
1317
1318 break;
1319 }
1320 case TargetOpcode::G_VECREDUCE_FMAX:
1321 case TargetOpcode::G_VECREDUCE_FMIN:
1322 case TargetOpcode::G_VECREDUCE_FMAXIMUM:
1323 case TargetOpcode::G_VECREDUCE_FMINIMUM: {
1324 Register Val = MI.getOperand(1).getReg();
1325 // reduce min/max will choose an element from one of the vector elements,
1326 // so we can infer and class information that is common to all elements.
1327
1328 Known =
1329 computeKnownFPClass(Val, MI.getFlags(), InterestedClasses, Depth + 1);
1330 // Can only propagate sign if output is never NaN.
1331 if (!Known.isKnownNeverNaN())
1332 Known.SignBit.reset();
1333 break;
1334 }
1335 case TargetOpcode::G_TRUNC:
1336 case TargetOpcode::G_FFLOOR:
1337 case TargetOpcode::G_FCEIL:
1338 case TargetOpcode::G_FRINT:
1339 case TargetOpcode::G_FNEARBYINT:
1340 case TargetOpcode::G_INTRINSIC_FPTRUNC_ROUND:
1341 case TargetOpcode::G_INTRINSIC_ROUND: {
1342 Register Val = MI.getOperand(1).getReg();
1343 KnownFPClass KnownSrc;
1344 FPClassTest InterestedSrcs = InterestedClasses;
1345 if (InterestedSrcs & fcPosFinite)
1346 InterestedSrcs |= fcPosFinite;
1347 if (InterestedSrcs & fcNegFinite)
1348 InterestedSrcs |= fcNegFinite;
1349 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc, Depth + 1);
1350
1351 // Integer results cannot be subnormal.
1352 Known.knownNot(fcSubnormal);
1353
1354 Known.propagateNaN(KnownSrc, true);
1355
1356 // TODO: handle multi unit FPTypes once LLT FPInfo lands
1357
1358 // Negative round ups to 0 produce -0
1359 if (KnownSrc.isKnownNever(fcPosFinite))
1360 Known.knownNot(fcPosFinite);
1361 if (KnownSrc.isKnownNever(fcNegFinite))
1362 Known.knownNot(fcNegFinite);
1363
1364 break;
1365 }
1366 case TargetOpcode::G_FEXP:
1367 case TargetOpcode::G_FEXP2:
1368 case TargetOpcode::G_FEXP10: {
1369 Known.knownNot(fcNegative);
1370 if ((InterestedClasses & fcNan) == fcNone)
1371 break;
1372
1373 Register Val = MI.getOperand(1).getReg();
1374 KnownFPClass KnownSrc;
1375 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1376 Depth + 1);
1377 if (KnownSrc.isKnownNeverNaN()) {
1378 Known.knownNot(fcNan);
1379 Known.signBitMustBeZero();
1380 }
1381
1382 break;
1383 }
1384 case TargetOpcode::G_FLOG:
1385 case TargetOpcode::G_FLOG2:
1386 case TargetOpcode::G_FLOG10: {
1387 // log(+inf) -> +inf
1388 // log([+-]0.0) -> -inf
1389 // log(-inf) -> nan
1390 // log(-x) -> nan
1391 if ((InterestedClasses & (fcNan | fcInf)) == fcNone)
1392 break;
1393
1394 FPClassTest InterestedSrcs = InterestedClasses;
1395 if ((InterestedClasses & fcNegInf) != fcNone)
1396 InterestedSrcs |= fcZero | fcSubnormal;
1397 if ((InterestedClasses & fcNan) != fcNone)
1398 InterestedSrcs |= fcNan | (fcNegative & ~fcNan);
1399
1400 Register Val = MI.getOperand(1).getReg();
1401 KnownFPClass KnownSrc;
1402 computeKnownFPClass(Val, DemandedElts, InterestedSrcs, KnownSrc, Depth + 1);
1403
1404 if (KnownSrc.isKnownNeverPosInfinity())
1405 Known.knownNot(fcPosInf);
1406
1407 if (KnownSrc.isKnownNeverNaN() && KnownSrc.cannotBeOrderedLessThanZero())
1408 Known.knownNot(fcNan);
1409
1410 LLT Ty = MRI.getType(Val).getScalarType();
1411 const fltSemantics &FltSem = getFltSemanticForLLT(Ty);
1412 DenormalMode Mode = MF->getDenormalMode(FltSem);
1413
1414 if (KnownSrc.isKnownNeverLogicalZero(Mode))
1415 Known.knownNot(fcNegInf);
1416
1417 break;
1418 }
1419 case TargetOpcode::G_FPOWI: {
1420 if ((InterestedClasses & fcNegative) == fcNone)
1421 break;
1422
1423 Register Exp = MI.getOperand(2).getReg();
1424 LLT ExpTy = MRI.getType(Exp);
1425 KnownBits ExponentKnownBits = getKnownBits(
1426 Exp, ExpTy.isVector() ? DemandedElts : APInt(1, 1), Depth + 1);
1427
1428 if (ExponentKnownBits.Zero[0]) { // Is even
1429 Known.knownNot(fcNegative);
1430 break;
1431 }
1432
1433 // Given that exp is an integer, here are the
1434 // ways that pow can return a negative value:
1435 //
1436 // pow(-x, exp) --> negative if exp is odd and x is negative.
1437 // pow(-0, exp) --> -inf if exp is negative odd.
1438 // pow(-0, exp) --> -0 if exp is positive odd.
1439 // pow(-inf, exp) --> -0 if exp is negative odd.
1440 // pow(-inf, exp) --> -inf if exp is positive odd.
1441 Register Val = MI.getOperand(1).getReg();
1442 KnownFPClass KnownSrc;
1443 computeKnownFPClass(Val, DemandedElts, fcNegative, KnownSrc, Depth + 1);
1444 if (KnownSrc.isKnownNever(fcNegative))
1445 Known.knownNot(fcNegative);
1446 break;
1447 }
1448 case TargetOpcode::G_FLDEXP:
1449 case TargetOpcode::G_STRICT_FLDEXP: {
1450 Register Val = MI.getOperand(1).getReg();
1451 KnownFPClass KnownSrc;
1452 computeKnownFPClass(Val, DemandedElts, InterestedClasses, KnownSrc,
1453 Depth + 1);
1454 Known.propagateNaN(KnownSrc, /*PropagateSign=*/true);
1455
1456 // Sign is preserved, but underflows may produce zeroes.
1457 if (KnownSrc.isKnownNever(fcNegative))
1458 Known.knownNot(fcNegative);
1459 else if (KnownSrc.cannotBeOrderedLessThanZero())
1461
1462 if (KnownSrc.isKnownNever(fcPositive))
1463 Known.knownNot(fcPositive);
1464 else if (KnownSrc.cannotBeOrderedGreaterThanZero())
1466
1467 // Can refine inf/zero handling based on the exponent operand.
1468 const FPClassTest ExpInfoMask = fcZero | fcSubnormal | fcInf;
1469 if ((InterestedClasses & ExpInfoMask) == fcNone)
1470 break;
1471 if ((KnownSrc.KnownFPClasses & ExpInfoMask) == fcNone)
1472 break;
1473
1474 // TODO: Handle constant range of Exp
1475
1476 break;
1477 }
1478 case TargetOpcode::G_INTRINSIC_ROUNDEVEN: {
1479 computeKnownFPClassForFPTrunc(MI, DemandedElts, InterestedClasses, Known,
1480 Depth);
1481 break;
1482 }
1483 case TargetOpcode::G_FADD:
1484 case TargetOpcode::G_STRICT_FADD:
1485 case TargetOpcode::G_FSUB:
1486 case TargetOpcode::G_STRICT_FSUB: {
1487 Register LHS = MI.getOperand(1).getReg();
1488 Register RHS = MI.getOperand(2).getReg();
1489 KnownFPClass KnownLHS, KnownRHS;
1490 bool WantNegative =
1491 (Opcode == TargetOpcode::G_FADD ||
1492 Opcode == TargetOpcode::G_STRICT_FADD) &&
1493 (InterestedClasses & KnownFPClass::OrderedLessThanZeroMask) != fcNone;
1494 bool WantNaN = (InterestedClasses & fcNan) != fcNone;
1495 bool WantNegZero = (InterestedClasses & fcNegZero) != fcNone;
1496
1497 if (!WantNaN && !WantNegative && !WantNegZero)
1498 break;
1499
1500 FPClassTest InterestedSrcs = InterestedClasses;
1501 if (WantNegative)
1502 InterestedSrcs |= KnownFPClass::OrderedLessThanZeroMask;
1503 if (InterestedClasses & fcNan)
1504 InterestedSrcs |= fcInf;
1505 computeKnownFPClass(RHS, DemandedElts, InterestedSrcs, KnownRHS, Depth + 1);
1506
1507 if ((WantNaN && KnownRHS.isKnownNeverNaN()) ||
1508 (WantNegative && KnownRHS.cannotBeOrderedLessThanZero()) ||
1509 WantNegZero ||
1510 (Opcode == TargetOpcode::G_FSUB ||
1511 Opcode == TargetOpcode::G_STRICT_FSUB)) {
1512
1513 // RHS is canonically cheaper to compute. Skip inspecting the LHS if
1514 // there's no point.
1515 computeKnownFPClass(LHS, DemandedElts, InterestedSrcs, KnownLHS,
1516 Depth + 1);
1517 // Adding positive and negative infinity produces NaN.
1518 // TODO: Check sign of infinities.
1519 if (KnownLHS.isKnownNeverNaN() && KnownRHS.isKnownNeverNaN() &&
1520 (KnownLHS.isKnownNeverInfinity() || KnownRHS.isKnownNeverInfinity()))
1521 Known.knownNot(fcNan);
1522
1523 if (Opcode == TargetOpcode::G_FADD ||
1524 Opcode == TargetOpcode::G_STRICT_FADD) {
1525 if (KnownLHS.cannotBeOrderedLessThanZero() &&
1526 KnownRHS.cannotBeOrderedLessThanZero())
1528
1529 // (fadd x, 0.0) is guaranteed to return +0.0, not -0.0.
1530 if ((KnownLHS.isKnownNeverLogicalNegZero(MF->getDenormalMode(
1532 KnownRHS.isKnownNeverLogicalNegZero(MF->getDenormalMode(
1533 getFltSemanticForLLT(DstTy.getScalarType())))) &&
1534 // Make sure output negative denormal can't flush to -0
1536 Known.knownNot(fcNegZero);
1537 } else {
1538 // Only fsub -0, +0 can return -0
1539 if ((KnownLHS.isKnownNeverLogicalNegZero(MF->getDenormalMode(
1541 KnownRHS.isKnownNeverLogicalPosZero(MF->getDenormalMode(
1542 getFltSemanticForLLT(DstTy.getScalarType())))) &&
1543 // Make sure output negative denormal can't flush to -0
1545 Known.knownNot(fcNegZero);
1546 }
1547 }
1548
1549 break;
1550 }
1551 case TargetOpcode::G_FMUL:
1552 case TargetOpcode::G_STRICT_FMUL: {
1553 Register LHS = MI.getOperand(1).getReg();
1554 Register RHS = MI.getOperand(2).getReg();
1555 // X * X is always non-negative or a NaN.
1556 if (LHS == RHS)
1557 Known.knownNot(fcNegative);
1558
1559 if ((InterestedClasses & fcNan) != fcNan)
1560 break;
1561
1562 // fcSubnormal is only needed in case of DAZ.
1563 const FPClassTest NeedForNan = fcNan | fcInf | fcZero | fcSubnormal;
1564
1565 KnownFPClass KnownLHS, KnownRHS;
1566 computeKnownFPClass(RHS, DemandedElts, NeedForNan, KnownRHS, Depth + 1);
1567 if (!KnownRHS.isKnownNeverNaN())
1568 break;
1569
1570 computeKnownFPClass(LHS, DemandedElts, NeedForNan, KnownLHS, Depth + 1);
1571 if (!KnownLHS.isKnownNeverNaN())
1572 break;
1573
1574 if (KnownLHS.SignBit && KnownRHS.SignBit) {
1575 if (*KnownLHS.SignBit == *KnownRHS.SignBit)
1576 Known.signBitMustBeZero();
1577 else
1578 Known.signBitMustBeOne();
1579 }
1580
1581 // If 0 * +/-inf produces NaN.
1582 if (KnownLHS.isKnownNeverInfinity() && KnownRHS.isKnownNeverInfinity()) {
1583 Known.knownNot(fcNan);
1584 break;
1585 }
1586
1587 if ((KnownRHS.isKnownNeverInfinity() ||
1588 KnownLHS.isKnownNeverLogicalZero(MF->getDenormalMode(
1589 getFltSemanticForLLT(DstTy.getScalarType())))) &&
1590 (KnownLHS.isKnownNeverInfinity() ||
1591 KnownRHS.isKnownNeverLogicalZero(
1592 MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType())))))
1593 Known.knownNot(fcNan);
1594
1595 break;
1596 }
1597 case TargetOpcode::G_FDIV:
1598 case TargetOpcode::G_FREM: {
1599 Register LHS = MI.getOperand(1).getReg();
1600 Register RHS = MI.getOperand(2).getReg();
1601
1602 if (LHS == RHS) {
1603 // TODO: Could filter out snan if we inspect the operand
1604 if (Opcode == TargetOpcode::G_FDIV) {
1605 // X / X is always exactly 1.0 or a NaN.
1607 } else {
1608 // X % X is always exactly [+-]0.0 or a NaN.
1609 Known.KnownFPClasses = fcNan | fcZero;
1610 }
1611
1612 break;
1613 }
1614
1615 const bool WantNan = (InterestedClasses & fcNan) != fcNone;
1616 const bool WantNegative = (InterestedClasses & fcNegative) != fcNone;
1617 const bool WantPositive = Opcode == TargetOpcode::G_FREM &&
1618 (InterestedClasses & fcPositive) != fcNone;
1619 if (!WantNan && !WantNegative && !WantPositive)
1620 break;
1621
1622 KnownFPClass KnownLHS, KnownRHS;
1623
1624 computeKnownFPClass(RHS, DemandedElts, fcNan | fcInf | fcZero | fcNegative,
1625 KnownRHS, Depth + 1);
1626
1627 bool KnowSomethingUseful =
1628 KnownRHS.isKnownNeverNaN() || KnownRHS.isKnownNever(fcNegative);
1629
1630 if (KnowSomethingUseful || WantPositive) {
1631 const FPClassTest InterestedLHS =
1632 WantPositive ? fcAllFlags
1634
1635 computeKnownFPClass(LHS, DemandedElts, InterestedClasses & InterestedLHS,
1636 KnownLHS, Depth + 1);
1637 }
1638
1639 if (Opcode == TargetOpcode::G_FDIV) {
1640 // Only 0/0, Inf/Inf produce NaN.
1641 if (KnownLHS.isKnownNeverNaN() && KnownRHS.isKnownNeverNaN() &&
1642 (KnownLHS.isKnownNeverInfinity() ||
1643 KnownRHS.isKnownNeverInfinity()) &&
1644 ((KnownLHS.isKnownNeverLogicalZero(MF->getDenormalMode(
1645 getFltSemanticForLLT(DstTy.getScalarType())))) ||
1646 (KnownRHS.isKnownNeverLogicalZero(MF->getDenormalMode(
1647 getFltSemanticForLLT(DstTy.getScalarType())))))) {
1648 Known.knownNot(fcNan);
1649 }
1650
1651 // X / -0.0 is -Inf (or NaN).
1652 // +X / +X is +X
1653 if (KnownLHS.isKnownNever(fcNegative) &&
1654 KnownRHS.isKnownNever(fcNegative))
1655 Known.knownNot(fcNegative);
1656 } else {
1657 // Inf REM x and x REM 0 produce NaN.
1658 if (KnownLHS.isKnownNeverNaN() && KnownRHS.isKnownNeverNaN() &&
1659 KnownLHS.isKnownNeverInfinity() &&
1660 KnownRHS.isKnownNeverLogicalZero(MF->getDenormalMode(
1662 Known.knownNot(fcNan);
1663 }
1664
1665 // The sign for frem is the same as the first operand.
1666 if (KnownLHS.cannotBeOrderedLessThanZero())
1668 if (KnownLHS.cannotBeOrderedGreaterThanZero())
1670
1671 // See if we can be more aggressive about the sign of 0.
1672 if (KnownLHS.isKnownNever(fcNegative))
1673 Known.knownNot(fcNegative);
1674 if (KnownLHS.isKnownNever(fcPositive))
1675 Known.knownNot(fcPositive);
1676 }
1677
1678 break;
1679 }
1680 case TargetOpcode::G_FPEXT: {
1681 Register Dst = MI.getOperand(0).getReg();
1682 Register Src = MI.getOperand(1).getReg();
1683 // Infinity, nan and zero propagate from source.
1684 computeKnownFPClass(R, DemandedElts, InterestedClasses, Known, Depth + 1);
1685
1686 LLT DstTy = MRI.getType(Dst).getScalarType();
1687 const fltSemantics &DstSem = getFltSemanticForLLT(DstTy);
1688 LLT SrcTy = MRI.getType(Src).getScalarType();
1689 const fltSemantics &SrcSem = getFltSemanticForLLT(SrcTy);
1690
1691 // All subnormal inputs should be in the normal range in the result type.
1692 if (APFloat::isRepresentableAsNormalIn(SrcSem, DstSem)) {
1693 if (Known.KnownFPClasses & fcPosSubnormal)
1694 Known.KnownFPClasses |= fcPosNormal;
1695 if (Known.KnownFPClasses & fcNegSubnormal)
1696 Known.KnownFPClasses |= fcNegNormal;
1697 Known.knownNot(fcSubnormal);
1698 }
1699
1700 // Sign bit of a nan isn't guaranteed.
1701 if (!Known.isKnownNeverNaN())
1702 Known.SignBit = std::nullopt;
1703 break;
1704 }
1705 case TargetOpcode::G_FPTRUNC: {
1706 computeKnownFPClassForFPTrunc(MI, DemandedElts, InterestedClasses, Known,
1707 Depth);
1708 break;
1709 }
1710 case TargetOpcode::G_SITOFP:
1711 case TargetOpcode::G_UITOFP: {
1712 // Cannot produce nan
1713 Known.knownNot(fcNan);
1714
1715 // Integers cannot be subnormal
1716 Known.knownNot(fcSubnormal);
1717
1718 // sitofp and uitofp turn into +0.0 for zero.
1719 Known.knownNot(fcNegZero);
1720 if (Opcode == TargetOpcode::G_UITOFP)
1721 Known.signBitMustBeZero();
1722
1723 Register Val = MI.getOperand(1).getReg();
1724 LLT Ty = MRI.getType(Val);
1725
1726 if (InterestedClasses & fcInf) {
1727 // Get width of largest magnitude integer (remove a bit if signed).
1728 // This still works for a signed minimum value because the largest FP
1729 // value is scaled by some fraction close to 2.0 (1.0 + 0.xxxx).;
1730 int IntSize = Ty.getScalarSizeInBits();
1731 if (Opcode == TargetOpcode::G_SITOFP)
1732 --IntSize;
1733
1734 // If the exponent of the largest finite FP value can hold the largest
1735 // integer, the result of the cast must be finite.
1736 LLT FPTy = DstTy.getScalarType();
1737 const fltSemantics &FltSem = getFltSemanticForLLT(FPTy);
1738 if (ilogb(APFloat::getLargest(FltSem)) >= IntSize)
1739 Known.knownNot(fcInf);
1740 }
1741
1742 break;
1743 }
1744 // case TargetOpcode::G_MERGE_VALUES:
1745 case TargetOpcode::G_BUILD_VECTOR:
1746 case TargetOpcode::G_CONCAT_VECTORS: {
1747 GMergeLikeInstr &Merge = cast<GMergeLikeInstr>(MI);
1748
1749 if (!DstTy.isFixedVector())
1750 break;
1751
1752 bool First = true;
1753 for (unsigned Idx = 0; Idx < Merge.getNumSources(); ++Idx) {
1754 // We know the index we are inserting to, so clear it from Vec check.
1755 bool NeedsElt = DemandedElts[Idx];
1756
1757 // Do we demand the inserted element?
1758 if (NeedsElt) {
1759 Register Src = Merge.getSourceReg(Idx);
1760 if (First) {
1761 computeKnownFPClass(Src, Known, InterestedClasses, Depth + 1);
1762 First = false;
1763 } else {
1764 KnownFPClass Known2;
1765 computeKnownFPClass(Src, Known2, InterestedClasses, Depth + 1);
1766 Known |= Known2;
1767 }
1768
1769 // If we don't know any bits, early out.
1770 if (Known.isUnknown())
1771 break;
1772 }
1773 }
1774
1775 break;
1776 }
1777 case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
1778 // Look through extract element. If the index is non-constant or
1779 // out-of-range demand all elements, otherwise just the extracted
1780 // element.
1781 GExtractVectorElement &Extract = cast<GExtractVectorElement>(MI);
1782 Register Vec = Extract.getVectorReg();
1783 Register Idx = Extract.getIndexReg();
1784
1785 auto CIdx = getIConstantVRegVal(Idx, MRI);
1786
1787 LLT VecTy = MRI.getType(Vec);
1788
1789 if (VecTy.isFixedVector()) {
1790 unsigned NumElts = VecTy.getNumElements();
1791 APInt DemandedVecElts = APInt::getAllOnes(NumElts);
1792 if (CIdx && CIdx->ult(NumElts))
1793 DemandedVecElts = APInt::getOneBitSet(NumElts, CIdx->getZExtValue());
1794 return computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known,
1795 Depth + 1);
1796 }
1797
1798 break;
1799 }
1800 case TargetOpcode::G_INSERT_VECTOR_ELT: {
1801 GInsertVectorElement &Insert = cast<GInsertVectorElement>(MI);
1802 Register Vec = Insert.getVectorReg();
1803 Register Elt = Insert.getElementReg();
1804 Register Idx = Insert.getIndexReg();
1805
1806 LLT VecTy = MRI.getType(Vec);
1807
1808 if (VecTy.isScalableVector())
1809 return;
1810
1811 auto CIdx = getIConstantVRegVal(Idx, MRI);
1812
1813 unsigned NumElts = DemandedElts.getBitWidth();
1814 APInt DemandedVecElts = DemandedElts;
1815 bool NeedsElt = true;
1816 // If we know the index we are inserting to, clear it from Vec check.
1817 if (CIdx && CIdx->ult(NumElts)) {
1818 DemandedVecElts.clearBit(CIdx->getZExtValue());
1819 NeedsElt = DemandedElts[CIdx->getZExtValue()];
1820 }
1821
1822 // Do we demand the inserted element?
1823 if (NeedsElt) {
1824 computeKnownFPClass(Elt, Known, InterestedClasses, Depth + 1);
1825 // If we don't know any bits, early out.
1826 if (Known.isUnknown())
1827 break;
1828 } else {
1829 Known.KnownFPClasses = fcNone;
1830 }
1831
1832 // Do we need anymore elements from Vec?
1833 if (!DemandedVecElts.isZero()) {
1834 KnownFPClass Known2;
1835 computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known2,
1836 Depth + 1);
1837 Known |= Known2;
1838 }
1839
1840 break;
1841 }
1842 case TargetOpcode::G_SHUFFLE_VECTOR: {
1843 // For undef elements, we don't know anything about the common state of
1844 // the shuffle result.
1845 GShuffleVector &Shuf = cast<GShuffleVector>(MI);
1846 APInt DemandedLHS, DemandedRHS;
1847 if (DstTy.isScalableVector()) {
1848 assert(DemandedElts == APInt(1, 1));
1849 DemandedLHS = DemandedRHS = DemandedElts;
1850 } else {
1852 DemandedElts, DemandedLHS,
1853 DemandedRHS)) {
1854 Known.resetAll();
1855 return;
1856 }
1857 }
1858
1859 if (!!DemandedLHS) {
1860 Register LHS = Shuf.getSrc1Reg();
1861 computeKnownFPClass(LHS, DemandedLHS, InterestedClasses, Known,
1862 Depth + 1);
1863
1864 // If we don't know any bits, early out.
1865 if (Known.isUnknown())
1866 break;
1867 } else {
1868 Known.KnownFPClasses = fcNone;
1869 }
1870
1871 if (!!DemandedRHS) {
1872 KnownFPClass Known2;
1873 Register RHS = Shuf.getSrc2Reg();
1874 computeKnownFPClass(RHS, DemandedRHS, InterestedClasses, Known2,
1875 Depth + 1);
1876 Known |= Known2;
1877 }
1878 break;
1879 }
1880 case TargetOpcode::COPY: {
1881 Register Src = MI.getOperand(1).getReg();
1882
1883 if (!Src.isVirtual())
1884 return;
1885
1886 computeKnownFPClass(Src, DemandedElts, InterestedClasses, Known, Depth + 1);
1887 break;
1888 }
1889 }
1890}
1891
1893GISelValueTracking::computeKnownFPClass(Register R, const APInt &DemandedElts,
1894 FPClassTest InterestedClasses,
1895 unsigned Depth) {
1896 KnownFPClass KnownClasses;
1897 computeKnownFPClass(R, DemandedElts, InterestedClasses, KnownClasses, Depth);
1898 return KnownClasses;
1899}
1900
1901KnownFPClass GISelValueTracking::computeKnownFPClass(
1902 Register R, FPClassTest InterestedClasses, unsigned Depth) {
1903 KnownFPClass Known;
1904 computeKnownFPClass(R, Known, InterestedClasses, Depth);
1905 return Known;
1906}
1907
1908KnownFPClass GISelValueTracking::computeKnownFPClass(
1909 Register R, const APInt &DemandedElts, uint32_t Flags,
1910 FPClassTest InterestedClasses, unsigned Depth) {
1912 InterestedClasses &= ~fcNan;
1914 InterestedClasses &= ~fcInf;
1915
1916 KnownFPClass Result =
1917 computeKnownFPClass(R, DemandedElts, InterestedClasses, Depth);
1918
1920 Result.KnownFPClasses &= ~fcNan;
1922 Result.KnownFPClasses &= ~fcInf;
1923 return Result;
1924}
1925
1926KnownFPClass GISelValueTracking::computeKnownFPClass(
1927 Register R, uint32_t Flags, FPClassTest InterestedClasses, unsigned Depth) {
1928 LLT Ty = MRI.getType(R);
1929 APInt DemandedElts =
1930 Ty.isFixedVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1);
1931 return computeKnownFPClass(R, DemandedElts, Flags, InterestedClasses, Depth);
1932}
1933
1934/// Compute number of sign bits for the intersection of \p Src0 and \p Src1
1935unsigned GISelValueTracking::computeNumSignBitsMin(Register Src0, Register Src1,
1936 const APInt &DemandedElts,
1937 unsigned Depth) {
1938 // Test src1 first, since we canonicalize simpler expressions to the RHS.
1939 unsigned Src1SignBits = computeNumSignBits(Src1, DemandedElts, Depth);
1940 if (Src1SignBits == 1)
1941 return 1;
1942 return std::min(computeNumSignBits(Src0, DemandedElts, Depth), Src1SignBits);
1943}
1944
1945/// Compute the known number of sign bits with attached range metadata in the
1946/// memory operand. If this is an extending load, accounts for the behavior of
1947/// the high bits.
1949 unsigned TyBits) {
1950 const MDNode *Ranges = Ld->getRanges();
1951 if (!Ranges)
1952 return 1;
1953
1955 if (TyBits > CR.getBitWidth()) {
1956 switch (Ld->getOpcode()) {
1957 case TargetOpcode::G_SEXTLOAD:
1958 CR = CR.signExtend(TyBits);
1959 break;
1960 case TargetOpcode::G_ZEXTLOAD:
1961 CR = CR.zeroExtend(TyBits);
1962 break;
1963 default:
1964 break;
1965 }
1966 }
1967
1968 return std::min(CR.getSignedMin().getNumSignBits(),
1970}
1971
1973 const APInt &DemandedElts,
1974 unsigned Depth) {
1975 MachineInstr &MI = *MRI.getVRegDef(R);
1976 unsigned Opcode = MI.getOpcode();
1977
1978 if (Opcode == TargetOpcode::G_CONSTANT)
1979 return MI.getOperand(1).getCImm()->getValue().getNumSignBits();
1980
1981 if (Depth == getMaxDepth())
1982 return 1;
1983
1984 if (!DemandedElts)
1985 return 1; // No demanded elts, better to assume we don't know anything.
1986
1987 LLT DstTy = MRI.getType(R);
1988 const unsigned TyBits = DstTy.getScalarSizeInBits();
1989
1990 // Handle the case where this is called on a register that does not have a
1991 // type constraint. This is unlikely to occur except by looking through copies
1992 // but it is possible for the initial register being queried to be in this
1993 // state.
1994 if (!DstTy.isValid())
1995 return 1;
1996
1997 unsigned FirstAnswer = 1;
1998 switch (Opcode) {
1999 case TargetOpcode::COPY: {
2000 MachineOperand &Src = MI.getOperand(1);
2001 if (Src.getReg().isVirtual() && Src.getSubReg() == 0 &&
2002 MRI.getType(Src.getReg()).isValid()) {
2003 // Don't increment Depth for this one since we didn't do any work.
2004 return computeNumSignBits(Src.getReg(), DemandedElts, Depth);
2005 }
2006
2007 return 1;
2008 }
2009 case TargetOpcode::G_SEXT: {
2010 Register Src = MI.getOperand(1).getReg();
2011 LLT SrcTy = MRI.getType(Src);
2012 unsigned Tmp = DstTy.getScalarSizeInBits() - SrcTy.getScalarSizeInBits();
2013 return computeNumSignBits(Src, DemandedElts, Depth + 1) + Tmp;
2014 }
2015 case TargetOpcode::G_ASSERT_SEXT:
2016 case TargetOpcode::G_SEXT_INREG: {
2017 // Max of the input and what this extends.
2018 Register Src = MI.getOperand(1).getReg();
2019 unsigned SrcBits = MI.getOperand(2).getImm();
2020 unsigned InRegBits = TyBits - SrcBits + 1;
2021 return std::max(computeNumSignBits(Src, DemandedElts, Depth + 1),
2022 InRegBits);
2023 }
2024 case TargetOpcode::G_LOAD: {
2025 GLoad *Ld = cast<GLoad>(&MI);
2026 if (DemandedElts != 1 || !getDataLayout().isLittleEndian())
2027 break;
2028
2029 return computeNumSignBitsFromRangeMetadata(Ld, TyBits);
2030 }
2031 case TargetOpcode::G_SEXTLOAD: {
2033
2034 // FIXME: We need an in-memory type representation.
2035 if (DstTy.isVector())
2036 return 1;
2037
2038 unsigned NumBits = computeNumSignBitsFromRangeMetadata(Ld, TyBits);
2039 if (NumBits != 1)
2040 return NumBits;
2041
2042 // e.g. i16->i32 = '17' bits known.
2043 const MachineMemOperand *MMO = *MI.memoperands_begin();
2044 return TyBits - MMO->getSizeInBits().getValue() + 1;
2045 }
2046 case TargetOpcode::G_ZEXTLOAD: {
2048
2049 // FIXME: We need an in-memory type representation.
2050 if (DstTy.isVector())
2051 return 1;
2052
2053 unsigned NumBits = computeNumSignBitsFromRangeMetadata(Ld, TyBits);
2054 if (NumBits != 1)
2055 return NumBits;
2056
2057 // e.g. i16->i32 = '16' bits known.
2058 const MachineMemOperand *MMO = *MI.memoperands_begin();
2059 return TyBits - MMO->getSizeInBits().getValue();
2060 }
2061 case TargetOpcode::G_AND:
2062 case TargetOpcode::G_OR:
2063 case TargetOpcode::G_XOR: {
2064 Register Src1 = MI.getOperand(1).getReg();
2065 unsigned Src1NumSignBits =
2066 computeNumSignBits(Src1, DemandedElts, Depth + 1);
2067 if (Src1NumSignBits != 1) {
2068 Register Src2 = MI.getOperand(2).getReg();
2069 unsigned Src2NumSignBits =
2070 computeNumSignBits(Src2, DemandedElts, Depth + 1);
2071 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits);
2072 }
2073 break;
2074 }
2075 case TargetOpcode::G_ASHR: {
2076 Register Src1 = MI.getOperand(1).getReg();
2077 Register Src2 = MI.getOperand(2).getReg();
2078 FirstAnswer = computeNumSignBits(Src1, DemandedElts, Depth + 1);
2079 if (auto C = getValidMinimumShiftAmount(Src2, DemandedElts, Depth + 1))
2080 FirstAnswer = std::min<uint64_t>(FirstAnswer + *C, TyBits);
2081 break;
2082 }
2083 case TargetOpcode::G_SHL: {
2084 Register Src1 = MI.getOperand(1).getReg();
2085 Register Src2 = MI.getOperand(2).getReg();
2086 if (std::optional<ConstantRange> ShAmtRange =
2087 getValidShiftAmountRange(Src2, DemandedElts, Depth + 1)) {
2088 uint64_t MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
2089 uint64_t MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
2090
2091 MachineInstr &ExtMI = *MRI.getVRegDef(Src1);
2092 unsigned ExtOpc = ExtMI.getOpcode();
2093
2094 // Try to look through ZERO/SIGN/ANY_EXTEND. If all extended bits are
2095 // shifted out, then we can compute the number of sign bits for the
2096 // operand being extended. A future improvement could be to pass along the
2097 // "shifted left by" information in the recursive calls to
2098 // ComputeKnownSignBits. Allowing us to handle this more generically.
2099 if (ExtOpc == TargetOpcode::G_SEXT || ExtOpc == TargetOpcode::G_ZEXT ||
2100 ExtOpc == TargetOpcode::G_ANYEXT) {
2101 LLT ExtTy = MRI.getType(Src1);
2102 Register Extendee = ExtMI.getOperand(1).getReg();
2103 LLT ExtendeeTy = MRI.getType(Extendee);
2104 uint64_t SizeDiff =
2105 ExtTy.getScalarSizeInBits() - ExtendeeTy.getScalarSizeInBits();
2106
2107 if (SizeDiff <= MinShAmt) {
2108 unsigned Tmp =
2109 SizeDiff + computeNumSignBits(Extendee, DemandedElts, Depth + 1);
2110 if (MaxShAmt < Tmp)
2111 return Tmp - MaxShAmt;
2112 }
2113 }
2114 // shl destroys sign bits, ensure it doesn't shift out all sign bits.
2115 unsigned Tmp = computeNumSignBits(Src1, DemandedElts, Depth + 1);
2116 if (MaxShAmt < Tmp)
2117 return Tmp - MaxShAmt;
2118 }
2119 break;
2120 }
2121 case TargetOpcode::G_TRUNC: {
2122 Register Src = MI.getOperand(1).getReg();
2123 LLT SrcTy = MRI.getType(Src);
2124
2125 // Check if the sign bits of source go down as far as the truncated value.
2126 unsigned DstTyBits = DstTy.getScalarSizeInBits();
2127 unsigned NumSrcBits = SrcTy.getScalarSizeInBits();
2128 unsigned NumSrcSignBits = computeNumSignBits(Src, DemandedElts, Depth + 1);
2129 if (NumSrcSignBits > (NumSrcBits - DstTyBits))
2130 return NumSrcSignBits - (NumSrcBits - DstTyBits);
2131 break;
2132 }
2133 case TargetOpcode::G_SELECT: {
2134 return computeNumSignBitsMin(MI.getOperand(2).getReg(),
2135 MI.getOperand(3).getReg(), DemandedElts,
2136 Depth + 1);
2137 }
2138 case TargetOpcode::G_SMIN:
2139 case TargetOpcode::G_SMAX:
2140 case TargetOpcode::G_UMIN:
2141 case TargetOpcode::G_UMAX:
2142 // TODO: Handle clamp pattern with number of sign bits for SMIN/SMAX.
2143 return computeNumSignBitsMin(MI.getOperand(1).getReg(),
2144 MI.getOperand(2).getReg(), DemandedElts,
2145 Depth + 1);
2146 case TargetOpcode::G_SADDO:
2147 case TargetOpcode::G_SADDE:
2148 case TargetOpcode::G_UADDO:
2149 case TargetOpcode::G_UADDE:
2150 case TargetOpcode::G_SSUBO:
2151 case TargetOpcode::G_SSUBE:
2152 case TargetOpcode::G_USUBO:
2153 case TargetOpcode::G_USUBE:
2154 case TargetOpcode::G_SMULO:
2155 case TargetOpcode::G_UMULO: {
2156 // If compares returns 0/-1, all bits are sign bits.
2157 // We know that we have an integer-based boolean since these operations
2158 // are only available for integer.
2159 if (MI.getOperand(1).getReg() == R) {
2160 if (TL.getBooleanContents(DstTy.isVector(), false) ==
2162 return TyBits;
2163 }
2164
2165 break;
2166 }
2167 case TargetOpcode::G_SUB: {
2168 Register Src2 = MI.getOperand(2).getReg();
2169 unsigned Src2NumSignBits =
2170 computeNumSignBits(Src2, DemandedElts, Depth + 1);
2171 if (Src2NumSignBits == 1)
2172 return 1; // Early out.
2173
2174 // Handle NEG.
2175 Register Src1 = MI.getOperand(1).getReg();
2176 KnownBits Known1 = getKnownBits(Src1, DemandedElts, Depth);
2177 if (Known1.isZero()) {
2178 KnownBits Known2 = getKnownBits(Src2, DemandedElts, Depth);
2179 // If the input is known to be 0 or 1, the output is 0/-1, which is all
2180 // sign bits set.
2181 if ((Known2.Zero | 1).isAllOnes())
2182 return TyBits;
2183
2184 // If the input is known to be positive (the sign bit is known clear),
2185 // the output of the NEG has, at worst, the same number of sign bits as
2186 // the input.
2187 if (Known2.isNonNegative()) {
2188 FirstAnswer = Src2NumSignBits;
2189 break;
2190 }
2191
2192 // Otherwise, we treat this like a SUB.
2193 }
2194
2195 unsigned Src1NumSignBits =
2196 computeNumSignBits(Src1, DemandedElts, Depth + 1);
2197 if (Src1NumSignBits == 1)
2198 return 1; // Early Out.
2199
2200 // Sub can have at most one carry bit. Thus we know that the output
2201 // is, at worst, one more bit than the inputs.
2202 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2203 break;
2204 }
2205 case TargetOpcode::G_ADD: {
2206 Register Src2 = MI.getOperand(2).getReg();
2207 unsigned Src2NumSignBits =
2208 computeNumSignBits(Src2, DemandedElts, Depth + 1);
2209 if (Src2NumSignBits <= 2)
2210 return 1; // Early out.
2211
2212 Register Src1 = MI.getOperand(1).getReg();
2213 unsigned Src1NumSignBits =
2214 computeNumSignBits(Src1, DemandedElts, Depth + 1);
2215 if (Src1NumSignBits == 1)
2216 return 1; // Early Out.
2217
2218 // Special case decrementing a value (ADD X, -1):
2219 KnownBits Known2 = getKnownBits(Src2, DemandedElts, Depth);
2220 if (Known2.isAllOnes()) {
2221 KnownBits Known1 = getKnownBits(Src1, DemandedElts, Depth);
2222 // If the input is known to be 0 or 1, the output is 0/-1, which is all
2223 // sign bits set.
2224 if ((Known1.Zero | 1).isAllOnes())
2225 return TyBits;
2226
2227 // If we are subtracting one from a positive number, there is no carry
2228 // out of the result.
2229 if (Known1.isNonNegative()) {
2230 FirstAnswer = Src1NumSignBits;
2231 break;
2232 }
2233
2234 // Otherwise, we treat this like an ADD.
2235 }
2236
2237 // Add can have at most one carry bit. Thus we know that the output
2238 // is, at worst, one more bit than the inputs.
2239 FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
2240 break;
2241 }
2242 case TargetOpcode::G_FCMP:
2243 case TargetOpcode::G_ICMP: {
2244 bool IsFP = Opcode == TargetOpcode::G_FCMP;
2245 if (TyBits == 1)
2246 break;
2247 auto BC = TL.getBooleanContents(DstTy.isVector(), IsFP);
2249 return TyBits; // All bits are sign bits.
2251 return TyBits - 1; // Every always-zero bit is a sign bit.
2252 break;
2253 }
2254 case TargetOpcode::G_BUILD_VECTOR: {
2255 // Collect the known bits that are shared by every demanded vector element.
2256 FirstAnswer = TyBits;
2257 APInt SingleDemandedElt(1, 1);
2258 for (const auto &[I, MO] : enumerate(drop_begin(MI.operands()))) {
2259 if (!DemandedElts[I])
2260 continue;
2261
2262 unsigned Tmp2 =
2263 computeNumSignBits(MO.getReg(), SingleDemandedElt, Depth + 1);
2264 FirstAnswer = std::min(FirstAnswer, Tmp2);
2265
2266 // If we don't know any bits, early out.
2267 if (FirstAnswer == 1)
2268 break;
2269 }
2270 break;
2271 }
2272 case TargetOpcode::G_CONCAT_VECTORS: {
2273 if (MRI.getType(MI.getOperand(0).getReg()).isScalableVector())
2274 break;
2275 FirstAnswer = TyBits;
2276 // Determine the minimum number of sign bits across all demanded
2277 // elts of the input vectors. Early out if the result is already 1.
2278 unsigned NumSubVectorElts =
2279 MRI.getType(MI.getOperand(1).getReg()).getNumElements();
2280 for (const auto &[I, MO] : enumerate(drop_begin(MI.operands()))) {
2281 APInt DemandedSub =
2282 DemandedElts.extractBits(NumSubVectorElts, I * NumSubVectorElts);
2283 if (!DemandedSub)
2284 continue;
2285 unsigned Tmp2 = computeNumSignBits(MO.getReg(), DemandedSub, Depth + 1);
2286
2287 FirstAnswer = std::min(FirstAnswer, Tmp2);
2288
2289 // If we don't know any bits, early out.
2290 if (FirstAnswer == 1)
2291 break;
2292 }
2293 break;
2294 }
2295 case TargetOpcode::G_SHUFFLE_VECTOR: {
2296 // Collect the minimum number of sign bits that are shared by every vector
2297 // element referenced by the shuffle.
2298 APInt DemandedLHS, DemandedRHS;
2299 Register Src1 = MI.getOperand(1).getReg();
2300 unsigned NumElts = MRI.getType(Src1).getNumElements();
2301 if (!getShuffleDemandedElts(NumElts, MI.getOperand(3).getShuffleMask(),
2302 DemandedElts, DemandedLHS, DemandedRHS))
2303 return 1;
2304
2305 if (!!DemandedLHS)
2306 FirstAnswer = computeNumSignBits(Src1, DemandedLHS, Depth + 1);
2307 // If we don't know anything, early out and try computeKnownBits fall-back.
2308 if (FirstAnswer == 1)
2309 break;
2310 if (!!DemandedRHS) {
2311 unsigned Tmp2 =
2312 computeNumSignBits(MI.getOperand(2).getReg(), DemandedRHS, Depth + 1);
2313 FirstAnswer = std::min(FirstAnswer, Tmp2);
2314 }
2315 break;
2316 }
2317 case TargetOpcode::G_SPLAT_VECTOR: {
2318 // Check if the sign bits of source go down as far as the truncated value.
2319 Register Src = MI.getOperand(1).getReg();
2320 unsigned NumSrcSignBits = computeNumSignBits(Src, APInt(1, 1), Depth + 1);
2321 unsigned NumSrcBits = MRI.getType(Src).getSizeInBits();
2322 if (NumSrcSignBits > (NumSrcBits - TyBits))
2323 return NumSrcSignBits - (NumSrcBits - TyBits);
2324 break;
2325 }
2326 case TargetOpcode::G_INTRINSIC:
2327 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
2328 case TargetOpcode::G_INTRINSIC_CONVERGENT:
2329 case TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS:
2330 default: {
2331 unsigned NumBits =
2332 TL.computeNumSignBitsForTargetInstr(*this, R, DemandedElts, MRI, Depth);
2333 if (NumBits > 1)
2334 FirstAnswer = std::max(FirstAnswer, NumBits);
2335 break;
2336 }
2337 }
2338
2339 // Finally, if we can prove that the top bits of the result are 0's or 1's,
2340 // use this information.
2341 KnownBits Known = getKnownBits(R, DemandedElts, Depth);
2342 APInt Mask;
2343 if (Known.isNonNegative()) { // sign bit is 0
2344 Mask = Known.Zero;
2345 } else if (Known.isNegative()) { // sign bit is 1;
2346 Mask = Known.One;
2347 } else {
2348 // Nothing known.
2349 return FirstAnswer;
2350 }
2351
2352 // Okay, we know that the sign bit in Mask is set. Use CLO to determine
2353 // the number of identical bits in the top of the input value.
2354 Mask <<= Mask.getBitWidth() - TyBits;
2355 return std::max(FirstAnswer, Mask.countl_one());
2356}
2357
2359 LLT Ty = MRI.getType(R);
2360 APInt DemandedElts =
2361 Ty.isFixedVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1);
2362 return computeNumSignBits(R, DemandedElts, Depth);
2363}
2364
2366 Register R, const APInt &DemandedElts, unsigned Depth) {
2367 // Shifting more than the bitwidth is not valid.
2368 MachineInstr &MI = *MRI.getVRegDef(R);
2369 unsigned Opcode = MI.getOpcode();
2370
2371 LLT Ty = MRI.getType(R);
2372 unsigned BitWidth = Ty.getScalarSizeInBits();
2373
2374 if (Opcode == TargetOpcode::G_CONSTANT) {
2375 const APInt &ShAmt = MI.getOperand(1).getCImm()->getValue();
2376 if (ShAmt.uge(BitWidth))
2377 return std::nullopt;
2378 return ConstantRange(ShAmt);
2379 }
2380
2381 if (Opcode == TargetOpcode::G_BUILD_VECTOR) {
2382 const APInt *MinAmt = nullptr, *MaxAmt = nullptr;
2383 for (unsigned I = 0, E = MI.getNumOperands() - 1; I != E; ++I) {
2384 if (!DemandedElts[I])
2385 continue;
2386 MachineInstr *Op = MRI.getVRegDef(MI.getOperand(I + 1).getReg());
2387 if (Op->getOpcode() != TargetOpcode::G_CONSTANT) {
2388 MinAmt = MaxAmt = nullptr;
2389 break;
2390 }
2391
2392 const APInt &ShAmt = Op->getOperand(1).getCImm()->getValue();
2393 if (ShAmt.uge(BitWidth))
2394 return std::nullopt;
2395 if (!MinAmt || MinAmt->ugt(ShAmt))
2396 MinAmt = &ShAmt;
2397 if (!MaxAmt || MaxAmt->ult(ShAmt))
2398 MaxAmt = &ShAmt;
2399 }
2400 assert(((!MinAmt && !MaxAmt) || (MinAmt && MaxAmt)) &&
2401 "Failed to find matching min/max shift amounts");
2402 if (MinAmt && MaxAmt)
2403 return ConstantRange(*MinAmt, *MaxAmt + 1);
2404 }
2405
2406 // Use computeKnownBits to find a hidden constant/knownbits (usually type
2407 // legalized). e.g. Hidden behind multiple bitcasts/build_vector/casts etc.
2408 KnownBits KnownAmt = getKnownBits(R, DemandedElts, Depth);
2409 if (KnownAmt.getMaxValue().ult(BitWidth))
2410 return ConstantRange::fromKnownBits(KnownAmt, /*IsSigned=*/false);
2411
2412 return std::nullopt;
2413}
2414
2416 Register R, const APInt &DemandedElts, unsigned Depth) {
2417 if (std::optional<ConstantRange> AmtRange =
2418 getValidShiftAmountRange(R, DemandedElts, Depth))
2419 return AmtRange->getUnsignedMin().getZExtValue();
2420 return std::nullopt;
2421}
2422
2428
2433
2435 if (!Info) {
2436 unsigned MaxDepth =
2438 Info = std::make_unique<GISelValueTracking>(MF, MaxDepth);
2439 }
2440 return *Info;
2441}
2442
2443AnalysisKey GISelValueTrackingAnalysis::Key;
2444
2450
2454 auto &VTA = MFAM.getResult<GISelValueTrackingAnalysis>(MF);
2455 const auto &MRI = MF.getRegInfo();
2456 OS << "name: ";
2457 MF.getFunction().printAsOperand(OS, /*PrintType=*/false);
2458 OS << '\n';
2459
2460 for (MachineBasicBlock &BB : MF) {
2461 for (MachineInstr &MI : BB) {
2462 for (MachineOperand &MO : MI.defs()) {
2463 if (!MO.isReg() || MO.getReg().isPhysical())
2464 continue;
2465 Register Reg = MO.getReg();
2466 if (!MRI.getType(Reg).isValid())
2467 continue;
2468 KnownBits Known = VTA.getKnownBits(Reg);
2469 unsigned SignedBits = VTA.computeNumSignBits(Reg);
2470 OS << " " << MO << " KnownBits:" << Known << " SignBits:" << SignedBits
2471 << '\n';
2472 };
2473 }
2474 }
2475 return PreservedAnalyses::all();
2476}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file declares a class to represent arbitrary precision floating point values and provide a varie...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
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 unsigned computeNumSignBitsFromRangeMetadata(const GAnyLoad *Ld, unsigned TyBits)
Compute the known number of sign bits with attached range metadata in the memory operand.
static bool outputDenormalIsIEEEOrPosZero(const MachineFunction &MF, LLT Ty)
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.
Promote Memory to Register
Definition Mem2Reg.cpp:110
static MCRegister getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Definition PassSupport.h:56
R600 Clause Merge
const SmallVectorImpl< MachineOperand > & Cond
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 make_scope_exit function, which executes user-defined cleanup logic at scope ex...
This file contains some functions that are useful when dealing with strings.
#define LLVM_DEBUG(...)
Definition Debug.h:114
This file describes how to lower LLVM code to machine code.
static Function * getFunction(FunctionType *Ty, const Twine &Name, Module *M)
Value * RHS
Value * LHS
static LLVM_ABI bool isRepresentableAsNormalIn(const fltSemantics &Src, const fltSemantics &Dst)
Definition APFloat.cpp:264
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1193
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt umul_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:2011
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:235
void clearBit(unsigned BitPosition)
Set a given bit to 0.
Definition APInt.h:1421
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1043
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:230
void setHighBits(unsigned hiBits)
Set the top hiBits bits.
Definition APInt.h:1406
void setBitsFrom(unsigned loBit)
Set the top bits starting from loBit.
Definition APInt.h:1400
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1189
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:381
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1503
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1118
LLVM_ABI APInt rotr(unsigned rotateAmt) const
Rotate right by rotateAmt.
Definition APInt.cpp:1185
unsigned getNumSignBits() const
Computes the number of leading bits of this APInt that are equal to its sign bit.
Definition APInt.h:1643
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1613
void clearLowBits(unsigned loBits)
Set bottom loBits bits to 0.
Definition APInt.h:1450
unsigned logBase2() const
Definition APInt.h:1776
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
Definition APInt.h:476
void setAllBits()
Set every bit to 1.
Definition APInt.h:1334
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:880
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:441
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:307
void setLowBits(unsigned loBits)
Set the bottom loBits bits.
Definition APInt.h:1403
LLVM_ABI APInt extractBits(unsigned numBits, unsigned bitPosition) const
Return an APInt with the extracted bits [bitPosition,bitPosition+numBits).
Definition APInt.cpp:482
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:287
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:240
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1228
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:676
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 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 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.
const MDNode * getRanges() const
Returns the Ranges that describes the dereference.
Represents an extract vector element.
static LLVM_ABI std::optional< GFConstant > getConstant(Register Const, const MachineRegisterInfo &MRI)
Definition Utils.cpp:2125
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)
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
void computeKnownBitsImpl(Register R, KnownBits &Known, const APInt &DemandedElts, unsigned Depth=0)
Represents a G_LOAD.
Represents a G_SEXTLOAD.
Register getCondReg() const
Register getFalseReg() const
Register getTrueReg() const
ArrayRef< int > getMask() const
Represents a G_ZEXTLOAD.
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 bool isFixedVector() const
Returns true if the LLT is a fixed vector.
TypeSize getValue() const
Metadata node.
Definition Metadata.h:1080
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
DenormalMode getDenormalMode(const fltSemantics &FPType) const
Returns the denormal handling type for the default rounding mode of the function.
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.
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.
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:165
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
operand_type_match m_Reg()
operand_type_match m_Pred()
bind_ty< FPClassTest > m_FPClassTest(FPClassTest &T)
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)
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 > getIConstantVRegVal(Register VReg, const MachineRegisterInfo &MRI)
If VReg is defined by a G_CONSTANT, return the corresponding value.
Definition Utils.cpp:293
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:2554
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:323
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition MathExtras.h:243
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
int ilogb(const APFloat &Arg)
Returns the exponent of the internal representation of the APFloat.
Definition APFloat.h:1601
LLVM_ABI std::optional< APInt > isConstantOrConstantSplatVector(MachineInstr &MI, const MachineRegisterInfo &MRI)
Determines if MI defines a constant integer or a splat vector of constant integers.
Definition Utils.cpp:1589
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:337
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:207
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
DWARFExpression::Operation Op
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
Represent subnormal handling kind for floating point instruction inputs and outputs.
DenormalModeKind Input
Denormal treatment kind for floating point instruction inputs in the default floating-point environme...
constexpr bool outputsAreZero() const
Return true if output denormals should be flushed to 0.
@ PositiveZero
Denormals are flushed to positive zero.
@ IEEE
IEEE-754 denormal numbers preserved.
constexpr bool inputsAreZero() const
Return true if input denormals must be implicitly treated as 0.
DenormalModeKind Output
Denormal flushing mode for floating point instruction results in the default floating point environme...
static constexpr DenormalMode getIEEE()
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
Definition KnownBits.h:317
KnownBits anyextOrTrunc(unsigned BitWidth) const
Return known bits for an "any" extension or truncation of the value we're tracking.
Definition KnownBits.h:192
LLVM_ABI KnownBits sextInReg(unsigned SrcBitWidth) const
Return known bits for a in-register sign extension of the value we're tracking.
static LLVM_ABI KnownBits mulhu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from zero-extended multiply-hi.
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:108
bool isZero() const
Returns true if value is all zero.
Definition KnownBits.h:80
static LLVM_ABI KnownBits ashr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for ashr(LHS, RHS).
bool isUnknown() const
Returns true if we don't know any bits.
Definition KnownBits.h:66
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition KnownBits.h:290
KnownBits trunc(unsigned BitWidth) const
Return known bits for a truncation of the value we're tracking.
Definition KnownBits.h:167
KnownBits byteSwap() const
Definition KnownBits.h:547
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition KnownBits.h:305
void setAllZero()
Make all bits known to be zero and discard any previous information.
Definition KnownBits.h:86
KnownBits reverseBits() const
Definition KnownBits.h:551
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).
KnownBits zext(unsigned BitWidth) const
Return known bits for a zero extension of the value we're tracking.
Definition KnownBits.h:178
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:363
static LLVM_ABI KnownBits lshr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for lshr(LHS, RHS).
static LLVM_ABI KnownBits abdu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for abdu(LHS, RHS).
KnownBits extractBits(unsigned NumBits, unsigned BitPosition) const
Return a subset of the known bits from [bitPosition,bitPosition+numBits).
Definition KnownBits.h:241
KnownBits intersectWith(const KnownBits &RHS) const
Returns KnownBits information that is known to be true for both this and RHS.
Definition KnownBits.h:327
KnownBits sext(unsigned BitWidth) const
Return known bits for a sign extension of the value we're tracking.
Definition KnownBits.h:186
KnownBits zextOrTrunc(unsigned BitWidth) const
Return known bits for a zero extension or truncation of the value we're tracking.
Definition KnownBits.h:202
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:148
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 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:132
static LLVM_ABI KnownBits sdiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for sdiv(LHS, RHS).
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:105
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:378
unsigned countMaxLeadingZeros() const
Returns the maximum number of leading zero bits possible.
Definition KnownBits.h:296
void insertBits(const KnownBits &SubBits, unsigned BitPosition)
Insert the bits from a smaller known bits starting at bitPosition.
Definition KnownBits.h:235
static LLVM_ABI KnownBits mul(const KnownBits &LHS, const KnownBits &RHS, bool NoUndefSelfMultiply=false)
Compute known bits resulting from multiplying LHS and RHS.
KnownBits anyext(unsigned BitWidth) const
Return known bits for an "any" extension of the value we're tracking, where we don't know anything ab...
Definition KnownBits.h:173
LLVM_ABI KnownBits abs(bool IntMinIsPoison=false) const
Compute known bits for the absolute value.
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:83
FPClassTest KnownFPClasses
Floating-point classes the value could be one of.
bool isKnownNeverInfinity() const
Return true if it's known this can never be an infinity.
bool cannotBeOrderedGreaterThanZero() const
Return true if we can prove that the analyzed floating-point value is either NaN or never greater tha...
static constexpr FPClassTest OrderedGreaterThanZeroMask
static constexpr FPClassTest OrderedLessThanZeroMask
void knownNot(FPClassTest RuleOut)
void copysign(const KnownFPClass &Sign)
bool isKnownNeverSubnormal() const
Return true if it's known this can never be a subnormal.
LLVM_ABI bool isKnownNeverLogicalZero(DenormalMode Mode) const
Return true if it's known this can never be interpreted as a zero.
bool isUnknown() const
bool isKnownNeverPosZero() const
Return true if it's known this can never be a literal positive zero.
std::optional< bool > SignBit
std::nullopt if the sign bit is unknown, true if the sign bit is definitely set or false if the sign ...
bool isKnownNeverNaN() const
Return true if it's known this can never be a nan.
bool isKnownNever(FPClassTest Mask) const
Return true if it's known this can never be one of the mask entries.
bool isKnownNeverNegZero() const
Return true if it's known this can never be a negative zero.
void propagateNaN(const KnownFPClass &Src, bool PreserveSign=false)
bool cannotBeOrderedLessThanZero() const
Return true if we can prove that the analyzed floating-point value is either NaN or never less than -...
void signBitMustBeOne()
Assume the sign bit is one.
void signBitMustBeZero()
Assume the sign bit is zero.
LLVM_ABI bool isKnownNeverLogicalPosZero(DenormalMode Mode) const
Return true if it's known this can never be interpreted as a positive zero.
bool isKnownNeverPosInfinity() const
Return true if it's known this can never be +infinity.
LLVM_ABI bool isKnownNeverLogicalNegZero(DenormalMode Mode) const
Return true if it's known this can never be interpreted as a negative zero.