1; RUN: opt -S -loop-rotate < %s | FileCheck %s 2; RUN: opt -S -loop-rotate -enable-mssa-loop-dependency=true -verify-memoryssa < %s | FileCheck %s 3; RUN: opt -S -passes='require<targetir>,require<assumptions>,loop(loop-rotate)' < %s | FileCheck %s 4; RUN: opt -S -passes='require<targetir>,require<assumptions>,loop(loop-rotate)' -enable-mssa-loop-dependency=true -verify-memoryssa < %s | FileCheck %s 5 6target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" 7target triple = "x86_64-unknown-linux-gnu" 8 9declare void @g(i32*) 10 11define void @test_02(i32* nocapture %_pA) nounwind ssp { 12; CHECK-LABEL: @test_02( 13; CHECK: entry: 14; CHECK: tail call void @llvm.experimental.noalias.scope.decl(metadata !2) 15; CHECK: store i32 42, i32* %_pA, align 16, !alias.scope !2 16; CHECK: for.body: 17; CHECK: tail call void @llvm.experimental.noalias.scope.decl(metadata !5) 18; CHECK: store i32 0, i32* %arrayidx, align 16, !noalias !5 19; CHECK: tail call void @llvm.experimental.noalias.scope.decl(metadata !7) 20; CHECK: store i32 42, i32* %_pA, align 16, !alias.scope !7 21; CHECK: for.end: 22 23entry: 24 %array = alloca [20 x i32], align 16 25 br label %for.cond 26 27for.cond: ; preds = %for.body, %entry 28 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 29 tail call void @llvm.experimental.noalias.scope.decl(metadata !2) 30 store i32 42, i32* %_pA, align 16, !alias.scope !2 31 %cmp = icmp slt i32 %i.0, 100 32 %arrayidx = getelementptr inbounds [20 x i32], [20 x i32]* %array, i64 0, i64 0 33 br i1 %cmp, label %for.body, label %for.end 34 35for.body: ; preds = %for.cond 36 store i32 0, i32* %arrayidx, align 16, !noalias !2 37 %inc = add nsw i32 %i.0, 1 38 br label %for.cond 39 40for.end: ; preds = %for.cond 41 %arrayidx.lcssa = phi i32* [ %arrayidx, %for.cond ] 42 call void @g(i32* %arrayidx.lcssa) nounwind 43 ret void 44} 45 46define void @test_03(i32* nocapture %_pA) nounwind ssp { 47; CHECK-LABEL: @test_03( 48; CHECK: entry: 49; CHECK: for.body: 50; CHECK: tail call void @llvm.experimental.noalias.scope.decl(metadata !5) 51; CHECK: store i32 42, i32* %_pA, align 16, !alias.scope !5 52; CHECK: store i32 0, i32* %arrayidx, align 16, !noalias !5 53; CHECK: for.end: 54 55entry: 56 %array = alloca [20 x i32], align 16 57 br label %for.cond 58 59for.cond: ; preds = %for.body, %entry 60 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 61 %cmp = icmp slt i32 %i.0, 100 62 %arrayidx = getelementptr inbounds [20 x i32], [20 x i32]* %array, i64 0, i64 0 63 br i1 %cmp, label %for.body, label %for.end 64 65for.body: ; preds = %for.cond 66 tail call void @llvm.experimental.noalias.scope.decl(metadata !2) 67 store i32 42, i32* %_pA, align 16, !alias.scope !2 68 store i32 0, i32* %arrayidx, align 16, !noalias !2 69 %inc = add nsw i32 %i.0, 1 70 br label %for.cond 71 72for.end: ; preds = %for.cond 73 %arrayidx.lcssa = phi i32* [ %arrayidx, %for.cond ] 74 call void @g(i32* %arrayidx.lcssa) nounwind 75 ret void 76} 77 78define void @test_04(i32* nocapture %_pA) nounwind ssp { 79; CHECK-LABEL: @test_04( 80; CHECK: entry: 81; CHECK: tail call void @llvm.experimental.noalias.scope.decl(metadata !9) 82; CHECK: store i32 42, i32* %_pA, align 16, !alias.scope !9 83; CHECK: for.body: 84; CHECK: tail call void @llvm.experimental.noalias.scope.decl(metadata !5) 85; CHECK: store i32 0, i32* %arrayidx, align 16, !noalias !5 86; CHECK: store i32 43, i32* %_pA, align 16, !alias.scope !5 87; CHECK: tail call void @llvm.experimental.noalias.scope.decl(metadata !11) 88; CHECK: store i32 42, i32* %_pA, align 16, !alias.scope !11 89; CHECK: for.end: 90entry: 91 %array = alloca [20 x i32], align 16 92 br label %for.cond 93 94for.cond: ; preds = %for.body, %entry 95 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 96 tail call void @llvm.experimental.noalias.scope.decl(metadata !2) 97 store i32 42, i32* %_pA, align 16, !alias.scope !2 98 %cmp = icmp slt i32 %i.0, 100 99 %arrayidx = getelementptr inbounds [20 x i32], [20 x i32]* %array, i64 0, i64 0 100 br i1 %cmp, label %for.body, label %for.end 101 102for.body: ; preds = %for.cond 103 store i32 0, i32* %arrayidx, align 16, !noalias !2 104 store i32 43, i32* %_pA, align 16, !alias.scope !2 105 %inc = add nsw i32 %i.0, 1 106 br label %for.cond 107 108for.end: ; preds = %for.cond 109 %arrayidx.lcssa = phi i32* [ %arrayidx, %for.cond ] 110 call void @g(i32* %arrayidx.lcssa) nounwind 111 ret void 112} 113 114define void @test_05(i32* nocapture %_pA) nounwind ssp { 115; CHECK-LABEL: @test_05( 116; CHECK: entry: 117; CHECK: tail call void @llvm.experimental.noalias.scope.decl(metadata !13) 118; CHECK: store i32 42, i32* %_pA, align 16, !alias.scope !13 119; CHECK: for.body: 120; CHECK: tail call void @llvm.experimental.noalias.scope.decl(metadata !5) 121; CHECK: store i32 0, i32* %arrayidx, align 16, !noalias !5 122; CHECK: store i32 43, i32* %_pA, align 16, !alias.scope !5 123; CHECK: tail call void @llvm.experimental.noalias.scope.decl(metadata !15) 124; CHECK: store i32 42, i32* %_pA, align 16, !alias.scope !15 125; CHECK: for.end: 126; CHECK: store i32 44, i32* %_pA, align 16, !alias.scope !5 127 128entry: 129 %array = alloca [20 x i32], align 16 130 br label %for.cond 131 132for.cond: ; preds = %for.body, %entry 133 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 134 tail call void @llvm.experimental.noalias.scope.decl(metadata !2) 135 store i32 42, i32* %_pA, align 16, !alias.scope !2 136 %cmp = icmp slt i32 %i.0, 100 137 %arrayidx = getelementptr inbounds [20 x i32], [20 x i32]* %array, i64 0, i64 0 138 br i1 %cmp, label %for.body, label %for.end 139 140for.body: ; preds = %for.cond 141 store i32 0, i32* %arrayidx, align 16, !noalias !2 142 store i32 43, i32* %_pA, align 16, !alias.scope !2 143 %inc = add nsw i32 %i.0, 1 144 br label %for.cond 145 146for.end: ; preds = %for.cond 147 %arrayidx.lcssa = phi i32* [ %arrayidx, %for.cond ] 148 store i32 44, i32* %_pA, align 16, !alias.scope !2 149 call void @g(i32* %arrayidx.lcssa) nounwind 150 ret void 151} 152 153; Function Attrs: inaccessiblememonly nounwind 154declare void @llvm.experimental.noalias.scope.decl(metadata) #1 155 156attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } 157attributes #1 = { inaccessiblememonly nounwind } 158attributes #2 = { nounwind readnone speculatable } 159 160!llvm.module.flags = !{!0} 161!llvm.ident = !{!1} 162 163!0 = !{i32 1, !"wchar_size", i32 4} 164!1 = !{!"clang"} 165!2 = !{!3} 166!3 = distinct !{!3, !4, !"test_loop_rotate_XX: pA"} 167!4 = distinct !{!4, !"test_loop_rotate_XX"} 168 169; CHECK: !0 = !{i32 1, !"wchar_size", i32 4} 170; CHECK: !1 = !{!"clang"} 171; CHECK: !2 = !{!3} 172; CHECK: !3 = distinct !{!3, !4, !"test_loop_rotate_XX: pA:pre.rot"} 173; CHECK: !4 = distinct !{!4, !"test_loop_rotate_XX"} 174; CHECK: !5 = !{!6} 175; CHECK: !6 = distinct !{!6, !4, !"test_loop_rotate_XX: pA"} 176; CHECK: !7 = !{!8} 177; CHECK: !8 = distinct !{!8, !4, !"test_loop_rotate_XX: pA:h.rot"} 178; CHECK: !9 = !{!10} 179; CHECK: !10 = distinct !{!10, !4, !"test_loop_rotate_XX: pA:pre.rot"} 180; CHECK: !11 = !{!12} 181; CHECK: !12 = distinct !{!12, !4, !"test_loop_rotate_XX: pA:h.rot"} 182; CHECK: !13 = !{!14} 183; CHECK: !14 = distinct !{!14, !4, !"test_loop_rotate_XX: pA:pre.rot"} 184; CHECK: !15 = !{!16} 185; CHECK: !16 = distinct !{!16, !4, !"test_loop_rotate_XX: pA:h.rot"} 186