[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / InstCombine / ARM / vld1.ll
blobc87ee04f420550ab2311889e9ae1eeca4889ad20
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -instcombine -S | FileCheck %s
4 target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5 target triple = "armv8-arm-none-eabi"
7 ; Turning a vld1 intrinsic into an llvm load is beneficial
8 ; when the underlying object being addressed comes from a
9 ; constant, since we get constant-folding for free.
11 ; Bail the optimization if the alignment is not a constant.
12 define <2 x i64> @vld1_align(i8* %ptr, i32 %align) {
13 ; CHECK-LABEL: @vld1_align(
14 ; CHECK-NEXT:    [[VLD1:%.*]] = call <2 x i64> @llvm.arm.neon.vld1.v2i64.p0i8(i8* [[PTR:%.*]], i32 [[ALIGN:%.*]])
15 ; CHECK-NEXT:    ret <2 x i64> [[VLD1]]
17   %vld1 = call <2 x i64> @llvm.arm.neon.vld1.v2i64.p0i8(i8* %ptr, i32 %align)
18   ret <2 x i64> %vld1
21 ; Bail the optimization if the alignment is not power of 2.
22 define <2 x i64> @vld1_align_pow2(i8* %ptr) {
23 ; CHECK-LABEL: @vld1_align_pow2(
24 ; CHECK-NEXT:    [[VLD1:%.*]] = call <2 x i64> @llvm.arm.neon.vld1.v2i64.p0i8(i8* [[PTR:%.*]], i32 3)
25 ; CHECK-NEXT:    ret <2 x i64> [[VLD1]]
27   %vld1 = call <2 x i64> @llvm.arm.neon.vld1.v2i64.p0i8(i8* %ptr, i32 3)
28   ret <2 x i64> %vld1
31 define <8 x i8> @vld1_8x8(i8* %ptr) {
32 ; CHECK-LABEL: @vld1_8x8(
33 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i8* [[PTR:%.*]] to <8 x i8>*
34 ; CHECK-NEXT:    [[TMP2:%.*]] = load <8 x i8>, <8 x i8>* [[TMP1]], align 1
35 ; CHECK-NEXT:    ret <8 x i8> [[TMP2]]
37   %vld1 = call <8 x i8> @llvm.arm.neon.vld1.v8i8.p0i8(i8* %ptr, i32 1)
38   ret <8 x i8> %vld1
41 define <4 x i16> @vld1_4x16(i8* %ptr) {
42 ; CHECK-LABEL: @vld1_4x16(
43 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i8* [[PTR:%.*]] to <4 x i16>*
44 ; CHECK-NEXT:    [[TMP2:%.*]] = load <4 x i16>, <4 x i16>* [[TMP1]], align 2
45 ; CHECK-NEXT:    ret <4 x i16> [[TMP2]]
47   %vld1 = call <4 x i16> @llvm.arm.neon.vld1.v4i16.p0i8(i8* %ptr, i32 2)
48   ret <4 x i16> %vld1
51 define <2 x i32> @vld1_2x32(i8* %ptr) {
52 ; CHECK-LABEL: @vld1_2x32(
53 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i8* [[PTR:%.*]] to <2 x i32>*
54 ; CHECK-NEXT:    [[TMP2:%.*]] = load <2 x i32>, <2 x i32>* [[TMP1]], align 4
55 ; CHECK-NEXT:    ret <2 x i32> [[TMP2]]
57   %vld1 = call <2 x i32> @llvm.arm.neon.vld1.v2i32.p0i8(i8* %ptr, i32 4)
58   ret <2 x i32> %vld1
61 define <1 x i64> @vld1_1x64(i8* %ptr) {
62 ; CHECK-LABEL: @vld1_1x64(
63 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i8* [[PTR:%.*]] to <1 x i64>*
64 ; CHECK-NEXT:    [[TMP2:%.*]] = load <1 x i64>, <1 x i64>* [[TMP1]], align 8
65 ; CHECK-NEXT:    ret <1 x i64> [[TMP2]]
67   %vld1 = call <1 x i64> @llvm.arm.neon.vld1.v1i64.p0i8(i8* %ptr, i32 8)
68   ret <1 x i64> %vld1
71 define <8 x i16> @vld1_8x16(i8* %ptr) {
72 ; CHECK-LABEL: @vld1_8x16(
73 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i8* [[PTR:%.*]] to <8 x i16>*
74 ; CHECK-NEXT:    [[TMP2:%.*]] = load <8 x i16>, <8 x i16>* [[TMP1]], align 2
75 ; CHECK-NEXT:    ret <8 x i16> [[TMP2]]
77   %vld1 = call <8 x i16> @llvm.arm.neon.vld1.v8i16.p0i8(i8* %ptr, i32 2)
78   ret <8 x i16> %vld1
81 define <16 x i8> @vld1_16x8(i8* %ptr) {
82 ; CHECK-LABEL: @vld1_16x8(
83 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i8* [[PTR:%.*]] to <16 x i8>*
84 ; CHECK-NEXT:    [[TMP2:%.*]] = load <16 x i8>, <16 x i8>* [[TMP1]], align 1
85 ; CHECK-NEXT:    ret <16 x i8> [[TMP2]]
87   %vld1 = call <16 x i8> @llvm.arm.neon.vld1.v16i8.p0i8(i8* %ptr, i32 1)
88   ret <16 x i8> %vld1
91 define <4 x i32> @vld1_4x32(i8* %ptr) {
92 ; CHECK-LABEL: @vld1_4x32(
93 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i8* [[PTR:%.*]] to <4 x i32>*
94 ; CHECK-NEXT:    [[TMP2:%.*]] = load <4 x i32>, <4 x i32>* [[TMP1]], align 4
95 ; CHECK-NEXT:    ret <4 x i32> [[TMP2]]
97   %vld1 = call <4 x i32> @llvm.arm.neon.vld1.v4i32.p0i8(i8* %ptr, i32 4)
98   ret <4 x i32> %vld1
101 define <2 x i64> @vld1_2x64(i8* %ptr) {
102 ; CHECK-LABEL: @vld1_2x64(
103 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i8* [[PTR:%.*]] to <2 x i64>*
104 ; CHECK-NEXT:    [[TMP2:%.*]] = load <2 x i64>, <2 x i64>* [[TMP1]], align 8
105 ; CHECK-NEXT:    ret <2 x i64> [[TMP2]]
107   %vld1 = call <2 x i64> @llvm.arm.neon.vld1.v2i64.p0i8(i8* %ptr, i32 8)
108   ret <2 x i64> %vld1
111 declare <8 x i8> @llvm.arm.neon.vld1.v8i8.p0i8(i8*, i32)
112 declare <4 x i16> @llvm.arm.neon.vld1.v4i16.p0i8(i8*, i32)
113 declare <2 x i32> @llvm.arm.neon.vld1.v2i32.p0i8(i8*, i32)
114 declare <1 x i64> @llvm.arm.neon.vld1.v1i64.p0i8(i8*, i32)
115 declare <8 x i16> @llvm.arm.neon.vld1.v8i16.p0i8(i8*, i32)
116 declare <16 x i8> @llvm.arm.neon.vld1.v16i8.p0i8(i8*, i32)
117 declare <4 x i32> @llvm.arm.neon.vld1.v4i32.p0i8(i8*, i32)
118 declare <2 x i64> @llvm.arm.neon.vld1.v2i64.p0i8(i8*, i32)