1a512ce5eSPhilip Reames; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2c416f670SPhilip Reames; RUN: opt < %s -passes=loop-vectorize -force-vector-interleave=4 -force-vector-width=1 -S | FileCheck --check-prefixes=CHECK,DEFAULT %s 3c416f670SPhilip Reames; RUN: opt < %s -passes=loop-vectorize -force-vector-interleave=4 -force-vector-width=1 -lv-strided-pointer-ivs=true -S | FileCheck --check-prefixes=CHECK,STRIDED %s 4a512ce5eSPhilip Reamestarget datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" 5a512ce5eSPhilip Reames 6a512ce5eSPhilip Reames; Test the scalar expansion of a non-constant stride pointer IV 7a512ce5eSPhilip Reamesdefine void @non_constant_scalar_expansion(i32 %0, ptr %call) { 8c416f670SPhilip Reames; DEFAULT-LABEL: @non_constant_scalar_expansion( 9c416f670SPhilip Reames; DEFAULT-NEXT: entry: 10c416f670SPhilip Reames; DEFAULT-NEXT: [[MUL:%.*]] = shl i32 [[TMP0:%.*]], 1 11c416f670SPhilip Reames; DEFAULT-NEXT: br label [[FOR_COND:%.*]] 12c416f670SPhilip Reames; DEFAULT: for.cond: 13c416f670SPhilip Reames; DEFAULT-NEXT: [[TMP1:%.*]] = phi i32 [ 30, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_COND]] ] 14c416f670SPhilip Reames; DEFAULT-NEXT: [[P_0:%.*]] = phi ptr [ null, [[ENTRY]] ], [ [[ADD_PTR:%.*]], [[FOR_COND]] ] 15c416f670SPhilip Reames; DEFAULT-NEXT: [[ADD_PTR]] = getelementptr i8, ptr [[P_0]], i32 [[MUL]] 16c416f670SPhilip Reames; DEFAULT-NEXT: [[ARRAYIDX:%.*]] = getelementptr ptr, ptr [[CALL:%.*]], i32 [[TMP1]] 17c416f670SPhilip Reames; DEFAULT-NEXT: store ptr [[P_0]], ptr [[ARRAYIDX]], align 4 18c416f670SPhilip Reames; DEFAULT-NEXT: [[INC]] = add i32 [[TMP1]], 1 19c416f670SPhilip Reames; DEFAULT-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP1]], 0 20c416f670SPhilip Reames; DEFAULT-NEXT: br i1 [[TOBOOL_NOT]], label [[FOR_END:%.*]], label [[FOR_COND]] 21c416f670SPhilip Reames; DEFAULT: for.end: 22c416f670SPhilip Reames; DEFAULT-NEXT: ret void 23c416f670SPhilip Reames; 24c416f670SPhilip Reames; STRIDED-LABEL: @non_constant_scalar_expansion( 25c416f670SPhilip Reames; STRIDED-NEXT: entry: 26c416f670SPhilip Reames; STRIDED-NEXT: [[MUL:%.*]] = shl i32 [[TMP0:%.*]], 1 27b85a402dSFlorian Hahn; STRIDED-NEXT: [[TMP1:%.*]] = sext i32 [[MUL]] to i64 28c416f670SPhilip Reames; STRIDED-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 29c416f670SPhilip Reames; STRIDED: vector.ph: 30236a0e82SFlorian Hahn; STRIDED-NEXT: [[TMP2:%.*]] = mul i64 4294967264, [[TMP1]] 31236a0e82SFlorian Hahn; STRIDED-NEXT: [[IND_END:%.*]] = getelementptr i8, ptr null, i64 [[TMP2]] 32c416f670SPhilip Reames; STRIDED-NEXT: br label [[VECTOR_BODY:%.*]] 33c416f670SPhilip Reames; STRIDED: vector.body: 34c416f670SPhilip Reames; STRIDED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 35c416f670SPhilip Reames; STRIDED-NEXT: [[DOTCAST:%.*]] = trunc i64 [[INDEX]] to i32 36c416f670SPhilip Reames; STRIDED-NEXT: [[OFFSET_IDX:%.*]] = add i32 30, [[DOTCAST]] 37*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TMP3:%.*]] = add i32 [[OFFSET_IDX]], 0 38*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TMP4:%.*]] = add i32 [[OFFSET_IDX]], 1 39*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TMP5:%.*]] = add i32 [[OFFSET_IDX]], 2 40*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TMP6:%.*]] = add i32 [[OFFSET_IDX]], 3 41*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[OFFSET_IDX2:%.*]] = mul i64 [[INDEX]], [[TMP1]] 42*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TMP7:%.*]] = mul i64 0, [[TMP1]] 43*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TMP8:%.*]] = add i64 [[OFFSET_IDX2]], [[TMP7]] 44*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TMP9:%.*]] = mul i64 1, [[TMP1]] 45*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TMP10:%.*]] = add i64 [[OFFSET_IDX2]], [[TMP9]] 46*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TMP11:%.*]] = mul i64 2, [[TMP1]] 47*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TMP12:%.*]] = add i64 [[OFFSET_IDX2]], [[TMP11]] 48*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TMP13:%.*]] = mul i64 3, [[TMP1]] 49*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TMP14:%.*]] = add i64 [[OFFSET_IDX2]], [[TMP13]] 50*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TMP15:%.*]] = getelementptr i8, ptr null, i64 [[TMP8]] 51*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TMP16:%.*]] = getelementptr i8, ptr null, i64 [[TMP10]] 52*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TMP17:%.*]] = getelementptr i8, ptr null, i64 [[TMP12]] 53*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TMP18:%.*]] = getelementptr i8, ptr null, i64 [[TMP14]] 54*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TMP19:%.*]] = getelementptr ptr, ptr [[CALL:%.*]], i32 [[TMP3]] 55*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TMP20:%.*]] = getelementptr ptr, ptr [[CALL]], i32 [[TMP4]] 56*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TMP21:%.*]] = getelementptr ptr, ptr [[CALL]], i32 [[TMP5]] 57*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TMP22:%.*]] = getelementptr ptr, ptr [[CALL]], i32 [[TMP6]] 58*06bb8c9fSFlorian Hahn; STRIDED-NEXT: store ptr [[TMP15]], ptr [[TMP19]], align 4 59*06bb8c9fSFlorian Hahn; STRIDED-NEXT: store ptr [[TMP16]], ptr [[TMP20]], align 4 60*06bb8c9fSFlorian Hahn; STRIDED-NEXT: store ptr [[TMP17]], ptr [[TMP21]], align 4 61*06bb8c9fSFlorian Hahn; STRIDED-NEXT: store ptr [[TMP18]], ptr [[TMP22]], align 4 62c416f670SPhilip Reames; STRIDED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 63*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TMP23:%.*]] = icmp eq i64 [[INDEX_NEXT]], 4294967264 64*06bb8c9fSFlorian Hahn; STRIDED-NEXT: br i1 [[TMP23]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]] 65c416f670SPhilip Reames; STRIDED: middle.block: 6696e83d37SFlorian Hahn; STRIDED-NEXT: br i1 false, label [[FOR_END:%.*]], label [[SCALAR_PH]] 67c416f670SPhilip Reames; STRIDED: scalar.ph: 68c416f670SPhilip Reames; STRIDED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ -2, [[MIDDLE_BLOCK]] ], [ 30, [[ENTRY:%.*]] ] 69c416f670SPhilip Reames; STRIDED-NEXT: [[BC_RESUME_VAL1:%.*]] = phi ptr [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ null, [[ENTRY]] ] 70c416f670SPhilip Reames; STRIDED-NEXT: br label [[FOR_COND:%.*]] 71c416f670SPhilip Reames; STRIDED: for.cond: 72*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TMP24:%.*]] = phi i32 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INC:%.*]], [[FOR_COND]] ] 73c416f670SPhilip Reames; STRIDED-NEXT: [[P_0:%.*]] = phi ptr [ [[BC_RESUME_VAL1]], [[SCALAR_PH]] ], [ [[ADD_PTR:%.*]], [[FOR_COND]] ] 74c416f670SPhilip Reames; STRIDED-NEXT: [[ADD_PTR]] = getelementptr i8, ptr [[P_0]], i32 [[MUL]] 75*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[ARRAYIDX:%.*]] = getelementptr ptr, ptr [[CALL]], i32 [[TMP24]] 76c416f670SPhilip Reames; STRIDED-NEXT: store ptr [[P_0]], ptr [[ARRAYIDX]], align 4 77*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[INC]] = add i32 [[TMP24]], 1 78*06bb8c9fSFlorian Hahn; STRIDED-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP24]], 0 79c416f670SPhilip Reames; STRIDED-NEXT: br i1 [[TOBOOL_NOT]], label [[FOR_END]], label [[FOR_COND]], !llvm.loop [[LOOP3:![0-9]+]] 80c416f670SPhilip Reames; STRIDED: for.end: 81c416f670SPhilip Reames; STRIDED-NEXT: ret void 82a512ce5eSPhilip Reames; 83a512ce5eSPhilip Reamesentry: 84a512ce5eSPhilip Reames %mul = shl i32 %0, 1 85a512ce5eSPhilip Reames br label %for.cond 86a512ce5eSPhilip Reames 87a512ce5eSPhilip Reamesfor.cond: ; preds = %for.body, %entry 88a512ce5eSPhilip Reames %1 = phi i32 [ 30, %entry ], [ %inc, %for.cond ] 89a512ce5eSPhilip Reames %p.0 = phi ptr [ null, %entry ], [ %add.ptr, %for.cond ] 90a512ce5eSPhilip Reames %add.ptr = getelementptr i8, ptr %p.0, i32 %mul 91a512ce5eSPhilip Reames %arrayidx = getelementptr ptr, ptr %call, i32 %1 92a512ce5eSPhilip Reames store ptr %p.0, ptr %arrayidx, align 4 93a512ce5eSPhilip Reames %inc = add i32 %1, 1 94a512ce5eSPhilip Reames %tobool.not = icmp eq i32 %1, 0 95a512ce5eSPhilip Reames br i1 %tobool.not, label %for.end, label %for.cond 96a512ce5eSPhilip Reames 97a512ce5eSPhilip Reames 98a512ce5eSPhilip Reamesfor.end: ; preds = %for.cond 99a512ce5eSPhilip Reames ret void 100a512ce5eSPhilip Reames} 101c416f670SPhilip Reames;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: 102c416f670SPhilip Reames; CHECK: {{.*}} 103