diff options
author | stozer <stephen.tozer@sony.com> | 2019-12-05 10:01:47 +0000 |
---|---|---|
committer | stozer <stephen.tozer@sony.com> | 2019-12-10 13:33:32 +0000 |
commit | f2ba93971ccc236c0eef5323704d31f48107e04f (patch) | |
tree | c60835aa3767ac116349865d4e847027eb45b644 /llvm/lib/Transforms/Utils/SimplifyCFG.cpp | |
parent | 14f3d13412cb2eac87f1c0ae74ed2af7ace1580f (diff) | |
download | bcm5719-llvm-f2ba93971ccc236c0eef5323704d31f48107e04f.tar.gz bcm5719-llvm-f2ba93971ccc236c0eef5323704d31f48107e04f.zip |
Reapply: [DebugInfo] Recover debug intrinsics when killing duplicated/empty...
basic blocks
Originally applied in 72ce759928e6dfee6a9efa310b966c19722352ba.
Fixed a build failure caused by incorrect use of cast instead of
dyn_cast.
This reverts commit 8b0780f795eb58fca0a2456e308adaaa1a0b5013.
Diffstat (limited to 'llvm/lib/Transforms/Utils/SimplifyCFG.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 59 |
1 files changed, 42 insertions, 17 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index d93ca4f04cd..681c344f87a 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()) { |