1800 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; RUN: opt < %s -passes=slp-vectorizer -S -mtriple=riscv64 -mattr=+v,+f \3; RUN: -riscv-v-vector-bits-min=-1 -riscv-v-slp-max-vf=0 \4; RUN: | FileCheck %s5; RUN: opt < %s -passes=slp-vectorizer -S -mtriple=riscv64 -mattr=+v,+f \6; RUN: | FileCheck %s --check-prefix=DEFAULT7 8declare float @fabsf(float) readonly nounwind willreturn9 10define <4 x float> @fabs_4x(ptr %a) {11; CHECK-LABEL: define <4 x float> @fabs_4x12; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {13; CHECK-NEXT: entry:14; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 1615; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @llvm.fabs.v4f32(<4 x float> [[TMP0]])16; CHECK-NEXT: ret <4 x float> [[TMP1]]17;18; DEFAULT-LABEL: define <4 x float> @fabs_4x19; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {20; DEFAULT-NEXT: entry:21; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 1622; DEFAULT-NEXT: [[TMP1:%.*]] = call fast <4 x float> @llvm.fabs.v4f32(<4 x float> [[TMP0]])23; DEFAULT-NEXT: ret <4 x float> [[TMP1]]24;25entry:26 %0 = load <4 x float>, ptr %a, align 1627 %vecext = extractelement <4 x float> %0, i32 028 %1 = tail call fast float @fabsf(float %vecext)29 %vecins = insertelement <4 x float> poison, float %1, i32 030 %vecext.1 = extractelement <4 x float> %0, i32 131 %2 = tail call fast float @fabsf(float %vecext.1)32 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 133 %vecext.2 = extractelement <4 x float> %0, i32 234 %3 = tail call fast float @fabsf(float %vecext.2)35 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 236 %vecext.3 = extractelement <4 x float> %0, i32 337 %4 = tail call fast float @fabsf(float %vecext.3)38 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 339 ret <4 x float> %vecins.340}41 42declare float @llvm.fabs.f32(float)43 44define <4 x float> @int_fabs_4x(ptr %a) {45; CHECK-LABEL: define <4 x float> @int_fabs_4x46; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {47; CHECK-NEXT: entry:48; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 1649; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @llvm.fabs.v4f32(<4 x float> [[TMP0]])50; CHECK-NEXT: ret <4 x float> [[TMP1]]51;52; DEFAULT-LABEL: define <4 x float> @int_fabs_4x53; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {54; DEFAULT-NEXT: entry:55; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 1656; DEFAULT-NEXT: [[TMP1:%.*]] = call fast <4 x float> @llvm.fabs.v4f32(<4 x float> [[TMP0]])57; DEFAULT-NEXT: ret <4 x float> [[TMP1]]58;59entry:60 %0 = load <4 x float>, ptr %a, align 1661 %vecext = extractelement <4 x float> %0, i32 062 %1 = tail call fast float @llvm.fabs.f32(float %vecext)63 %vecins = insertelement <4 x float> poison, float %1, i32 064 %vecext.1 = extractelement <4 x float> %0, i32 165 %2 = tail call fast float @llvm.fabs.f32(float %vecext.1)66 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 167 %vecext.2 = extractelement <4 x float> %0, i32 268 %3 = tail call fast float @llvm.fabs.f32(float %vecext.2)69 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 270 %vecext.3 = extractelement <4 x float> %0, i32 371 %4 = tail call fast float @llvm.fabs.f32(float %vecext.3)72 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 373 ret <4 x float> %vecins.374}75 76declare float @sqrtf(float) readonly nounwind willreturn77 78define <4 x float> @sqrt_4x(ptr %a) {79; CHECK-LABEL: define <4 x float> @sqrt_4x80; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {81; CHECK-NEXT: entry:82; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 1683; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @llvm.sqrt.v4f32(<4 x float> [[TMP0]])84; CHECK-NEXT: ret <4 x float> [[TMP1]]85;86; DEFAULT-LABEL: define <4 x float> @sqrt_4x87; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {88; DEFAULT-NEXT: entry:89; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 1690; DEFAULT-NEXT: [[TMP1:%.*]] = call fast <4 x float> @llvm.sqrt.v4f32(<4 x float> [[TMP0]])91; DEFAULT-NEXT: ret <4 x float> [[TMP1]]92;93entry:94 %0 = load <4 x float>, ptr %a, align 1695 %vecext = extractelement <4 x float> %0, i32 096 %1 = tail call fast float @sqrtf(float %vecext)97 %vecins = insertelement <4 x float> poison, float %1, i32 098 %vecext.1 = extractelement <4 x float> %0, i32 199 %2 = tail call fast float @sqrtf(float %vecext.1)100 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1101 %vecext.2 = extractelement <4 x float> %0, i32 2102 %3 = tail call fast float @sqrtf(float %vecext.2)103 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2104 %vecext.3 = extractelement <4 x float> %0, i32 3105 %4 = tail call fast float @sqrtf(float %vecext.3)106 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3107 ret <4 x float> %vecins.3108}109 110declare float @llvm.sqrt.f32(float)111 112define <4 x float> @int_sqrt_4x(ptr %a) {113; CHECK-LABEL: define <4 x float> @int_sqrt_4x114; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {115; CHECK-NEXT: entry:116; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16117; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @llvm.sqrt.v4f32(<4 x float> [[TMP0]])118; CHECK-NEXT: ret <4 x float> [[TMP1]]119;120; DEFAULT-LABEL: define <4 x float> @int_sqrt_4x121; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {122; DEFAULT-NEXT: entry:123; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16124; DEFAULT-NEXT: [[TMP1:%.*]] = call fast <4 x float> @llvm.sqrt.v4f32(<4 x float> [[TMP0]])125; DEFAULT-NEXT: ret <4 x float> [[TMP1]]126;127entry:128 %0 = load <4 x float>, ptr %a, align 16129 %vecext = extractelement <4 x float> %0, i32 0130 %1 = tail call fast float @llvm.sqrt.f32(float %vecext)131 %vecins = insertelement <4 x float> poison, float %1, i32 0132 %vecext.1 = extractelement <4 x float> %0, i32 1133 %2 = tail call fast float @llvm.sqrt.f32(float %vecext.1)134 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1135 %vecext.2 = extractelement <4 x float> %0, i32 2136 %3 = tail call fast float @llvm.sqrt.f32(float %vecext.2)137 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2138 %vecext.3 = extractelement <4 x float> %0, i32 3139 %4 = tail call fast float @llvm.sqrt.f32(float %vecext.3)140 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3141 ret <4 x float> %vecins.3142}143 144declare float @expf(float) readonly nounwind willreturn145 146; We can not vectorized exp since RISCV has no such instruction.147define <4 x float> @exp_4x(ptr %a) {148; CHECK-LABEL: define <4 x float> @exp_4x149; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {150; CHECK-NEXT: entry:151; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16152; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0153; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @expf(float [[VECEXT]])154; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0155; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1156; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @expf(float [[VECEXT_1]])157; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1158; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2159; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @expf(float [[VECEXT_2]])160; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2161; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3162; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @expf(float [[VECEXT_3]])163; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3164; CHECK-NEXT: ret <4 x float> [[VECINS_3]]165;166; DEFAULT-LABEL: define <4 x float> @exp_4x167; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {168; DEFAULT-NEXT: entry:169; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16170; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0171; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @expf(float [[VECEXT]])172; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0173; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1174; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @expf(float [[VECEXT_1]])175; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1176; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2177; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @expf(float [[VECEXT_2]])178; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2179; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3180; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @expf(float [[VECEXT_3]])181; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3182; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]183;184entry:185 %0 = load <4 x float>, ptr %a, align 16186 %vecext = extractelement <4 x float> %0, i32 0187 %1 = tail call fast float @expf(float %vecext)188 %vecins = insertelement <4 x float> poison, float %1, i32 0189 %vecext.1 = extractelement <4 x float> %0, i32 1190 %2 = tail call fast float @expf(float %vecext.1)191 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1192 %vecext.2 = extractelement <4 x float> %0, i32 2193 %3 = tail call fast float @expf(float %vecext.2)194 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2195 %vecext.3 = extractelement <4 x float> %0, i32 3196 %4 = tail call fast float @expf(float %vecext.3)197 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3198 ret <4 x float> %vecins.3199}200 201declare float @llvm.exp.f32(float)202 203; We can not vectorized exp since RISCV has no such instruction.204define <4 x float> @int_exp_4x(ptr %a) {205; CHECK-LABEL: define <4 x float> @int_exp_4x206; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {207; CHECK-NEXT: entry:208; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16209; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0210; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.exp.f32(float [[VECEXT]])211; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0212; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1213; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.exp.f32(float [[VECEXT_1]])214; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1215; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2216; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.exp.f32(float [[VECEXT_2]])217; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2218; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3219; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.exp.f32(float [[VECEXT_3]])220; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3221; CHECK-NEXT: ret <4 x float> [[VECINS_3]]222;223; DEFAULT-LABEL: define <4 x float> @int_exp_4x224; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {225; DEFAULT-NEXT: entry:226; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16227; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0228; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.exp.f32(float [[VECEXT]])229; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0230; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1231; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.exp.f32(float [[VECEXT_1]])232; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1233; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2234; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.exp.f32(float [[VECEXT_2]])235; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2236; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3237; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.exp.f32(float [[VECEXT_3]])238; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3239; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]240;241entry:242 %0 = load <4 x float>, ptr %a, align 16243 %vecext = extractelement <4 x float> %0, i32 0244 %1 = tail call fast float @llvm.exp.f32(float %vecext)245 %vecins = insertelement <4 x float> poison, float %1, i32 0246 %vecext.1 = extractelement <4 x float> %0, i32 1247 %2 = tail call fast float @llvm.exp.f32(float %vecext.1)248 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1249 %vecext.2 = extractelement <4 x float> %0, i32 2250 %3 = tail call fast float @llvm.exp.f32(float %vecext.2)251 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2252 %vecext.3 = extractelement <4 x float> %0, i32 3253 %4 = tail call fast float @llvm.exp.f32(float %vecext.3)254 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3255 ret <4 x float> %vecins.3256}257 258declare float @logf(float) readonly nounwind willreturn259 260; We can not vectorized log since RISCV has no such instruction.261define <4 x float> @log_4x(ptr %a) {262; CHECK-LABEL: define <4 x float> @log_4x263; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {264; CHECK-NEXT: entry:265; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16266; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0267; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @logf(float [[VECEXT]])268; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0269; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1270; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @logf(float [[VECEXT_1]])271; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1272; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2273; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @logf(float [[VECEXT_2]])274; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2275; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3276; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @logf(float [[VECEXT_3]])277; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3278; CHECK-NEXT: ret <4 x float> [[VECINS_3]]279;280; DEFAULT-LABEL: define <4 x float> @log_4x281; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {282; DEFAULT-NEXT: entry:283; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16284; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0285; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @logf(float [[VECEXT]])286; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0287; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1288; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @logf(float [[VECEXT_1]])289; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1290; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2291; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @logf(float [[VECEXT_2]])292; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2293; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3294; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @logf(float [[VECEXT_3]])295; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3296; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]297;298entry:299 %0 = load <4 x float>, ptr %a, align 16300 %vecext = extractelement <4 x float> %0, i32 0301 %1 = tail call fast float @logf(float %vecext)302 %vecins = insertelement <4 x float> poison, float %1, i32 0303 %vecext.1 = extractelement <4 x float> %0, i32 1304 %2 = tail call fast float @logf(float %vecext.1)305 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1306 %vecext.2 = extractelement <4 x float> %0, i32 2307 %3 = tail call fast float @logf(float %vecext.2)308 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2309 %vecext.3 = extractelement <4 x float> %0, i32 3310 %4 = tail call fast float @logf(float %vecext.3)311 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3312 ret <4 x float> %vecins.3313}314 315declare float @llvm.log.f32(float)316 317; We can not vectorized log since RISCV has no such instruction.318define <4 x float> @int_log_4x(ptr %a) {319; CHECK-LABEL: define <4 x float> @int_log_4x320; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {321; CHECK-NEXT: entry:322; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16323; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0324; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.log.f32(float [[VECEXT]])325; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0326; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1327; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.log.f32(float [[VECEXT_1]])328; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1329; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2330; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.log.f32(float [[VECEXT_2]])331; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2332; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3333; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.log.f32(float [[VECEXT_3]])334; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3335; CHECK-NEXT: ret <4 x float> [[VECINS_3]]336;337; DEFAULT-LABEL: define <4 x float> @int_log_4x338; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {339; DEFAULT-NEXT: entry:340; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16341; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0342; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.log.f32(float [[VECEXT]])343; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0344; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1345; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.log.f32(float [[VECEXT_1]])346; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1347; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2348; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.log.f32(float [[VECEXT_2]])349; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2350; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3351; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.log.f32(float [[VECEXT_3]])352; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3353; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]354;355entry:356 %0 = load <4 x float>, ptr %a, align 16357 %vecext = extractelement <4 x float> %0, i32 0358 %1 = tail call fast float @llvm.log.f32(float %vecext)359 %vecins = insertelement <4 x float> poison, float %1, i32 0360 %vecext.1 = extractelement <4 x float> %0, i32 1361 %2 = tail call fast float @llvm.log.f32(float %vecext.1)362 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1363 %vecext.2 = extractelement <4 x float> %0, i32 2364 %3 = tail call fast float @llvm.log.f32(float %vecext.2)365 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2366 %vecext.3 = extractelement <4 x float> %0, i32 3367 %4 = tail call fast float @llvm.log.f32(float %vecext.3)368 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3369 ret <4 x float> %vecins.3370}371 372declare float @sinf(float) readonly nounwind willreturn373 374; We can not vectorized sin since RISCV has no such instruction.375define <4 x float> @sin_4x(ptr %a) {376; CHECK-LABEL: define <4 x float> @sin_4x377; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {378; CHECK-NEXT: entry:379; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16380; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0381; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @sinf(float [[VECEXT]])382; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0383; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1384; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @sinf(float [[VECEXT_1]])385; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1386; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2387; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @sinf(float [[VECEXT_2]])388; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2389; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3390; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @sinf(float [[VECEXT_3]])391; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3392; CHECK-NEXT: ret <4 x float> [[VECINS_3]]393;394; DEFAULT-LABEL: define <4 x float> @sin_4x395; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {396; DEFAULT-NEXT: entry:397; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16398; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0399; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @sinf(float [[VECEXT]])400; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0401; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1402; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @sinf(float [[VECEXT_1]])403; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1404; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2405; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @sinf(float [[VECEXT_2]])406; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2407; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3408; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @sinf(float [[VECEXT_3]])409; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3410; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]411;412entry:413 %0 = load <4 x float>, ptr %a, align 16414 %vecext = extractelement <4 x float> %0, i32 0415 %1 = tail call fast float @sinf(float %vecext)416 %vecins = insertelement <4 x float> poison, float %1, i32 0417 %vecext.1 = extractelement <4 x float> %0, i32 1418 %2 = tail call fast float @sinf(float %vecext.1)419 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1420 %vecext.2 = extractelement <4 x float> %0, i32 2421 %3 = tail call fast float @sinf(float %vecext.2)422 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2423 %vecext.3 = extractelement <4 x float> %0, i32 3424 %4 = tail call fast float @sinf(float %vecext.3)425 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3426 ret <4 x float> %vecins.3427}428 429declare float @llvm.sin.f32(float)430 431; We can not vectorized sin since RISCV has no such instruction.432define <4 x float> @int_sin_4x(ptr %a) {433; CHECK-LABEL: define <4 x float> @int_sin_4x434; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {435; CHECK-NEXT: entry:436; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16437; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0438; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.sin.f32(float [[VECEXT]])439; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0440; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1441; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.sin.f32(float [[VECEXT_1]])442; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1443; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2444; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.sin.f32(float [[VECEXT_2]])445; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2446; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3447; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.sin.f32(float [[VECEXT_3]])448; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3449; CHECK-NEXT: ret <4 x float> [[VECINS_3]]450;451; DEFAULT-LABEL: define <4 x float> @int_sin_4x452; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {453; DEFAULT-NEXT: entry:454; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16455; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0456; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.sin.f32(float [[VECEXT]])457; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0458; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1459; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.sin.f32(float [[VECEXT_1]])460; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1461; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2462; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.sin.f32(float [[VECEXT_2]])463; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2464; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3465; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.sin.f32(float [[VECEXT_3]])466; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3467; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]468;469entry:470 %0 = load <4 x float>, ptr %a, align 16471 %vecext = extractelement <4 x float> %0, i32 0472 %1 = tail call fast float @llvm.sin.f32(float %vecext)473 %vecins = insertelement <4 x float> poison, float %1, i32 0474 %vecext.1 = extractelement <4 x float> %0, i32 1475 %2 = tail call fast float @llvm.sin.f32(float %vecext.1)476 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1477 %vecext.2 = extractelement <4 x float> %0, i32 2478 %3 = tail call fast float @llvm.sin.f32(float %vecext.2)479 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2480 %vecext.3 = extractelement <4 x float> %0, i32 3481 %4 = tail call fast float @llvm.sin.f32(float %vecext.3)482 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3483 ret <4 x float> %vecins.3484}485 486declare float @asinf(float) readonly nounwind willreturn487 488; We can not vectorized asin since RISCV has no such instruction.489define <4 x float> @asin_4x(ptr %a) {490; CHECK-LABEL: define <4 x float> @asin_4x491; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {492; CHECK-NEXT: entry:493; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16494; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0495; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @asinf(float [[VECEXT]])496; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0497; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1498; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @asinf(float [[VECEXT_1]])499; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1500; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2501; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @asinf(float [[VECEXT_2]])502; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2503; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3504; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @asinf(float [[VECEXT_3]])505; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3506; CHECK-NEXT: ret <4 x float> [[VECINS_3]]507;508; DEFAULT-LABEL: define <4 x float> @asin_4x509; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {510; DEFAULT-NEXT: entry:511; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16512; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0513; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @asinf(float [[VECEXT]])514; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0515; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1516; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @asinf(float [[VECEXT_1]])517; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1518; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2519; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @asinf(float [[VECEXT_2]])520; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2521; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3522; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @asinf(float [[VECEXT_3]])523; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3524; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]525;526entry:527 %0 = load <4 x float>, ptr %a, align 16528 %vecext = extractelement <4 x float> %0, i32 0529 %1 = tail call fast float @asinf(float %vecext)530 %vecins = insertelement <4 x float> poison, float %1, i32 0531 %vecext.1 = extractelement <4 x float> %0, i32 1532 %2 = tail call fast float @asinf(float %vecext.1)533 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1534 %vecext.2 = extractelement <4 x float> %0, i32 2535 %3 = tail call fast float @asinf(float %vecext.2)536 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2537 %vecext.3 = extractelement <4 x float> %0, i32 3538 %4 = tail call fast float @asinf(float %vecext.3)539 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3540 ret <4 x float> %vecins.3541}542 543declare float @llvm.asin.f32(float)544 545; We can not vectorized asin since RISCV has no such instruction.546define <4 x float> @int_asin_4x(ptr %a) {547; CHECK-LABEL: define <4 x float> @int_asin_4x548; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {549; CHECK-NEXT: entry:550; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16551; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0552; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.asin.f32(float [[VECEXT]])553; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0554; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1555; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.asin.f32(float [[VECEXT_1]])556; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1557; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2558; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.asin.f32(float [[VECEXT_2]])559; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2560; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3561; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.asin.f32(float [[VECEXT_3]])562; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3563; CHECK-NEXT: ret <4 x float> [[VECINS_3]]564;565; DEFAULT-LABEL: define <4 x float> @int_asin_4x566; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {567; DEFAULT-NEXT: entry:568; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16569; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0570; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.asin.f32(float [[VECEXT]])571; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0572; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1573; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.asin.f32(float [[VECEXT_1]])574; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1575; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2576; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.asin.f32(float [[VECEXT_2]])577; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2578; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3579; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.asin.f32(float [[VECEXT_3]])580; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3581; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]582;583entry:584 %0 = load <4 x float>, ptr %a, align 16585 %vecext = extractelement <4 x float> %0, i32 0586 %1 = tail call fast float @llvm.asin.f32(float %vecext)587 %vecins = insertelement <4 x float> poison, float %1, i32 0588 %vecext.1 = extractelement <4 x float> %0, i32 1589 %2 = tail call fast float @llvm.asin.f32(float %vecext.1)590 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1591 %vecext.2 = extractelement <4 x float> %0, i32 2592 %3 = tail call fast float @llvm.asin.f32(float %vecext.2)593 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2594 %vecext.3 = extractelement <4 x float> %0, i32 3595 %4 = tail call fast float @llvm.asin.f32(float %vecext.3)596 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3597 ret <4 x float> %vecins.3598}599 600declare float @cosf(float) readonly nounwind willreturn601 602; We can not vectorized cos cosce RISCV has no such instruction.603define <4 x float> @cos_4x(ptr %a) {604; CHECK-LABEL: define <4 x float> @cos_4x605; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {606; CHECK-NEXT: entry:607; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16608; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0609; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @cosf(float [[VECEXT]])610; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0611; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1612; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @cosf(float [[VECEXT_1]])613; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1614; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2615; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @cosf(float [[VECEXT_2]])616; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2617; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3618; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @cosf(float [[VECEXT_3]])619; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3620; CHECK-NEXT: ret <4 x float> [[VECINS_3]]621;622; DEFAULT-LABEL: define <4 x float> @cos_4x623; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {624; DEFAULT-NEXT: entry:625; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16626; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0627; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @cosf(float [[VECEXT]])628; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0629; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1630; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @cosf(float [[VECEXT_1]])631; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1632; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2633; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @cosf(float [[VECEXT_2]])634; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2635; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3636; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @cosf(float [[VECEXT_3]])637; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3638; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]639;640entry:641 %0 = load <4 x float>, ptr %a, align 16642 %vecext = extractelement <4 x float> %0, i32 0643 %1 = tail call fast float @cosf(float %vecext)644 %vecins = insertelement <4 x float> poison, float %1, i32 0645 %vecext.1 = extractelement <4 x float> %0, i32 1646 %2 = tail call fast float @cosf(float %vecext.1)647 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1648 %vecext.2 = extractelement <4 x float> %0, i32 2649 %3 = tail call fast float @cosf(float %vecext.2)650 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2651 %vecext.3 = extractelement <4 x float> %0, i32 3652 %4 = tail call fast float @cosf(float %vecext.3)653 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3654 ret <4 x float> %vecins.3655}656 657declare float @llvm.cos.f32(float)658 659; We can not vectorized cos cosce RISCV has no such instruction.660define <4 x float> @int_cos_4x(ptr %a) {661; CHECK-LABEL: define <4 x float> @int_cos_4x662; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {663; CHECK-NEXT: entry:664; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16665; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0666; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.cos.f32(float [[VECEXT]])667; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0668; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1669; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.cos.f32(float [[VECEXT_1]])670; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1671; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2672; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.cos.f32(float [[VECEXT_2]])673; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2674; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3675; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.cos.f32(float [[VECEXT_3]])676; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3677; CHECK-NEXT: ret <4 x float> [[VECINS_3]]678;679; DEFAULT-LABEL: define <4 x float> @int_cos_4x680; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {681; DEFAULT-NEXT: entry:682; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16683; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0684; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.cos.f32(float [[VECEXT]])685; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0686; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1687; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.cos.f32(float [[VECEXT_1]])688; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1689; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2690; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.cos.f32(float [[VECEXT_2]])691; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2692; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3693; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.cos.f32(float [[VECEXT_3]])694; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3695; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]696;697entry:698 %0 = load <4 x float>, ptr %a, align 16699 %vecext = extractelement <4 x float> %0, i32 0700 %1 = tail call fast float @llvm.cos.f32(float %vecext)701 %vecins = insertelement <4 x float> poison, float %1, i32 0702 %vecext.1 = extractelement <4 x float> %0, i32 1703 %2 = tail call fast float @llvm.cos.f32(float %vecext.1)704 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1705 %vecext.2 = extractelement <4 x float> %0, i32 2706 %3 = tail call fast float @llvm.cos.f32(float %vecext.2)707 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2708 %vecext.3 = extractelement <4 x float> %0, i32 3709 %4 = tail call fast float @llvm.cos.f32(float %vecext.3)710 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3711 ret <4 x float> %vecins.3712}713 714declare float @acosf(float) readonly nounwind willreturn715 716; We can not vectorized acos cosce RISCV has no such instruction.717define <4 x float> @acos_4x(ptr %a) {718; CHECK-LABEL: define <4 x float> @acos_4x719; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {720; CHECK-NEXT: entry:721; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16722; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0723; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @acosf(float [[VECEXT]])724; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0725; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1726; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @acosf(float [[VECEXT_1]])727; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1728; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2729; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @acosf(float [[VECEXT_2]])730; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2731; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3732; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @acosf(float [[VECEXT_3]])733; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3734; CHECK-NEXT: ret <4 x float> [[VECINS_3]]735;736; DEFAULT-LABEL: define <4 x float> @acos_4x737; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {738; DEFAULT-NEXT: entry:739; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16740; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0741; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @acosf(float [[VECEXT]])742; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0743; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1744; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @acosf(float [[VECEXT_1]])745; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1746; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2747; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @acosf(float [[VECEXT_2]])748; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2749; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3750; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @acosf(float [[VECEXT_3]])751; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3752; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]753;754entry:755 %0 = load <4 x float>, ptr %a, align 16756 %vecext = extractelement <4 x float> %0, i32 0757 %1 = tail call fast float @acosf(float %vecext)758 %vecins = insertelement <4 x float> poison, float %1, i32 0759 %vecext.1 = extractelement <4 x float> %0, i32 1760 %2 = tail call fast float @acosf(float %vecext.1)761 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1762 %vecext.2 = extractelement <4 x float> %0, i32 2763 %3 = tail call fast float @acosf(float %vecext.2)764 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2765 %vecext.3 = extractelement <4 x float> %0, i32 3766 %4 = tail call fast float @acosf(float %vecext.3)767 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3768 ret <4 x float> %vecins.3769}770 771declare float @llvm.acos.f32(float)772 773; We can not vectorized acos cosce RISCV has no such instruction.774define <4 x float> @int_acos_4x(ptr %a) {775; CHECK-LABEL: define <4 x float> @int_acos_4x776; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {777; CHECK-NEXT: entry:778; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16779; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0780; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.acos.f32(float [[VECEXT]])781; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0782; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1783; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.acos.f32(float [[VECEXT_1]])784; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1785; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2786; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.acos.f32(float [[VECEXT_2]])787; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2788; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3789; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.acos.f32(float [[VECEXT_3]])790; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3791; CHECK-NEXT: ret <4 x float> [[VECINS_3]]792;793; DEFAULT-LABEL: define <4 x float> @int_acos_4x794; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {795; DEFAULT-NEXT: entry:796; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16797; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0798; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.acos.f32(float [[VECEXT]])799; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0800; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1801; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.acos.f32(float [[VECEXT_1]])802; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1803; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2804; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.acos.f32(float [[VECEXT_2]])805; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2806; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3807; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.acos.f32(float [[VECEXT_3]])808; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3809; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]810;811entry:812 %0 = load <4 x float>, ptr %a, align 16813 %vecext = extractelement <4 x float> %0, i32 0814 %1 = tail call fast float @llvm.acos.f32(float %vecext)815 %vecins = insertelement <4 x float> poison, float %1, i32 0816 %vecext.1 = extractelement <4 x float> %0, i32 1817 %2 = tail call fast float @llvm.acos.f32(float %vecext.1)818 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1819 %vecext.2 = extractelement <4 x float> %0, i32 2820 %3 = tail call fast float @llvm.acos.f32(float %vecext.2)821 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2822 %vecext.3 = extractelement <4 x float> %0, i32 3823 %4 = tail call fast float @llvm.acos.f32(float %vecext.3)824 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3825 ret <4 x float> %vecins.3826}827 828declare float @tanf(float) readonly nounwind willreturn829 830; We can not vectorized tan tance RISCV has no such instruction.831define <4 x float> @tan_4x(ptr %a) {832; CHECK-LABEL: define <4 x float> @tan_4x833; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {834; CHECK-NEXT: entry:835; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16836; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0837; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @tanf(float [[VECEXT]])838; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0839; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1840; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @tanf(float [[VECEXT_1]])841; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1842; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2843; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @tanf(float [[VECEXT_2]])844; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2845; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3846; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @tanf(float [[VECEXT_3]])847; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3848; CHECK-NEXT: ret <4 x float> [[VECINS_3]]849;850; DEFAULT-LABEL: define <4 x float> @tan_4x851; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {852; DEFAULT-NEXT: entry:853; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16854; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0855; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @tanf(float [[VECEXT]])856; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0857; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1858; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @tanf(float [[VECEXT_1]])859; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1860; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2861; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @tanf(float [[VECEXT_2]])862; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2863; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3864; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @tanf(float [[VECEXT_3]])865; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3866; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]867;868entry:869 %0 = load <4 x float>, ptr %a, align 16870 %vecext = extractelement <4 x float> %0, i32 0871 %1 = tail call fast float @tanf(float %vecext)872 %vecins = insertelement <4 x float> poison, float %1, i32 0873 %vecext.1 = extractelement <4 x float> %0, i32 1874 %2 = tail call fast float @tanf(float %vecext.1)875 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1876 %vecext.2 = extractelement <4 x float> %0, i32 2877 %3 = tail call fast float @tanf(float %vecext.2)878 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2879 %vecext.3 = extractelement <4 x float> %0, i32 3880 %4 = tail call fast float @tanf(float %vecext.3)881 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3882 ret <4 x float> %vecins.3883}884 885declare float @llvm.tan.f32(float)886 887; We can not vectorized tan tance RISCV has no such instruction.888define <4 x float> @int_tan_4x(ptr %a) {889; CHECK-LABEL: define <4 x float> @int_tan_4x890; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {891; CHECK-NEXT: entry:892; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16893; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0894; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.tan.f32(float [[VECEXT]])895; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0896; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1897; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.tan.f32(float [[VECEXT_1]])898; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1899; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2900; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.tan.f32(float [[VECEXT_2]])901; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2902; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3903; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.tan.f32(float [[VECEXT_3]])904; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3905; CHECK-NEXT: ret <4 x float> [[VECINS_3]]906;907; DEFAULT-LABEL: define <4 x float> @int_tan_4x908; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {909; DEFAULT-NEXT: entry:910; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16911; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0912; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.tan.f32(float [[VECEXT]])913; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0914; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1915; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.tan.f32(float [[VECEXT_1]])916; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1917; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2918; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.tan.f32(float [[VECEXT_2]])919; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2920; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3921; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.tan.f32(float [[VECEXT_3]])922; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3923; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]924;925entry:926 %0 = load <4 x float>, ptr %a, align 16927 %vecext = extractelement <4 x float> %0, i32 0928 %1 = tail call fast float @llvm.tan.f32(float %vecext)929 %vecins = insertelement <4 x float> poison, float %1, i32 0930 %vecext.1 = extractelement <4 x float> %0, i32 1931 %2 = tail call fast float @llvm.tan.f32(float %vecext.1)932 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1933 %vecext.2 = extractelement <4 x float> %0, i32 2934 %3 = tail call fast float @llvm.tan.f32(float %vecext.2)935 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2936 %vecext.3 = extractelement <4 x float> %0, i32 3937 %4 = tail call fast float @llvm.tan.f32(float %vecext.3)938 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3939 ret <4 x float> %vecins.3940}941 942declare float @atanf(float) readonly nounwind willreturn943 944; We can not vectorized atan tance RISCV has no such instruction.945define <4 x float> @atan_4x(ptr %a) {946; CHECK-LABEL: define <4 x float> @atan_4x947; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {948; CHECK-NEXT: entry:949; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16950; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0951; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @atanf(float [[VECEXT]])952; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0953; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1954; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @atanf(float [[VECEXT_1]])955; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1956; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2957; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @atanf(float [[VECEXT_2]])958; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2959; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3960; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @atanf(float [[VECEXT_3]])961; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3962; CHECK-NEXT: ret <4 x float> [[VECINS_3]]963;964; DEFAULT-LABEL: define <4 x float> @atan_4x965; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {966; DEFAULT-NEXT: entry:967; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 16968; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0969; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @atanf(float [[VECEXT]])970; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 0971; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1972; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @atanf(float [[VECEXT_1]])973; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1974; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2975; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @atanf(float [[VECEXT_2]])976; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2977; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3978; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @atanf(float [[VECEXT_3]])979; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3980; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]981;982entry:983 %0 = load <4 x float>, ptr %a, align 16984 %vecext = extractelement <4 x float> %0, i32 0985 %1 = tail call fast float @atanf(float %vecext)986 %vecins = insertelement <4 x float> poison, float %1, i32 0987 %vecext.1 = extractelement <4 x float> %0, i32 1988 %2 = tail call fast float @atanf(float %vecext.1)989 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1990 %vecext.2 = extractelement <4 x float> %0, i32 2991 %3 = tail call fast float @atanf(float %vecext.2)992 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2993 %vecext.3 = extractelement <4 x float> %0, i32 3994 %4 = tail call fast float @atanf(float %vecext.3)995 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3996 ret <4 x float> %vecins.3997}998 999declare float @llvm.atan.f32(float)1000 1001; We can not vectorized atan tance RISCV has no such instruction.1002define <4 x float> @int_atan_4x(ptr %a) {1003; CHECK-LABEL: define <4 x float> @int_atan_4x1004; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1005; CHECK-NEXT: entry:1006; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161007; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01008; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.atan.f32(float [[VECEXT]])1009; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01010; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11011; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.atan.f32(float [[VECEXT_1]])1012; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11013; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21014; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.atan.f32(float [[VECEXT_2]])1015; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21016; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31017; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.atan.f32(float [[VECEXT_3]])1018; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31019; CHECK-NEXT: ret <4 x float> [[VECINS_3]]1020;1021; DEFAULT-LABEL: define <4 x float> @int_atan_4x1022; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1023; DEFAULT-NEXT: entry:1024; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161025; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01026; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.atan.f32(float [[VECEXT]])1027; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01028; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11029; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.atan.f32(float [[VECEXT_1]])1030; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11031; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21032; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.atan.f32(float [[VECEXT_2]])1033; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21034; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31035; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.atan.f32(float [[VECEXT_3]])1036; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31037; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]1038;1039entry:1040 %0 = load <4 x float>, ptr %a, align 161041 %vecext = extractelement <4 x float> %0, i32 01042 %1 = tail call fast float @llvm.atan.f32(float %vecext)1043 %vecins = insertelement <4 x float> poison, float %1, i32 01044 %vecext.1 = extractelement <4 x float> %0, i32 11045 %2 = tail call fast float @llvm.atan.f32(float %vecext.1)1046 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 11047 %vecext.2 = extractelement <4 x float> %0, i32 21048 %3 = tail call fast float @llvm.atan.f32(float %vecext.2)1049 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 21050 %vecext.3 = extractelement <4 x float> %0, i32 31051 %4 = tail call fast float @llvm.atan.f32(float %vecext.3)1052 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 31053 ret <4 x float> %vecins.31054}1055 1056declare float @sinhf(float) readonly nounwind willreturn1057 1058; We can not vectorized sinh since RISCV has no such instruction.1059define <4 x float> @sinh_4x(ptr %a) {1060; CHECK-LABEL: define <4 x float> @sinh_4x1061; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1062; CHECK-NEXT: entry:1063; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161064; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01065; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @sinhf(float [[VECEXT]])1066; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01067; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11068; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @sinhf(float [[VECEXT_1]])1069; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11070; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21071; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @sinhf(float [[VECEXT_2]])1072; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21073; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31074; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @sinhf(float [[VECEXT_3]])1075; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31076; CHECK-NEXT: ret <4 x float> [[VECINS_3]]1077;1078; DEFAULT-LABEL: define <4 x float> @sinh_4x1079; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1080; DEFAULT-NEXT: entry:1081; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161082; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01083; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @sinhf(float [[VECEXT]])1084; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01085; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11086; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @sinhf(float [[VECEXT_1]])1087; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11088; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21089; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @sinhf(float [[VECEXT_2]])1090; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21091; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31092; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @sinhf(float [[VECEXT_3]])1093; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31094; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]1095;1096entry:1097 %0 = load <4 x float>, ptr %a, align 161098 %vecext = extractelement <4 x float> %0, i32 01099 %1 = tail call fast float @sinhf(float %vecext)1100 %vecins = insertelement <4 x float> poison, float %1, i32 01101 %vecext.1 = extractelement <4 x float> %0, i32 11102 %2 = tail call fast float @sinhf(float %vecext.1)1103 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 11104 %vecext.2 = extractelement <4 x float> %0, i32 21105 %3 = tail call fast float @sinhf(float %vecext.2)1106 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 21107 %vecext.3 = extractelement <4 x float> %0, i32 31108 %4 = tail call fast float @sinhf(float %vecext.3)1109 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 31110 ret <4 x float> %vecins.31111}1112 1113declare float @llvm.sinh.f32(float)1114 1115; We can not vectorized sinh since RISCV has no such instruction.1116define <4 x float> @int_sinh_4x(ptr %a) {1117; CHECK-LABEL: define <4 x float> @int_sinh_4x1118; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1119; CHECK-NEXT: entry:1120; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161121; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01122; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.sinh.f32(float [[VECEXT]])1123; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01124; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11125; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.sinh.f32(float [[VECEXT_1]])1126; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11127; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21128; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.sinh.f32(float [[VECEXT_2]])1129; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21130; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31131; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.sinh.f32(float [[VECEXT_3]])1132; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31133; CHECK-NEXT: ret <4 x float> [[VECINS_3]]1134;1135; DEFAULT-LABEL: define <4 x float> @int_sinh_4x1136; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1137; DEFAULT-NEXT: entry:1138; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161139; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01140; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.sinh.f32(float [[VECEXT]])1141; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01142; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11143; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.sinh.f32(float [[VECEXT_1]])1144; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11145; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21146; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.sinh.f32(float [[VECEXT_2]])1147; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21148; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31149; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.sinh.f32(float [[VECEXT_3]])1150; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31151; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]1152;1153entry:1154 %0 = load <4 x float>, ptr %a, align 161155 %vecext = extractelement <4 x float> %0, i32 01156 %1 = tail call fast float @llvm.sinh.f32(float %vecext)1157 %vecins = insertelement <4 x float> poison, float %1, i32 01158 %vecext.1 = extractelement <4 x float> %0, i32 11159 %2 = tail call fast float @llvm.sinh.f32(float %vecext.1)1160 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 11161 %vecext.2 = extractelement <4 x float> %0, i32 21162 %3 = tail call fast float @llvm.sinh.f32(float %vecext.2)1163 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 21164 %vecext.3 = extractelement <4 x float> %0, i32 31165 %4 = tail call fast float @llvm.sinh.f32(float %vecext.3)1166 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 31167 ret <4 x float> %vecins.31168}1169 1170declare float @asinhf(float) readonly nounwind willreturn1171 1172; We can not vectorized asinh since RISCV has no such instruction.1173define <4 x float> @asinh_4x(ptr %a) {1174; CHECK-LABEL: define <4 x float> @asinh_4x1175; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1176; CHECK-NEXT: entry:1177; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161178; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01179; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @asinhf(float [[VECEXT]])1180; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01181; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11182; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @asinhf(float [[VECEXT_1]])1183; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11184; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21185; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @asinhf(float [[VECEXT_2]])1186; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21187; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31188; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @asinhf(float [[VECEXT_3]])1189; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31190; CHECK-NEXT: ret <4 x float> [[VECINS_3]]1191;1192; DEFAULT-LABEL: define <4 x float> @asinh_4x1193; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1194; DEFAULT-NEXT: entry:1195; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161196; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01197; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @asinhf(float [[VECEXT]])1198; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01199; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11200; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @asinhf(float [[VECEXT_1]])1201; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11202; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21203; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @asinhf(float [[VECEXT_2]])1204; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21205; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31206; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @asinhf(float [[VECEXT_3]])1207; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31208; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]1209;1210entry:1211 %0 = load <4 x float>, ptr %a, align 161212 %vecext = extractelement <4 x float> %0, i32 01213 %1 = tail call fast float @asinhf(float %vecext)1214 %vecins = insertelement <4 x float> poison, float %1, i32 01215 %vecext.1 = extractelement <4 x float> %0, i32 11216 %2 = tail call fast float @asinhf(float %vecext.1)1217 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 11218 %vecext.2 = extractelement <4 x float> %0, i32 21219 %3 = tail call fast float @asinhf(float %vecext.2)1220 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 21221 %vecext.3 = extractelement <4 x float> %0, i32 31222 %4 = tail call fast float @asinhf(float %vecext.3)1223 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 31224 ret <4 x float> %vecins.31225}1226 1227declare float @llvm.asinh.f32(float)1228 1229; We can not vectorized asinh since RISCV has no such instruction.1230define <4 x float> @int_asinh_4x(ptr %a) {1231; CHECK-LABEL: define <4 x float> @int_asinh_4x1232; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1233; CHECK-NEXT: entry:1234; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161235; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01236; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.asinh.f32(float [[VECEXT]])1237; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01238; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11239; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.asinh.f32(float [[VECEXT_1]])1240; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11241; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21242; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.asinh.f32(float [[VECEXT_2]])1243; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21244; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31245; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.asinh.f32(float [[VECEXT_3]])1246; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31247; CHECK-NEXT: ret <4 x float> [[VECINS_3]]1248;1249; DEFAULT-LABEL: define <4 x float> @int_asinh_4x1250; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1251; DEFAULT-NEXT: entry:1252; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161253; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01254; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.asinh.f32(float [[VECEXT]])1255; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01256; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11257; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.asinh.f32(float [[VECEXT_1]])1258; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11259; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21260; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.asinh.f32(float [[VECEXT_2]])1261; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21262; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31263; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.asinh.f32(float [[VECEXT_3]])1264; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31265; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]1266;1267entry:1268 %0 = load <4 x float>, ptr %a, align 161269 %vecext = extractelement <4 x float> %0, i32 01270 %1 = tail call fast float @llvm.asinh.f32(float %vecext)1271 %vecins = insertelement <4 x float> poison, float %1, i32 01272 %vecext.1 = extractelement <4 x float> %0, i32 11273 %2 = tail call fast float @llvm.asinh.f32(float %vecext.1)1274 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 11275 %vecext.2 = extractelement <4 x float> %0, i32 21276 %3 = tail call fast float @llvm.asinh.f32(float %vecext.2)1277 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 21278 %vecext.3 = extractelement <4 x float> %0, i32 31279 %4 = tail call fast float @llvm.asinh.f32(float %vecext.3)1280 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 31281 ret <4 x float> %vecins.31282}1283 1284declare float @coshf(float) readonly nounwind willreturn1285 1286; We can not vectorized cosh since RISCV has no such instruction.1287define <4 x float> @cosh_4x(ptr %a) {1288; CHECK-LABEL: define <4 x float> @cosh_4x1289; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1290; CHECK-NEXT: entry:1291; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161292; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01293; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @coshf(float [[VECEXT]])1294; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01295; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11296; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @coshf(float [[VECEXT_1]])1297; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11298; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21299; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @coshf(float [[VECEXT_2]])1300; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21301; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31302; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @coshf(float [[VECEXT_3]])1303; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31304; CHECK-NEXT: ret <4 x float> [[VECINS_3]]1305;1306; DEFAULT-LABEL: define <4 x float> @cosh_4x1307; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1308; DEFAULT-NEXT: entry:1309; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161310; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01311; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @coshf(float [[VECEXT]])1312; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01313; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11314; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @coshf(float [[VECEXT_1]])1315; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11316; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21317; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @coshf(float [[VECEXT_2]])1318; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21319; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31320; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @coshf(float [[VECEXT_3]])1321; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31322; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]1323;1324entry:1325 %0 = load <4 x float>, ptr %a, align 161326 %vecext = extractelement <4 x float> %0, i32 01327 %1 = tail call fast float @coshf(float %vecext)1328 %vecins = insertelement <4 x float> poison, float %1, i32 01329 %vecext.1 = extractelement <4 x float> %0, i32 11330 %2 = tail call fast float @coshf(float %vecext.1)1331 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 11332 %vecext.2 = extractelement <4 x float> %0, i32 21333 %3 = tail call fast float @coshf(float %vecext.2)1334 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 21335 %vecext.3 = extractelement <4 x float> %0, i32 31336 %4 = tail call fast float @coshf(float %vecext.3)1337 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 31338 ret <4 x float> %vecins.31339}1340 1341declare float @llvm.cosh.f32(float)1342 1343; We can not vectorized cosh since RISCV has no such instruction.1344define <4 x float> @int_cosh_4x(ptr %a) {1345; CHECK-LABEL: define <4 x float> @int_cosh_4x1346; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1347; CHECK-NEXT: entry:1348; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161349; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01350; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.cosh.f32(float [[VECEXT]])1351; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01352; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11353; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.cosh.f32(float [[VECEXT_1]])1354; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11355; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21356; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.cosh.f32(float [[VECEXT_2]])1357; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21358; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31359; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.cosh.f32(float [[VECEXT_3]])1360; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31361; CHECK-NEXT: ret <4 x float> [[VECINS_3]]1362;1363; DEFAULT-LABEL: define <4 x float> @int_cosh_4x1364; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1365; DEFAULT-NEXT: entry:1366; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161367; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01368; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.cosh.f32(float [[VECEXT]])1369; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01370; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11371; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.cosh.f32(float [[VECEXT_1]])1372; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11373; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21374; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.cosh.f32(float [[VECEXT_2]])1375; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21376; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31377; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.cosh.f32(float [[VECEXT_3]])1378; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31379; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]1380;1381entry:1382 %0 = load <4 x float>, ptr %a, align 161383 %vecext = extractelement <4 x float> %0, i32 01384 %1 = tail call fast float @llvm.cosh.f32(float %vecext)1385 %vecins = insertelement <4 x float> poison, float %1, i32 01386 %vecext.1 = extractelement <4 x float> %0, i32 11387 %2 = tail call fast float @llvm.cosh.f32(float %vecext.1)1388 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 11389 %vecext.2 = extractelement <4 x float> %0, i32 21390 %3 = tail call fast float @llvm.cosh.f32(float %vecext.2)1391 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 21392 %vecext.3 = extractelement <4 x float> %0, i32 31393 %4 = tail call fast float @llvm.cosh.f32(float %vecext.3)1394 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 31395 ret <4 x float> %vecins.31396}1397 1398declare float @acoshf(float) readonly nounwind willreturn1399 1400; We can not vectorized acosh since RISCV has no such instruction.1401define <4 x float> @acosh_4x(ptr %a) {1402; CHECK-LABEL: define <4 x float> @acosh_4x1403; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1404; CHECK-NEXT: entry:1405; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161406; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01407; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @acoshf(float [[VECEXT]])1408; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01409; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11410; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @acoshf(float [[VECEXT_1]])1411; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11412; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21413; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @acoshf(float [[VECEXT_2]])1414; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21415; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31416; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @acoshf(float [[VECEXT_3]])1417; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31418; CHECK-NEXT: ret <4 x float> [[VECINS_3]]1419;1420; DEFAULT-LABEL: define <4 x float> @acosh_4x1421; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1422; DEFAULT-NEXT: entry:1423; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161424; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01425; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @acoshf(float [[VECEXT]])1426; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01427; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11428; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @acoshf(float [[VECEXT_1]])1429; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11430; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21431; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @acoshf(float [[VECEXT_2]])1432; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21433; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31434; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @acoshf(float [[VECEXT_3]])1435; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31436; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]1437;1438entry:1439 %0 = load <4 x float>, ptr %a, align 161440 %vecext = extractelement <4 x float> %0, i32 01441 %1 = tail call fast float @acoshf(float %vecext)1442 %vecins = insertelement <4 x float> poison, float %1, i32 01443 %vecext.1 = extractelement <4 x float> %0, i32 11444 %2 = tail call fast float @acoshf(float %vecext.1)1445 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 11446 %vecext.2 = extractelement <4 x float> %0, i32 21447 %3 = tail call fast float @acoshf(float %vecext.2)1448 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 21449 %vecext.3 = extractelement <4 x float> %0, i32 31450 %4 = tail call fast float @acoshf(float %vecext.3)1451 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 31452 ret <4 x float> %vecins.31453}1454 1455declare float @llvm.acosh.f32(float)1456 1457; We can not vectorized acosh since RISCV has no such instruction.1458define <4 x float> @int_acosh_4x(ptr %a) {1459; CHECK-LABEL: define <4 x float> @int_acosh_4x1460; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1461; CHECK-NEXT: entry:1462; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161463; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01464; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.acosh.f32(float [[VECEXT]])1465; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01466; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11467; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.acosh.f32(float [[VECEXT_1]])1468; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11469; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21470; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.acosh.f32(float [[VECEXT_2]])1471; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21472; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31473; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.acosh.f32(float [[VECEXT_3]])1474; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31475; CHECK-NEXT: ret <4 x float> [[VECINS_3]]1476;1477; DEFAULT-LABEL: define <4 x float> @int_acosh_4x1478; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1479; DEFAULT-NEXT: entry:1480; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161481; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01482; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.acosh.f32(float [[VECEXT]])1483; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01484; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11485; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.acosh.f32(float [[VECEXT_1]])1486; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11487; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21488; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.acosh.f32(float [[VECEXT_2]])1489; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21490; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31491; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.acosh.f32(float [[VECEXT_3]])1492; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31493; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]1494;1495entry:1496 %0 = load <4 x float>, ptr %a, align 161497 %vecext = extractelement <4 x float> %0, i32 01498 %1 = tail call fast float @llvm.acosh.f32(float %vecext)1499 %vecins = insertelement <4 x float> poison, float %1, i32 01500 %vecext.1 = extractelement <4 x float> %0, i32 11501 %2 = tail call fast float @llvm.acosh.f32(float %vecext.1)1502 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 11503 %vecext.2 = extractelement <4 x float> %0, i32 21504 %3 = tail call fast float @llvm.acosh.f32(float %vecext.2)1505 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 21506 %vecext.3 = extractelement <4 x float> %0, i32 31507 %4 = tail call fast float @llvm.acosh.f32(float %vecext.3)1508 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 31509 ret <4 x float> %vecins.31510}1511 1512declare float @tanhf(float) readonly nounwind willreturn1513 1514; We can not vectorized tanh since RISCV has no such instruction.1515define <4 x float> @tanh_4x(ptr %a) {1516; CHECK-LABEL: define <4 x float> @tanh_4x1517; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1518; CHECK-NEXT: entry:1519; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161520; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01521; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @tanhf(float [[VECEXT]])1522; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01523; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11524; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @tanhf(float [[VECEXT_1]])1525; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11526; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21527; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @tanhf(float [[VECEXT_2]])1528; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21529; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31530; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @tanhf(float [[VECEXT_3]])1531; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31532; CHECK-NEXT: ret <4 x float> [[VECINS_3]]1533;1534; DEFAULT-LABEL: define <4 x float> @tanh_4x1535; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1536; DEFAULT-NEXT: entry:1537; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161538; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01539; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @tanhf(float [[VECEXT]])1540; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01541; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11542; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @tanhf(float [[VECEXT_1]])1543; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11544; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21545; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @tanhf(float [[VECEXT_2]])1546; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21547; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31548; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @tanhf(float [[VECEXT_3]])1549; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31550; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]1551;1552entry:1553 %0 = load <4 x float>, ptr %a, align 161554 %vecext = extractelement <4 x float> %0, i32 01555 %1 = tail call fast float @tanhf(float %vecext)1556 %vecins = insertelement <4 x float> poison, float %1, i32 01557 %vecext.1 = extractelement <4 x float> %0, i32 11558 %2 = tail call fast float @tanhf(float %vecext.1)1559 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 11560 %vecext.2 = extractelement <4 x float> %0, i32 21561 %3 = tail call fast float @tanhf(float %vecext.2)1562 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 21563 %vecext.3 = extractelement <4 x float> %0, i32 31564 %4 = tail call fast float @tanhf(float %vecext.3)1565 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 31566 ret <4 x float> %vecins.31567}1568 1569declare float @llvm.tanh.f32(float)1570 1571; We can not vectorized tanh since RISCV has no such instruction.1572define <4 x float> @int_tanh_4x(ptr %a) {1573; CHECK-LABEL: define <4 x float> @int_tanh_4x1574; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1575; CHECK-NEXT: entry:1576; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161577; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01578; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.tanh.f32(float [[VECEXT]])1579; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01580; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11581; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.tanh.f32(float [[VECEXT_1]])1582; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11583; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21584; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.tanh.f32(float [[VECEXT_2]])1585; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21586; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31587; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.tanh.f32(float [[VECEXT_3]])1588; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31589; CHECK-NEXT: ret <4 x float> [[VECINS_3]]1590;1591; DEFAULT-LABEL: define <4 x float> @int_tanh_4x1592; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1593; DEFAULT-NEXT: entry:1594; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161595; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01596; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.tanh.f32(float [[VECEXT]])1597; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01598; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11599; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.tanh.f32(float [[VECEXT_1]])1600; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11601; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21602; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.tanh.f32(float [[VECEXT_2]])1603; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21604; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31605; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.tanh.f32(float [[VECEXT_3]])1606; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31607; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]1608;1609entry:1610 %0 = load <4 x float>, ptr %a, align 161611 %vecext = extractelement <4 x float> %0, i32 01612 %1 = tail call fast float @llvm.tanh.f32(float %vecext)1613 %vecins = insertelement <4 x float> poison, float %1, i32 01614 %vecext.1 = extractelement <4 x float> %0, i32 11615 %2 = tail call fast float @llvm.tanh.f32(float %vecext.1)1616 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 11617 %vecext.2 = extractelement <4 x float> %0, i32 21618 %3 = tail call fast float @llvm.tanh.f32(float %vecext.2)1619 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 21620 %vecext.3 = extractelement <4 x float> %0, i32 31621 %4 = tail call fast float @llvm.tanh.f32(float %vecext.3)1622 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 31623 ret <4 x float> %vecins.31624}1625 1626declare float @atanhf(float) readonly nounwind willreturn1627 1628; We can not vectorized atanh since RISCV has no such instruction.1629define <4 x float> @atanh_4x(ptr %a) {1630; CHECK-LABEL: define <4 x float> @atanh_4x1631; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1632; CHECK-NEXT: entry:1633; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161634; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01635; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @atanhf(float [[VECEXT]])1636; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01637; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11638; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @atanhf(float [[VECEXT_1]])1639; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11640; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21641; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @atanhf(float [[VECEXT_2]])1642; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21643; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31644; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @atanhf(float [[VECEXT_3]])1645; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31646; CHECK-NEXT: ret <4 x float> [[VECINS_3]]1647;1648; DEFAULT-LABEL: define <4 x float> @atanh_4x1649; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1650; DEFAULT-NEXT: entry:1651; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161652; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01653; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @atanhf(float [[VECEXT]])1654; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01655; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11656; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @atanhf(float [[VECEXT_1]])1657; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11658; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21659; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @atanhf(float [[VECEXT_2]])1660; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21661; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31662; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @atanhf(float [[VECEXT_3]])1663; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31664; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]1665;1666entry:1667 %0 = load <4 x float>, ptr %a, align 161668 %vecext = extractelement <4 x float> %0, i32 01669 %1 = tail call fast float @atanhf(float %vecext)1670 %vecins = insertelement <4 x float> poison, float %1, i32 01671 %vecext.1 = extractelement <4 x float> %0, i32 11672 %2 = tail call fast float @atanhf(float %vecext.1)1673 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 11674 %vecext.2 = extractelement <4 x float> %0, i32 21675 %3 = tail call fast float @atanhf(float %vecext.2)1676 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 21677 %vecext.3 = extractelement <4 x float> %0, i32 31678 %4 = tail call fast float @atanhf(float %vecext.3)1679 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 31680 ret <4 x float> %vecins.31681}1682 1683declare float @llvm.atanh.f32(float)1684 1685; We can not vectorized atanh since RISCV has no such instruction.1686define <4 x float> @int_atanh_4x(ptr %a) {1687; CHECK-LABEL: define <4 x float> @int_atanh_4x1688; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1689; CHECK-NEXT: entry:1690; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161691; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01692; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.atanh.f32(float [[VECEXT]])1693; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01694; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11695; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.atanh.f32(float [[VECEXT_1]])1696; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11697; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21698; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.atanh.f32(float [[VECEXT_2]])1699; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21700; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31701; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.atanh.f32(float [[VECEXT_3]])1702; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31703; CHECK-NEXT: ret <4 x float> [[VECINS_3]]1704;1705; DEFAULT-LABEL: define <4 x float> @int_atanh_4x1706; DEFAULT-SAME: (ptr [[A:%.*]]) #[[ATTR1]] {1707; DEFAULT-NEXT: entry:1708; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A]], align 161709; DEFAULT-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01710; DEFAULT-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.atanh.f32(float [[VECEXT]])1711; DEFAULT-NEXT: [[VECINS:%.*]] = insertelement <4 x float> poison, float [[TMP1]], i32 01712; DEFAULT-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11713; DEFAULT-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.atanh.f32(float [[VECEXT_1]])1714; DEFAULT-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11715; DEFAULT-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21716; DEFAULT-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.atanh.f32(float [[VECEXT_2]])1717; DEFAULT-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21718; DEFAULT-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31719; DEFAULT-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.atanh.f32(float [[VECEXT_3]])1720; DEFAULT-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31721; DEFAULT-NEXT: ret <4 x float> [[VECINS_3]]1722;1723entry:1724 %0 = load <4 x float>, ptr %a, align 161725 %vecext = extractelement <4 x float> %0, i32 01726 %1 = tail call fast float @llvm.atanh.f32(float %vecext)1727 %vecins = insertelement <4 x float> poison, float %1, i32 01728 %vecext.1 = extractelement <4 x float> %0, i32 11729 %2 = tail call fast float @llvm.atanh.f32(float %vecext.1)1730 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 11731 %vecext.2 = extractelement <4 x float> %0, i32 21732 %3 = tail call fast float @llvm.atanh.f32(float %vecext.2)1733 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 21734 %vecext.3 = extractelement <4 x float> %0, i32 31735 %4 = tail call fast float @llvm.atanh.f32(float %vecext.3)1736 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 31737 ret <4 x float> %vecins.31738}1739 1740define void @f(i1 %c, ptr %p, ptr %q, ptr %r) {1741; CHECK-LABEL: define void @f1742; CHECK-SAME: (i1 [[C:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]], ptr [[R:%.*]]) #[[ATTR1]] {1743; CHECK-NEXT: [[X0:%.*]] = load i64, ptr [[P]], align 81744; CHECK-NEXT: [[P1:%.*]] = getelementptr i64, ptr [[P]], i64 11745; CHECK-NEXT: [[X1:%.*]] = load i64, ptr [[P1]], align 81746; CHECK-NEXT: br i1 [[C]], label [[FOO:%.*]], label [[BAR:%.*]]1747; CHECK: foo:1748; CHECK-NEXT: [[Y0:%.*]] = load float, ptr [[R]], align 41749; CHECK-NEXT: [[Y1:%.*]] = call float @fabsf(float [[Y0]])1750; CHECK-NEXT: br label [[BAZ:%.*]]1751; CHECK: bar:1752; CHECK-NEXT: [[Z0:%.*]] = load float, ptr [[R]], align 41753; CHECK-NEXT: [[Z1:%.*]] = call float @fabsf(float [[Z0]])1754; CHECK-NEXT: br label [[BAZ]]1755; CHECK: baz:1756; CHECK-NEXT: store i64 [[X0]], ptr [[Q]], align 81757; CHECK-NEXT: [[Q1:%.*]] = getelementptr i64, ptr [[Q]], i64 11758; CHECK-NEXT: store i64 [[X1]], ptr [[Q1]], align 81759; CHECK-NEXT: ret void1760;1761; DEFAULT-LABEL: define void @f1762; DEFAULT-SAME: (i1 [[C:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]], ptr [[R:%.*]]) #[[ATTR1]] {1763; DEFAULT-NEXT: [[X0:%.*]] = load i64, ptr [[P]], align 81764; DEFAULT-NEXT: [[P1:%.*]] = getelementptr i64, ptr [[P]], i64 11765; DEFAULT-NEXT: [[X1:%.*]] = load i64, ptr [[P1]], align 81766; DEFAULT-NEXT: br i1 [[C]], label [[FOO:%.*]], label [[BAR:%.*]]1767; DEFAULT: foo:1768; DEFAULT-NEXT: [[Y0:%.*]] = load float, ptr [[R]], align 41769; DEFAULT-NEXT: [[Y1:%.*]] = call float @fabsf(float [[Y0]])1770; DEFAULT-NEXT: br label [[BAZ:%.*]]1771; DEFAULT: bar:1772; DEFAULT-NEXT: [[Z0:%.*]] = load float, ptr [[R]], align 41773; DEFAULT-NEXT: [[Z1:%.*]] = call float @fabsf(float [[Z0]])1774; DEFAULT-NEXT: br label [[BAZ]]1775; DEFAULT: baz:1776; DEFAULT-NEXT: store i64 [[X0]], ptr [[Q]], align 81777; DEFAULT-NEXT: [[Q1:%.*]] = getelementptr i64, ptr [[Q]], i64 11778; DEFAULT-NEXT: store i64 [[X1]], ptr [[Q1]], align 81779; DEFAULT-NEXT: ret void1780;1781 %x0 = load i64, ptr %p1782 %p1 = getelementptr i64, ptr %p, i64 11783 %x1 = load i64, ptr %p11784 br i1 %c, label %foo, label %bar1785foo:1786 %y0 = load float, ptr %r1787 %y1 = call float @fabsf(float %y0)1788 br label %baz1789bar:1790 %z0 = load float, ptr %r1791 %z1 = call float @fabsf(float %z0)1792 br label %baz1793baz:1794 store i64 %x0, ptr %q1795 %q1 = getelementptr i64, ptr %q, i64 11796 store i64 %x1, ptr %q11797 1798 ret void1799}1800