diff options
| author | Adrian Prantl <aprantl@apple.com> | 2017-11-01 17:28:50 +0000 | 
|---|---|---|
| committer | Adrian Prantl <aprantl@apple.com> | 2017-11-01 17:28:50 +0000 | 
| commit | 9259f21604766e6baeda0d7c053fa8f54d8ca7cf (patch) | |
| tree | 978f92f7345d413f241a025ac3be65499bc46331 /llvm | |
| parent | b627acd0ce2969cac9b5af819c658aabc89d9e87 (diff) | |
| download | bcm5719-llvm-9259f21604766e6baeda0d7c053fa8f54d8ca7cf.tar.gz bcm5719-llvm-9259f21604766e6baeda0d7c053fa8f54d8ca7cf.zip  | |
loop-rotate: avoid duplicating dbg.value intrinsics in the entry block.
This fixes the second half of PR35113.
llvm-svn: 317106
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopRotation.cpp | 24 | ||||
| -rw-r--r-- | llvm/test/Transforms/LoopRotate/dbg-value-duplicates.ll | 2 | 
2 files changed, 26 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopRotation.cpp b/llvm/lib/Transforms/Scalar/LoopRotation.cpp index 8581198cc7d..2f8dfaee7c5 100644 --- a/llvm/lib/Transforms/Scalar/LoopRotation.cpp +++ b/llvm/lib/Transforms/Scalar/LoopRotation.cpp @@ -25,6 +25,7 @@  #include "llvm/Analysis/TargetTransformInfo.h"  #include "llvm/Analysis/ValueTracking.h"  #include "llvm/IR/CFG.h" +#include "llvm/IR/DebugInfoMetadata.h"  #include "llvm/IR/Dominators.h"  #include "llvm/IR/Function.h"  #include "llvm/IR/IntrinsicInst.h" @@ -307,6 +308,22 @@ bool LoopRotate::rotateLoop(Loop *L, bool SimplifiedLatch) {    // For the rest of the instructions, either hoist to the OrigPreheader if    // possible or create a clone in the OldPreHeader if not.    TerminatorInst *LoopEntryBranch = OrigPreheader->getTerminator(); + +  // Record all debug intrinsics preceding LoopEntryBranch to avoid duplication. +  using DbgIntrinsicHash = +      std::pair<std::pair<Value *, DILocalVariable *>, DIExpression *>; +  auto makeHash = [](DbgInfoIntrinsic *D) -> DbgIntrinsicHash { +    return {{D->getVariableLocation(), D->getVariable()}, D->getExpression()}; +  }; +  SmallDenseSet<DbgIntrinsicHash, 8> DbgIntrinsics; +  for (auto I = std::next(OrigPreheader->rbegin()), E = OrigPreheader->rend(); +       I != E; ++I) { +    if (auto *DII = dyn_cast<DbgInfoIntrinsic>(&*I)) +      DbgIntrinsics.insert(makeHash(DII)); +    else +      break; +  } +    while (I != E) {      Instruction *Inst = &*I++; @@ -330,6 +347,13 @@ bool LoopRotate::rotateLoop(Loop *L, bool SimplifiedLatch) {      RemapInstruction(C, ValueMap,                       RF_NoModuleLevelChanges | RF_IgnoreMissingLocals); +    // Avoid inserting the same intrinsic twice. +    if (auto *DII = dyn_cast<DbgInfoIntrinsic>(C)) +      if (DbgIntrinsics.count(makeHash(DII))) { +        C->deleteValue(); +        continue; +      } +      // With the operands remapped, see if the instruction constant folds or is      // otherwise simplifyable.  This commonly occurs because the entry from PHI      // nodes allows icmps and other instructions to fold. diff --git a/llvm/test/Transforms/LoopRotate/dbg-value-duplicates.ll b/llvm/test/Transforms/LoopRotate/dbg-value-duplicates.ll index ad47cbfb55b..10c708e7e1f 100644 --- a/llvm/test/Transforms/LoopRotate/dbg-value-duplicates.ll +++ b/llvm/test/Transforms/LoopRotate/dbg-value-duplicates.ll @@ -10,6 +10,8 @@ entry:    call void @llvm.dbg.value(metadata i64 %n, metadata !16, metadata !DIExpression()), !dbg !21    call void @llvm.dbg.value(metadata i64 %s, metadata !17, metadata !DIExpression()), !dbg !22    call void @llvm.dbg.value(metadata i64 0, metadata !18, metadata !DIExpression()), !dbg !23 +  ; CHECK:   call void @llvm.dbg.value(metadata i64 0, metadata !18, metadata !DIExpression()), !dbg !23 +  ; CHECK-NOT:   call void @llvm.dbg.value(metadata i64 0, metadata !18, metadata !DIExpression()), !dbg !23    br label %for.cond, !dbg !24  for.cond:                                         ; preds = %for.body, %entry  | 

