Please use GitHub pull requests for new patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
llvm/test/Transforms/SLPVectorizer/RISCV/load-store.ll
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | ||||
; RUN: opt < %s -slp-vectorizer -mtriple=riscv64 -mattr=+v \ | ; RUN: opt < %s -slp-vectorizer -mtriple=riscv64 -mattr=+v \ | ||||
; RUN: -riscv-v-vector-bits-min=-1 -S | FileCheck %s --check-prefixes=CHECK | ; 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) { | define void @simple_copy(ptr %dest, ptr %p) { | ||||
; CHECK-LABEL: @simple_copy( | ; CHECK-LABEL: @simple_copy( | ||||
; CHECK-NEXT: entry: | ; CHECK-NEXT: entry: | ||||
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4 | ; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4 | ||||
; CHECK-NEXT: store <2 x i16> [[TMP0]], ptr [[DEST:%.*]], align 4 | ; CHECK-NEXT: store <2 x i16> [[TMP0]], ptr [[DEST:%.*]], align 4 | ||||
; CHECK-NEXT: ret void | ; 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: | entry: | ||||
%e0 = load i16, ptr %p, align 4 | %e0 = load i16, ptr %p, align 4 | ||||
%inc = getelementptr inbounds i16, ptr %p, i64 1 | %inc = getelementptr inbounds i16, ptr %p, i64 1 | ||||
%e1 = load i16, ptr %inc, align 2 | %e1 = load i16, ptr %inc, align 2 | ||||
store i16 %e0, ptr %dest, align 4 | store i16 %e0, ptr %dest, align 4 | ||||
%inc2 = getelementptr inbounds i16, ptr %dest, i64 1 | %inc2 = getelementptr inbounds i16, ptr %dest, i64 1 | ||||
store i16 %e1, ptr %inc2, align 2 | store i16 %e1, ptr %inc2, align 2 | ||||
ret void | ret void | ||||
} | } | ||||
define void @vec_add(ptr %dest, ptr %p) { | define void @vec_add(ptr %dest, ptr %p) { | ||||
; CHECK-LABEL: @vec_add( | ; CHECK-LABEL: @vec_add( | ||||
; CHECK-NEXT: entry: | ; CHECK-NEXT: entry: | ||||
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4 | ; 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: [[TMP1:%.*]] = add <2 x i16> [[TMP0]], <i16 1, i16 1> | ||||
; CHECK-NEXT: store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 4 | ; CHECK-NEXT: store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 4 | ||||
; CHECK-NEXT: ret void | ; 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: | entry: | ||||
%e0 = load i16, ptr %p, align 4 | %e0 = load i16, ptr %p, align 4 | ||||
%inc = getelementptr inbounds i16, ptr %p, i64 1 | %inc = getelementptr inbounds i16, ptr %p, i64 1 | ||||
%e1 = load i16, ptr %inc, align 2 | %e1 = load i16, ptr %inc, align 2 | ||||
%a0 = add i16 %e0, 1 | %a0 = add i16 %e0, 1 | ||||
%a1 = add i16 %e1, 1 | %a1 = add i16 %e1, 1 | ||||
store i16 %a0, ptr %dest, align 4 | store i16 %a0, ptr %dest, align 4 | ||||
%inc2 = getelementptr inbounds i16, ptr %dest, i64 1 | %inc2 = getelementptr inbounds i16, ptr %dest, i64 1 | ||||
store i16 %a1, ptr %inc2, align 2 | store i16 %a1, ptr %inc2, align 2 | ||||
ret void | ret void | ||||
} | } | ||||
define void @splat_store(ptr %dest, ptr %p) { | define void @splat_store(ptr %dest, ptr %p) { | ||||
; CHECK-LABEL: @splat_store( | ; CHECK-LABEL: @splat_store( | ||||
; CHECK-NEXT: entry: | ; CHECK-NEXT: entry: | ||||
; CHECK-NEXT: [[E0:%.*]] = load i16, ptr [[P:%.*]], align 4 | ; CHECK-NEXT: [[E0:%.*]] = load i16, ptr [[P:%.*]], align 4 | ||||
; CHECK-NEXT: store i16 [[E0]], ptr [[DEST:%.*]], align 4 | ; CHECK-NEXT: store i16 [[E0]], ptr [[DEST:%.*]], align 4 | ||||
; CHECK-NEXT: [[INC2:%.*]] = getelementptr inbounds i16, ptr [[DEST]], i64 1 | ; CHECK-NEXT: [[INC2:%.*]] = getelementptr inbounds i16, ptr [[DEST]], i64 1 | ||||
; CHECK-NEXT: store i16 [[E0]], ptr [[INC2]], align 2 | ; CHECK-NEXT: store i16 [[E0]], ptr [[INC2]], align 2 | ||||
; CHECK-NEXT: ret void | ; 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: | entry: | ||||
%e0 = load i16, ptr %p, align 4 | %e0 = load i16, ptr %p, align 4 | ||||
store i16 %e0, ptr %dest, align 4 | store i16 %e0, ptr %dest, align 4 | ||||
%inc2 = getelementptr inbounds i16, ptr %dest, i64 1 | %inc2 = getelementptr inbounds i16, ptr %dest, i64 1 | ||||
store i16 %e0, ptr %inc2, align 2 | store i16 %e0, ptr %inc2, align 2 | ||||
ret void | ret void | ||||
} | } | ||||