This change implements a TTI query with the goal of disabling slp vectorization on RISCV. The current default configuration disables SLP already, but its current tied to the ability to lower fixed length vectors. Over in D131508, I want to enable fixed length vectors for purposes of LoopVectorizer, but preliminary analysis has revealed a couple of SLP specific issues we need to resolve before enabling it by default. This change exists to allow us to enable LV without SLP. Differential Revision: https://reviews.llvm.org/D132680
96 lines
3.4 KiB
LLVM
96 lines
3.4 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -slp-vectorizer -mtriple=riscv64 -mattr=+v \
|
|
; RUN: -riscv-v-vector-bits-min=-1 -riscv-v-slp-max-vf=0 -S | FileCheck %s --check-prefixes=CHECK
|
|
; RUN: opt < %s -slp-vectorizer -mtriple=riscv64 -mattr=+v -S | FileCheck %s --check-prefixes=DEFAULT
|
|
|
|
|
|
define void @simple_copy(ptr %dest, ptr %p) {
|
|
; CHECK-LABEL: @simple_copy(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
|
|
; CHECK-NEXT: store <2 x i16> [[TMP0]], ptr [[DEST:%.*]], align 4
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
; DEFAULT-LABEL: @simple_copy(
|
|
; DEFAULT-NEXT: entry:
|
|
; DEFAULT-NEXT: [[E0:%.*]] = load i16, ptr [[P:%.*]], align 4
|
|
; DEFAULT-NEXT: [[INC:%.*]] = getelementptr inbounds i16, ptr [[P]], i64 1
|
|
; DEFAULT-NEXT: [[E1:%.*]] = load i16, ptr [[INC]], align 2
|
|
; DEFAULT-NEXT: store i16 [[E0]], ptr [[DEST:%.*]], align 4
|
|
; DEFAULT-NEXT: [[INC2:%.*]] = getelementptr inbounds i16, ptr [[DEST]], i64 1
|
|
; DEFAULT-NEXT: store i16 [[E1]], ptr [[INC2]], align 2
|
|
; DEFAULT-NEXT: ret void
|
|
;
|
|
entry:
|
|
%e0 = load i16, ptr %p, align 4
|
|
%inc = getelementptr inbounds i16, ptr %p, i64 1
|
|
%e1 = load i16, ptr %inc, align 2
|
|
|
|
store i16 %e0, ptr %dest, align 4
|
|
%inc2 = getelementptr inbounds i16, ptr %dest, i64 1
|
|
store i16 %e1, ptr %inc2, align 2
|
|
ret void
|
|
}
|
|
|
|
define void @vec_add(ptr %dest, ptr %p) {
|
|
; CHECK-LABEL: @vec_add(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4
|
|
; CHECK-NEXT: [[TMP1:%.*]] = add <2 x i16> [[TMP0]], <i16 1, i16 1>
|
|
; CHECK-NEXT: store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 4
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
; DEFAULT-LABEL: @vec_add(
|
|
; DEFAULT-NEXT: entry:
|
|
; DEFAULT-NEXT: [[E0:%.*]] = load i16, ptr [[P:%.*]], align 4
|
|
; DEFAULT-NEXT: [[INC:%.*]] = getelementptr inbounds i16, ptr [[P]], i64 1
|
|
; DEFAULT-NEXT: [[E1:%.*]] = load i16, ptr [[INC]], align 2
|
|
; DEFAULT-NEXT: [[A0:%.*]] = add i16 [[E0]], 1
|
|
; DEFAULT-NEXT: [[A1:%.*]] = add i16 [[E1]], 1
|
|
; DEFAULT-NEXT: store i16 [[A0]], ptr [[DEST:%.*]], align 4
|
|
; DEFAULT-NEXT: [[INC2:%.*]] = getelementptr inbounds i16, ptr [[DEST]], i64 1
|
|
; DEFAULT-NEXT: store i16 [[A1]], ptr [[INC2]], align 2
|
|
; DEFAULT-NEXT: ret void
|
|
;
|
|
entry:
|
|
%e0 = load i16, ptr %p, align 4
|
|
%inc = getelementptr inbounds i16, ptr %p, i64 1
|
|
%e1 = load i16, ptr %inc, align 2
|
|
|
|
%a0 = add i16 %e0, 1
|
|
%a1 = add i16 %e1, 1
|
|
|
|
store i16 %a0, ptr %dest, align 4
|
|
%inc2 = getelementptr inbounds i16, ptr %dest, i64 1
|
|
store i16 %a1, ptr %inc2, align 2
|
|
ret void
|
|
}
|
|
|
|
|
|
define void @splat_store(ptr %dest, ptr %p) {
|
|
; CHECK-LABEL: @splat_store(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[E0:%.*]] = load i16, ptr [[P:%.*]], align 4
|
|
; CHECK-NEXT: store i16 [[E0]], ptr [[DEST:%.*]], align 4
|
|
; CHECK-NEXT: [[INC2:%.*]] = getelementptr inbounds i16, ptr [[DEST]], i64 1
|
|
; CHECK-NEXT: store i16 [[E0]], ptr [[INC2]], align 2
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
; DEFAULT-LABEL: @splat_store(
|
|
; DEFAULT-NEXT: entry:
|
|
; DEFAULT-NEXT: [[E0:%.*]] = load i16, ptr [[P:%.*]], align 4
|
|
; DEFAULT-NEXT: store i16 [[E0]], ptr [[DEST:%.*]], align 4
|
|
; DEFAULT-NEXT: [[INC2:%.*]] = getelementptr inbounds i16, ptr [[DEST]], i64 1
|
|
; DEFAULT-NEXT: store i16 [[E0]], ptr [[INC2]], align 2
|
|
; DEFAULT-NEXT: ret void
|
|
;
|
|
entry:
|
|
%e0 = load i16, ptr %p, align 4
|
|
|
|
store i16 %e0, ptr %dest, align 4
|
|
%inc2 = getelementptr inbounds i16, ptr %dest, i64 1
|
|
store i16 %e0, ptr %inc2, align 2
|
|
ret void
|
|
}
|
|
|