brintos

brintos / llvm-project-archived public Read only

0
0
Text · 103.4 KiB · fc71643 Raw
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