| commit 808fcfe5944755f08ae88722070302fcf9135e58 |
| Author: Markus Lavin <markus.lavin@ericsson.com> |
| Date: Fri Nov 27 08:49:20 2020 +0100 |
| |
| Revert "[DebugInfo] Improve dbg preservation in LSR." |
| |
| This reverts commit 06758c6a6135f59deec8e73d4fcb69946ab47f54. |
| |
| Bug: https://bugs.llvm.org/show_bug.cgi?id=48166 |
| Additional discussion in: https://reviews.llvm.org/D91711 |
| |
| diff --git a/llvm/include/llvm/Analysis/ScalarEvolution.h b/llvm/include/llvm/Analysis/ScalarEvolution.h |
| index a7a24f086fb..35e569710ca 100644 |
| --- a/llvm/include/llvm/Analysis/ScalarEvolution.h |
| +++ b/llvm/include/llvm/Analysis/ScalarEvolution.h |
| @@ -1163,15 +1163,6 @@ public: |
| const SCEV *S, const Loop *L, |
| SmallPtrSetImpl<const SCEVPredicate *> &Preds); |
| |
| - /// Compute \p LHS - \p RHS and returns the result as an APInt if it is a |
| - /// constant, and None if it isn't. |
| - /// |
| - /// This is intended to be a cheaper version of getMinusSCEV. We can be |
| - /// frugal here since we just bail out of actually constructing and |
| - /// canonicalizing an expression in the cases where the result isn't going |
| - /// to be a constant. |
| - Optional<APInt> computeConstantDifference(const SCEV *LHS, const SCEV *RHS); |
| - |
| private: |
| /// A CallbackVH to arrange for ScalarEvolution to be notified whenever a |
| /// Value is deleted. |
| @@ -1893,6 +1884,15 @@ private: |
| bool splitBinaryAdd(const SCEV *Expr, const SCEV *&L, const SCEV *&R, |
| SCEV::NoWrapFlags &Flags); |
| |
| + /// Compute \p LHS - \p RHS and returns the result as an APInt if it is a |
| + /// constant, and None if it isn't. |
| + /// |
| + /// This is intended to be a cheaper version of getMinusSCEV. We can be |
| + /// frugal here since we just bail out of actually constructing and |
| + /// canonicalizing an expression in the cases where the result isn't going |
| + /// to be a constant. |
| + Optional<APInt> computeConstantDifference(const SCEV *LHS, const SCEV *RHS); |
| + |
| /// Drop memoized information computed for S. |
| void forgetMemoizedResults(const SCEV *S); |
| |
| diff --git a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp |
| index 2713fa61ba3..a1d182931d0 100644 |
| --- a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp |
| +++ b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp |
| @@ -59,7 +59,6 @@ |
| #include "llvm/ADT/Hashing.h" |
| #include "llvm/ADT/PointerIntPair.h" |
| #include "llvm/ADT/STLExtras.h" |
| -#include "llvm/ADT/SetOperations.h" |
| #include "llvm/ADT/SetVector.h" |
| #include "llvm/ADT/SmallBitVector.h" |
| #include "llvm/ADT/SmallPtrSet.h" |
| @@ -81,7 +80,6 @@ |
| #include "llvm/IR/BasicBlock.h" |
| #include "llvm/IR/Constant.h" |
| #include "llvm/IR/Constants.h" |
| -#include "llvm/IR/DebugInfoMetadata.h" |
| #include "llvm/IR/DerivedTypes.h" |
| #include "llvm/IR/Dominators.h" |
| #include "llvm/IR/GlobalValue.h" |
| @@ -5788,27 +5786,6 @@ static bool ReduceLoopStrength(Loop *L, IVUsers &IU, ScalarEvolution &SE, |
| if (MSSA) |
| MSSAU = std::make_unique<MemorySSAUpdater>(MSSA); |
| |
| - // Debug preservation - record all llvm.dbg.value from the loop as well as |
| - // the SCEV of their variable location. Since salvageDebugInfo may change the |
| - // DIExpression we need to store the original here as well (i.e. it needs to |
| - // be in sync with the SCEV). |
| - SmallVector< |
| - std::tuple<DbgValueInst *, const Type *, const SCEV *, DIExpression *>, |
| - 32> |
| - DbgValues; |
| - for (auto &B : L->getBlocks()) { |
| - for (auto &I : *B) { |
| - if (DbgValueInst *D = dyn_cast<DbgValueInst>(&I)) { |
| - auto V = D->getVariableLocation(); |
| - if (!V || !SE.isSCEVable(V->getType())) |
| - continue; |
| - auto DS = SE.getSCEV(V); |
| - DbgValues.push_back( |
| - std::make_tuple(D, V->getType(), DS, D->getExpression())); |
| - } |
| - } |
| - } |
| - |
| // Run the main LSR transformation. |
| Changed |= |
| LSRInstance(L, IU, SE, DT, LI, TTI, AC, TLI, MSSAU.get()).getChanged(); |
| @@ -5830,40 +5807,6 @@ static bool ReduceLoopStrength(Loop *L, IVUsers &IU, ScalarEvolution &SE, |
| DeleteDeadPHIs(L->getHeader(), &TLI, MSSAU.get()); |
| } |
| } |
| - // Debug preservation - go through all recorded llvm.dbg.value and for those |
| - // that now have an undef variable location use the recorded SCEV to try and |
| - // update it. Compare with SCEV of Phi-nodes of loop header to find a |
| - // suitable update candidate. SCEV match with constant offset is allowed and |
| - // will be compensated for in the DIExpression. |
| - if (Changed) { |
| - for (auto &D : DbgValues) { |
| - auto DbgValue = std::get<DbgValueInst *>(D); |
| - auto DbgValueType = std::get<const Type *>(D); |
| - auto DbgValueSCEV = std::get<const SCEV *>(D); |
| - auto DbgDIExpr = std::get<DIExpression *>(D); |
| - if (!isa<UndefValue>(DbgValue->getVariableLocation())) |
| - continue; |
| - for (PHINode &Phi : L->getHeader()->phis()) { |
| - if (DbgValueType != Phi.getType()) |
| - continue; |
| - if (!SE.isSCEVable(Phi.getType())) |
| - continue; |
| - auto PhiSCEV = SE.getSCEV(&Phi); |
| - if (Optional<APInt> Offset = |
| - SE.computeConstantDifference(DbgValueSCEV, PhiSCEV)) { |
| - auto &Ctx = DbgValue->getContext(); |
| - DbgValue->setOperand( |
| - 0, MetadataAsValue::get(Ctx, ValueAsMetadata::get(&Phi))); |
| - if (Offset.getValue().getSExtValue()) { |
| - SmallVector<uint64_t, 8> Ops; |
| - DIExpression::appendOffset(Ops, Offset.getValue().getSExtValue()); |
| - DbgDIExpr = DIExpression::prependOpcodes(DbgDIExpr, Ops, true); |
| - } |
| - DbgValue->setOperand(2, MetadataAsValue::get(Ctx, DbgDIExpr)); |
| - } |
| - } |
| - } |
| - } |
| return Changed; |
| } |
| |
| diff --git a/llvm/test/DebugInfo/COFF/fpo-shrink-wrap.ll b/llvm/test/DebugInfo/COFF/fpo-shrink-wrap.ll |
| index e8f37a37066..08aecdac5b7 100644 |
| --- a/llvm/test/DebugInfo/COFF/fpo-shrink-wrap.ll |
| +++ b/llvm/test/DebugInfo/COFF/fpo-shrink-wrap.ll |
| @@ -33,7 +33,7 @@ |
| ; ASM: popl %ebx |
| ; ASM: [[EPILOGUE]]: # %return |
| ; ASM: retl $8 |
| -; ASM: Ltmp11: |
| +; ASM: Ltmp10: |
| ; ASM: .cv_fpo_endproc |
| |
| ; Note how RvaStart advances 7 bytes to skip the shrink-wrapped portion. |
| diff --git a/llvm/test/Transforms/LoopStrengthReduce/dbg-preserve-0.ll b/llvm/test/Transforms/LoopStrengthReduce/dbg-preserve-0.ll |
| deleted file mode 100644 |
| index 71031aabb95..00000000000 |
| --- a/llvm/test/Transforms/LoopStrengthReduce/dbg-preserve-0.ll |
| +++ /dev/null |
| @@ -1,74 +0,0 @@ |
| -; RUN: opt < %s -loop-reduce -S | FileCheck %s |
| - |
| -; Test that LSR preserves debug-info for induction variables. |
| - |
| -target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" |
| - |
| -define dso_local void @foo(i8* nocapture %p) local_unnamed_addr !dbg !7 { |
| -; CHECK-LABEL: @foo( |
| -entry: |
| - call void @llvm.dbg.value(metadata i8* %p, metadata !13, metadata !DIExpression()), !dbg !16 |
| - call void @llvm.dbg.value(metadata i8 0, metadata !14, metadata !DIExpression()), !dbg !17 |
| - br label %for.body, !dbg !18 |
| - |
| -for.cond.cleanup: ; preds = %for.body |
| - ret void, !dbg !19 |
| - |
| -for.body: ; preds = %entry, %for.body |
| -; CHECK-LABEL: for.body: |
| - %i.06 = phi i8 [ 0, %entry ], [ %inc, %for.body ] |
| - %p.addr.05 = phi i8* [ %p, %entry ], [ %add.ptr, %for.body ] |
| - call void @llvm.dbg.value(metadata i8 %i.06, metadata !14, metadata !DIExpression()), !dbg !17 |
| - call void @llvm.dbg.value(metadata i8* %p.addr.05, metadata !13, metadata !DIExpression()), !dbg !16 |
| -; CHECK-NOT: call void @llvm.dbg.value(metadata i8* undef |
| -; CHECK: call void @llvm.dbg.value(metadata i8* %lsr.iv, metadata ![[MID_p:[0-9]+]], metadata !DIExpression(DW_OP_constu, 3, DW_OP_minus, DW_OP_stack_value)), !dbg !16 |
| - %add.ptr = getelementptr inbounds i8, i8* %p.addr.05, i64 3, !dbg !20 |
| - call void @llvm.dbg.value(metadata i8* %add.ptr, metadata !13, metadata !DIExpression()), !dbg !16 |
| -; CHECK-NOT: call void @llvm.dbg.value(metadata i8* undef |
| -; CHECK: call void @llvm.dbg.value(metadata i8* %lsr.iv, metadata ![[MID_p]], metadata !DIExpression()), !dbg !16 |
| - store i8 %i.06, i8* %add.ptr, align 1, !dbg !23, !tbaa !24 |
| - %inc = add nuw nsw i8 %i.06, 1, !dbg !27 |
| - call void @llvm.dbg.value(metadata i8 %inc, metadata !14, metadata !DIExpression()), !dbg !17 |
| - %exitcond.not = icmp eq i8 %inc, 32, !dbg !28 |
| - br i1 %exitcond.not, label %for.cond.cleanup, label %for.body, !dbg !18, !llvm.loop !29 |
| -} |
| - |
| -declare void @llvm.dbg.value(metadata, metadata, metadata) |
| - |
| -!llvm.dbg.cu = !{!0} |
| -!llvm.module.flags = !{!3, !4, !5} |
| -!llvm.ident = !{!6} |
| - |
| -!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 12.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None) |
| -!1 = !DIFile(filename: "lsrdbg.c", directory: "/") |
| -!2 = !{} |
| -!3 = !{i32 7, !"Dwarf Version", i32 4} |
| -!4 = !{i32 2, !"Debug Info Version", i32 3} |
| -!5 = !{i32 1, !"wchar_size", i32 4} |
| -!6 = !{!"clang version 12.0.0"} |
| -!7 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 2, type: !8, scopeLine: 2, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !12) |
| -!8 = !DISubroutineType(types: !9) |
| -!9 = !{null, !10} |
| -!10 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !11, size: 64) |
| -!11 = !DIBasicType(name: "unsigned char", size: 8, encoding: DW_ATE_unsigned_char) |
| -!12 = !{!13, !14} |
| -!13 = !DILocalVariable(name: "p", arg: 1, scope: !7, file: !1, line: 2, type: !10) |
| -; CHECK: ![[MID_p]] = !DILocalVariable(name: "p", arg: 1, scope: !7, file: !1, line: 2, type: !10) |
| -!14 = !DILocalVariable(name: "i", scope: !15, file: !1, line: 4, type: !11) |
| -!15 = distinct !DILexicalBlock(scope: !7, file: !1, line: 4, column: 3) |
| -!16 = !DILocation(line: 0, scope: !7) |
| -!17 = !DILocation(line: 0, scope: !15) |
| -!18 = !DILocation(line: 4, column: 3, scope: !15) |
| -!19 = !DILocation(line: 8, column: 1, scope: !7) |
| -!20 = !DILocation(line: 5, column: 7, scope: !21) |
| -!21 = distinct !DILexicalBlock(scope: !22, file: !1, line: 4, column: 42) |
| -!22 = distinct !DILexicalBlock(scope: !15, file: !1, line: 4, column: 3) |
| -!23 = !DILocation(line: 6, column: 8, scope: !21) |
| -!24 = !{!25, !25, i64 0} |
| -!25 = !{!"omnipotent char", !26, i64 0} |
| -!26 = !{!"Simple C/C++ TBAA"} |
| -!27 = !DILocation(line: 4, column: 38, scope: !22) |
| -!28 = !DILocation(line: 4, column: 31, scope: !22) |
| -!29 = distinct !{!29, !18, !30, !31} |
| -!30 = !DILocation(line: 7, column: 3, scope: !15) |
| -!31 = !{!"llvm.loop.unroll.disable"} |