[llvm] r272180 - Teach isGuarantdToTransferExecToSuccessor about debug info intrinsics
Sanjoy Das via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 8 10:48:37 PDT 2016
Author: sanjoy
Date: Wed Jun 8 12:48:36 2016
New Revision: 272180
URL: http://llvm.org/viewvc/llvm-project?rev=272180&view=rev
Log:
Teach isGuarantdToTransferExecToSuccessor about debug info intrinsics
Calls to `@llvm.dbg.*` can be assumed to terminate.
Added:
llvm/trunk/test/Analysis/ScalarEvolution/flags-from-poison-dbg.ll
Modified:
llvm/trunk/lib/Analysis/ValueTracking.cpp
Modified: llvm/trunk/lib/Analysis/ValueTracking.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=272180&r1=272179&r2=272180&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ValueTracking.cpp (original)
+++ llvm/trunk/lib/Analysis/ValueTracking.cpp Wed Jun 8 12:48:36 2016
@@ -3448,10 +3448,13 @@ bool llvm::isGuaranteedToTransferExecuti
// atomic operations are guaranteed to terminate on most platforms
// and most functions terminate.
+ // Calls can throw and thus not terminate, and invokes may not terminate and
+ // could throw to non-successor (see bug 24185 for details).
+ if (isa<CallInst>(I) || isa<InvokeInst>(I))
+ // However, llvm.dbg intrinsics are safe, since they're no-ops.
+ return isa<DbgInfoIntrinsic>(I);
+
return !I->isAtomic() && // atomics may never succeed on some platforms
- !isa<CallInst>(I) && // could throw and might not terminate
- !isa<InvokeInst>(I) && // might not terminate and could throw to
- // non-successor (see bug 24185 for details).
!isa<ResumeInst>(I) && // has no successors
!isa<ReturnInst>(I); // has no successors
}
Added: llvm/trunk/test/Analysis/ScalarEvolution/flags-from-poison-dbg.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ScalarEvolution/flags-from-poison-dbg.ll?rev=272180&view=auto
==============================================================================
--- llvm/trunk/test/Analysis/ScalarEvolution/flags-from-poison-dbg.ll (added)
+++ llvm/trunk/test/Analysis/ScalarEvolution/flags-from-poison-dbg.ll Wed Jun 8 12:48:36 2016
@@ -0,0 +1,75 @@
+; RUN: opt -analyze -scalar-evolution < %s | FileCheck %s
+
+; Make sure poison value tracking works in the presence of @llvm.dbg
+; intrinsics. Unfortunately, I was not able to reduce this file
+; further while still keeping the debug info well formed.
+
+define void @foo(i32 %n, i32* %arr) !dbg !7 {
+; CHECK-LABEL: Classifying expressions for: @foo
+entry:
+ %cmp1 = icmp slt i32 0, %n, !dbg !12
+ br i1 %cmp1, label %for.body.lr.ph, label %for.end, !dbg !15
+
+for.body.lr.ph: ; preds = %entry
+ br label %for.body, !dbg !15
+
+for.body: ; preds = %for.inc, %for.body.lr.ph
+ %i.02 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.inc ]
+ %add = add nsw i32 %i.02, 50, !dbg !16
+ call void @llvm.dbg.value(metadata i32 %add, i64 0, metadata !18, metadata !19), !dbg !20
+ %idxprom = sext i32 %add to i64, !dbg !21
+
+; CHECK: %idxprom = sext i32 %add to i64
+; CHECK-NEXT: --> {50,+,1}<nuw><nsw><%for.body>
+
+ %arrayidx = getelementptr inbounds i32, i32* %arr, i64 %idxprom, !dbg !21
+ store i32 100, i32* %arrayidx, align 4, !dbg !22
+ br label %for.inc, !dbg !23
+
+for.inc: ; preds = %for.body
+ %inc = add nsw i32 %i.02, 1, !dbg !24
+ %cmp = icmp slt i32 %inc, %n, !dbg !12
+ br i1 %cmp, label %for.body, label %for.cond.for.end_crit_edge, !dbg !15, !llvm.loop !25
+
+for.cond.for.end_crit_edge: ; preds = %for.inc
+ br label %for.end, !dbg !15
+
+for.end: ; preds = %for.cond.for.end_crit_edge, %entry
+ ret void, !dbg !27
+}
+
+; Function Attrs: nounwind readnone
+declare void @llvm.dbg.value(metadata, i64, 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 3.9.0 (llvm/trunk 271857)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
+!1 = !DIFile(filename: "x.c", directory: "/Users/sanjoy/Code/clang/build/debug+asserts-x86")
+!2 = !{}
+!3 = !{i32 2, !"Dwarf Version", i32 2}
+!4 = !{i32 2, !"Debug Info Version", i32 3}
+!5 = !{i32 1, !"PIC Level", i32 2}
+!6 = !{!"clang version 3.9.0 (llvm/trunk 271857)"}
+!7 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !8, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
+!8 = !DISubroutineType(types: !9)
+!9 = !{null, !10, !11}
+!10 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
+!11 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !10, size: 64, align: 64)
+!12 = !DILocation(line: 2, column: 24, scope: !13)
+!13 = distinct !DILexicalBlock(scope: !14, file: !1, line: 2, column: 6)
+!14 = distinct !DILexicalBlock(scope: !7, file: !1, line: 2, column: 6)
+!15 = !DILocation(line: 2, column: 6, scope: !14)
+!16 = !DILocation(line: 3, column: 14, scope: !17)
+!17 = distinct !DILexicalBlock(scope: !13, file: !1, line: 2, column: 34)
+!18 = !DILocalVariable(name: "k", scope: !17, file: !1, line: 3, type: !10)
+!19 = !DIExpression()
+!20 = !DILocation(line: 3, column: 8, scope: !17)
+!21 = !DILocation(line: 4, column: 4, scope: !17)
+!22 = !DILocation(line: 4, column: 11, scope: !17)
+!23 = !DILocation(line: 5, column: 6, scope: !17)
+!24 = !DILocation(line: 2, column: 30, scope: !13)
+!25 = distinct !{!25, !26}
+!26 = !DILocation(line: 2, column: 6, scope: !7)
+!27 = !DILocation(line: 6, column: 1, scope: !7)
More information about the llvm-commits
mailing list