summaryrefslogtreecommitdiff
path: root/test/CodeGen/Mips
diff options
context:
space:
mode:
authorSimon Dardis <simon.dardis@imgtec.com>2017-10-18 14:35:29 +0000
committerSimon Dardis <simon.dardis@imgtec.com>2017-10-18 14:35:29 +0000
commit4eeab93a12331c8856a0fd188ce20cf0f79b2ead (patch)
treed7f71fe446ede43936e40ff8e4580e3da53a9243 /test/CodeGen/Mips
parent429594f14d984c439ffcce83f636c515cfa3a9a8 (diff)
[mips] Fix analyzeBranch to handle debug data
In the case where there was a conditional branch followed by a unconditional branch with debug instruction separating them, MipsInstrInfo::analyzeBranch would not skip past debug instruction when searching for the second branch which give erroneous results about the control flow of the block. This could lead to the branch folder to merge the non-fall through case into it's predecessor, leaving the conditional branch with a dangling basic block operand. This resolves PR34975. Thanks to Alexander Richardson for reporting the issue! Reviewers: atanasyan Differential Revision: https://reviews.llvm.org/D39003 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@316084 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGen/Mips')
-rw-r--r--test/CodeGen/Mips/pr34975.ll90
1 files changed, 90 insertions, 0 deletions
diff --git a/test/CodeGen/Mips/pr34975.ll b/test/CodeGen/Mips/pr34975.ll
new file mode 100644
index 00000000000..a77a59fc5d3
--- /dev/null
+++ b/test/CodeGen/Mips/pr34975.ll
@@ -0,0 +1,90 @@
+; RUN: llc -mtriple=mips64-unknown-freebsd -target-abi n64 -relocation-model pic -o /dev/null %s -O2
+
+; Test that the presence of debug information does not cause the branch folder
+; to rewrite branches to have negative basic block ids, which would cause the
+; long branch pass to crash.
+
+@c = external global i32, align 4
+
+define void @e() !dbg !19 {
+entry:
+ %0 = load i32, i32* @c, align 4, !dbg !28, !tbaa !31
+ %tobool8 = icmp eq i32 %0, 0, !dbg !35
+ br i1 %tobool8, label %for.end, label %for.body.preheader, !dbg !35
+
+for.body.preheader: ; preds = %entry
+ br label %for.body, !dbg !36
+
+for.body: ; preds = %for.body.preheader
+ %1 = load i8, i8* undef, align 1, !dbg !36, !tbaa !38
+ %conv = zext i8 %1 to i32, !dbg !36
+ %cmp = icmp sgt i32 %0, %conv, !dbg !39
+ br i1 %cmp, label %if.end, label %if.then, !dbg !40
+
+if.then: ; preds = %for.body
+ tail call void @llvm.dbg.value(metadata i32 %conv, metadata !41, metadata !DIExpression()), !dbg !43
+ %idxprom5 = zext i8 %1 to i64, !dbg !44
+ %call = tail call i32 bitcast (i32 (...)* @g to i32 (i32)*)(i32 signext undef) #3, !dbg !45
+ br label %if.end, !dbg !46
+
+if.end: ; preds = %if.then, %for.body
+ unreachable
+
+for.end: ; preds = %entry
+ ret void
+}
+
+declare i32 @g(...)
+
+declare void @llvm.dbg.value(metadata, metadata, metadata)
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!17, !18}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 6.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, globals: !3)
+!1 = !DIFile(filename: "/local/scratch/alr48/cheri/llvm/tools/clang/test/CodeGen/<stdin>", directory: "/local/scratch/alr48/cheri/llvm/cmake-build-debug/tools/clang/test/CodeGen")
+!2 = !{}
+!3 = !{!4, !9, !13, !15}
+!4 = !DIGlobalVariableExpression(var: !5, expr: !DIExpression())
+!5 = distinct !DIGlobalVariable(name: "a", scope: !0, file: !6, line: 6, type: !7, isLocal: false, isDefinition: true)
+!6 = !DIFile(filename: "/crash.c", directory: "/tmp")
+!7 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !8, size: 64)
+!8 = !DIBasicType(name: "unsigned char", size: 8, encoding: DW_ATE_unsigned_char)
+!9 = !DIGlobalVariableExpression(var: !10, expr: !DIExpression())
+!10 = distinct !DIGlobalVariable(name: "b", scope: !0, file: !6, line: 7, type: !11, isLocal: false, isDefinition: true)
+!11 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !12, size: 64)
+!12 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
+!13 = !DIGlobalVariableExpression(var: !14, expr: !DIExpression())
+!14 = distinct !DIGlobalVariable(name: "c", scope: !0, file: !6, line: 8, type: !12, isLocal: false, isDefinition: true)
+!15 = !DIGlobalVariableExpression(var: !16, expr: !DIExpression())
+!16 = distinct !DIGlobalVariable(name: "d", scope: !0, file: !6, line: 8, type: !12, isLocal: false, isDefinition: true)
+!17 = !{i32 2, !"Debug Info Version", i32 3}
+!18 = !{i32 7, !"PIC Level", i32 2}
+!19 = distinct !DISubprogram(name: "e", scope: !6, file: !6, line: 9, type: !20, isLocal: false, isDefinition: true, scopeLine: 9, isOptimized: true, unit: !0, variables: !22)
+!20 = !DISubroutineType(types: !21)
+!21 = !{!12}
+!22 = !{!23}
+!23 = !DILocalVariable(name: "f", scope: !24, file: !6, line: 12, type: !12)
+!24 = distinct !DILexicalBlock(scope: !25, file: !6, line: 11, column: 20)
+!25 = distinct !DILexicalBlock(scope: !26, file: !6, line: 11, column: 9)
+!26 = distinct !DILexicalBlock(scope: !27, file: !6, line: 10, column: 3)
+!27 = distinct !DILexicalBlock(scope: !19, file: !6, line: 10, column: 3)
+!28 = !DILocation(line: 10, column: 10, scope: !29)
+!29 = distinct !DILexicalBlock(scope: !30, file: !6, line: 10, column: 3)
+!30 = distinct !DILexicalBlock(scope: !19, file: !6, line: 10, column: 3)
+!31 = !{!32, !32, i64 0}
+!32 = !{!"int", !33, i64 0}
+!33 = !{!"omnipotent char", !34, i64 0}
+!34 = !{!"Simple C/C++ TBAA"}
+!35 = !DILocation(line: 10, column: 3, scope: !30)
+!36 = !DILocation(line: 11, column: 9, scope: !37)
+!37 = distinct !DILexicalBlock(scope: !29, file: !6, line: 11, column: 9)
+!38 = !{!33, !33, i64 0}
+!39 = !DILocation(line: 11, column: 14, scope: !37)
+!40 = !DILocation(line: 11, column: 9, scope: !29)
+!41 = !DILocalVariable(name: "f", scope: !42, file: !6, line: 12, type: !12)
+!42 = distinct !DILexicalBlock(scope: !37, file: !6, line: 11, column: 20)
+!43 = !DILocation(line: 12, column: 11, scope: !42)
+!44 = !DILocation(line: 13, column: 9, scope: !42)
+!45 = !DILocation(line: 13, column: 7, scope: !42)
+!46 = !DILocation(line: 14, column: 5, scope: !42)