aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Instrumentation/ControlHeightReduction.cpp
diff options
context:
space:
mode:
authorXun Li <lxfind@gmail.com>2021-06-12 10:29:53 -0700
committerXun Li <lxfind@gmail.com>2021-06-12 10:29:53 -0700
commitfae7debadcea335d4aaddee82406a8d10426e730 (patch)
tree6aac28222170e12dc750450438952ff4508c94d1 /llvm/lib/Transforms/Instrumentation/ControlHeightReduction.cpp
parentc997867dc084a1bcf631816f964b3ff49a297ba3 (diff)
downloadllvm-fae7debadcea335d4aaddee82406a8d10426e730.zip
llvm-fae7debadcea335d4aaddee82406a8d10426e730.tar.gz
llvm-fae7debadcea335d4aaddee82406a8d10426e730.tar.bz2
[CHR] Don't run ControlHeightReduction if any BB has address taken
This patch is to address https://bugs.llvm.org/show_bug.cgi?id=50610. In computed goto pattern, there are usually a list of basic blocks that are all targets of indirectbr instruction, and each basic block also has address taken and stored in a variable. CHR pass could potentially clone these basic blocks, which would generate a cloned version of the indirectbr and clonved version of all basic blocks in the list. However these basic blocks will not have their addresses taken and stored anywhere. So latter SimplifyCFG pass will simply remove all tehse cloned basic blocks, resulting in incorrect code. To fix this, when searching for scopes, we skip scopes that contains BBs with addresses taken. Added a few test cases. Reviewed By: aeubanks, wenlei, hoy Differential Revision: https://reviews.llvm.org/D103867
Diffstat (limited to 'llvm/lib/Transforms/Instrumentation/ControlHeightReduction.cpp')
-rw-r--r--llvm/lib/Transforms/Instrumentation/ControlHeightReduction.cpp5
1 files changed, 5 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/ControlHeightReduction.cpp b/llvm/lib/Transforms/Instrumentation/ControlHeightReduction.cpp
index 3420256..3b4d80d 100644
--- a/llvm/lib/Transforms/Instrumentation/ControlHeightReduction.cpp
+++ b/llvm/lib/Transforms/Instrumentation/ControlHeightReduction.cpp
@@ -767,6 +767,11 @@ CHRScope * CHR::findScope(Region *R) {
for (BasicBlock *Pred : predecessors(Entry))
if (R->contains(Pred))
return nullptr;
+ // If any of the basic blocks have address taken, we must skip this region
+ // because we cannot clone basic blocks that have address taken.
+ for (BasicBlock *BB : R->blocks())
+ if (BB->hasAddressTaken())
+ return nullptr;
if (Exit) {
// Try to find an if-then block (check if R is an if-then).
// if (cond) {