1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py 2 // REQUIRES: aarch64-registered-target 3 // RUN: %clang_cc1 -triple aarch64 -target-feature +sve -disable-O0-optnone -Werror -Wall -emit-llvm -o - %s | opt -S -passes=mem2reg,tailcallelim | FileCheck %s 4 // RUN: %clang_cc1 -triple aarch64 -target-feature +sve -disable-O0-optnone -Werror -Wall -emit-llvm -o - -x c++ %s | opt -S -passes=mem2reg,tailcallelim | FileCheck %s -check-prefix=CPP-CHECK 5 // RUN: %clang_cc1 -DSVE_OVERLOADED_FORMS -triple aarch64 -target-feature +sve -disable-O0-optnone -Werror -Wall -emit-llvm -o - %s | opt -S -passes=mem2reg,tailcallelim | FileCheck %s 6 // RUN: %clang_cc1 -DSVE_OVERLOADED_FORMS -triple aarch64 -target-feature +sve -disable-O0-optnone -Werror -Wall -emit-llvm -o - -x c++ %s | opt -S -passes=mem2reg,tailcallelim | FileCheck %s -check-prefix=CPP-CHECK 7 // RUN: %clang_cc1 -triple aarch64 -target-feature +sve -S -disable-O0-optnone -Werror -Wall -o /dev/null %s 8 // RUN: %clang_cc1 -triple aarch64 -target-feature +sme -S -disable-O0-optnone -Werror -Wall -o /dev/null %s 9 // RUN: %clang_cc1 -triple aarch64 -target-feature +sve -target-feature +sme -S -disable-O0-optnone -Werror -Wall -o /dev/null %s 10 11 #include <arm_sve.h> 12 13 #ifdef SVE_OVERLOADED_FORMS 14 // A simple used,unused... macro, long enough to represent any SVE builtin. 15 #define SVE_ACLE_FUNC(A1,A2_UNUSED,A3,A4_UNUSED) A1##A3 16 #else 17 #define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4 18 #endif 19 20 #ifdef __ARM_FEATURE_SME 21 #define ATTR __arm_streaming 22 #else 23 #define ATTR 24 #endif 25 26 // CHECK-LABEL: @test_svget2_s8( 27 // CHECK-NEXT: entry: 28 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } poison, <vscale x 16 x i8> [[TUPLE_COERCE0:%.*]], 0 29 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP0]], <vscale x 16 x i8> [[TUPLE_COERCE1:%.*]], 1 30 // CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP1]], 0 31 // CHECK-NEXT: ret <vscale x 16 x i8> [[TMP2]] 32 // 33 // CPP-CHECK-LABEL: @_Z14test_svget2_s810svint8x2_t( 34 // CPP-CHECK-NEXT: entry: 35 // CPP-CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } poison, <vscale x 16 x i8> [[TUPLE_COERCE0:%.*]], 0 36 // CPP-CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP0]], <vscale x 16 x i8> [[TUPLE_COERCE1:%.*]], 1 37 // CPP-CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP1]], 0 38 // CPP-CHECK-NEXT: ret <vscale x 16 x i8> [[TMP2]] 39 // 40 svint8_t test_svget2_s8(svint8x2_t tuple) ATTR 41 { 42 return SVE_ACLE_FUNC(svget2,_s8,,)(tuple, 0); 43 } 44 45 // CHECK-LABEL: @test_svget2_s16( 46 // CHECK-NEXT: entry: 47 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } poison, <vscale x 8 x i16> [[TUPLE_COERCE0:%.*]], 0 48 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP0]], <vscale x 8 x i16> [[TUPLE_COERCE1:%.*]], 1 49 // CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP1]], 1 50 // CHECK-NEXT: ret <vscale x 8 x i16> [[TMP2]] 51 // 52 // CPP-CHECK-LABEL: @_Z15test_svget2_s1611svint16x2_t( 53 // CPP-CHECK-NEXT: entry: 54 // CPP-CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } poison, <vscale x 8 x i16> [[TUPLE_COERCE0:%.*]], 0 55 // CPP-CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP0]], <vscale x 8 x i16> [[TUPLE_COERCE1:%.*]], 1 56 // CPP-CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP1]], 1 57 // CPP-CHECK-NEXT: ret <vscale x 8 x i16> [[TMP2]] 58 // 59 svint16_t test_svget2_s16(svint16x2_t tuple) ATTR 60 { 61 return SVE_ACLE_FUNC(svget2,_s16,,)(tuple, 1); 62 } 63 64 // CHECK-LABEL: @test_svget2_s32( 65 // CHECK-NEXT: entry: 66 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } poison, <vscale x 4 x i32> [[TUPLE_COERCE0:%.*]], 0 67 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP0]], <vscale x 4 x i32> [[TUPLE_COERCE1:%.*]], 1 68 // CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP1]], 0 69 // CHECK-NEXT: ret <vscale x 4 x i32> [[TMP2]] 70 // 71 // CPP-CHECK-LABEL: @_Z15test_svget2_s3211svint32x2_t( 72 // CPP-CHECK-NEXT: entry: 73 // CPP-CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } poison, <vscale x 4 x i32> [[TUPLE_COERCE0:%.*]], 0 74 // CPP-CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP0]], <vscale x 4 x i32> [[TUPLE_COERCE1:%.*]], 1 75 // CPP-CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP1]], 0 76 // CPP-CHECK-NEXT: ret <vscale x 4 x i32> [[TMP2]] 77 // 78 svint32_t test_svget2_s32(svint32x2_t tuple) ATTR 79 { 80 return SVE_ACLE_FUNC(svget2,_s32,,)(tuple, 0); 81 } 82 83 // CHECK-LABEL: @test_svget2_s64( 84 // CHECK-NEXT: entry: 85 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } poison, <vscale x 2 x i64> [[TUPLE_COERCE0:%.*]], 0 86 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP0]], <vscale x 2 x i64> [[TUPLE_COERCE1:%.*]], 1 87 // CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP1]], 1 88 // CHECK-NEXT: ret <vscale x 2 x i64> [[TMP2]] 89 // 90 // CPP-CHECK-LABEL: @_Z15test_svget2_s6411svint64x2_t( 91 // CPP-CHECK-NEXT: entry: 92 // CPP-CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } poison, <vscale x 2 x i64> [[TUPLE_COERCE0:%.*]], 0 93 // CPP-CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP0]], <vscale x 2 x i64> [[TUPLE_COERCE1:%.*]], 1 94 // CPP-CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP1]], 1 95 // CPP-CHECK-NEXT: ret <vscale x 2 x i64> [[TMP2]] 96 // 97 svint64_t test_svget2_s64(svint64x2_t tuple) ATTR 98 { 99 return SVE_ACLE_FUNC(svget2,_s64,,)(tuple, 1); 100 } 101 102 // CHECK-LABEL: @test_svget2_u8( 103 // CHECK-NEXT: entry: 104 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } poison, <vscale x 16 x i8> [[TUPLE_COERCE0:%.*]], 0 105 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP0]], <vscale x 16 x i8> [[TUPLE_COERCE1:%.*]], 1 106 // CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP1]], 0 107 // CHECK-NEXT: ret <vscale x 16 x i8> [[TMP2]] 108 // 109 // CPP-CHECK-LABEL: @_Z14test_svget2_u811svuint8x2_t( 110 // CPP-CHECK-NEXT: entry: 111 // CPP-CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } poison, <vscale x 16 x i8> [[TUPLE_COERCE0:%.*]], 0 112 // CPP-CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP0]], <vscale x 16 x i8> [[TUPLE_COERCE1:%.*]], 1 113 // CPP-CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP1]], 0 114 // CPP-CHECK-NEXT: ret <vscale x 16 x i8> [[TMP2]] 115 // 116 svuint8_t test_svget2_u8(svuint8x2_t tuple) ATTR 117 { 118 return SVE_ACLE_FUNC(svget2,_u8,,)(tuple, 0); 119 } 120 121 // CHECK-LABEL: @test_svget2_u16( 122 // CHECK-NEXT: entry: 123 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } poison, <vscale x 8 x i16> [[TUPLE_COERCE0:%.*]], 0 124 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP0]], <vscale x 8 x i16> [[TUPLE_COERCE1:%.*]], 1 125 // CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP1]], 1 126 // CHECK-NEXT: ret <vscale x 8 x i16> [[TMP2]] 127 // 128 // CPP-CHECK-LABEL: @_Z15test_svget2_u1612svuint16x2_t( 129 // CPP-CHECK-NEXT: entry: 130 // CPP-CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } poison, <vscale x 8 x i16> [[TUPLE_COERCE0:%.*]], 0 131 // CPP-CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP0]], <vscale x 8 x i16> [[TUPLE_COERCE1:%.*]], 1 132 // CPP-CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP1]], 1 133 // CPP-CHECK-NEXT: ret <vscale x 8 x i16> [[TMP2]] 134 // 135 svuint16_t test_svget2_u16(svuint16x2_t tuple) ATTR 136 { 137 return SVE_ACLE_FUNC(svget2,_u16,,)(tuple, 1); 138 } 139 140 // CHECK-LABEL: @test_svget2_u32( 141 // CHECK-NEXT: entry: 142 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } poison, <vscale x 4 x i32> [[TUPLE_COERCE0:%.*]], 0 143 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP0]], <vscale x 4 x i32> [[TUPLE_COERCE1:%.*]], 1 144 // CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP1]], 0 145 // CHECK-NEXT: ret <vscale x 4 x i32> [[TMP2]] 146 // 147 // CPP-CHECK-LABEL: @_Z15test_svget2_u3212svuint32x2_t( 148 // CPP-CHECK-NEXT: entry: 149 // CPP-CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } poison, <vscale x 4 x i32> [[TUPLE_COERCE0:%.*]], 0 150 // CPP-CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP0]], <vscale x 4 x i32> [[TUPLE_COERCE1:%.*]], 1 151 // CPP-CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP1]], 0 152 // CPP-CHECK-NEXT: ret <vscale x 4 x i32> [[TMP2]] 153 // 154 svuint32_t test_svget2_u32(svuint32x2_t tuple) ATTR 155 { 156 return SVE_ACLE_FUNC(svget2,_u32,,)(tuple, 0); 157 } 158 159 // CHECK-LABEL: @test_svget2_u64( 160 // CHECK-NEXT: entry: 161 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } poison, <vscale x 2 x i64> [[TUPLE_COERCE0:%.*]], 0 162 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP0]], <vscale x 2 x i64> [[TUPLE_COERCE1:%.*]], 1 163 // CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP1]], 1 164 // CHECK-NEXT: ret <vscale x 2 x i64> [[TMP2]] 165 // 166 // CPP-CHECK-LABEL: @_Z15test_svget2_u6412svuint64x2_t( 167 // CPP-CHECK-NEXT: entry: 168 // CPP-CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } poison, <vscale x 2 x i64> [[TUPLE_COERCE0:%.*]], 0 169 // CPP-CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP0]], <vscale x 2 x i64> [[TUPLE_COERCE1:%.*]], 1 170 // CPP-CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP1]], 1 171 // CPP-CHECK-NEXT: ret <vscale x 2 x i64> [[TMP2]] 172 // 173 svuint64_t test_svget2_u64(svuint64x2_t tuple) ATTR 174 { 175 return SVE_ACLE_FUNC(svget2,_u64,,)(tuple, 1); 176 } 177 178 // CHECK-LABEL: @test_svget2_f16( 179 // CHECK-NEXT: entry: 180 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 8 x half>, <vscale x 8 x half> } poison, <vscale x 8 x half> [[TUPLE_COERCE0:%.*]], 0 181 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 8 x half>, <vscale x 8 x half> } [[TMP0]], <vscale x 8 x half> [[TUPLE_COERCE1:%.*]], 1 182 // CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <vscale x 8 x half>, <vscale x 8 x half> } [[TMP1]], 0 183 // CHECK-NEXT: ret <vscale x 8 x half> [[TMP2]] 184 // 185 // CPP-CHECK-LABEL: @_Z15test_svget2_f1613svfloat16x2_t( 186 // CPP-CHECK-NEXT: entry: 187 // CPP-CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 8 x half>, <vscale x 8 x half> } poison, <vscale x 8 x half> [[TUPLE_COERCE0:%.*]], 0 188 // CPP-CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 8 x half>, <vscale x 8 x half> } [[TMP0]], <vscale x 8 x half> [[TUPLE_COERCE1:%.*]], 1 189 // CPP-CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <vscale x 8 x half>, <vscale x 8 x half> } [[TMP1]], 0 190 // CPP-CHECK-NEXT: ret <vscale x 8 x half> [[TMP2]] 191 // 192 svfloat16_t test_svget2_f16(svfloat16x2_t tuple) ATTR 193 { 194 return SVE_ACLE_FUNC(svget2,_f16,,)(tuple, 0); 195 } 196 197 // CHECK-LABEL: @test_svget2_f32( 198 // CHECK-NEXT: entry: 199 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 4 x float>, <vscale x 4 x float> } poison, <vscale x 4 x float> [[TUPLE_COERCE0:%.*]], 0 200 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP0]], <vscale x 4 x float> [[TUPLE_COERCE1:%.*]], 1 201 // CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP1]], 1 202 // CHECK-NEXT: ret <vscale x 4 x float> [[TMP2]] 203 // 204 // CPP-CHECK-LABEL: @_Z15test_svget2_f3213svfloat32x2_t( 205 // CPP-CHECK-NEXT: entry: 206 // CPP-CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 4 x float>, <vscale x 4 x float> } poison, <vscale x 4 x float> [[TUPLE_COERCE0:%.*]], 0 207 // CPP-CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP0]], <vscale x 4 x float> [[TUPLE_COERCE1:%.*]], 1 208 // CPP-CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP1]], 1 209 // CPP-CHECK-NEXT: ret <vscale x 4 x float> [[TMP2]] 210 // 211 svfloat32_t test_svget2_f32(svfloat32x2_t tuple) ATTR 212 { 213 return SVE_ACLE_FUNC(svget2,_f32,,)(tuple, 1); 214 } 215 216 // CHECK-LABEL: @test_svget2_f64( 217 // CHECK-NEXT: entry: 218 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 2 x double>, <vscale x 2 x double> } poison, <vscale x 2 x double> [[TUPLE_COERCE0:%.*]], 0 219 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP0]], <vscale x 2 x double> [[TUPLE_COERCE1:%.*]], 1 220 // CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP1]], 0 221 // CHECK-NEXT: ret <vscale x 2 x double> [[TMP2]] 222 // 223 // CPP-CHECK-LABEL: @_Z15test_svget2_f6413svfloat64x2_t( 224 // CPP-CHECK-NEXT: entry: 225 // CPP-CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 2 x double>, <vscale x 2 x double> } poison, <vscale x 2 x double> [[TUPLE_COERCE0:%.*]], 0 226 // CPP-CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP0]], <vscale x 2 x double> [[TUPLE_COERCE1:%.*]], 1 227 // CPP-CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP1]], 0 228 // CPP-CHECK-NEXT: ret <vscale x 2 x double> [[TMP2]] 229 // 230 svfloat64_t test_svget2_f64(svfloat64x2_t tuple) ATTR 231 { 232 return SVE_ACLE_FUNC(svget2,_f64,,)(tuple, 0); 233 } 234