1; RUN: opt -basicaa -loop-distribute -enable-loop-distribute=0 -S < %s | FileCheck %s --check-prefix=CHECK --check-prefix=EXPLICIT --check-prefix=DEFAULT_OFF 2; RUN: opt -basicaa -loop-distribute -enable-loop-distribute=1 -S < %s | FileCheck %s --check-prefix=CHECK --check-prefix=EXPLICIT --check-prefix=DEFAULT_ON 3 4; Same loop as in basic.ll. Check that distribution is enabled/disabled 5; properly according to -enable-loop-distribute=0/1 and the 6; llvm.loop.distribute.enable metadata. 7 8target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" 9target triple = "x86_64-apple-macosx10.10.0" 10 11; CHECK-LABEL: @explicit_on( 12define void @explicit_on(i32* noalias %a, 13 i32* noalias %b, 14 i32* noalias %c, 15 i32* noalias %d, 16 i32* noalias %e) { 17entry: 18 br label %for.body 19 20; EXPLICIT: for.body.ldist1: 21 22for.body: ; preds = %for.body, %entry 23 %ind = phi i64 [ 0, %entry ], [ %add, %for.body ] 24 25 %arrayidxA = getelementptr inbounds i32, i32* %a, i64 %ind 26 %loadA = load i32, i32* %arrayidxA, align 4 27 28 %arrayidxB = getelementptr inbounds i32, i32* %b, i64 %ind 29 %loadB = load i32, i32* %arrayidxB, align 4 30 31 %mulA = mul i32 %loadB, %loadA 32 33 %add = add nuw nsw i64 %ind, 1 34 %arrayidxA_plus_4 = getelementptr inbounds i32, i32* %a, i64 %add 35 store i32 %mulA, i32* %arrayidxA_plus_4, align 4 36 37 %arrayidxD = getelementptr inbounds i32, i32* %d, i64 %ind 38 %loadD = load i32, i32* %arrayidxD, align 4 39 40 %arrayidxE = getelementptr inbounds i32, i32* %e, i64 %ind 41 %loadE = load i32, i32* %arrayidxE, align 4 42 43 %mulC = mul i32 %loadD, %loadE 44 45 %arrayidxC = getelementptr inbounds i32, i32* %c, i64 %ind 46 store i32 %mulC, i32* %arrayidxC, align 4 47 48 %exitcond = icmp eq i64 %add, 20 49 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !0 50 51for.end: ; preds = %for.body 52 ret void 53} 54 55; CHECK-LABEL: @explicit_off( 56define void @explicit_off(i32* noalias %a, 57 i32* noalias %b, 58 i32* noalias %c, 59 i32* noalias %d, 60 i32* noalias %e) { 61entry: 62 br label %for.body 63 64; EXPLICIT-NOT: for.body.ldist1: 65 66for.body: ; preds = %for.body, %entry 67 %ind = phi i64 [ 0, %entry ], [ %add, %for.body ] 68 69 %arrayidxA = getelementptr inbounds i32, i32* %a, i64 %ind 70 %loadA = load i32, i32* %arrayidxA, align 4 71 72 %arrayidxB = getelementptr inbounds i32, i32* %b, i64 %ind 73 %loadB = load i32, i32* %arrayidxB, align 4 74 75 %mulA = mul i32 %loadB, %loadA 76 77 %add = add nuw nsw i64 %ind, 1 78 %arrayidxA_plus_4 = getelementptr inbounds i32, i32* %a, i64 %add 79 store i32 %mulA, i32* %arrayidxA_plus_4, align 4 80 81 %arrayidxD = getelementptr inbounds i32, i32* %d, i64 %ind 82 %loadD = load i32, i32* %arrayidxD, align 4 83 84 %arrayidxE = getelementptr inbounds i32, i32* %e, i64 %ind 85 %loadE = load i32, i32* %arrayidxE, align 4 86 87 %mulC = mul i32 %loadD, %loadE 88 89 %arrayidxC = getelementptr inbounds i32, i32* %c, i64 %ind 90 store i32 %mulC, i32* %arrayidxC, align 4 91 92 %exitcond = icmp eq i64 %add, 20 93 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !2 94 95for.end: ; preds = %for.body 96 ret void 97} 98 99; CHECK-LABEL: @default_distribute( 100define void @default_distribute(i32* noalias %a, 101 i32* noalias %b, 102 i32* noalias %c, 103 i32* noalias %d, 104 i32* noalias %e) { 105entry: 106 br label %for.body 107 108; Verify the two distributed loops. 109 110; DEFAULT_ON: for.body.ldist1: 111; DEFAULT_OFF-NOT: for.body.ldist1: 112 113for.body: ; preds = %for.body, %entry 114 %ind = phi i64 [ 0, %entry ], [ %add, %for.body ] 115 116 %arrayidxA = getelementptr inbounds i32, i32* %a, i64 %ind 117 %loadA = load i32, i32* %arrayidxA, align 4 118 119 %arrayidxB = getelementptr inbounds i32, i32* %b, i64 %ind 120 %loadB = load i32, i32* %arrayidxB, align 4 121 122 %mulA = mul i32 %loadB, %loadA 123 124 %add = add nuw nsw i64 %ind, 1 125 %arrayidxA_plus_4 = getelementptr inbounds i32, i32* %a, i64 %add 126 store i32 %mulA, i32* %arrayidxA_plus_4, align 4 127 128 %arrayidxD = getelementptr inbounds i32, i32* %d, i64 %ind 129 %loadD = load i32, i32* %arrayidxD, align 4 130 131 %arrayidxE = getelementptr inbounds i32, i32* %e, i64 %ind 132 %loadE = load i32, i32* %arrayidxE, align 4 133 134 %mulC = mul i32 %loadD, %loadE 135 136 %arrayidxC = getelementptr inbounds i32, i32* %c, i64 %ind 137 store i32 %mulC, i32* %arrayidxC, align 4 138 139 %exitcond = icmp eq i64 %add, 20 140 br i1 %exitcond, label %for.end, label %for.body 141 142for.end: ; preds = %for.body 143 ret void 144} 145 146!0 = distinct !{!0, !1} 147!1 = !{!"llvm.loop.distribute.enable", i1 true} 148!2 = distinct !{!2, !3} 149!3 = !{!"llvm.loop.distribute.enable", i1 false} 150