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 Pilgrimtemplate <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 Pilgrimvoid 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