diff --git a/llvm/test/Transforms/LoopVectorize/RISCV/dbg-tail-folding-by-evl.ll b/llvm/test/Transforms/LoopVectorize/RISCV/dbg-tail-folding-by-evl.ll new file mode 100644 index 0000000000000..bab5c39c779e3 --- /dev/null +++ b/llvm/test/Transforms/LoopVectorize/RISCV/dbg-tail-folding-by-evl.ll @@ -0,0 +1,93 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 +; RUN: opt -passes=loop-vectorize \ +; RUN: -prefer-predicate-over-epilogue=predicate-else-scalar-epilogue \ +; RUN: -mtriple=riscv64 -mattr=+v -S < %s | FileCheck %s + +define void @reverse_store(ptr %a, i64 %n) !dbg !3 { +; CHECK-LABEL: define void @reverse_store( +; CHECK-SAME: ptr [[A:%.*]], i64 [[N:%.*]]) #[[ATTR0:[0-9]+]] !dbg [[DBG3:![0-9]+]] { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[N]], 1 +; CHECK-NEXT: [[UMIN:%.*]] = call i64 @llvm.umin.i64(i64 [[N]], i64 1) +; CHECK-NEXT: [[TMP1:%.*]] = sub i64 [[TMP0]], [[UMIN]] +; CHECK-NEXT: br label %[[VECTOR_PH:.*]] +; CHECK: [[VECTOR_PH]]: +; CHECK-NEXT: [[TMP2:%.*]] = call @llvm.stepvector.nxv2i64() +; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement poison, i64 [[N]], i64 0 +; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector [[BROADCAST_SPLATINSERT]], poison, zeroinitializer +; CHECK-NEXT: [[TMP3:%.*]] = mul nsw [[TMP2]], splat (i64 -1) +; CHECK-NEXT: [[INDUCTION:%.*]] = add nsw [[BROADCAST_SPLAT]], [[TMP3]] +; CHECK-NEXT: br label %[[VECTOR_BODY:.*]] +; CHECK: [[VECTOR_BODY]]: +; CHECK-NEXT: [[VEC_IND:%.*]] = phi [ [[INDUCTION]], %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ] +; CHECK-NEXT: [[AVL:%.*]] = phi i64 [ [[TMP1]], %[[VECTOR_PH]] ], [ [[AVL_NEXT:%.*]], %[[VECTOR_BODY]] ] +; CHECK-NEXT: [[TMP4:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[AVL]], i32 2, i1 true) +; CHECK-NEXT: [[TMP5:%.*]] = zext i32 [[TMP4]] to i64 +; CHECK-NEXT: [[TMP6:%.*]] = mul nsw i64 -1, [[TMP5]] +; CHECK-NEXT: [[BROADCAST_SPLATINSERT1:%.*]] = insertelement poison, i64 [[TMP6]], i64 0 +; CHECK-NEXT: [[BROADCAST_SPLAT2:%.*]] = shufflevector [[BROADCAST_SPLATINSERT1]], poison, zeroinitializer +; CHECK-NEXT: [[TMP7:%.*]] = add nsw [[VEC_IND]], splat (i64 -1), !dbg [[DBG6:![0-9]+]] +; CHECK-NEXT: [[TMP8:%.*]] = extractelement [[TMP7]], i32 0 +; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw i64, ptr [[A]], i64 [[TMP8]], !dbg [[DBG7:![0-9]+]] +; CHECK-NEXT: [[TMP10:%.*]] = zext i32 [[TMP4]] to i64, !dbg [[DBG8:![0-9]+]] +; CHECK-NEXT: [[TMP11:%.*]] = mul i64 0, [[TMP10]], !dbg [[DBG8]] +; CHECK-NEXT: [[TMP12:%.*]] = sub i64 [[TMP10]], 1, !dbg [[DBG8]] +; CHECK-NEXT: [[TMP13:%.*]] = mul i64 -1, [[TMP12]], !dbg [[DBG8]] +; CHECK-NEXT: [[TMP14:%.*]] = getelementptr i64, ptr [[TMP9]], i64 [[TMP11]], !dbg [[DBG8]] +; CHECK-NEXT: [[TMP15:%.*]] = getelementptr i64, ptr [[TMP14]], i64 [[TMP13]], !dbg [[DBG8]] +; CHECK-NEXT: [[VP_REVERSE:%.*]] = call @llvm.experimental.vp.reverse.nxv2i64( [[TMP7]], splat (i1 true), i32 [[TMP4]]), !dbg [[DBG8]] +; CHECK-NEXT: call void @llvm.vp.store.nxv2i64.p0( [[VP_REVERSE]], ptr align 8 [[TMP15]], splat (i1 true), i32 [[TMP4]]), !dbg [[DBG8]] +; CHECK-NEXT: [[AVL_NEXT]] = sub nuw i64 [[AVL]], [[TMP5]] +; CHECK-NEXT: [[VEC_IND_NEXT]] = add nsw [[VEC_IND]], [[BROADCAST_SPLAT2]] +; CHECK-NEXT: [[TMP17:%.*]] = icmp eq i64 [[AVL_NEXT]], 0 +; CHECK-NEXT: br i1 [[TMP17]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !dbg [[DBG9:![0-9]+]], !llvm.loop [[LOOP10:![0-9]+]] +; CHECK: [[MIDDLE_BLOCK]]: +; CHECK-NEXT: br label %[[EXIT:.*]], !dbg [[DBG9]] +; CHECK: [[EXIT]]: +; CHECK-NEXT: ret void +; +entry: + br label %loop + +loop: + %iv = phi i64 [ %n, %entry ], [ %iv.next, %loop ] + %iv.next = add nsw i64 %iv, -1, !dbg !6 + %arrayidx = getelementptr inbounds nuw i64, ptr %a, i64 %iv.next, !dbg !7 + store i64 %iv.next, ptr %arrayidx, align 8, !dbg !8 + %cmp = icmp samesign ugt i64 %iv, 1, !dbg !9 + br i1 %cmp, label %loop, label %exit, !dbg !10, !llvm.loop !11 + +exit: + ret void +} + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!2} + +!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None) +!1 = !DIFile(filename: "dbg-tail-folding-by-evl.cpp", directory: "/test/file/path") +!2 = !{i32 2, !"Debug Info Version", i32 3} +!3 = distinct !DISubprogram(name: "reverse_store", scope: !1, file: !1, line: 1, type: !4, scopeLine: 1, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !5) +!4 = !DISubroutineType(types: !5) +!5 = !{} +!6 = !DILocation(line: 2, scope: !3) +!7 = !DILocation(line: 3, column: 7, scope: !3) +!8 = !DILocation(line: 3, column: 12, scope: !3) +!9 = !DILocation(line: 2, column: 27, scope: !3) +!10 = !DILocation(line: 2, column: 5, scope: !3) +!11 = distinct !{!11, !12} +!12 = !{!"llvm.loop.vectorize.enable", i1 true} +;. +; CHECK: [[META0:![0-9]+]] = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: [[META1:![0-9]+]], producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None) +; CHECK: [[META1]] = !DIFile(filename: "{{.*}}dbg-tail-folding-by-evl.cpp", directory: {{.*}}) +; CHECK: [[DBG3]] = distinct !DISubprogram(name: "reverse_store", scope: [[META1]], file: [[META1]], line: 1, type: [[META4:![0-9]+]], scopeLine: 1, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: [[META0]], retainedNodes: [[META5:![0-9]+]]) +; CHECK: [[META4]] = !DISubroutineType(types: [[META5]]) +; CHECK: [[META5]] = !{} +; CHECK: [[DBG6]] = !DILocation(line: 2, scope: [[DBG3]]) +; CHECK: [[DBG7]] = !DILocation(line: 3, column: 7, scope: [[DBG3]]) +; CHECK: [[DBG8]] = !DILocation(line: 3, column: 12, scope: [[DBG3]]) +; CHECK: [[DBG9]] = !DILocation(line: 2, column: 5, scope: [[DBG3]]) +; CHECK: [[LOOP10]] = distinct !{[[LOOP10]], [[META11:![0-9]+]], [[META12:![0-9]+]]} +; CHECK: [[META11]] = !{!"llvm.loop.isvectorized", i32 1} +; CHECK: [[META12]] = !{!"llvm.loop.unroll.runtime.disable"} +;.