aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
diff options
context:
space:
mode:
authorstozer <stephen.tozer@sony.com>2020-02-12 13:41:18 +0000
committerstozer <stephen.tozer@sony.com>2020-02-12 14:36:30 +0000
commit61b35e4111160fe834a00c33d040e01150b576ac (patch)
tree976c3e80e7e9e7ba33a30100461ec5cf9c9e46c6 /llvm/lib/Transforms/Utils/SimplifyCFG.cpp
parentfa61e200e53aaa929276abd76482a15c7a9638b7 (diff)
downloadllvm-61b35e4111160fe834a00c33d040e01150b576ac.zip
llvm-61b35e4111160fe834a00c33d040e01150b576ac.tar.gz
llvm-61b35e4111160fe834a00c33d040e01150b576ac.tar.bz2
Re-reapply: Recover debug intrinsics when killing duplicated/empty blocks
This reverts commit 636c93ed11a5f98b5c3ff88241460d61cb7785bb. The original patch caused build failures on TSan buildbots. Commit 6ded69f294a9 fixes this issue by reducing the rate at which empty debug intrinsics propagate, reducing the memory footprint and preventing a fatal spike.
Diffstat (limited to 'llvm/lib/Transforms/Utils/SimplifyCFG.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/SimplifyCFG.cpp59
1 files changed, 42 insertions, 17 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
index 222f8af..0f8a9b4 100644
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -13,6 +13,7 @@
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/MapVector.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SetOperations.h"
@@ -38,6 +39,7 @@
#include "llvm/IR/ConstantRange.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
+#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalValue.h"
@@ -1250,14 +1252,38 @@ static bool HoistThenElseCodeToIf(BranchInst *BI,
Instruction *I1 = &*BB1_Itr++, *I2 = &*BB2_Itr++;
// Skip debug info if it is not identical.
- DbgInfoIntrinsic *DBI1 = dyn_cast<DbgInfoIntrinsic>(I1);
- DbgInfoIntrinsic *DBI2 = dyn_cast<DbgInfoIntrinsic>(I2);
- if (!DBI1 || !DBI2 || !DBI1->isIdenticalToWhenDefined(DBI2)) {
- while (isa<DbgInfoIntrinsic>(I1))
- I1 = &*BB1_Itr++;
- while (isa<DbgInfoIntrinsic>(I2))
- I2 = &*BB2_Itr++;
- }
+
+ // If the terminator instruction is hoisted, and any variable locations have
+ // non-identical debug intrinsics, then those variable locations must be set
+ // as undef.
+ // FIXME: If each block contains identical debug variable intrinsics in a
+ // different order, they will be considered non-identical and be dropped.
+ MapVector<DebugVariable, DbgVariableIntrinsic *> UndefDVIs;
+
+ auto SkipDbgInfo = [&UndefDVIs](Instruction *&I,
+ BasicBlock::iterator &BB_Itr) {
+ while (isa<DbgInfoIntrinsic>(I)) {
+ if (DbgVariableIntrinsic *DVI = dyn_cast<DbgVariableIntrinsic>(I))
+ UndefDVIs.insert(
+ {DebugVariable(DVI->getVariable(), DVI->getExpression(),
+ DVI->getDebugLoc()->getInlinedAt()),
+ DVI});
+ I = &*BB_Itr++;
+ }
+ };
+
+ auto SkipNonIdenticalDbgInfo =
+ [&BB1_Itr, &BB2_Itr, &SkipDbgInfo](Instruction *&I1, Instruction *&I2) {
+ DbgInfoIntrinsic *DBI1 = dyn_cast<DbgInfoIntrinsic>(I1);
+ DbgInfoIntrinsic *DBI2 = dyn_cast<DbgInfoIntrinsic>(I2);
+ if (!DBI1 || !DBI2 || !DBI1->isIdenticalToWhenDefined(DBI2)) {
+ SkipDbgInfo(I1, BB1_Itr);
+ SkipDbgInfo(I2, BB2_Itr);
+ }
+ };
+
+ SkipNonIdenticalDbgInfo(I1, I2);
+
// FIXME: Can we define a safety predicate for CallBr?
if (isa<PHINode>(I1) || !I1->isIdenticalToWhenDefined(I2) ||
(isa<InvokeInst>(I1) && !isSafeToHoistInvoke(BB1, BB2, I1, I2)) ||
@@ -1330,15 +1356,7 @@ static bool HoistThenElseCodeToIf(BranchInst *BI,
I1 = &*BB1_Itr++;
I2 = &*BB2_Itr++;
- // Skip debug info if it is not identical.
- DbgInfoIntrinsic *DBI1 = dyn_cast<DbgInfoIntrinsic>(I1);
- DbgInfoIntrinsic *DBI2 = dyn_cast<DbgInfoIntrinsic>(I2);
- if (!DBI1 || !DBI2 || !DBI1->isIdenticalToWhenDefined(DBI2)) {
- while (isa<DbgInfoIntrinsic>(I1))
- I1 = &*BB1_Itr++;
- while (isa<DbgInfoIntrinsic>(I2))
- I2 = &*BB2_Itr++;
- }
+ SkipNonIdenticalDbgInfo(I1, I2);
} while (I1->isIdenticalToWhenDefined(I2));
return true;
@@ -1374,6 +1392,13 @@ HoistTerminator:
}
// Okay, it is safe to hoist the terminator.
+ for (auto DIVariableInst : UndefDVIs) {
+ DbgVariableIntrinsic *DVI = DIVariableInst.second;
+ DVI->moveBefore(BI);
+ if (DVI->getVariableLocation())
+ setDbgVariableUndef(DVI);
+ }
+
Instruction *NT = I1->clone();
BIParent->getInstList().insert(BI->getIterator(), NT);
if (!NT->getType()->isVoidTy()) {