mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
loop-rotate: avoid duplicating dbg.value intrinsics in the entry block.
This fixes the second half of PR35113. This reapplies r317106 without modifications. llvm-svn: 317121
This commit is contained in:
parent
f7d9254721
commit
9392f56e2b
@ -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.
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user