xref: /llvm-project/llvm/unittests/Support/KnownBitsTest.h (revision ecb9d94a8bfb07591fdfcf3418c5cfafcad5a13d)
1c1f6ce0cSSimon Pilgrim //===- llvm/unittest/Support/KnownBitsTest.h - KnownBits tests ------------===//
2c1f6ce0cSSimon Pilgrim //
3c1f6ce0cSSimon Pilgrim // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4c1f6ce0cSSimon Pilgrim // See https://llvm.org/LICENSE.txt for license information.
5c1f6ce0cSSimon Pilgrim // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6c1f6ce0cSSimon Pilgrim //
7c1f6ce0cSSimon Pilgrim //===----------------------------------------------------------------------===//
8c1f6ce0cSSimon Pilgrim //
9c1f6ce0cSSimon Pilgrim // This file implements helpers for KnownBits and DemandedBits unit tests.
10c1f6ce0cSSimon Pilgrim //
11c1f6ce0cSSimon Pilgrim //===----------------------------------------------------------------------===//
12c1f6ce0cSSimon Pilgrim 
13c1f6ce0cSSimon Pilgrim #ifndef LLVM_UNITTESTS_SUPPORT_KNOWNBITSTEST_H
14c1f6ce0cSSimon Pilgrim #define LLVM_UNITTESTS_SUPPORT_KNOWNBITSTEST_H
15c1f6ce0cSSimon Pilgrim 
16c1f6ce0cSSimon Pilgrim #include "llvm/Support/KnownBits.h"
17c1f6ce0cSSimon Pilgrim 
18c1f6ce0cSSimon Pilgrim namespace {
19c1f6ce0cSSimon Pilgrim 
20c1f6ce0cSSimon Pilgrim using namespace llvm;
21c1f6ce0cSSimon Pilgrim 
ForeachKnownBits(unsigned Bits,FnTy Fn)22c1f6ce0cSSimon Pilgrim template <typename FnTy> void ForeachKnownBits(unsigned Bits, FnTy Fn) {
23c1f6ce0cSSimon Pilgrim   unsigned Max = 1 << Bits;
24c1f6ce0cSSimon Pilgrim   KnownBits Known(Bits);
25c1f6ce0cSSimon Pilgrim   for (unsigned Zero = 0; Zero < Max; ++Zero) {
26c1f6ce0cSSimon Pilgrim     for (unsigned One = 0; One < Max; ++One) {
27c1f6ce0cSSimon Pilgrim       Known.Zero = Zero;
28c1f6ce0cSSimon Pilgrim       Known.One = One;
29c1f6ce0cSSimon Pilgrim       Fn(Known);
30c1f6ce0cSSimon Pilgrim     }
31c1f6ce0cSSimon Pilgrim   }
32c1f6ce0cSSimon Pilgrim }
33c1f6ce0cSSimon Pilgrim 
34c1f6ce0cSSimon Pilgrim template <typename FnTy>
ForeachNumInKnownBits(const KnownBits & Known,FnTy Fn)35c1f6ce0cSSimon Pilgrim void ForeachNumInKnownBits(const KnownBits &Known, FnTy Fn) {
36c1f6ce0cSSimon Pilgrim   unsigned Bits = Known.getBitWidth();
37f97bcdbdSJay Foad   assert(Bits < 32);
38f97bcdbdSJay Foad   unsigned Max = 1u << Bits;
39f97bcdbdSJay Foad   unsigned Zero = Known.Zero.getZExtValue();
40f97bcdbdSJay Foad   unsigned One = Known.One.getZExtValue();
41*ecb9d94aSJay Foad 
42*ecb9d94aSJay Foad   if (Zero & One) {
43*ecb9d94aSJay Foad     // Known has a conflict. No values will satisfy it.
44*ecb9d94aSJay Foad     return;
45*ecb9d94aSJay Foad   }
46*ecb9d94aSJay Foad 
47c1f6ce0cSSimon Pilgrim   for (unsigned N = 0; N < Max; ++N) {
48f97bcdbdSJay Foad     if ((N & Zero) == 0 && (~N & One) == 0)
49f97bcdbdSJay Foad       Fn(APInt(Bits, N));
50c1f6ce0cSSimon Pilgrim   }
51c1f6ce0cSSimon Pilgrim }
52c1f6ce0cSSimon Pilgrim 
53c1f6ce0cSSimon Pilgrim } // end anonymous namespace
54c1f6ce0cSSimon Pilgrim 
55c1f6ce0cSSimon Pilgrim #endif
56