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