|
1 | | -; REQUIRES: asserts |
2 | | -; RUN: not --crash opt -p loop-vectorize -S %s |
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 6 |
| 2 | +; RUN: opt -p loop-vectorize -S %s | FileCheck %s |
3 | 3 |
|
4 | 4 | target triple = "riscv64-unknown-linux-gnu" |
5 | 5 |
|
6 | 6 | define void @ptr_induction(ptr %p, ptr noalias %q, ptr noalias %p.end) #0 { |
| 7 | +; CHECK-LABEL: define void @ptr_induction( |
| 8 | +; CHECK-SAME: ptr [[P:%.*]], ptr noalias [[Q:%.*]], ptr noalias [[P_END:%.*]]) #[[ATTR0:[0-9]+]] { |
| 9 | +; CHECK-NEXT: [[ENTRY:.*:]] |
| 10 | +; CHECK-NEXT: [[P2:%.*]] = ptrtoint ptr [[P]] to i64 |
| 11 | +; CHECK-NEXT: [[P_END1:%.*]] = ptrtoint ptr [[P_END]] to i64 |
| 12 | +; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[P_END1]], 1 |
| 13 | +; CHECK-NEXT: [[TMP1:%.*]] = sub i64 [[TMP0]], [[P2]] |
| 14 | +; CHECK-NEXT: br label %[[VECTOR_PH:.*]] |
| 15 | +; CHECK: [[VECTOR_PH]]: |
| 16 | +; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <vscale x 2 x ptr> poison, ptr [[Q]], i64 0 |
| 17 | +; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <vscale x 2 x ptr> [[BROADCAST_SPLATINSERT]], <vscale x 2 x ptr> poison, <vscale x 2 x i32> zeroinitializer |
| 18 | +; CHECK-NEXT: [[BROADCAST_SPLATINSERT3:%.*]] = insertelement <vscale x 2 x ptr> poison, ptr [[P]], i64 0 |
| 19 | +; CHECK-NEXT: [[BROADCAST_SPLAT4:%.*]] = shufflevector <vscale x 2 x ptr> [[BROADCAST_SPLATINSERT3]], <vscale x 2 x ptr> poison, <vscale x 2 x i32> zeroinitializer |
| 20 | +; CHECK-NEXT: [[TMP2:%.*]] = call <vscale x 2 x i64> @llvm.stepvector.nxv2i64() |
| 21 | +; CHECK-NEXT: [[TMP3:%.*]] = mul <vscale x 2 x i64> [[TMP2]], splat (i64 1) |
| 22 | +; CHECK-NEXT: [[INDUCTION:%.*]] = add <vscale x 2 x i64> zeroinitializer, [[TMP3]] |
| 23 | +; CHECK-NEXT: br label %[[VECTOR_BODY:.*]] |
| 24 | +; CHECK: [[VECTOR_BODY]]: |
| 25 | +; CHECK-NEXT: [[VEC_IND:%.*]] = phi <vscale x 2 x i64> [ [[INDUCTION]], %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ] |
| 26 | +; CHECK-NEXT: [[POINTER_PHI:%.*]] = phi ptr [ [[P]], %[[VECTOR_PH]] ], [ [[PTR_IND7:%.*]], %[[VECTOR_BODY]] ] |
| 27 | +; CHECK-NEXT: [[AVL:%.*]] = phi i64 [ [[TMP1]], %[[VECTOR_PH]] ], [ [[AVL_NEXT:%.*]], %[[VECTOR_BODY]] ] |
| 28 | +; CHECK-NEXT: [[VECTOR_GEP:%.*]] = getelementptr i8, ptr [[POINTER_PHI]], <vscale x 2 x i64> [[TMP2]] |
| 29 | +; CHECK-NEXT: [[TMP4:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[AVL]], i32 2, i1 true) |
| 30 | +; CHECK-NEXT: [[TMP5:%.*]] = zext i32 [[TMP4]] to i64 |
| 31 | +; CHECK-NEXT: [[BROADCAST_SPLATINSERT5:%.*]] = insertelement <vscale x 2 x i64> poison, i64 [[TMP5]], i64 0 |
| 32 | +; CHECK-NEXT: [[BROADCAST_SPLAT6:%.*]] = shufflevector <vscale x 2 x i64> [[BROADCAST_SPLATINSERT5]], <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer |
| 33 | +; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint <vscale x 2 x ptr> [[VECTOR_GEP]] to <vscale x 2 x i64> |
| 34 | +; CHECK-NEXT: call void @llvm.vp.scatter.nxv2i64.nxv2p0(<vscale x 2 x i64> [[TMP6]], <vscale x 2 x ptr> align 8 [[BROADCAST_SPLAT]], <vscale x 2 x i1> splat (i1 true), i32 [[TMP4]]) |
| 35 | +; CHECK-NEXT: call void @llvm.vp.scatter.nxv2i64.nxv2p0(<vscale x 2 x i64> [[VEC_IND]], <vscale x 2 x ptr> align 8 [[BROADCAST_SPLAT4]], <vscale x 2 x i1> splat (i1 true), i32 [[TMP4]]) |
| 36 | +; CHECK-NEXT: [[AVL_NEXT]] = sub nuw i64 [[AVL]], [[TMP5]] |
| 37 | +; CHECK-NEXT: [[VEC_IND_NEXT]] = add <vscale x 2 x i64> [[VEC_IND]], [[BROADCAST_SPLAT6]] |
| 38 | +; CHECK-NEXT: [[PTR_IND7]] = getelementptr i8, ptr [[POINTER_PHI]], i64 [[TMP5]] |
| 39 | +; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[AVL_NEXT]], 0 |
| 40 | +; CHECK-NEXT: br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]] |
| 41 | +; CHECK: [[MIDDLE_BLOCK]]: |
| 42 | +; CHECK-NEXT: br label %[[EXIT:.*]] |
| 43 | +; CHECK: [[EXIT]]: |
| 44 | +; CHECK-NEXT: ret void |
| 45 | +; |
7 | 46 | entry: |
8 | 47 | br label %loop |
9 | 48 |
|
|
0 commit comments