1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -loop-rotate < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.dbg.declare(metadata, metadata, metadata) nounwind readnone 4*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.dbg.value(metadata, i64, metadata, metadata) nounwind readnone 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine i32 @tak(i32 %x, i32 %y, i32 %z) nounwind ssp !dbg !0 { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @tak( 8*9880d681SAndroid Build Coastguard Worker; CHECK: entry 9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @llvm.dbg.value(metadata i32 %x 10*9880d681SAndroid Build Coastguard Worker; CHECK: tail call void @llvm.dbg.value(metadata i32 %call 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerentry: 13*9880d681SAndroid Build Coastguard Worker br label %tailrecurse 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workertailrecurse: ; preds = %if.then, %entry 16*9880d681SAndroid Build Coastguard Worker %x.tr = phi i32 [ %x, %entry ], [ %call, %if.then ] 17*9880d681SAndroid Build Coastguard Worker %y.tr = phi i32 [ %y, %entry ], [ %call9, %if.then ] 18*9880d681SAndroid Build Coastguard Worker %z.tr = phi i32 [ %z, %entry ], [ %call14, %if.then ] 19*9880d681SAndroid Build Coastguard Worker tail call void @llvm.dbg.value(metadata i32 %x.tr, i64 0, metadata !6, metadata !DIExpression()), !dbg !7 20*9880d681SAndroid Build Coastguard Worker tail call void @llvm.dbg.value(metadata i32 %y.tr, i64 0, metadata !8, metadata !DIExpression()), !dbg !9 21*9880d681SAndroid Build Coastguard Worker tail call void @llvm.dbg.value(metadata i32 %z.tr, i64 0, metadata !10, metadata !DIExpression()), !dbg !11 22*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %y.tr, %x.tr, !dbg !12 23*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.end, !dbg !12 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %tailrecurse 26*9880d681SAndroid Build Coastguard Worker %sub = sub nsw i32 %x.tr, 1, !dbg !14 27*9880d681SAndroid Build Coastguard Worker %call = tail call i32 @tak(i32 %sub, i32 %y.tr, i32 %z.tr), !dbg !14 28*9880d681SAndroid Build Coastguard Worker %sub6 = sub nsw i32 %y.tr, 1, !dbg !14 29*9880d681SAndroid Build Coastguard Worker %call9 = tail call i32 @tak(i32 %sub6, i32 %z.tr, i32 %x.tr), !dbg !14 30*9880d681SAndroid Build Coastguard Worker %sub11 = sub nsw i32 %z.tr, 1, !dbg !14 31*9880d681SAndroid Build Coastguard Worker %call14 = tail call i32 @tak(i32 %sub11, i32 %x.tr, i32 %y.tr), !dbg !14 32*9880d681SAndroid Build Coastguard Worker br label %tailrecurse 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %tailrecurse 35*9880d681SAndroid Build Coastguard Worker br label %return, !dbg !16 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %if.end 38*9880d681SAndroid Build Coastguard Worker ret i32 %z.tr, !dbg !17 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerdefine i32 @tak2(i32 %x, i32 %y, i32 %z) nounwind ssp !dbg !0 { 42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @tak2( 43*9880d681SAndroid Build Coastguard Worker; CHECK: entry 44*9880d681SAndroid Build Coastguard Worker; CHECK: tail call void @llvm.dbg.value(metadata i32 %x.tr 45*9880d681SAndroid Build Coastguard Worker; CHECK: tail call void @llvm.dbg.value(metadata i32 undef 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerentry: 48*9880d681SAndroid Build Coastguard Worker br label %tailrecurse 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workertailrecurse: ; preds = %if.then, %entry 51*9880d681SAndroid Build Coastguard Worker %x.tr = phi i32 [ %x, %entry ], [ %call, %if.then ] 52*9880d681SAndroid Build Coastguard Worker %y.tr = phi i32 [ %y, %entry ], [ %call9, %if.then ] 53*9880d681SAndroid Build Coastguard Worker %z.tr = phi i32 [ %z, %entry ], [ %call14, %if.then ] 54*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %y.tr, %x.tr, !dbg !12 55*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.end, !dbg !12 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %tailrecurse 58*9880d681SAndroid Build Coastguard Worker tail call void @llvm.dbg.value(metadata i32 %x.tr, i64 0, metadata !6, metadata !DIExpression()), !dbg !7 59*9880d681SAndroid Build Coastguard Worker tail call void @llvm.dbg.value(metadata i32 %y.tr, i64 0, metadata !8, metadata !DIExpression()), !dbg !9 60*9880d681SAndroid Build Coastguard Worker tail call void @llvm.dbg.value(metadata i32 %z.tr, i64 0, metadata !10, metadata !DIExpression()), !dbg !11 61*9880d681SAndroid Build Coastguard Worker %sub = sub nsw i32 %x.tr, 1, !dbg !14 62*9880d681SAndroid Build Coastguard Worker %call = tail call i32 @tak(i32 %sub, i32 %y.tr, i32 %z.tr), !dbg !14 63*9880d681SAndroid Build Coastguard Worker %sub6 = sub nsw i32 %y.tr, 1, !dbg !14 64*9880d681SAndroid Build Coastguard Worker %call9 = tail call i32 @tak(i32 %sub6, i32 %z.tr, i32 %x.tr), !dbg !14 65*9880d681SAndroid Build Coastguard Worker %sub11 = sub nsw i32 %z.tr, 1, !dbg !14 66*9880d681SAndroid Build Coastguard Worker %call14 = tail call i32 @tak(i32 %sub11, i32 %x.tr, i32 %y.tr), !dbg !14 67*9880d681SAndroid Build Coastguard Worker br label %tailrecurse 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %tailrecurse 70*9880d681SAndroid Build Coastguard Worker tail call void @llvm.dbg.value(metadata i32 %x.tr, i64 0, metadata !6, metadata !DIExpression()), !dbg !7 71*9880d681SAndroid Build Coastguard Worker tail call void @llvm.dbg.value(metadata i32 %y.tr, i64 0, metadata !8, metadata !DIExpression()), !dbg !9 72*9880d681SAndroid Build Coastguard Worker tail call void @llvm.dbg.value(metadata i32 %z.tr, i64 0, metadata !10, metadata !DIExpression()), !dbg !11 73*9880d681SAndroid Build Coastguard Worker br label %return, !dbg !16 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %if.end 76*9880d681SAndroid Build Coastguard Worker ret i32 %z.tr, !dbg !17 77*9880d681SAndroid Build Coastguard Worker} 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker@channelColumns = external global i64 80*9880d681SAndroid Build Coastguard Worker@horzPlane = external global i8*, align 8 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workerdefine void @FindFreeHorzSeg(i64 %startCol, i64 %row, i64* %rowStart) { 83*9880d681SAndroid Build Coastguard Worker; Ensure that the loop increment basic block is rotated into the tail of the 84*9880d681SAndroid Build Coastguard Worker; body, even though it contains a debug intrinsic call. 85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @FindFreeHorzSeg( 86*9880d681SAndroid Build Coastguard Worker; CHECK: %dec = add 87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: tail call void @llvm.dbg.value 88*9880d681SAndroid Build Coastguard Worker; CHECK: %cmp = icmp 89*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %cmp 90*9880d681SAndroid Build Coastguard Worker; CHECK: phi i64 [ %{{[^,]*}}, %{{[^,]*}} ] 91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %for.end 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Workerentry: 95*9880d681SAndroid Build Coastguard Worker br label %for.cond 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerfor.cond: 98*9880d681SAndroid Build Coastguard Worker %i.0 = phi i64 [ %startCol, %entry ], [ %dec, %for.inc ] 99*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i64 %i.0, 0 100*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.end, label %for.body 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Workerfor.body: 103*9880d681SAndroid Build Coastguard Worker %0 = load i64, i64* @channelColumns, align 8 104*9880d681SAndroid Build Coastguard Worker %mul = mul i64 %0, %row 105*9880d681SAndroid Build Coastguard Worker %add = add i64 %mul, %i.0 106*9880d681SAndroid Build Coastguard Worker %1 = load i8*, i8** @horzPlane, align 8 107*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i8, i8* %1, i64 %add 108*9880d681SAndroid Build Coastguard Worker %2 = load i8, i8* %arrayidx, align 1 109*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i8 %2, 0 110*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %for.inc, label %for.end 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Workerfor.inc: 113*9880d681SAndroid Build Coastguard Worker %dec = add i64 %i.0, -1 114*9880d681SAndroid Build Coastguard Worker tail call void @llvm.dbg.value(metadata i64 %dec, i64 0, metadata !DILocalVariable(scope: !0), metadata !DIExpression()), !dbg !DILocation(scope: !0) 115*9880d681SAndroid Build Coastguard Worker br label %for.cond 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerfor.end: 118*9880d681SAndroid Build Coastguard Worker %add1 = add i64 %i.0, 1 119*9880d681SAndroid Build Coastguard Worker store i64 %add1, i64* %rowStart, align 8 120*9880d681SAndroid Build Coastguard Worker ret void 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker!llvm.module.flags = !{!20} 124*9880d681SAndroid Build Coastguard Worker!llvm.dbg.cu = !{!2} 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker!0 = distinct !DISubprogram(name: "tak", line: 32, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !2, file: !18, scope: !1, type: !3) 127*9880d681SAndroid Build Coastguard Worker!1 = !DIFile(filename: "/Volumes/Lalgate/cj/llvm/projects/llvm-test/SingleSource/Benchmarks/BenchmarkGame/recursive.c", directory: "/Volumes/Lalgate/cj/D/projects/llvm-test/SingleSource/Benchmarks/BenchmarkGame") 128*9880d681SAndroid Build Coastguard Worker!2 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang version 2.9 (trunk 125492)", isOptimized: true, emissionKind: FullDebug, file: !18) 129*9880d681SAndroid Build Coastguard Worker!3 = !DISubroutineType(types: !4) 130*9880d681SAndroid Build Coastguard Worker!4 = !{!5} 131*9880d681SAndroid Build Coastguard Worker!5 = !DIBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32, encoding: DW_ATE_signed) 132*9880d681SAndroid Build Coastguard Worker!6 = !DILocalVariable(name: "x", line: 32, arg: 1, scope: !0, file: !1, type: !5) 133*9880d681SAndroid Build Coastguard Worker!7 = !DILocation(line: 32, column: 13, scope: !0) 134*9880d681SAndroid Build Coastguard Worker!8 = !DILocalVariable(name: "y", line: 32, arg: 2, scope: !0, file: !1, type: !5) 135*9880d681SAndroid Build Coastguard Worker!9 = !DILocation(line: 32, column: 20, scope: !0) 136*9880d681SAndroid Build Coastguard Worker!10 = !DILocalVariable(name: "z", line: 32, arg: 3, scope: !0, file: !1, type: !5) 137*9880d681SAndroid Build Coastguard Worker!11 = !DILocation(line: 32, column: 27, scope: !0) 138*9880d681SAndroid Build Coastguard Worker!12 = !DILocation(line: 33, column: 3, scope: !13) 139*9880d681SAndroid Build Coastguard Worker!13 = distinct !DILexicalBlock(line: 32, column: 30, file: !18, scope: !0) 140*9880d681SAndroid Build Coastguard Worker!14 = !DILocation(line: 34, column: 5, scope: !15) 141*9880d681SAndroid Build Coastguard Worker!15 = distinct !DILexicalBlock(line: 33, column: 14, file: !18, scope: !13) 142*9880d681SAndroid Build Coastguard Worker!16 = !DILocation(line: 36, column: 3, scope: !13) 143*9880d681SAndroid Build Coastguard Worker!17 = !DILocation(line: 37, column: 1, scope: !13) 144*9880d681SAndroid Build Coastguard Worker!18 = !DIFile(filename: "/Volumes/Lalgate/cj/llvm/projects/llvm-test/SingleSource/Benchmarks/BenchmarkGame/recursive.c", directory: "/Volumes/Lalgate/cj/D/projects/llvm-test/SingleSource/Benchmarks/BenchmarkGame") 145*9880d681SAndroid Build Coastguard Worker!20 = !{i32 1, !"Debug Info Version", i32 3} 146