2018-11-09 17:42:10 +08:00
; RUN: opt < %s -S -simplifycfg | FileCheck %s
; SimplifyCFG can hoist any common code in the 'then' and 'else' blocks to
; the 'if' basic block.
;
; For the special case, when hoisting the terminator instruction, its debug
; location keep references to its basic block, causing the debug information
; to become ambiguous. It causes the debugger to display unreached lines.
2019-01-14 20:13:12 +08:00
; Check that hoisted instructions get unknown-location line numbers -- there
; is no correct line number for code that has been common'd in this way.
2018-11-09 17:42:10 +08:00
; IR generated with:
; clang -S -g -gno-column-info -O2 -emit-llvm pr39187.cpp -o pr39187-g.ll -mllvm -opt-bisect-limit=10
; // pr39187.cpp
; int main() {
; volatile int foo = 0;
;
; int beards = 0;
; bool cond = foo == 4;
; int bar = 0;
; if (cond)
; beards = 8;
; else
; beards = 4;
;
; volatile bool face = cond;
;
; return face ? beards : 0;
; }
; CHECK-LABEL: entry
; CHECK: %foo = alloca i32, align 4
; CHECK: %face = alloca i8, align 1
; CHECK: %foo.0..sroa_cast = bitcast i32* %foo to i8*
; CHECK: store volatile i32 0, i32* %foo, align 4
; CHECK: %foo.0. = load volatile i32, i32* %foo, align 4, !dbg !16
; CHECK: %cmp = icmp eq i32 %foo.0., 4, !dbg !16
; CHECK: %frombool = zext i1 %cmp to i8, !dbg !16
; CHECK: call void @llvm.dbg.value(metadata i8 %frombool, metadata !13, metadata !DIExpression()), !dbg !16
; CHECK: call void @llvm.dbg.value(metadata i32 0, metadata !15, metadata !DIExpression()), !dbg !17
2019-01-14 20:13:12 +08:00
; CHECK: %. = select i1 %cmp, i32 8, i32 4, !dbg ![[MERGEDLOC:[0-9]+]]
; CHECK: ![[MERGEDLOC]] = !DILocation(line: 0, scope: !7)
2018-11-09 17:42:10 +08:00
; ModuleID = 'pr39187.cpp'
source_filename = "pr39187.cpp"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"
; Function Attrs: norecurse nounwind uwtable
define d s o _ l o c a l i32 @main ( ) local_unnamed_addr #0 !dbg !7 {
entry:
%foo = alloca i32 , align 4
%face = alloca i8 , align 1
%foo.0..sroa_cast = bitcast i32 * %foo to i8 *
store volatile i32 0 , i32 * %foo , align 4
%foo.0. = load volatile i32 , i32 * %foo , align 4 , !dbg !26
%cmp = icmp eq i32 %foo.0. , 4 , !dbg !26
%frombool = zext i1 %cmp to i8 , !dbg !26
call void @llvm.dbg.value ( metadata i8 %frombool , metadata !15 , metadata !DIExpression ( ) ) , !dbg !26
call void @llvm.dbg.value ( metadata i32 0 , metadata !17 , metadata !DIExpression ( ) ) , !dbg !27
br i1 %cmp , label %if.then , label %if.else
if.then: ; preds = %entry
call void @llvm.dbg.value ( metadata i32 8 , metadata !14 , metadata !DIExpression ( ) ) , !dbg !25
2019-01-14 20:13:12 +08:00
br label %if.end , !dbg !25
2018-11-09 17:42:10 +08:00
if.else: ; preds = %entry
2019-01-14 20:13:12 +08:00
call void @llvm.dbg.value ( metadata i32 4 , metadata !14 , metadata !DIExpression ( ) ) , !dbg !27
br label %if.end , !dbg !27
2018-11-09 17:42:10 +08:00
if.end: ; preds = %if.else, %if.then
%beards.0 = phi i32 [ 8 , %if.then ] , [ 4 , %if.else ]
store volatile i8 %frombool , i8 * %face , align 1
%face.0. = load volatile i8 , i8 * %face , align 1
%0 = and i8 %face.0. , 1
%tobool3 = icmp eq i8 %0 , 0
%cond4 = select i1 %tobool3 , i32 0 , i32 %beards.0
ret i32 %cond4
}
; Function Attrs: nounwind readnone speculatable
declare void @llvm.dbg.value ( metadata , metadata , metadata ) #2
!llvm.dbg.cu = ! { !0 }
!llvm.module.flags = ! { !3 , !4 , !5 }
!llvm.ident = ! { !6 }
!0 = distinct !DICompileUnit ( language: D W _ L A N G _ C _ p l u s _ p l u s , file: !1 , producer: "clang version 8.0.0 (trunk 346301)" , isOptimized: true , runtimeVersion: 0 , emissionKind: F u l l D e b u g , enums: !2 , nameTableKind: N one )
!1 = !DIFile ( filename: "pr39187.cpp" , directory: "." )
!2 = ! { }
!3 = ! { i32 2 , !"Dwarf Version" , i32 4 }
!4 = ! { i32 2 , !"Debug Info Version" , i32 3 }
!5 = ! { i32 1 , !"wchar_size" , i32 4 }
!6 = ! { !"clang version 8.0.0 (trunk 346301)" }
!7 = distinct !DISubprogram ( name: "main" , scope: !1 , file: !1 , line: 1 , type: !8 , isLocal: false , isDefinition: true , scopeLine: 1 , flags: D I F l a g P r o t o t y p e d , isOptimized: true , unit: !0 , retainedNodes: !11 )
!8 = !DISubroutineType ( types: !9 )
!9 = ! { !10 }
!10 = !DIBasicType ( name: "int" , size: 32 , encoding: D W _ A T E _ s i g n e d )
!11 = ! { !14 , !15 , !17 }
!14 = !DILocalVariable ( name: "beards" , scope: !7 , file: !1 , line: 4 , type: !10 )
!15 = !DILocalVariable ( name: "cond" , scope: !7 , file: !1 , line: 5 , type: !16 )
!16 = !DIBasicType ( name: "bool" , size: 8 , encoding: D W _ A T E _ b o o l e a n )
!17 = !DILocalVariable ( name: "bar" , scope: !7 , file: !1 , line: 6 , type: !10 )
!25 = !DILocation ( line: 4 , scope: !7 )
!26 = !DILocation ( line: 5 , scope: !7 )
!27 = !DILocation ( line: 6 , scope: !7 )