1; RUN: opt < %s -passes=loop-vectorize -force-vector-width=2 -S | FileCheck %s 2 3%s1 = type { [32000 x double], [32000 x double], [32000 x double] } 4 5define i32 @load_with_pointer_phi_no_runtime_checks(ptr %data) { 6; CHECK-LABEL: @load_with_pointer_phi_no_runtime_checks 7; CHECK-NOT: memcheck 8; CHECK: vector.body: 9; 10entry: 11 br label %loop.header 12 13loop.header: ; preds = %loop.latch, %entry 14 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ] 15 %iv.next = add nuw nsw i64 %iv, 1 16 %cmp5 = icmp ult i64 %iv, 15999 17 %arrayidx = getelementptr inbounds %s1, ptr %data, i64 0, i32 0, i64 %iv 18 br i1 %cmp5, label %if.then, label %if.else 19 20if.then: ; preds = %loop.header 21 %gep.1 = getelementptr inbounds %s1, ptr %data, i64 0, i32 1, i64 %iv 22 br label %loop.latch 23 24if.else: ; preds = %loop.header 25 %gep.2 = getelementptr inbounds %s1, ptr %data, i64 0, i32 2, i64 %iv 26 br label %loop.latch 27 28loop.latch: ; preds = %if.else, %if.then 29 %gep.2.sink = phi ptr [ %gep.2, %if.else ], [ %gep.1, %if.then ] 30 %v8 = load double, ptr %gep.2.sink, align 8 31 %mul16 = fmul double 3.0, %v8 32 store double %mul16, ptr %arrayidx, align 8 33 %exitcond.not = icmp eq i64 %iv.next, 32000 34 br i1 %exitcond.not, label %exit, label %loop.header 35 36exit: ; preds = %loop.latch 37 ret i32 10 38} 39 40define i32 @store_with_pointer_phi_no_runtime_checks(ptr %data) { 41; CHECK-LABEL: @store_with_pointer_phi_no_runtime_checks 42; CHECK-NOT: memcheck 43; CHECK: vector.body 44; 45entry: 46 br label %loop.header 47 48loop.header: ; preds = %loop.latch, %entry 49 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ] 50 %iv.next = add nuw nsw i64 %iv, 1 51 %cmp5 = icmp ult i64 %iv, 15999 52 %arrayidx = getelementptr inbounds %s1, ptr %data, i64 0, i32 0, i64 %iv 53 br i1 %cmp5, label %if.then, label %if.else 54 55if.then: ; preds = %loop.header 56 %gep.1 = getelementptr inbounds %s1, ptr %data, i64 0, i32 1, i64 %iv 57 br label %loop.latch 58 59if.else: ; preds = %loop.header 60 %gep.2 = getelementptr inbounds %s1, ptr %data, i64 0, i32 2, i64 %iv 61 br label %loop.latch 62 63loop.latch: ; preds = %if.else, %if.then 64 %gep.2.sink = phi ptr [ %gep.2, %if.else ], [ %gep.1, %if.then ] 65 %v8 = load double, ptr %arrayidx, align 8 66 %mul16 = fmul double 3.0, %v8 67 store double %mul16, ptr %gep.2.sink, align 8 68 %exitcond.not = icmp eq i64 %iv.next, 32000 69 br i1 %exitcond.not, label %exit, label %loop.header 70 71exit: ; preds = %loop.latch 72 ret i32 10 73} 74 75define i32 @store_with_pointer_phi_runtime_checks(ptr %A, ptr %B, ptr %C) { 76; CHECK-LABEL: @store_with_pointer_phi_runtime_checks 77; CHECK: memcheck 78; CHECK: vector.body 79; 80entry: 81 br label %loop.header 82 83loop.header: ; preds = %loop.latch, %entry 84 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ] 85 %iv.next = add nuw nsw i64 %iv, 1 86 %cmp5 = icmp ult i64 %iv, 15999 87 %arrayidx = getelementptr inbounds double, ptr %A, i64 %iv 88 br i1 %cmp5, label %if.then, label %if.else 89 90if.then: ; preds = %loop.header 91 %gep.1 = getelementptr inbounds double, ptr %B, i64 %iv 92 br label %loop.latch 93 94if.else: ; preds = %loop.header 95 %gep.2 = getelementptr inbounds double, ptr %C, i64 %iv 96 br label %loop.latch 97 98loop.latch: ; preds = %if.else, %if.then 99 %gep.2.sink = phi ptr [ %gep.2, %if.else ], [ %gep.1, %if.then ] 100 %v8 = load double, ptr %arrayidx, align 8 101 %mul16 = fmul double 3.0, %v8 102 store double %mul16, ptr %gep.2.sink, align 8 103 %exitcond.not = icmp eq i64 %iv.next, 32000 104 br i1 %exitcond.not, label %exit, label %loop.header 105 106exit: ; preds = %loop.latch 107 ret i32 10 108} 109 110define i32 @load_with_pointer_phi_outside_loop(ptr %A, ptr %B, ptr %C, i1 %c.0, i1 %c.1) { 111; CHECK-LABEL: @load_with_pointer_phi_outside_loop 112; CHECK-NOT: vector.body 113; 114entry: 115 br i1 %c.0, label %if.then, label %if.else 116 117if.then: 118 br label %loop.ph 119 120if.else: 121 %ptr.select = select i1 %c.1, ptr %C, ptr %B 122 br label %loop.ph 123 124loop.ph: 125 %ptr = phi ptr [ %A, %if.then ], [ %ptr.select, %if.else ] 126 br label %loop.header 127 128loop.header: ; preds = %loop.latch, %entry 129 %iv = phi i64 [ 0, %loop.ph ], [ %iv.next, %loop.header ] 130 %iv.next = add nuw nsw i64 %iv, 1 131 %arrayidx = getelementptr inbounds double, ptr %A, i64 %iv 132 %v8 = load double, ptr %ptr, align 8 133 %mul16 = fmul double 3.0, %v8 134 store double %mul16, ptr %arrayidx, align 8 135 %exitcond.not = icmp eq i64 %iv.next, 32000 136 br i1 %exitcond.not, label %exit, label %loop.header 137 138exit: ; preds = %loop.latch 139 ret i32 10 140} 141 142define i32 @store_with_pointer_phi_outside_loop(ptr %A, ptr %B, ptr %C, i1 %c.0, i1 %c.1) { 143; CHECK-LABEL: @store_with_pointer_phi_outside_loop 144; CHECK-NOT: vector.body 145; 146entry: 147 br i1 %c.0, label %if.then, label %if.else 148 149if.then: 150 br label %loop.ph 151 152if.else: 153 %ptr.select = select i1 %c.1, ptr %C, ptr %B 154 br label %loop.ph 155 156loop.ph: 157 %ptr = phi ptr [ %A, %if.then ], [ %ptr.select, %if.else ] 158 br label %loop.header 159 160loop.header: ; preds = %loop.latch, %entry 161 %iv = phi i64 [ 0, %loop.ph ], [ %iv.next, %loop.header ] 162 %iv.next = add nuw nsw i64 %iv, 1 163 %arrayidx = getelementptr inbounds double, ptr %A, i64 %iv 164 %v8 = load double, ptr %arrayidx, align 8 165 %mul16 = fmul double 3.0, %v8 166 store double %mul16, ptr %ptr, align 8 167 %exitcond.not = icmp eq i64 %iv.next, 32000 168 br i1 %exitcond.not, label %exit, label %loop.header 169 170exit: ; preds = %loop.latch 171 ret i32 10 172} 173