summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Transforms/IPO/LowerTypeTests.cpp11
1 files changed, 9 insertions, 2 deletions
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<bool> AvoidReuse(
cl::desc("Try to avoid reuse of byte array addresses using aliases"),
cl::Hidden, cl::init(true));
+static cl::opt<unsigned> 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);
OpenPOWER on IntegriCloud