diff --git a/llvm/test/Analysis/CostModel/RISCV/gep-zero-indices.ll b/llvm/test/Analysis/CostModel/RISCV/gep-zero-indices.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Analysis/CostModel/RISCV/gep-zero-indices.ll @@ -0,0 +1,81 @@ +; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 2 +; RUN: opt -mtriple=riscv32 -mattr=+v -passes="print" 2>&1 -disable-output < %s \ +; RUN: | FileCheck %s +; RUN: opt -mtriple=riscv64 -mattr=+v -passes="print" 2>&1 -disable-output < %s \ +; RUN: | FileCheck %s + +define ptr @zero_indices_i8(ptr %p) { +; CHECK-LABEL: 'zero_indices_i8' +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %x = getelementptr i8, ptr %p, i32 0 +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret ptr %x +; + %x = getelementptr i8, ptr %p, i32 0 + ret ptr %x +} + +define ptr @zero_indices_i16(ptr %p) { +; CHECK-LABEL: 'zero_indices_i16' +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %x = getelementptr i16, ptr %p, i32 0 +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret ptr %x +; + %x = getelementptr i16, ptr %p, i32 0 + ret ptr %x +} + +define ptr @zero_indices_i32(ptr %p) { +; CHECK-LABEL: 'zero_indices_i32' +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %x = getelementptr i32, ptr %p, i32 0 +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret ptr %x +; + %x = getelementptr i32, ptr %p, i32 0 + ret ptr %x +} + +define ptr @zero_indices_i64(ptr %p) { +; CHECK-LABEL: 'zero_indices_i64' +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %x = getelementptr i64, ptr %p, i32 0 +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret ptr %x +; + %x = getelementptr i64, ptr %p, i32 0 + ret ptr %x +} + +define ptr @zero_indices_array(ptr %p) { +; CHECK-LABEL: 'zero_indices_array' +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %x = getelementptr [42 x i64], ptr %p, i32 0, i32 0 +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret ptr %x +; + %x = getelementptr [42 x i64], ptr %p, i32 0, i32 0 + ret ptr %x +} + +%struct = type { %struct.inner } +%struct.inner = type { %struct.inner.inner } +%struct.inner.inner = type { i32 } + +define ptr @zero_indices_struct(ptr %p) { +; CHECK-LABEL: 'zero_indices_struct' +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %x = getelementptr %struct, ptr %p, i32 0, i32 0, i32 0 +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret ptr %x +; + %x = getelementptr %struct, ptr %p, i32 0, i32 0, i32 0 + ret ptr %x +} + +define <4 x ptr> @zero_indices_v4i32(<4 x ptr> %p) { +; CHECK-LABEL: 'zero_indices_v4i32' +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %x = getelementptr i32, <4 x ptr> %p, <4 x i32> zeroinitializer +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret <4 x ptr> %x +; + %x = getelementptr i32, <4 x ptr> %p, <4 x i32> zeroinitializer + ret <4 x ptr> %x +} + +define <4 x ptr> @zero_indices_v4v4i32(<4 x ptr> %p) { +; CHECK-LABEL: 'zero_indices_v4v4i32' +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %x = getelementptr <32 x i32>, <4 x ptr> %p, <4 x i32> zeroinitializer, <4 x i32> zeroinitializer +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret <4 x ptr> %x +; + %x = getelementptr <32 x i32>, <4 x ptr> %p, <4 x i32> zeroinitializer, <4 x i32> zeroinitializer + ret <4 x ptr> %x +} diff --git a/llvm/test/Transforms/SLPVectorizer/RISCV/gep.ll b/llvm/test/Transforms/SLPVectorizer/RISCV/gep.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/SLPVectorizer/RISCV/gep.ll @@ -0,0 +1,28 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -passes=slp-vectorizer -mtriple=riscv64 -mattr=+v \ +; RUN: -riscv-v-slp-max-vf=0 -S | FileCheck %s + +; FIXME: This should not be vectorized + +define void @copy_with_offset_v2i8(ptr noalias %p, ptr noalias %q) { +; CHECK-LABEL: @copy_with_offset_v2i8( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 8 +; CHECK-NEXT: [[Q1:%.*]] = getelementptr i8, ptr [[Q:%.*]], i32 16 +; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i8>, ptr [[P1]], align 1 +; CHECK-NEXT: store <2 x i8> [[TMP0]], ptr [[Q1]], align 1 +; CHECK-NEXT: ret void +; +entry: + %p1 = getelementptr i8, ptr %p, i32 8 + %x1 = load i8, ptr %p1 + %q1 = getelementptr i8, ptr %q, i32 16 + store i8 %x1, ptr %q1 + + %p2 = getelementptr i8, ptr %p, i32 9 + %x2 = load i8, ptr %p2 + %q2 = getelementptr i8, ptr %q, i32 17 + store i8 %x2, ptr %q2 + + ret void +}