From 7b5905bda6f632425b7c3b4b8ee698cba65dcd48 Mon Sep 17 00:00:00 2001 From: Philipp Bartsch Date: Mon, 17 Jun 2019 02:00:14 +0000 Subject: llvm_mode/split-switches-pass: add checks Add extra check to allow early exist in trivial cases that would sometimes lead to crashes. --- llvm_mode/split-switches-pass.so.cc | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'llvm_mode/split-switches-pass.so.cc') diff --git a/llvm_mode/split-switches-pass.so.cc b/llvm_mode/split-switches-pass.so.cc index 45847f88..4c28f34c 100644 --- a/llvm_mode/split-switches-pass.so.cc +++ b/llvm_mode/split-switches-pass.so.cc @@ -87,6 +87,7 @@ BasicBlock* SplitSwitchesTransform::switchConvert(CaseVector Cases, std::vector< std::vector setSizes; std::vector> byteSets(BytesInValue, std::set()); + assert(ValTypeBitWidth >= 8 && ValTypeBitWidth <= 64); /* for each of the possible cases we iterate over all bytes of the values * build a set of possible values at each byte position in byteSets */ @@ -98,6 +99,8 @@ BasicBlock* SplitSwitchesTransform::switchConvert(CaseVector Cases, std::vector< } } + /* find the index of the first byte position that was not yet checked. then + * save the number of possible values at that byte position */ unsigned smallestIndex = 0; unsigned smallestSize = 257; for(unsigned i = 0; i < byteSets.size(); i++) { @@ -235,9 +238,13 @@ bool SplitSwitchesTransform::splitSwitches(Module &M) { /* this is the value we are switching on */ Value *Val = SI->getCondition(); BasicBlock* Default = SI->getDefaultDest(); + unsigned bitw = Val->getType()->getIntegerBitWidth(); - /* If there is only the default destination, don't bother with the code below. */ - if (!SI->getNumCases()) { + errs() << "switch: " << SI->getNumCases() << " cases " << bitw << " bit\n"; + + /* If there is only the default destination or the condition checks 8 bit or less, don't bother with the code below. */ + if (!SI->getNumCases() || bitw <= 8) { + errs() << "skip trivial switch..\n"; continue; } -- cgit 1.4.1