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