If any pointer operand of the non-cosencutive loads is an instructions with the user, which is not part of the current graph, and, thus, requires emission of the extractelement instruction, better to try to detect if the load sequence can be repsented as strided load and extractelement instructions for pointers are not required. Reviewers: preames, RKSimon, topperc Reviewed By: RKSimon Pull Request: https://github.com/llvm/llvm-project/pull/101668
39 lines
1.9 KiB
LLVM
39 lines
1.9 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
|
|
; RUN: opt -S --passes=slp-vectorizer -mtriple=riscv64-unknown-linux-gnu -mattr=+v -slp-threshold=-20 < %s | FileCheck %s
|
|
|
|
%S = type { i16, i16 }
|
|
|
|
define i16 @test() {
|
|
; CHECK-LABEL: define i16 @test
|
|
; CHECK-SAME: () #[[ATTR0:[0-9]+]] {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[PPREV_058_I:%.*]] = getelementptr [[S:%.*]], ptr null, i64 -1
|
|
; CHECK-NEXT: br label [[WHILE_BODY_I:%.*]]
|
|
; CHECK: while.body.i:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = phi i16 [ 0, [[WHILE_BODY_I]] ], [ 0, [[ENTRY:%.*]] ]
|
|
; CHECK-NEXT: [[PPREV_062_I:%.*]] = phi ptr [ [[PPREV_0_I:%.*]], [[WHILE_BODY_I]] ], [ [[PPREV_058_I]], [[ENTRY]] ]
|
|
; CHECK-NEXT: [[PEDGE_061_I:%.*]] = phi ptr [ [[INCDEC_PTR_I:%.*]], [[WHILE_BODY_I]] ], [ null, [[ENTRY]] ]
|
|
; CHECK-NEXT: [[INCDEC_PTR_I]] = getelementptr [[S]], ptr [[PEDGE_061_I]], i64 -1
|
|
; CHECK-NEXT: [[PPREV_0_I]] = getelementptr [[S]], ptr [[PPREV_062_I]], i64 -1
|
|
; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i16> @llvm.experimental.vp.strided.load.v2i16.p0.i64(ptr align 2 [[PPREV_0_I]], i64 4, <2 x i1> <i1 true, i1 true>, i32 2)
|
|
; CHECK-NEXT: [[TMP2:%.*]] = extractelement <2 x i16> [[TMP1]], i32 0
|
|
; CHECK-NEXT: [[TMP3:%.*]] = extractelement <2 x i16> [[TMP1]], i32 1
|
|
; CHECK-NEXT: [[CMP_I178:%.*]] = icmp ult i16 [[TMP3]], [[TMP2]]
|
|
; CHECK-NEXT: br label [[WHILE_BODY_I]]
|
|
;
|
|
entry:
|
|
%pPrev.058.i = getelementptr %S, ptr null, i64 -1
|
|
br label %while.body.i
|
|
|
|
while.body.i:
|
|
%0 = phi i16 [ 0, %while.body.i ], [ 0, %entry ]
|
|
%pPrev.062.i = phi ptr [ %pPrev.0.i, %while.body.i ], [ %pPrev.058.i, %entry ]
|
|
%pEdge.061.i = phi ptr [ %incdec.ptr.i, %while.body.i ], [ null, %entry ]
|
|
%incdec.ptr.i = getelementptr %S, ptr %pEdge.061.i, i64 -1
|
|
%pPrev.0.i = getelementptr %S, ptr %pPrev.062.i, i64 -1
|
|
%1 = load i16, ptr %incdec.ptr.i, align 2
|
|
%2 = load i16, ptr %pPrev.0.i, align 2
|
|
%cmp.i178 = icmp ult i16 %1, %2
|
|
br label %while.body.i
|
|
}
|