From 3aade11252bc574105dc5c401b09f2a2efcda0ae Mon Sep 17 00:00:00 2001 From: Ivan Krasin Date: Wed, 3 Aug 2016 00:59:38 +0000 Subject: Add -lowertypetests-bitsets-level to control bitsets generation. Summary: Sometimes, bitsets could get really large (>300k entries) and we might want to drop a check, as it would have a too much cost. Adding a flag to control how much penalty are we willing to pay for bitsets. Reviewers: kcc Differential Revision: https://reviews.llvm.org/D23088 llvm-svn: 277556 --- llvm/lib/Transforms/IPO/LowerTypeTests.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'llvm/lib') diff --git a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp index 8e343bcbb6e..1d7ad8bc5a4 100644 --- a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp +++ b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp @@ -48,6 +48,11 @@ static cl::opt AvoidReuse( cl::desc("Try to avoid reuse of byte array addresses using aliases"), cl::Hidden, cl::init(true)); +static cl::opt BitsetsLevel( + "lowertypetests-bitsets-level", + cl::desc("Whether to generate bitsets: 0 - never, 1 - only if no loads, 2 - always."), + cl::Hidden, cl::init(2)); + bool BitSetInfo::containsGlobalOffset(uint64_t Offset) const { if (Offset < ByteOffset) return false; @@ -473,8 +478,10 @@ Value *LowerTypeTests::lowerBitSetCall( Constant *BitSizeConst = ConstantInt::get(IntPtrTy, BSI.BitSize); Value *OffsetInRange = B.CreateICmpULT(BitOffset, BitSizeConst); - // If the bit set is all ones, testing against it is unnecessary. - if (BSI.isAllOnes()) + // If the bit set is all ones (or we treat it as such), testing against it + // is unnecessary. + if (BSI.isAllOnes() || BitsetsLevel == 0 || + (BitsetsLevel == 1 && BSI.BitSize > 64)) return OffsetInRange; TerminatorInst *Term = SplitBlockAndInsertIfThen(OffsetInRange, CI, false); -- cgit v1.2.3