142 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -passes='loop-vectorize' -force-vector-width=8 -force-vector-interleave=2 -S %s | FileCheck --check-prefixes=CHECK %s3 4target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"5 6define i64 @remove_loop_region_int_iv_used_outside(ptr %dst) {7; CHECK-LABEL: define i64 @remove_loop_region_int_iv_used_outside(8; CHECK-SAME: ptr [[DST:%.*]]) {9; CHECK-NEXT: [[ENTRY:.*:]]10; CHECK-NEXT: br label %[[VECTOR_PH:.*]]11; CHECK: [[VECTOR_PH]]:12; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]13; CHECK: [[VECTOR_BODY]]:14; CHECK-NEXT: [[TMP2:%.*]] = getelementptr ptr, ptr [[DST]], i64 815; CHECK-NEXT: store <8 x ptr> zeroinitializer, ptr [[DST]], align 816; CHECK-NEXT: store <8 x ptr> zeroinitializer, ptr [[TMP2]], align 817; CHECK-NEXT: br label %[[MIDDLE_BLOCK:.*]]18; CHECK: [[MIDDLE_BLOCK]]:19; CHECK-NEXT: br label %[[EXIT:.*]]20; CHECK: [[EXIT]]:21; CHECK-NEXT: ret i64 1522;23entry:24 br label %loop25 26loop:27 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]28 %gep = getelementptr ptr, ptr %dst, i64 %iv29 store ptr null, ptr %gep, align 830 %iv.next = add i64 %iv, 131 %ec = icmp eq i64 %iv.next, 1632 br i1 %ec, label %exit, label %loop33 34exit:35 %res = phi i64 [ %iv, %loop ]36 ret i64 %res37}38 39define i64 @remove_loop_region_int_iv_inc_used_outside(ptr %dst) {40; CHECK-LABEL: define i64 @remove_loop_region_int_iv_inc_used_outside(41; CHECK-SAME: ptr [[DST:%.*]]) {42; CHECK-NEXT: [[ENTRY:.*:]]43; CHECK-NEXT: br label %[[VECTOR_PH:.*]]44; CHECK: [[VECTOR_PH]]:45; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]46; CHECK: [[VECTOR_BODY]]:47; CHECK-NEXT: [[TMP2:%.*]] = getelementptr ptr, ptr [[DST]], i64 848; CHECK-NEXT: store <8 x ptr> zeroinitializer, ptr [[DST]], align 849; CHECK-NEXT: store <8 x ptr> zeroinitializer, ptr [[TMP2]], align 850; CHECK-NEXT: br label %[[MIDDLE_BLOCK:.*]]51; CHECK: [[MIDDLE_BLOCK]]:52; CHECK-NEXT: br label %[[EXIT:.*]]53; CHECK: [[EXIT]]:54; CHECK-NEXT: ret i64 1655;56entry:57 br label %loop58 59loop:60 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]61 %gep = getelementptr ptr, ptr %dst, i64 %iv62 store ptr null, ptr %gep, align 863 %iv.next = add i64 %iv, 164 %ec = icmp eq i64 %iv.next, 1665 br i1 %ec, label %exit, label %loop66 67exit:68 %res = phi i64 [ %iv.next, %loop ]69 ret i64 %res70}71 72define ptr @remove_loop_region_ptr_iv_used_outside(ptr %dst) {73; CHECK-LABEL: define ptr @remove_loop_region_ptr_iv_used_outside(74; CHECK-SAME: ptr [[DST:%.*]]) {75; CHECK-NEXT: [[ENTRY:.*:]]76; CHECK-NEXT: br label %[[VECTOR_PH:.*]]77; CHECK: [[VECTOR_PH]]:78; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[DST]], i64 12879; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]80; CHECK: [[VECTOR_BODY]]:81; CHECK-NEXT: [[TMP2:%.*]] = getelementptr ptr, ptr [[DST]], i64 882; CHECK-NEXT: store <8 x ptr> zeroinitializer, ptr [[DST]], align 883; CHECK-NEXT: store <8 x ptr> zeroinitializer, ptr [[TMP2]], align 884; CHECK-NEXT: br label %[[MIDDLE_BLOCK:.*]]85; CHECK: [[MIDDLE_BLOCK]]:86; CHECK-NEXT: [[IND_ESCAPE:%.*]] = getelementptr i8, ptr [[TMP0]], i64 -887; CHECK-NEXT: br label %[[EXIT:.*]]88; CHECK: [[EXIT]]:89; CHECK-NEXT: ret ptr [[IND_ESCAPE]]90;91entry:92 br label %loop93 94loop:95 %ptr.iv = phi ptr [ %dst, %entry ], [ %ptr.iv.next, %loop ]96 %int.iv = phi i64 [ 0, %entry ], [ %int.iv.next, %loop ]97 store ptr null, ptr %ptr.iv, align 898 %int.iv.next = add i64 %int.iv, 199 %ptr.iv.next = getelementptr i8, ptr %ptr.iv, i64 8100 %ec = icmp eq i64 %int.iv.next, 16101 br i1 %ec, label %exit, label %loop102 103exit:104 %res = phi ptr [ %ptr.iv, %loop ]105 ret ptr %res106}107 108define ptr @remove_loop_region_ptr_iv_inc_used_outside(ptr %dst) {109; CHECK-LABEL: define ptr @remove_loop_region_ptr_iv_inc_used_outside(110; CHECK-SAME: ptr [[DST:%.*]]) {111; CHECK-NEXT: [[ENTRY:.*:]]112; CHECK-NEXT: br label %[[VECTOR_PH:.*]]113; CHECK: [[VECTOR_PH]]:114; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[DST]], i64 128115; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]116; CHECK: [[VECTOR_BODY]]:117; CHECK-NEXT: [[TMP2:%.*]] = getelementptr ptr, ptr [[DST]], i64 8118; CHECK-NEXT: store <8 x ptr> zeroinitializer, ptr [[DST]], align 8119; CHECK-NEXT: store <8 x ptr> zeroinitializer, ptr [[TMP2]], align 8120; CHECK-NEXT: br label %[[MIDDLE_BLOCK:.*]]121; CHECK: [[MIDDLE_BLOCK]]:122; CHECK-NEXT: br label %[[EXIT:.*]]123; CHECK: [[EXIT]]:124; CHECK-NEXT: ret ptr [[TMP0]]125;126entry:127 br label %loop128 129loop:130 %ptr.iv = phi ptr [ %dst, %entry ], [ %ptr.iv.next, %loop ]131 %int.iv = phi i64 [ 0, %entry ], [ %int.iv.next, %loop ]132 store ptr null, ptr %ptr.iv, align 8133 %int.iv.next = add i64 %int.iv, 1134 %ptr.iv.next = getelementptr i8, ptr %ptr.iv, i64 8135 %ec = icmp eq i64 %int.iv.next, 16136 br i1 %ec, label %exit, label %loop137 138exit:139 %res = phi ptr [ %ptr.iv.next, %loop ]140 ret ptr %res141}142