brintos

brintos / llvm-project-archived public Read only

0
0
Text · 119.2 KiB · 6cd7ec1 Raw
1442 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --check-attributes --version 22// REQUIRES: x86-registered-target3// RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-feature +avx -fenable-matrix -menable-no-infs -menable-no-nans -emit-llvm -o - %s | FileCheck -check-prefixes=CFINITEONLY %s4// RUN: %clang_cc1 -x cl -triple x86_64-unknown-unknown -target-feature +avx -fenable-matrix -menable-no-nans -menable-no-infs -emit-llvm -o - %s | FileCheck -check-prefixes=CLFINITEONLY %s5 6// RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-feature +avx -fenable-matrix -menable-no-nans -emit-llvm -o - %s | FileCheck -check-prefixes=NONANS %s7// RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-feature +avx -fenable-matrix -menable-no-infs -emit-llvm -o - %s | FileCheck -check-prefixes=NOINFS %s8 9// XUN: %clang_cc1 -triple x86_64-unknown-unknown -target-feature +avx -fenable-matrix -fsignaling-nans -emit-llvm -o - %s | FileCheck -check-prefixes=SNANS %s10// XUN: %clang_cc1 -triple x86_64-unknown-unknown -target-feature +avx -fenable-matrix -fno-signaling-nans -emit-llvm -o - %s | FileCheck -check-prefixes=NO-SNANS %s11 12#ifdef __OPENCL_C_VERSION__13#pragma OPENCL EXTENSION __cl_clang_variadic_functions : enable14#endif15 16typedef float float1 __attribute__((ext_vector_type(1)));17typedef float float2 __attribute__((ext_vector_type(2)));18typedef _Float16 half2 __attribute__((ext_vector_type(2)));19typedef double double2 __attribute__((ext_vector_type(2)));20typedef double dx5x5_t __attribute__((matrix_type(5, 5)));21 22extern float extern_func(float, double, _Float16);23extern float2 extern_func_vec(float2, double2, half2);24extern _Complex float extern_complex(_Complex float, _Complex double, _Complex _Float16);25extern float variadic(float, ...);26extern dx5x5_t extern_matrix(dx5x5_t);27 28 29// CFINITEONLY: Function Attrs: noinline nounwind optnone30// CFINITEONLY-LABEL: define dso_local nofpclass(nan inf) float @defined_func_f3231// CFINITEONLY-SAME: (float noundef nofpclass(nan inf) [[A:%.*]], float noundef nofpclass(nan inf) [[B:%.*]], float noundef nofpclass(nan inf) [[C:%.*]]) #[[ATTR0:[0-9]+]] {32// CFINITEONLY-NEXT:  entry:33// CFINITEONLY-NEXT:    [[A_ADDR:%.*]] = alloca float, align 434// CFINITEONLY-NEXT:    [[B_ADDR:%.*]] = alloca float, align 435// CFINITEONLY-NEXT:    [[C_ADDR:%.*]] = alloca float, align 436// CFINITEONLY-NEXT:    store float [[A]], ptr [[A_ADDR]], align 437// CFINITEONLY-NEXT:    store float [[B]], ptr [[B_ADDR]], align 438// CFINITEONLY-NEXT:    store float [[C]], ptr [[C_ADDR]], align 439// CFINITEONLY-NEXT:    [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 440// CFINITEONLY-NEXT:    [[TMP1:%.*]] = load float, ptr [[B_ADDR]], align 441// CFINITEONLY-NEXT:    [[TMP2:%.*]] = load float, ptr [[C_ADDR]], align 442// CFINITEONLY-NEXT:    [[TMP3:%.*]] = call nnan ninf float @llvm.fma.f32(float [[TMP0]], float [[TMP1]], float [[TMP2]])43// CFINITEONLY-NEXT:    [[ADD:%.*]] = fadd nnan ninf float [[TMP3]], 4.000000e+0044// CFINITEONLY-NEXT:    ret float [[ADD]]45//46// CLFINITEONLY: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)47// CLFINITEONLY-LABEL: define dso_local nofpclass(nan inf) float @defined_func_f3248// CLFINITEONLY-SAME: (float noundef nofpclass(nan inf) [[A:%.*]], float noundef nofpclass(nan inf) [[B:%.*]], float noundef nofpclass(nan inf) [[C:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {49// CLFINITEONLY-NEXT:  entry:50// CLFINITEONLY-NEXT:    [[TMP0:%.*]] = tail call nnan ninf float @llvm.fma.f32(float [[A]], float [[B]], float [[C]])51// CLFINITEONLY-NEXT:    [[ADD:%.*]] = fadd nnan ninf float [[TMP0]], 4.000000e+0052// CLFINITEONLY-NEXT:    ret float [[ADD]]53//54// NONANS: Function Attrs: noinline nounwind optnone55// NONANS-LABEL: define dso_local nofpclass(nan) float @defined_func_f3256// NONANS-SAME: (float noundef nofpclass(nan) [[A:%.*]], float noundef nofpclass(nan) [[B:%.*]], float noundef nofpclass(nan) [[C:%.*]]) #[[ATTR0:[0-9]+]] {57// NONANS-NEXT:  entry:58// NONANS-NEXT:    [[A_ADDR:%.*]] = alloca float, align 459// NONANS-NEXT:    [[B_ADDR:%.*]] = alloca float, align 460// NONANS-NEXT:    [[C_ADDR:%.*]] = alloca float, align 461// NONANS-NEXT:    store float [[A]], ptr [[A_ADDR]], align 462// NONANS-NEXT:    store float [[B]], ptr [[B_ADDR]], align 463// NONANS-NEXT:    store float [[C]], ptr [[C_ADDR]], align 464// NONANS-NEXT:    [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 465// NONANS-NEXT:    [[TMP1:%.*]] = load float, ptr [[B_ADDR]], align 466// NONANS-NEXT:    [[TMP2:%.*]] = load float, ptr [[C_ADDR]], align 467// NONANS-NEXT:    [[TMP3:%.*]] = call nnan float @llvm.fma.f32(float [[TMP0]], float [[TMP1]], float [[TMP2]])68// NONANS-NEXT:    [[ADD:%.*]] = fadd nnan float [[TMP3]], 4.000000e+0069// NONANS-NEXT:    ret float [[ADD]]70//71// NOINFS: Function Attrs: noinline nounwind optnone72// NOINFS-LABEL: define dso_local nofpclass(inf) float @defined_func_f3273// NOINFS-SAME: (float noundef nofpclass(inf) [[A:%.*]], float noundef nofpclass(inf) [[B:%.*]], float noundef nofpclass(inf) [[C:%.*]]) #[[ATTR0:[0-9]+]] {74// NOINFS-NEXT:  entry:75// NOINFS-NEXT:    [[A_ADDR:%.*]] = alloca float, align 476// NOINFS-NEXT:    [[B_ADDR:%.*]] = alloca float, align 477// NOINFS-NEXT:    [[C_ADDR:%.*]] = alloca float, align 478// NOINFS-NEXT:    store float [[A]], ptr [[A_ADDR]], align 479// NOINFS-NEXT:    store float [[B]], ptr [[B_ADDR]], align 480// NOINFS-NEXT:    store float [[C]], ptr [[C_ADDR]], align 481// NOINFS-NEXT:    [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 482// NOINFS-NEXT:    [[TMP1:%.*]] = load float, ptr [[B_ADDR]], align 483// NOINFS-NEXT:    [[TMP2:%.*]] = load float, ptr [[C_ADDR]], align 484// NOINFS-NEXT:    [[TMP3:%.*]] = call ninf float @llvm.fma.f32(float [[TMP0]], float [[TMP1]], float [[TMP2]])85// NOINFS-NEXT:    [[ADD:%.*]] = fadd ninf float [[TMP3]], 4.000000e+0086// NOINFS-NEXT:    ret float [[ADD]]87//88float defined_func_f32(float a, float b, float c) {89  return __builtin_fmaf(a, b, c) + 4.0f;90}91 92// CFINITEONLY: Function Attrs: noinline nounwind optnone93// CFINITEONLY-LABEL: define dso_local nofpclass(nan inf) <2 x double> @defined_func_v2f6494// CFINITEONLY-SAME: (<2 x double> noundef nofpclass(nan inf) [[A:%.*]], <2 x double> noundef nofpclass(nan inf) [[B:%.*]], <2 x double> noundef nofpclass(nan inf) [[C:%.*]]) #[[ATTR2:[0-9]+]] {95// CFINITEONLY-NEXT:  entry:96// CFINITEONLY-NEXT:    [[A_ADDR:%.*]] = alloca <2 x double>, align 1697// CFINITEONLY-NEXT:    [[B_ADDR:%.*]] = alloca <2 x double>, align 1698// CFINITEONLY-NEXT:    [[C_ADDR:%.*]] = alloca <2 x double>, align 1699// CFINITEONLY-NEXT:    store <2 x double> [[A]], ptr [[A_ADDR]], align 16100// CFINITEONLY-NEXT:    store <2 x double> [[B]], ptr [[B_ADDR]], align 16101// CFINITEONLY-NEXT:    store <2 x double> [[C]], ptr [[C_ADDR]], align 16102// CFINITEONLY-NEXT:    [[TMP0:%.*]] = load <2 x double>, ptr [[A_ADDR]], align 16103// CFINITEONLY-NEXT:    [[TMP1:%.*]] = load <2 x double>, ptr [[B_ADDR]], align 16104// CFINITEONLY-NEXT:    [[TMP2:%.*]] = load <2 x double>, ptr [[C_ADDR]], align 16105// CFINITEONLY-NEXT:    [[TMP3:%.*]] = call nnan ninf <2 x double> @llvm.fma.v2f64(<2 x double> [[TMP0]], <2 x double> [[TMP1]], <2 x double> [[TMP2]])106// CFINITEONLY-NEXT:    [[ADD:%.*]] = fadd nnan ninf <2 x double> [[TMP3]], splat (double 4.000000e+00)107// CFINITEONLY-NEXT:    ret <2 x double> [[ADD]]108//109// CLFINITEONLY: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)110// CLFINITEONLY-LABEL: define dso_local nofpclass(nan inf) <2 x double> @defined_func_v2f64111// CLFINITEONLY-SAME: (<2 x double> noundef nofpclass(nan inf) [[A:%.*]], <2 x double> noundef nofpclass(nan inf) [[B:%.*]], <2 x double> noundef nofpclass(nan inf) [[C:%.*]]) local_unnamed_addr #[[ATTR2:[0-9]+]] {112// CLFINITEONLY-NEXT:  entry:113// CLFINITEONLY-NEXT:    [[TMP0:%.*]] = tail call nnan ninf <2 x double> @llvm.fma.v2f64(<2 x double> [[A]], <2 x double> [[B]], <2 x double> [[C]])114// CLFINITEONLY-NEXT:    [[ADD:%.*]] = fadd nnan ninf <2 x double> [[TMP0]], splat (double 4.000000e+00)115// CLFINITEONLY-NEXT:    ret <2 x double> [[ADD]]116//117// NONANS: Function Attrs: noinline nounwind optnone118// NONANS-LABEL: define dso_local nofpclass(nan) <2 x double> @defined_func_v2f64119// NONANS-SAME: (<2 x double> noundef nofpclass(nan) [[A:%.*]], <2 x double> noundef nofpclass(nan) [[B:%.*]], <2 x double> noundef nofpclass(nan) [[C:%.*]]) #[[ATTR2:[0-9]+]] {120// NONANS-NEXT:  entry:121// NONANS-NEXT:    [[A_ADDR:%.*]] = alloca <2 x double>, align 16122// NONANS-NEXT:    [[B_ADDR:%.*]] = alloca <2 x double>, align 16123// NONANS-NEXT:    [[C_ADDR:%.*]] = alloca <2 x double>, align 16124// NONANS-NEXT:    store <2 x double> [[A]], ptr [[A_ADDR]], align 16125// NONANS-NEXT:    store <2 x double> [[B]], ptr [[B_ADDR]], align 16126// NONANS-NEXT:    store <2 x double> [[C]], ptr [[C_ADDR]], align 16127// NONANS-NEXT:    [[TMP0:%.*]] = load <2 x double>, ptr [[A_ADDR]], align 16128// NONANS-NEXT:    [[TMP1:%.*]] = load <2 x double>, ptr [[B_ADDR]], align 16129// NONANS-NEXT:    [[TMP2:%.*]] = load <2 x double>, ptr [[C_ADDR]], align 16130// NONANS-NEXT:    [[TMP3:%.*]] = call nnan <2 x double> @llvm.fma.v2f64(<2 x double> [[TMP0]], <2 x double> [[TMP1]], <2 x double> [[TMP2]])131// NONANS-NEXT:    [[ADD:%.*]] = fadd nnan <2 x double> [[TMP3]], splat (double 4.000000e+00)132// NONANS-NEXT:    ret <2 x double> [[ADD]]133//134// NOINFS: Function Attrs: noinline nounwind optnone135// NOINFS-LABEL: define dso_local nofpclass(inf) <2 x double> @defined_func_v2f64136// NOINFS-SAME: (<2 x double> noundef nofpclass(inf) [[A:%.*]], <2 x double> noundef nofpclass(inf) [[B:%.*]], <2 x double> noundef nofpclass(inf) [[C:%.*]]) #[[ATTR2:[0-9]+]] {137// NOINFS-NEXT:  entry:138// NOINFS-NEXT:    [[A_ADDR:%.*]] = alloca <2 x double>, align 16139// NOINFS-NEXT:    [[B_ADDR:%.*]] = alloca <2 x double>, align 16140// NOINFS-NEXT:    [[C_ADDR:%.*]] = alloca <2 x double>, align 16141// NOINFS-NEXT:    store <2 x double> [[A]], ptr [[A_ADDR]], align 16142// NOINFS-NEXT:    store <2 x double> [[B]], ptr [[B_ADDR]], align 16143// NOINFS-NEXT:    store <2 x double> [[C]], ptr [[C_ADDR]], align 16144// NOINFS-NEXT:    [[TMP0:%.*]] = load <2 x double>, ptr [[A_ADDR]], align 16145// NOINFS-NEXT:    [[TMP1:%.*]] = load <2 x double>, ptr [[B_ADDR]], align 16146// NOINFS-NEXT:    [[TMP2:%.*]] = load <2 x double>, ptr [[C_ADDR]], align 16147// NOINFS-NEXT:    [[TMP3:%.*]] = call ninf <2 x double> @llvm.fma.v2f64(<2 x double> [[TMP0]], <2 x double> [[TMP1]], <2 x double> [[TMP2]])148// NOINFS-NEXT:    [[ADD:%.*]] = fadd ninf <2 x double> [[TMP3]], splat (double 4.000000e+00)149// NOINFS-NEXT:    ret <2 x double> [[ADD]]150//151double2 defined_func_v2f64(double2 a, double2 b, double2 c) {152  return __builtin_elementwise_fma(a, b, c) + 4.0;153}154 155// CFINITEONLY: Function Attrs: noinline nounwind optnone156// CFINITEONLY-LABEL: define dso_local nofpclass(nan inf) float @call_extern_func157// CFINITEONLY-SAME: (float noundef nofpclass(nan inf) [[A:%.*]], double noundef nofpclass(nan inf) [[B:%.*]], half noundef nofpclass(nan inf) [[C:%.*]]) #[[ATTR0]] {158// CFINITEONLY-NEXT:  entry:159// CFINITEONLY-NEXT:    [[A_ADDR:%.*]] = alloca float, align 4160// CFINITEONLY-NEXT:    [[B_ADDR:%.*]] = alloca double, align 8161// CFINITEONLY-NEXT:    [[C_ADDR:%.*]] = alloca half, align 2162// CFINITEONLY-NEXT:    store float [[A]], ptr [[A_ADDR]], align 4163// CFINITEONLY-NEXT:    store double [[B]], ptr [[B_ADDR]], align 8164// CFINITEONLY-NEXT:    store half [[C]], ptr [[C_ADDR]], align 2165// CFINITEONLY-NEXT:    [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 4166// CFINITEONLY-NEXT:    [[TMP1:%.*]] = load double, ptr [[B_ADDR]], align 8167// CFINITEONLY-NEXT:    [[TMP2:%.*]] = load half, ptr [[C_ADDR]], align 2168// CFINITEONLY-NEXT:    [[CALL:%.*]] = call nnan ninf nofpclass(nan inf) float @extern_func(float noundef nofpclass(nan inf) [[TMP0]], double noundef nofpclass(nan inf) [[TMP1]], half noundef nofpclass(nan inf) [[TMP2]])169// CFINITEONLY-NEXT:    ret float [[CALL]]170//171// CLFINITEONLY: Function Attrs: convergent norecurse nounwind172// CLFINITEONLY-LABEL: define dso_local nofpclass(nan inf) float @call_extern_func173// CLFINITEONLY-SAME: (float noundef nofpclass(nan inf) [[A:%.*]], double noundef nofpclass(nan inf) [[B:%.*]], half noundef nofpclass(nan inf) [[C:%.*]]) local_unnamed_addr #[[ATTR3:[0-9]+]] {174// CLFINITEONLY-NEXT:  entry:175// CLFINITEONLY-NEXT:    [[CALL:%.*]] = tail call nnan ninf nofpclass(nan inf) float @extern_func(float noundef nofpclass(nan inf) [[A]], double noundef nofpclass(nan inf) [[B]], half noundef nofpclass(nan inf) [[C]]) #[[ATTR11:[0-9]+]]176// CLFINITEONLY-NEXT:    ret float [[CALL]]177//178// NONANS: Function Attrs: noinline nounwind optnone179// NONANS-LABEL: define dso_local nofpclass(nan) float @call_extern_func180// NONANS-SAME: (float noundef nofpclass(nan) [[A:%.*]], double noundef nofpclass(nan) [[B:%.*]], half noundef nofpclass(nan) [[C:%.*]]) #[[ATTR0]] {181// NONANS-NEXT:  entry:182// NONANS-NEXT:    [[A_ADDR:%.*]] = alloca float, align 4183// NONANS-NEXT:    [[B_ADDR:%.*]] = alloca double, align 8184// NONANS-NEXT:    [[C_ADDR:%.*]] = alloca half, align 2185// NONANS-NEXT:    store float [[A]], ptr [[A_ADDR]], align 4186// NONANS-NEXT:    store double [[B]], ptr [[B_ADDR]], align 8187// NONANS-NEXT:    store half [[C]], ptr [[C_ADDR]], align 2188// NONANS-NEXT:    [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 4189// NONANS-NEXT:    [[TMP1:%.*]] = load double, ptr [[B_ADDR]], align 8190// NONANS-NEXT:    [[TMP2:%.*]] = load half, ptr [[C_ADDR]], align 2191// NONANS-NEXT:    [[CALL:%.*]] = call nnan nofpclass(nan) float @extern_func(float noundef nofpclass(nan) [[TMP0]], double noundef nofpclass(nan) [[TMP1]], half noundef nofpclass(nan) [[TMP2]])192// NONANS-NEXT:    ret float [[CALL]]193//194// NOINFS: Function Attrs: noinline nounwind optnone195// NOINFS-LABEL: define dso_local nofpclass(inf) float @call_extern_func196// NOINFS-SAME: (float noundef nofpclass(inf) [[A:%.*]], double noundef nofpclass(inf) [[B:%.*]], half noundef nofpclass(inf) [[C:%.*]]) #[[ATTR0]] {197// NOINFS-NEXT:  entry:198// NOINFS-NEXT:    [[A_ADDR:%.*]] = alloca float, align 4199// NOINFS-NEXT:    [[B_ADDR:%.*]] = alloca double, align 8200// NOINFS-NEXT:    [[C_ADDR:%.*]] = alloca half, align 2201// NOINFS-NEXT:    store float [[A]], ptr [[A_ADDR]], align 4202// NOINFS-NEXT:    store double [[B]], ptr [[B_ADDR]], align 8203// NOINFS-NEXT:    store half [[C]], ptr [[C_ADDR]], align 2204// NOINFS-NEXT:    [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 4205// NOINFS-NEXT:    [[TMP1:%.*]] = load double, ptr [[B_ADDR]], align 8206// NOINFS-NEXT:    [[TMP2:%.*]] = load half, ptr [[C_ADDR]], align 2207// NOINFS-NEXT:    [[CALL:%.*]] = call ninf nofpclass(inf) float @extern_func(float noundef nofpclass(inf) [[TMP0]], double noundef nofpclass(inf) [[TMP1]], half noundef nofpclass(inf) [[TMP2]])208// NOINFS-NEXT:    ret float [[CALL]]209//210float call_extern_func(float a, double b, _Float16 c) {211  return extern_func(a, b, c);212}213 214// CFINITEONLY: Function Attrs: noinline nounwind optnone215// CFINITEONLY-LABEL: define dso_local nofpclass(nan inf) double @call_extern_func_vec216// CFINITEONLY-SAME: (double noundef nofpclass(nan inf) [[A_COERCE:%.*]], <2 x double> noundef nofpclass(nan inf) [[B:%.*]], i32 noundef [[C_COERCE:%.*]]) #[[ATTR2]] {217// CFINITEONLY-NEXT:  entry:218// CFINITEONLY-NEXT:    [[RETVAL:%.*]] = alloca <2 x float>, align 8219// CFINITEONLY-NEXT:    [[A:%.*]] = alloca <2 x float>, align 8220// CFINITEONLY-NEXT:    [[C:%.*]] = alloca <2 x half>, align 4221// CFINITEONLY-NEXT:    [[A_ADDR:%.*]] = alloca <2 x float>, align 8222// CFINITEONLY-NEXT:    [[B_ADDR:%.*]] = alloca <2 x double>, align 16223// CFINITEONLY-NEXT:    [[C_ADDR:%.*]] = alloca <2 x half>, align 4224// CFINITEONLY-NEXT:    [[COERCE:%.*]] = alloca <2 x float>, align 8225// CFINITEONLY-NEXT:    [[COERCE3:%.*]] = alloca <2 x half>, align 4226// CFINITEONLY-NEXT:    [[COERCE4:%.*]] = alloca <2 x float>, align 8227// CFINITEONLY-NEXT:    store double [[A_COERCE]], ptr [[A]], align 8228// CFINITEONLY-NEXT:    [[A1:%.*]] = load <2 x float>, ptr [[A]], align 8229// CFINITEONLY-NEXT:    store i32 [[C_COERCE]], ptr [[C]], align 4230// CFINITEONLY-NEXT:    [[C2:%.*]] = load <2 x half>, ptr [[C]], align 4231// CFINITEONLY-NEXT:    store <2 x float> [[A1]], ptr [[A_ADDR]], align 8232// CFINITEONLY-NEXT:    store <2 x double> [[B]], ptr [[B_ADDR]], align 16233// CFINITEONLY-NEXT:    store <2 x half> [[C2]], ptr [[C_ADDR]], align 4234// CFINITEONLY-NEXT:    [[TMP0:%.*]] = load <2 x float>, ptr [[A_ADDR]], align 8235// CFINITEONLY-NEXT:    [[TMP1:%.*]] = load <2 x double>, ptr [[B_ADDR]], align 16236// CFINITEONLY-NEXT:    [[TMP2:%.*]] = load <2 x half>, ptr [[C_ADDR]], align 4237// CFINITEONLY-NEXT:    store <2 x float> [[TMP0]], ptr [[COERCE]], align 8238// CFINITEONLY-NEXT:    [[TMP3:%.*]] = load double, ptr [[COERCE]], align 8239// CFINITEONLY-NEXT:    store <2 x half> [[TMP2]], ptr [[COERCE3]], align 4240// CFINITEONLY-NEXT:    [[TMP4:%.*]] = load i32, ptr [[COERCE3]], align 4241// CFINITEONLY-NEXT:    [[CALL:%.*]] = call nnan ninf nofpclass(nan inf) double @extern_func_vec(double noundef nofpclass(nan inf) [[TMP3]], <2 x double> noundef nofpclass(nan inf) [[TMP1]], i32 noundef [[TMP4]])242// CFINITEONLY-NEXT:    store double [[CALL]], ptr [[COERCE4]], align 8243// CFINITEONLY-NEXT:    [[TMP5:%.*]] = load <2 x float>, ptr [[COERCE4]], align 8244// CFINITEONLY-NEXT:    store <2 x float> [[TMP5]], ptr [[RETVAL]], align 8245// CFINITEONLY-NEXT:    [[TMP6:%.*]] = load double, ptr [[RETVAL]], align 8246// CFINITEONLY-NEXT:    ret double [[TMP6]]247//248// CLFINITEONLY: Function Attrs: convergent norecurse nounwind249// CLFINITEONLY-LABEL: define dso_local nofpclass(nan inf) double @call_extern_func_vec250// CLFINITEONLY-SAME: (double noundef nofpclass(nan inf) [[A_COERCE:%.*]], <2 x double> noundef nofpclass(nan inf) [[B:%.*]], i32 noundef [[C_COERCE:%.*]]) local_unnamed_addr #[[ATTR5:[0-9]+]] {251// CLFINITEONLY-NEXT:  entry:252// CLFINITEONLY-NEXT:    [[CALL:%.*]] = tail call nnan ninf nofpclass(nan inf) double @extern_func_vec(double noundef nofpclass(nan inf) [[A_COERCE]], <2 x double> noundef nofpclass(nan inf) [[B]], i32 noundef [[C_COERCE]]) #[[ATTR11]]253// CLFINITEONLY-NEXT:    ret double [[CALL]]254//255// NONANS: Function Attrs: noinline nounwind optnone256// NONANS-LABEL: define dso_local nofpclass(nan) double @call_extern_func_vec257// NONANS-SAME: (double noundef nofpclass(nan) [[A_COERCE:%.*]], <2 x double> noundef nofpclass(nan) [[B:%.*]], i32 noundef [[C_COERCE:%.*]]) #[[ATTR2]] {258// NONANS-NEXT:  entry:259// NONANS-NEXT:    [[RETVAL:%.*]] = alloca <2 x float>, align 8260// NONANS-NEXT:    [[A:%.*]] = alloca <2 x float>, align 8261// NONANS-NEXT:    [[C:%.*]] = alloca <2 x half>, align 4262// NONANS-NEXT:    [[A_ADDR:%.*]] = alloca <2 x float>, align 8263// NONANS-NEXT:    [[B_ADDR:%.*]] = alloca <2 x double>, align 16264// NONANS-NEXT:    [[C_ADDR:%.*]] = alloca <2 x half>, align 4265// NONANS-NEXT:    [[COERCE:%.*]] = alloca <2 x float>, align 8266// NONANS-NEXT:    [[COERCE3:%.*]] = alloca <2 x half>, align 4267// NONANS-NEXT:    [[COERCE4:%.*]] = alloca <2 x float>, align 8268// NONANS-NEXT:    store double [[A_COERCE]], ptr [[A]], align 8269// NONANS-NEXT:    [[A1:%.*]] = load <2 x float>, ptr [[A]], align 8270// NONANS-NEXT:    store i32 [[C_COERCE]], ptr [[C]], align 4271// NONANS-NEXT:    [[C2:%.*]] = load <2 x half>, ptr [[C]], align 4272// NONANS-NEXT:    store <2 x float> [[A1]], ptr [[A_ADDR]], align 8273// NONANS-NEXT:    store <2 x double> [[B]], ptr [[B_ADDR]], align 16274// NONANS-NEXT:    store <2 x half> [[C2]], ptr [[C_ADDR]], align 4275// NONANS-NEXT:    [[TMP0:%.*]] = load <2 x float>, ptr [[A_ADDR]], align 8276// NONANS-NEXT:    [[TMP1:%.*]] = load <2 x double>, ptr [[B_ADDR]], align 16277// NONANS-NEXT:    [[TMP2:%.*]] = load <2 x half>, ptr [[C_ADDR]], align 4278// NONANS-NEXT:    store <2 x float> [[TMP0]], ptr [[COERCE]], align 8279// NONANS-NEXT:    [[TMP3:%.*]] = load double, ptr [[COERCE]], align 8280// NONANS-NEXT:    store <2 x half> [[TMP2]], ptr [[COERCE3]], align 4281// NONANS-NEXT:    [[TMP4:%.*]] = load i32, ptr [[COERCE3]], align 4282// NONANS-NEXT:    [[CALL:%.*]] = call nnan nofpclass(nan) double @extern_func_vec(double noundef nofpclass(nan) [[TMP3]], <2 x double> noundef nofpclass(nan) [[TMP1]], i32 noundef [[TMP4]])283// NONANS-NEXT:    store double [[CALL]], ptr [[COERCE4]], align 8284// NONANS-NEXT:    [[TMP5:%.*]] = load <2 x float>, ptr [[COERCE4]], align 8285// NONANS-NEXT:    store <2 x float> [[TMP5]], ptr [[RETVAL]], align 8286// NONANS-NEXT:    [[TMP6:%.*]] = load double, ptr [[RETVAL]], align 8287// NONANS-NEXT:    ret double [[TMP6]]288//289// NOINFS: Function Attrs: noinline nounwind optnone290// NOINFS-LABEL: define dso_local nofpclass(inf) double @call_extern_func_vec291// NOINFS-SAME: (double noundef nofpclass(inf) [[A_COERCE:%.*]], <2 x double> noundef nofpclass(inf) [[B:%.*]], i32 noundef [[C_COERCE:%.*]]) #[[ATTR2]] {292// NOINFS-NEXT:  entry:293// NOINFS-NEXT:    [[RETVAL:%.*]] = alloca <2 x float>, align 8294// NOINFS-NEXT:    [[A:%.*]] = alloca <2 x float>, align 8295// NOINFS-NEXT:    [[C:%.*]] = alloca <2 x half>, align 4296// NOINFS-NEXT:    [[A_ADDR:%.*]] = alloca <2 x float>, align 8297// NOINFS-NEXT:    [[B_ADDR:%.*]] = alloca <2 x double>, align 16298// NOINFS-NEXT:    [[C_ADDR:%.*]] = alloca <2 x half>, align 4299// NOINFS-NEXT:    [[COERCE:%.*]] = alloca <2 x float>, align 8300// NOINFS-NEXT:    [[COERCE3:%.*]] = alloca <2 x half>, align 4301// NOINFS-NEXT:    [[COERCE4:%.*]] = alloca <2 x float>, align 8302// NOINFS-NEXT:    store double [[A_COERCE]], ptr [[A]], align 8303// NOINFS-NEXT:    [[A1:%.*]] = load <2 x float>, ptr [[A]], align 8304// NOINFS-NEXT:    store i32 [[C_COERCE]], ptr [[C]], align 4305// NOINFS-NEXT:    [[C2:%.*]] = load <2 x half>, ptr [[C]], align 4306// NOINFS-NEXT:    store <2 x float> [[A1]], ptr [[A_ADDR]], align 8307// NOINFS-NEXT:    store <2 x double> [[B]], ptr [[B_ADDR]], align 16308// NOINFS-NEXT:    store <2 x half> [[C2]], ptr [[C_ADDR]], align 4309// NOINFS-NEXT:    [[TMP0:%.*]] = load <2 x float>, ptr [[A_ADDR]], align 8310// NOINFS-NEXT:    [[TMP1:%.*]] = load <2 x double>, ptr [[B_ADDR]], align 16311// NOINFS-NEXT:    [[TMP2:%.*]] = load <2 x half>, ptr [[C_ADDR]], align 4312// NOINFS-NEXT:    store <2 x float> [[TMP0]], ptr [[COERCE]], align 8313// NOINFS-NEXT:    [[TMP3:%.*]] = load double, ptr [[COERCE]], align 8314// NOINFS-NEXT:    store <2 x half> [[TMP2]], ptr [[COERCE3]], align 4315// NOINFS-NEXT:    [[TMP4:%.*]] = load i32, ptr [[COERCE3]], align 4316// NOINFS-NEXT:    [[CALL:%.*]] = call ninf nofpclass(inf) double @extern_func_vec(double noundef nofpclass(inf) [[TMP3]], <2 x double> noundef nofpclass(inf) [[TMP1]], i32 noundef [[TMP4]])317// NOINFS-NEXT:    store double [[CALL]], ptr [[COERCE4]], align 8318// NOINFS-NEXT:    [[TMP5:%.*]] = load <2 x float>, ptr [[COERCE4]], align 8319// NOINFS-NEXT:    store <2 x float> [[TMP5]], ptr [[RETVAL]], align 8320// NOINFS-NEXT:    [[TMP6:%.*]] = load double, ptr [[RETVAL]], align 8321// NOINFS-NEXT:    ret double [[TMP6]]322//323float2 call_extern_func_vec(float2 a, double2 b, half2 c) {324  return extern_func_vec(a, b, c);325}326 327// CFINITEONLY: Function Attrs: noinline nounwind optnone328// CFINITEONLY-LABEL: define dso_local nofpclass(nan inf) <2 x float> @defined_complex_func329// CFINITEONLY-SAME: (<2 x float> noundef nofpclass(nan inf) [[A_COERCE:%.*]], double noundef nofpclass(nan inf) [[B_COERCE0:%.*]], double noundef nofpclass(nan inf) [[B_COERCE1:%.*]], <2 x half> noundef nofpclass(nan inf) [[C_COERCE:%.*]]) #[[ATTR4:[0-9]+]] {330// CFINITEONLY-NEXT:  entry:331// CFINITEONLY-NEXT:    [[RETVAL:%.*]] = alloca { float, float }, align 4332// CFINITEONLY-NEXT:    [[A:%.*]] = alloca { float, float }, align 4333// CFINITEONLY-NEXT:    [[B:%.*]] = alloca { double, double }, align 8334// CFINITEONLY-NEXT:    [[C:%.*]] = alloca { half, half }, align 2335// CFINITEONLY-NEXT:    [[COERCE:%.*]] = alloca { float, float }, align 4336// CFINITEONLY-NEXT:    [[COERCE1:%.*]] = alloca { double, double }, align 8337// CFINITEONLY-NEXT:    [[COERCE2:%.*]] = alloca { half, half }, align 2338// CFINITEONLY-NEXT:    [[COERCE3:%.*]] = alloca { float, float }, align 4339// CFINITEONLY-NEXT:    store <2 x float> [[A_COERCE]], ptr [[A]], align 4340// CFINITEONLY-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i32 0, i32 0341// CFINITEONLY-NEXT:    store double [[B_COERCE0]], ptr [[TMP0]], align 8342// CFINITEONLY-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i32 0, i32 1343// CFINITEONLY-NEXT:    store double [[B_COERCE1]], ptr [[TMP1]], align 8344// CFINITEONLY-NEXT:    store <2 x half> [[C_COERCE]], ptr [[C]], align 2345// CFINITEONLY-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[A]], i32 0, i32 0346// CFINITEONLY-NEXT:    [[A_REAL:%.*]] = load float, ptr [[A_REALP]], align 4347// CFINITEONLY-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[A]], i32 0, i32 1348// CFINITEONLY-NEXT:    [[A_IMAG:%.*]] = load float, ptr [[A_IMAGP]], align 4349// CFINITEONLY-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i32 0, i32 0350// CFINITEONLY-NEXT:    [[B_REAL:%.*]] = load double, ptr [[B_REALP]], align 8351// CFINITEONLY-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i32 0, i32 1352// CFINITEONLY-NEXT:    [[B_IMAG:%.*]] = load double, ptr [[B_IMAGP]], align 8353// CFINITEONLY-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 0354// CFINITEONLY-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 2355// CFINITEONLY-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 1356// CFINITEONLY-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 2357// CFINITEONLY-NEXT:    [[COERCE_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE]], i32 0, i32 0358// CFINITEONLY-NEXT:    [[COERCE_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE]], i32 0, i32 1359// CFINITEONLY-NEXT:    store float [[A_REAL]], ptr [[COERCE_REALP]], align 4360// CFINITEONLY-NEXT:    store float [[A_IMAG]], ptr [[COERCE_IMAGP]], align 4361// CFINITEONLY-NEXT:    [[TMP2:%.*]] = load <2 x float>, ptr [[COERCE]], align 4362// CFINITEONLY-NEXT:    [[COERCE1_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[COERCE1]], i32 0, i32 0363// CFINITEONLY-NEXT:    [[COERCE1_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[COERCE1]], i32 0, i32 1364// CFINITEONLY-NEXT:    store double [[B_REAL]], ptr [[COERCE1_REALP]], align 8365// CFINITEONLY-NEXT:    store double [[B_IMAG]], ptr [[COERCE1_IMAGP]], align 8366// CFINITEONLY-NEXT:    [[TMP3:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[COERCE1]], i32 0, i32 0367// CFINITEONLY-NEXT:    [[TMP4:%.*]] = load double, ptr [[TMP3]], align 8368// CFINITEONLY-NEXT:    [[TMP5:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[COERCE1]], i32 0, i32 1369// CFINITEONLY-NEXT:    [[TMP6:%.*]] = load double, ptr [[TMP5]], align 8370// CFINITEONLY-NEXT:    [[COERCE2_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE2]], i32 0, i32 0371// CFINITEONLY-NEXT:    [[COERCE2_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE2]], i32 0, i32 1372// CFINITEONLY-NEXT:    store half [[C_REAL]], ptr [[COERCE2_REALP]], align 2373// CFINITEONLY-NEXT:    store half [[C_IMAG]], ptr [[COERCE2_IMAGP]], align 2374// CFINITEONLY-NEXT:    [[TMP7:%.*]] = load <2 x half>, ptr [[COERCE2]], align 2375// CFINITEONLY-NEXT:    [[CALL:%.*]] = call nnan ninf nofpclass(nan inf) <2 x float> @extern_complex(<2 x float> noundef nofpclass(nan inf) [[TMP2]], double noundef nofpclass(nan inf) [[TMP4]], double noundef nofpclass(nan inf) [[TMP6]], <2 x half> noundef nofpclass(nan inf) [[TMP7]])376// CFINITEONLY-NEXT:    store <2 x float> [[CALL]], ptr [[COERCE3]], align 4377// CFINITEONLY-NEXT:    [[COERCE3_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE3]], i32 0, i32 0378// CFINITEONLY-NEXT:    [[COERCE3_REAL:%.*]] = load float, ptr [[COERCE3_REALP]], align 4379// CFINITEONLY-NEXT:    [[COERCE3_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE3]], i32 0, i32 1380// CFINITEONLY-NEXT:    [[COERCE3_IMAG:%.*]] = load float, ptr [[COERCE3_IMAGP]], align 4381// CFINITEONLY-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[RETVAL]], i32 0, i32 0382// CFINITEONLY-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[RETVAL]], i32 0, i32 1383// CFINITEONLY-NEXT:    store float [[COERCE3_REAL]], ptr [[RETVAL_REALP]], align 4384// CFINITEONLY-NEXT:    store float [[COERCE3_IMAG]], ptr [[RETVAL_IMAGP]], align 4385// CFINITEONLY-NEXT:    [[TMP8:%.*]] = load <2 x float>, ptr [[RETVAL]], align 4386// CFINITEONLY-NEXT:    ret <2 x float> [[TMP8]]387//388// CLFINITEONLY: Function Attrs: convergent norecurse nounwind389// CLFINITEONLY-LABEL: define dso_local nofpclass(nan inf) <2 x float> @defined_complex_func390// CLFINITEONLY-SAME: (<2 x float> noundef nofpclass(nan inf) [[A_COERCE:%.*]], double noundef nofpclass(nan inf) [[B_COERCE0:%.*]], double noundef nofpclass(nan inf) [[B_COERCE1:%.*]], <2 x half> noundef nofpclass(nan inf) [[C_COERCE:%.*]]) local_unnamed_addr #[[ATTR6:[0-9]+]] {391// CLFINITEONLY-NEXT:  entry:392// CLFINITEONLY-NEXT:    [[CALL:%.*]] = tail call nnan ninf nofpclass(nan inf) <2 x float> @extern_complex(<2 x float> noundef nofpclass(nan inf) [[A_COERCE]], double noundef nofpclass(nan inf) [[B_COERCE0]], double noundef nofpclass(nan inf) [[B_COERCE1]], <2 x half> noundef nofpclass(nan inf) [[C_COERCE]]) #[[ATTR11]]393// CLFINITEONLY-NEXT:    ret <2 x float> [[CALL]]394//395// NONANS: Function Attrs: noinline nounwind optnone396// NONANS-LABEL: define dso_local nofpclass(nan) <2 x float> @defined_complex_func397// NONANS-SAME: (<2 x float> noundef nofpclass(nan) [[A_COERCE:%.*]], double noundef nofpclass(nan) [[B_COERCE0:%.*]], double noundef nofpclass(nan) [[B_COERCE1:%.*]], <2 x half> noundef nofpclass(nan) [[C_COERCE:%.*]]) #[[ATTR4:[0-9]+]] {398// NONANS-NEXT:  entry:399// NONANS-NEXT:    [[RETVAL:%.*]] = alloca { float, float }, align 4400// NONANS-NEXT:    [[A:%.*]] = alloca { float, float }, align 4401// NONANS-NEXT:    [[B:%.*]] = alloca { double, double }, align 8402// NONANS-NEXT:    [[C:%.*]] = alloca { half, half }, align 2403// NONANS-NEXT:    [[COERCE:%.*]] = alloca { float, float }, align 4404// NONANS-NEXT:    [[COERCE1:%.*]] = alloca { double, double }, align 8405// NONANS-NEXT:    [[COERCE2:%.*]] = alloca { half, half }, align 2406// NONANS-NEXT:    [[COERCE3:%.*]] = alloca { float, float }, align 4407// NONANS-NEXT:    store <2 x float> [[A_COERCE]], ptr [[A]], align 4408// NONANS-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i32 0, i32 0409// NONANS-NEXT:    store double [[B_COERCE0]], ptr [[TMP0]], align 8410// NONANS-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i32 0, i32 1411// NONANS-NEXT:    store double [[B_COERCE1]], ptr [[TMP1]], align 8412// NONANS-NEXT:    store <2 x half> [[C_COERCE]], ptr [[C]], align 2413// NONANS-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[A]], i32 0, i32 0414// NONANS-NEXT:    [[A_REAL:%.*]] = load float, ptr [[A_REALP]], align 4415// NONANS-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[A]], i32 0, i32 1416// NONANS-NEXT:    [[A_IMAG:%.*]] = load float, ptr [[A_IMAGP]], align 4417// NONANS-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i32 0, i32 0418// NONANS-NEXT:    [[B_REAL:%.*]] = load double, ptr [[B_REALP]], align 8419// NONANS-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i32 0, i32 1420// NONANS-NEXT:    [[B_IMAG:%.*]] = load double, ptr [[B_IMAGP]], align 8421// NONANS-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 0422// NONANS-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 2423// NONANS-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 1424// NONANS-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 2425// NONANS-NEXT:    [[COERCE_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE]], i32 0, i32 0426// NONANS-NEXT:    [[COERCE_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE]], i32 0, i32 1427// NONANS-NEXT:    store float [[A_REAL]], ptr [[COERCE_REALP]], align 4428// NONANS-NEXT:    store float [[A_IMAG]], ptr [[COERCE_IMAGP]], align 4429// NONANS-NEXT:    [[TMP2:%.*]] = load <2 x float>, ptr [[COERCE]], align 4430// NONANS-NEXT:    [[COERCE1_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[COERCE1]], i32 0, i32 0431// NONANS-NEXT:    [[COERCE1_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[COERCE1]], i32 0, i32 1432// NONANS-NEXT:    store double [[B_REAL]], ptr [[COERCE1_REALP]], align 8433// NONANS-NEXT:    store double [[B_IMAG]], ptr [[COERCE1_IMAGP]], align 8434// NONANS-NEXT:    [[TMP3:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[COERCE1]], i32 0, i32 0435// NONANS-NEXT:    [[TMP4:%.*]] = load double, ptr [[TMP3]], align 8436// NONANS-NEXT:    [[TMP5:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[COERCE1]], i32 0, i32 1437// NONANS-NEXT:    [[TMP6:%.*]] = load double, ptr [[TMP5]], align 8438// NONANS-NEXT:    [[COERCE2_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE2]], i32 0, i32 0439// NONANS-NEXT:    [[COERCE2_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE2]], i32 0, i32 1440// NONANS-NEXT:    store half [[C_REAL]], ptr [[COERCE2_REALP]], align 2441// NONANS-NEXT:    store half [[C_IMAG]], ptr [[COERCE2_IMAGP]], align 2442// NONANS-NEXT:    [[TMP7:%.*]] = load <2 x half>, ptr [[COERCE2]], align 2443// NONANS-NEXT:    [[CALL:%.*]] = call nnan nofpclass(nan) <2 x float> @extern_complex(<2 x float> noundef nofpclass(nan) [[TMP2]], double noundef nofpclass(nan) [[TMP4]], double noundef nofpclass(nan) [[TMP6]], <2 x half> noundef nofpclass(nan) [[TMP7]])444// NONANS-NEXT:    store <2 x float> [[CALL]], ptr [[COERCE3]], align 4445// NONANS-NEXT:    [[COERCE3_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE3]], i32 0, i32 0446// NONANS-NEXT:    [[COERCE3_REAL:%.*]] = load float, ptr [[COERCE3_REALP]], align 4447// NONANS-NEXT:    [[COERCE3_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE3]], i32 0, i32 1448// NONANS-NEXT:    [[COERCE3_IMAG:%.*]] = load float, ptr [[COERCE3_IMAGP]], align 4449// NONANS-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[RETVAL]], i32 0, i32 0450// NONANS-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[RETVAL]], i32 0, i32 1451// NONANS-NEXT:    store float [[COERCE3_REAL]], ptr [[RETVAL_REALP]], align 4452// NONANS-NEXT:    store float [[COERCE3_IMAG]], ptr [[RETVAL_IMAGP]], align 4453// NONANS-NEXT:    [[TMP8:%.*]] = load <2 x float>, ptr [[RETVAL]], align 4454// NONANS-NEXT:    ret <2 x float> [[TMP8]]455//456// NOINFS: Function Attrs: noinline nounwind optnone457// NOINFS-LABEL: define dso_local nofpclass(inf) <2 x float> @defined_complex_func458// NOINFS-SAME: (<2 x float> noundef nofpclass(inf) [[A_COERCE:%.*]], double noundef nofpclass(inf) [[B_COERCE0:%.*]], double noundef nofpclass(inf) [[B_COERCE1:%.*]], <2 x half> noundef nofpclass(inf) [[C_COERCE:%.*]]) #[[ATTR4:[0-9]+]] {459// NOINFS-NEXT:  entry:460// NOINFS-NEXT:    [[RETVAL:%.*]] = alloca { float, float }, align 4461// NOINFS-NEXT:    [[A:%.*]] = alloca { float, float }, align 4462// NOINFS-NEXT:    [[B:%.*]] = alloca { double, double }, align 8463// NOINFS-NEXT:    [[C:%.*]] = alloca { half, half }, align 2464// NOINFS-NEXT:    [[COERCE:%.*]] = alloca { float, float }, align 4465// NOINFS-NEXT:    [[COERCE1:%.*]] = alloca { double, double }, align 8466// NOINFS-NEXT:    [[COERCE2:%.*]] = alloca { half, half }, align 2467// NOINFS-NEXT:    [[COERCE3:%.*]] = alloca { float, float }, align 4468// NOINFS-NEXT:    store <2 x float> [[A_COERCE]], ptr [[A]], align 4469// NOINFS-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i32 0, i32 0470// NOINFS-NEXT:    store double [[B_COERCE0]], ptr [[TMP0]], align 8471// NOINFS-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i32 0, i32 1472// NOINFS-NEXT:    store double [[B_COERCE1]], ptr [[TMP1]], align 8473// NOINFS-NEXT:    store <2 x half> [[C_COERCE]], ptr [[C]], align 2474// NOINFS-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[A]], i32 0, i32 0475// NOINFS-NEXT:    [[A_REAL:%.*]] = load float, ptr [[A_REALP]], align 4476// NOINFS-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[A]], i32 0, i32 1477// NOINFS-NEXT:    [[A_IMAG:%.*]] = load float, ptr [[A_IMAGP]], align 4478// NOINFS-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i32 0, i32 0479// NOINFS-NEXT:    [[B_REAL:%.*]] = load double, ptr [[B_REALP]], align 8480// NOINFS-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i32 0, i32 1481// NOINFS-NEXT:    [[B_IMAG:%.*]] = load double, ptr [[B_IMAGP]], align 8482// NOINFS-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 0483// NOINFS-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 2484// NOINFS-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 1485// NOINFS-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 2486// NOINFS-NEXT:    [[COERCE_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE]], i32 0, i32 0487// NOINFS-NEXT:    [[COERCE_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE]], i32 0, i32 1488// NOINFS-NEXT:    store float [[A_REAL]], ptr [[COERCE_REALP]], align 4489// NOINFS-NEXT:    store float [[A_IMAG]], ptr [[COERCE_IMAGP]], align 4490// NOINFS-NEXT:    [[TMP2:%.*]] = load <2 x float>, ptr [[COERCE]], align 4491// NOINFS-NEXT:    [[COERCE1_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[COERCE1]], i32 0, i32 0492// NOINFS-NEXT:    [[COERCE1_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[COERCE1]], i32 0, i32 1493// NOINFS-NEXT:    store double [[B_REAL]], ptr [[COERCE1_REALP]], align 8494// NOINFS-NEXT:    store double [[B_IMAG]], ptr [[COERCE1_IMAGP]], align 8495// NOINFS-NEXT:    [[TMP3:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[COERCE1]], i32 0, i32 0496// NOINFS-NEXT:    [[TMP4:%.*]] = load double, ptr [[TMP3]], align 8497// NOINFS-NEXT:    [[TMP5:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[COERCE1]], i32 0, i32 1498// NOINFS-NEXT:    [[TMP6:%.*]] = load double, ptr [[TMP5]], align 8499// NOINFS-NEXT:    [[COERCE2_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE2]], i32 0, i32 0500// NOINFS-NEXT:    [[COERCE2_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE2]], i32 0, i32 1501// NOINFS-NEXT:    store half [[C_REAL]], ptr [[COERCE2_REALP]], align 2502// NOINFS-NEXT:    store half [[C_IMAG]], ptr [[COERCE2_IMAGP]], align 2503// NOINFS-NEXT:    [[TMP7:%.*]] = load <2 x half>, ptr [[COERCE2]], align 2504// NOINFS-NEXT:    [[CALL:%.*]] = call ninf nofpclass(inf) <2 x float> @extern_complex(<2 x float> noundef nofpclass(inf) [[TMP2]], double noundef nofpclass(inf) [[TMP4]], double noundef nofpclass(inf) [[TMP6]], <2 x half> noundef nofpclass(inf) [[TMP7]])505// NOINFS-NEXT:    store <2 x float> [[CALL]], ptr [[COERCE3]], align 4506// NOINFS-NEXT:    [[COERCE3_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE3]], i32 0, i32 0507// NOINFS-NEXT:    [[COERCE3_REAL:%.*]] = load float, ptr [[COERCE3_REALP]], align 4508// NOINFS-NEXT:    [[COERCE3_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE3]], i32 0, i32 1509// NOINFS-NEXT:    [[COERCE3_IMAG:%.*]] = load float, ptr [[COERCE3_IMAGP]], align 4510// NOINFS-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[RETVAL]], i32 0, i32 0511// NOINFS-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[RETVAL]], i32 0, i32 1512// NOINFS-NEXT:    store float [[COERCE3_REAL]], ptr [[RETVAL_REALP]], align 4513// NOINFS-NEXT:    store float [[COERCE3_IMAG]], ptr [[RETVAL_IMAGP]], align 4514// NOINFS-NEXT:    [[TMP8:%.*]] = load <2 x float>, ptr [[RETVAL]], align 4515// NOINFS-NEXT:    ret <2 x float> [[TMP8]]516//517_Complex float defined_complex_func(_Complex float a, _Complex double b, _Complex _Float16 c) {518  return extern_complex(a, b, c);519}520 521// CFINITEONLY: Function Attrs: noinline nounwind optnone522// CFINITEONLY-LABEL: define dso_local nofpclass(nan inf) { double, double } @defined_complex_func_f64_ret523// CFINITEONLY-SAME: (double noundef nofpclass(nan inf) [[C_COERCE0:%.*]], double noundef nofpclass(nan inf) [[C_COERCE1:%.*]]) #[[ATTR0]] {524// CFINITEONLY-NEXT:  entry:525// CFINITEONLY-NEXT:    [[RETVAL:%.*]] = alloca { double, double }, align 8526// CFINITEONLY-NEXT:    [[C:%.*]] = alloca { double, double }, align 8527// CFINITEONLY-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[C]], i32 0, i32 0528// CFINITEONLY-NEXT:    store double [[C_COERCE0]], ptr [[TMP0]], align 8529// CFINITEONLY-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[C]], i32 0, i32 1530// CFINITEONLY-NEXT:    store double [[C_COERCE1]], ptr [[TMP1]], align 8531// CFINITEONLY-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[C]], i32 0, i32 0532// CFINITEONLY-NEXT:    [[C_REAL:%.*]] = load double, ptr [[C_REALP]], align 8533// CFINITEONLY-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[C]], i32 0, i32 1534// CFINITEONLY-NEXT:    [[C_IMAG:%.*]] = load double, ptr [[C_IMAGP]], align 8535// CFINITEONLY-NEXT:    [[C_REALP1:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[C]], i32 0, i32 0536// CFINITEONLY-NEXT:    [[C_REAL2:%.*]] = load double, ptr [[C_REALP1]], align 8537// CFINITEONLY-NEXT:    [[C_IMAGP3:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[C]], i32 0, i32 1538// CFINITEONLY-NEXT:    [[C_IMAG4:%.*]] = load double, ptr [[C_IMAGP3]], align 8539// CFINITEONLY-NEXT:    [[MUL_AC:%.*]] = fmul nnan ninf double [[C_REAL]], [[C_REAL2]]540// CFINITEONLY-NEXT:    [[MUL_BD:%.*]] = fmul nnan ninf double [[C_IMAG]], [[C_IMAG4]]541// CFINITEONLY-NEXT:    [[MUL_AD:%.*]] = fmul nnan ninf double [[C_REAL]], [[C_IMAG4]]542// CFINITEONLY-NEXT:    [[MUL_BC:%.*]] = fmul nnan ninf double [[C_IMAG]], [[C_REAL2]]543// CFINITEONLY-NEXT:    [[MUL_R:%.*]] = fsub nnan ninf double [[MUL_AC]], [[MUL_BD]]544// CFINITEONLY-NEXT:    [[MUL_I:%.*]] = fadd nnan ninf double [[MUL_AD]], [[MUL_BC]]545// CFINITEONLY-NEXT:    [[ISNAN_CMP:%.*]] = fcmp nnan ninf uno double [[MUL_R]], [[MUL_R]]546// CFINITEONLY-NEXT:    br i1 [[ISNAN_CMP]], label [[COMPLEX_MUL_IMAG_NAN:%.*]], label [[COMPLEX_MUL_CONT:%.*]], !prof [[PROF2:![0-9]+]]547// CFINITEONLY:       complex_mul_imag_nan:548// CFINITEONLY-NEXT:    [[ISNAN_CMP5:%.*]] = fcmp nnan ninf uno double [[MUL_I]], [[MUL_I]]549// CFINITEONLY-NEXT:    br i1 [[ISNAN_CMP5]], label [[COMPLEX_MUL_LIBCALL:%.*]], label [[COMPLEX_MUL_CONT]], !prof [[PROF2]]550// CFINITEONLY:       complex_mul_libcall:551// CFINITEONLY-NEXT:    [[CALL:%.*]] = call nnan ninf nofpclass(nan inf) { double, double } @__muldc3(double noundef nofpclass(nan inf) [[C_REAL]], double noundef nofpclass(nan inf) [[C_IMAG]], double noundef nofpclass(nan inf) [[C_REAL2]], double noundef nofpclass(nan inf) [[C_IMAG4]]) #[[ATTR7:[0-9]+]]552// CFINITEONLY-NEXT:    [[TMP2:%.*]] = extractvalue { double, double } [[CALL]], 0553// CFINITEONLY-NEXT:    [[TMP3:%.*]] = extractvalue { double, double } [[CALL]], 1554// CFINITEONLY-NEXT:    br label [[COMPLEX_MUL_CONT]]555// CFINITEONLY:       complex_mul_cont:556// CFINITEONLY-NEXT:    [[REAL_MUL_PHI:%.*]] = phi nnan ninf double [ [[MUL_R]], [[ENTRY:%.*]] ], [ [[MUL_R]], [[COMPLEX_MUL_IMAG_NAN]] ], [ [[TMP2]], [[COMPLEX_MUL_LIBCALL]] ]557// CFINITEONLY-NEXT:    [[IMAG_MUL_PHI:%.*]] = phi nnan ninf double [ [[MUL_I]], [[ENTRY]] ], [ [[MUL_I]], [[COMPLEX_MUL_IMAG_NAN]] ], [ [[TMP3]], [[COMPLEX_MUL_LIBCALL]] ]558// CFINITEONLY-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[RETVAL]], i32 0, i32 0559// CFINITEONLY-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[RETVAL]], i32 0, i32 1560// CFINITEONLY-NEXT:    store double [[REAL_MUL_PHI]], ptr [[RETVAL_REALP]], align 8561// CFINITEONLY-NEXT:    store double [[IMAG_MUL_PHI]], ptr [[RETVAL_IMAGP]], align 8562// CFINITEONLY-NEXT:    [[TMP4:%.*]] = load { double, double }, ptr [[RETVAL]], align 8563// CFINITEONLY-NEXT:    ret { double, double } [[TMP4]]564//565// CLFINITEONLY: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)566// CLFINITEONLY-LABEL: define dso_local nofpclass(nan inf) { double, double } @defined_complex_func_f64_ret567// CLFINITEONLY-SAME: (double noundef nofpclass(nan inf) [[C_COERCE0:%.*]], double noundef nofpclass(nan inf) [[C_COERCE1:%.*]]) local_unnamed_addr #[[ATTR0]] {568// CLFINITEONLY-NEXT:  entry:569// CLFINITEONLY-NEXT:    [[MUL_AD:%.*]] = fmul nnan ninf double [[C_COERCE0]], [[C_COERCE1]]570// CLFINITEONLY-NEXT:    [[MUL_I:%.*]] = fadd nnan ninf double [[MUL_AD]], [[MUL_AD]]571// CLFINITEONLY-NEXT:    [[MUL_AC:%.*]] = fmul nnan ninf double [[C_COERCE0]], [[C_COERCE0]]572// CLFINITEONLY-NEXT:    [[MUL_BD:%.*]] = fmul nnan ninf double [[C_COERCE1]], [[C_COERCE1]]573// CLFINITEONLY-NEXT:    [[MUL_R:%.*]] = fsub nnan ninf double [[MUL_AC]], [[MUL_BD]]574// CLFINITEONLY-NEXT:    [[DOTFCA_0_INSERT:%.*]] = insertvalue { double, double } poison, double [[MUL_R]], 0575// CLFINITEONLY-NEXT:    [[DOTFCA_1_INSERT:%.*]] = insertvalue { double, double } [[DOTFCA_0_INSERT]], double [[MUL_I]], 1576// CLFINITEONLY-NEXT:    ret { double, double } [[DOTFCA_1_INSERT]]577//578// NONANS: Function Attrs: noinline nounwind optnone579// NONANS-LABEL: define dso_local nofpclass(nan) { double, double } @defined_complex_func_f64_ret580// NONANS-SAME: (double noundef nofpclass(nan) [[C_COERCE0:%.*]], double noundef nofpclass(nan) [[C_COERCE1:%.*]]) #[[ATTR0]] {581// NONANS-NEXT:  entry:582// NONANS-NEXT:    [[RETVAL:%.*]] = alloca { double, double }, align 8583// NONANS-NEXT:    [[C:%.*]] = alloca { double, double }, align 8584// NONANS-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[C]], i32 0, i32 0585// NONANS-NEXT:    store double [[C_COERCE0]], ptr [[TMP0]], align 8586// NONANS-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[C]], i32 0, i32 1587// NONANS-NEXT:    store double [[C_COERCE1]], ptr [[TMP1]], align 8588// NONANS-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[C]], i32 0, i32 0589// NONANS-NEXT:    [[C_REAL:%.*]] = load double, ptr [[C_REALP]], align 8590// NONANS-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[C]], i32 0, i32 1591// NONANS-NEXT:    [[C_IMAG:%.*]] = load double, ptr [[C_IMAGP]], align 8592// NONANS-NEXT:    [[C_REALP1:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[C]], i32 0, i32 0593// NONANS-NEXT:    [[C_REAL2:%.*]] = load double, ptr [[C_REALP1]], align 8594// NONANS-NEXT:    [[C_IMAGP3:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[C]], i32 0, i32 1595// NONANS-NEXT:    [[C_IMAG4:%.*]] = load double, ptr [[C_IMAGP3]], align 8596// NONANS-NEXT:    [[MUL_AC:%.*]] = fmul nnan double [[C_REAL]], [[C_REAL2]]597// NONANS-NEXT:    [[MUL_BD:%.*]] = fmul nnan double [[C_IMAG]], [[C_IMAG4]]598// NONANS-NEXT:    [[MUL_AD:%.*]] = fmul nnan double [[C_REAL]], [[C_IMAG4]]599// NONANS-NEXT:    [[MUL_BC:%.*]] = fmul nnan double [[C_IMAG]], [[C_REAL2]]600// NONANS-NEXT:    [[MUL_R:%.*]] = fsub nnan double [[MUL_AC]], [[MUL_BD]]601// NONANS-NEXT:    [[MUL_I:%.*]] = fadd nnan double [[MUL_AD]], [[MUL_BC]]602// NONANS-NEXT:    [[ISNAN_CMP:%.*]] = fcmp nnan uno double [[MUL_R]], [[MUL_R]]603// NONANS-NEXT:    br i1 [[ISNAN_CMP]], label [[COMPLEX_MUL_IMAG_NAN:%.*]], label [[COMPLEX_MUL_CONT:%.*]], !prof [[PROF2:![0-9]+]]604// NONANS:       complex_mul_imag_nan:605// NONANS-NEXT:    [[ISNAN_CMP5:%.*]] = fcmp nnan uno double [[MUL_I]], [[MUL_I]]606// NONANS-NEXT:    br i1 [[ISNAN_CMP5]], label [[COMPLEX_MUL_LIBCALL:%.*]], label [[COMPLEX_MUL_CONT]], !prof [[PROF2]]607// NONANS:       complex_mul_libcall:608// NONANS-NEXT:    [[CALL:%.*]] = call nnan nofpclass(nan) { double, double } @__muldc3(double noundef nofpclass(nan) [[C_REAL]], double noundef nofpclass(nan) [[C_IMAG]], double noundef nofpclass(nan) [[C_REAL2]], double noundef nofpclass(nan) [[C_IMAG4]]) #[[ATTR7:[0-9]+]]609// NONANS-NEXT:    [[TMP2:%.*]] = extractvalue { double, double } [[CALL]], 0610// NONANS-NEXT:    [[TMP3:%.*]] = extractvalue { double, double } [[CALL]], 1611// NONANS-NEXT:    br label [[COMPLEX_MUL_CONT]]612// NONANS:       complex_mul_cont:613// NONANS-NEXT:    [[REAL_MUL_PHI:%.*]] = phi nnan double [ [[MUL_R]], [[ENTRY:%.*]] ], [ [[MUL_R]], [[COMPLEX_MUL_IMAG_NAN]] ], [ [[TMP2]], [[COMPLEX_MUL_LIBCALL]] ]614// NONANS-NEXT:    [[IMAG_MUL_PHI:%.*]] = phi nnan double [ [[MUL_I]], [[ENTRY]] ], [ [[MUL_I]], [[COMPLEX_MUL_IMAG_NAN]] ], [ [[TMP3]], [[COMPLEX_MUL_LIBCALL]] ]615// NONANS-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[RETVAL]], i32 0, i32 0616// NONANS-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[RETVAL]], i32 0, i32 1617// NONANS-NEXT:    store double [[REAL_MUL_PHI]], ptr [[RETVAL_REALP]], align 8618// NONANS-NEXT:    store double [[IMAG_MUL_PHI]], ptr [[RETVAL_IMAGP]], align 8619// NONANS-NEXT:    [[TMP4:%.*]] = load { double, double }, ptr [[RETVAL]], align 8620// NONANS-NEXT:    ret { double, double } [[TMP4]]621//622// NOINFS: Function Attrs: noinline nounwind optnone623// NOINFS-LABEL: define dso_local nofpclass(inf) { double, double } @defined_complex_func_f64_ret624// NOINFS-SAME: (double noundef nofpclass(inf) [[C_COERCE0:%.*]], double noundef nofpclass(inf) [[C_COERCE1:%.*]]) #[[ATTR0]] {625// NOINFS-NEXT:  entry:626// NOINFS-NEXT:    [[RETVAL:%.*]] = alloca { double, double }, align 8627// NOINFS-NEXT:    [[C:%.*]] = alloca { double, double }, align 8628// NOINFS-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[C]], i32 0, i32 0629// NOINFS-NEXT:    store double [[C_COERCE0]], ptr [[TMP0]], align 8630// NOINFS-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[C]], i32 0, i32 1631// NOINFS-NEXT:    store double [[C_COERCE1]], ptr [[TMP1]], align 8632// NOINFS-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[C]], i32 0, i32 0633// NOINFS-NEXT:    [[C_REAL:%.*]] = load double, ptr [[C_REALP]], align 8634// NOINFS-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[C]], i32 0, i32 1635// NOINFS-NEXT:    [[C_IMAG:%.*]] = load double, ptr [[C_IMAGP]], align 8636// NOINFS-NEXT:    [[C_REALP1:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[C]], i32 0, i32 0637// NOINFS-NEXT:    [[C_REAL2:%.*]] = load double, ptr [[C_REALP1]], align 8638// NOINFS-NEXT:    [[C_IMAGP3:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[C]], i32 0, i32 1639// NOINFS-NEXT:    [[C_IMAG4:%.*]] = load double, ptr [[C_IMAGP3]], align 8640// NOINFS-NEXT:    [[MUL_AC:%.*]] = fmul ninf double [[C_REAL]], [[C_REAL2]]641// NOINFS-NEXT:    [[MUL_BD:%.*]] = fmul ninf double [[C_IMAG]], [[C_IMAG4]]642// NOINFS-NEXT:    [[MUL_AD:%.*]] = fmul ninf double [[C_REAL]], [[C_IMAG4]]643// NOINFS-NEXT:    [[MUL_BC:%.*]] = fmul ninf double [[C_IMAG]], [[C_REAL2]]644// NOINFS-NEXT:    [[MUL_R:%.*]] = fsub ninf double [[MUL_AC]], [[MUL_BD]]645// NOINFS-NEXT:    [[MUL_I:%.*]] = fadd ninf double [[MUL_AD]], [[MUL_BC]]646// NOINFS-NEXT:    [[ISNAN_CMP:%.*]] = fcmp ninf uno double [[MUL_R]], [[MUL_R]]647// NOINFS-NEXT:    br i1 [[ISNAN_CMP]], label [[COMPLEX_MUL_IMAG_NAN:%.*]], label [[COMPLEX_MUL_CONT:%.*]], !prof [[PROF2:![0-9]+]]648// NOINFS:       complex_mul_imag_nan:649// NOINFS-NEXT:    [[ISNAN_CMP5:%.*]] = fcmp ninf uno double [[MUL_I]], [[MUL_I]]650// NOINFS-NEXT:    br i1 [[ISNAN_CMP5]], label [[COMPLEX_MUL_LIBCALL:%.*]], label [[COMPLEX_MUL_CONT]], !prof [[PROF2]]651// NOINFS:       complex_mul_libcall:652// NOINFS-NEXT:    [[CALL:%.*]] = call ninf nofpclass(inf) { double, double } @__muldc3(double noundef nofpclass(inf) [[C_REAL]], double noundef nofpclass(inf) [[C_IMAG]], double noundef nofpclass(inf) [[C_REAL2]], double noundef nofpclass(inf) [[C_IMAG4]]) #[[ATTR7:[0-9]+]]653// NOINFS-NEXT:    [[TMP2:%.*]] = extractvalue { double, double } [[CALL]], 0654// NOINFS-NEXT:    [[TMP3:%.*]] = extractvalue { double, double } [[CALL]], 1655// NOINFS-NEXT:    br label [[COMPLEX_MUL_CONT]]656// NOINFS:       complex_mul_cont:657// NOINFS-NEXT:    [[REAL_MUL_PHI:%.*]] = phi ninf double [ [[MUL_R]], [[ENTRY:%.*]] ], [ [[MUL_R]], [[COMPLEX_MUL_IMAG_NAN]] ], [ [[TMP2]], [[COMPLEX_MUL_LIBCALL]] ]658// NOINFS-NEXT:    [[IMAG_MUL_PHI:%.*]] = phi ninf double [ [[MUL_I]], [[ENTRY]] ], [ [[MUL_I]], [[COMPLEX_MUL_IMAG_NAN]] ], [ [[TMP3]], [[COMPLEX_MUL_LIBCALL]] ]659// NOINFS-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[RETVAL]], i32 0, i32 0660// NOINFS-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[RETVAL]], i32 0, i32 1661// NOINFS-NEXT:    store double [[REAL_MUL_PHI]], ptr [[RETVAL_REALP]], align 8662// NOINFS-NEXT:    store double [[IMAG_MUL_PHI]], ptr [[RETVAL_IMAGP]], align 8663// NOINFS-NEXT:    [[TMP4:%.*]] = load { double, double }, ptr [[RETVAL]], align 8664// NOINFS-NEXT:    ret { double, double } [[TMP4]]665//666_Complex double defined_complex_func_f64_ret(_Complex double c) {667  return c * c;668}669 670// CFINITEONLY: Function Attrs: noinline nounwind optnone671// CFINITEONLY-LABEL: define dso_local nofpclass(nan inf) <2 x half> @defined_complex_func_f16_ret672// CFINITEONLY-SAME: (<2 x half> noundef nofpclass(nan inf) [[C_COERCE:%.*]]) #[[ATTR4]] {673// CFINITEONLY-NEXT:  entry:674// CFINITEONLY-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2675// CFINITEONLY-NEXT:    [[C:%.*]] = alloca { half, half }, align 2676// CFINITEONLY-NEXT:    [[COERCE:%.*]] = alloca { float, float }, align 4677// CFINITEONLY-NEXT:    store <2 x half> [[C_COERCE]], ptr [[C]], align 2678// CFINITEONLY-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 0679// CFINITEONLY-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 2680// CFINITEONLY-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 1681// CFINITEONLY-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 2682// CFINITEONLY-NEXT:    [[EXT:%.*]] = fpext nnan ninf half [[C_REAL]] to float683// CFINITEONLY-NEXT:    [[EXT1:%.*]] = fpext nnan ninf half [[C_IMAG]] to float684// CFINITEONLY-NEXT:    [[C_REALP2:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 0685// CFINITEONLY-NEXT:    [[C_REAL3:%.*]] = load half, ptr [[C_REALP2]], align 2686// CFINITEONLY-NEXT:    [[C_IMAGP4:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 1687// CFINITEONLY-NEXT:    [[C_IMAG5:%.*]] = load half, ptr [[C_IMAGP4]], align 2688// CFINITEONLY-NEXT:    [[EXT6:%.*]] = fpext nnan ninf half [[C_REAL3]] to float689// CFINITEONLY-NEXT:    [[EXT7:%.*]] = fpext nnan ninf half [[C_IMAG5]] to float690// CFINITEONLY-NEXT:    [[MUL_AC:%.*]] = fmul nnan ninf float [[EXT]], [[EXT6]]691// CFINITEONLY-NEXT:    [[MUL_BD:%.*]] = fmul nnan ninf float [[EXT1]], [[EXT7]]692// CFINITEONLY-NEXT:    [[MUL_AD:%.*]] = fmul nnan ninf float [[EXT]], [[EXT7]]693// CFINITEONLY-NEXT:    [[MUL_BC:%.*]] = fmul nnan ninf float [[EXT1]], [[EXT6]]694// CFINITEONLY-NEXT:    [[MUL_R:%.*]] = fsub nnan ninf float [[MUL_AC]], [[MUL_BD]]695// CFINITEONLY-NEXT:    [[MUL_I:%.*]] = fadd nnan ninf float [[MUL_AD]], [[MUL_BC]]696// CFINITEONLY-NEXT:    [[ISNAN_CMP:%.*]] = fcmp nnan ninf uno float [[MUL_R]], [[MUL_R]]697// CFINITEONLY-NEXT:    br i1 [[ISNAN_CMP]], label [[COMPLEX_MUL_IMAG_NAN:%.*]], label [[COMPLEX_MUL_CONT:%.*]], !prof [[PROF2]]698// CFINITEONLY:       complex_mul_imag_nan:699// CFINITEONLY-NEXT:    [[ISNAN_CMP8:%.*]] = fcmp nnan ninf uno float [[MUL_I]], [[MUL_I]]700// CFINITEONLY-NEXT:    br i1 [[ISNAN_CMP8]], label [[COMPLEX_MUL_LIBCALL:%.*]], label [[COMPLEX_MUL_CONT]], !prof [[PROF2]]701// CFINITEONLY:       complex_mul_libcall:702// CFINITEONLY-NEXT:    [[CALL:%.*]] = call nnan ninf nofpclass(nan inf) <2 x float> @__mulsc3(float noundef nofpclass(nan inf) [[EXT]], float noundef nofpclass(nan inf) [[EXT1]], float noundef nofpclass(nan inf) [[EXT6]], float noundef nofpclass(nan inf) [[EXT7]]) #[[ATTR7]]703// CFINITEONLY-NEXT:    store <2 x float> [[CALL]], ptr [[COERCE]], align 4704// CFINITEONLY-NEXT:    [[COERCE_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE]], i32 0, i32 0705// CFINITEONLY-NEXT:    [[COERCE_REAL:%.*]] = load float, ptr [[COERCE_REALP]], align 4706// CFINITEONLY-NEXT:    [[COERCE_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE]], i32 0, i32 1707// CFINITEONLY-NEXT:    [[COERCE_IMAG:%.*]] = load float, ptr [[COERCE_IMAGP]], align 4708// CFINITEONLY-NEXT:    br label [[COMPLEX_MUL_CONT]]709// CFINITEONLY:       complex_mul_cont:710// CFINITEONLY-NEXT:    [[REAL_MUL_PHI:%.*]] = phi nnan ninf float [ [[MUL_R]], [[ENTRY:%.*]] ], [ [[MUL_R]], [[COMPLEX_MUL_IMAG_NAN]] ], [ [[COERCE_REAL]], [[COMPLEX_MUL_LIBCALL]] ]711// CFINITEONLY-NEXT:    [[IMAG_MUL_PHI:%.*]] = phi nnan ninf float [ [[MUL_I]], [[ENTRY]] ], [ [[MUL_I]], [[COMPLEX_MUL_IMAG_NAN]] ], [ [[COERCE_IMAG]], [[COMPLEX_MUL_LIBCALL]] ]712// CFINITEONLY-NEXT:    [[UNPROMOTION:%.*]] = fptrunc nnan ninf float [[REAL_MUL_PHI]] to half713// CFINITEONLY-NEXT:    [[UNPROMOTION9:%.*]] = fptrunc nnan ninf float [[IMAG_MUL_PHI]] to half714// CFINITEONLY-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0715// CFINITEONLY-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1716// CFINITEONLY-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 2717// CFINITEONLY-NEXT:    store half [[UNPROMOTION9]], ptr [[RETVAL_IMAGP]], align 2718// CFINITEONLY-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2719// CFINITEONLY-NEXT:    ret <2 x half> [[TMP0]]720//721// CLFINITEONLY: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)722// CLFINITEONLY-LABEL: define dso_local nofpclass(nan inf) <2 x half> @defined_complex_func_f16_ret723// CLFINITEONLY-SAME: (<2 x half> noundef nofpclass(nan inf) [[C_COERCE:%.*]]) local_unnamed_addr #[[ATTR7:[0-9]+]] {724// CLFINITEONLY-NEXT:  entry:725// CLFINITEONLY-NEXT:    [[C_SROA_0_0_VEC_EXTRACT:%.*]] = extractelement <2 x half> [[C_COERCE]], i64 0726// CLFINITEONLY-NEXT:    [[EXT:%.*]] = fpext nnan ninf half [[C_SROA_0_0_VEC_EXTRACT]] to float727// CLFINITEONLY-NEXT:    [[C_SROA_0_2_VEC_EXTRACT:%.*]] = extractelement <2 x half> [[C_COERCE]], i64 1728// CLFINITEONLY-NEXT:    [[EXT1:%.*]] = fpext nnan ninf half [[C_SROA_0_2_VEC_EXTRACT]] to float729// CLFINITEONLY-NEXT:    [[MUL_AD:%.*]] = fmul nnan ninf float [[EXT]], [[EXT1]]730// CLFINITEONLY-NEXT:    [[MUL_I:%.*]] = fadd nnan ninf float [[MUL_AD]], [[MUL_AD]]731// CLFINITEONLY-NEXT:    [[MUL_AC:%.*]] = fmul nnan ninf float [[EXT]], [[EXT]]732// CLFINITEONLY-NEXT:    [[MUL_BD:%.*]] = fmul nnan ninf float [[EXT1]], [[EXT1]]733// CLFINITEONLY-NEXT:    [[MUL_R:%.*]] = fsub nnan ninf float [[MUL_AC]], [[MUL_BD]]734// CLFINITEONLY-NEXT:    [[UNPROMOTION:%.*]] = fptrunc nnan ninf float [[MUL_R]] to half735// CLFINITEONLY-NEXT:    [[UNPROMOTION9:%.*]] = fptrunc nnan ninf float [[MUL_I]] to half736// CLFINITEONLY-NEXT:    [[RETVAL_SROA_0_0_VEC_INSERT:%.*]] = insertelement <2 x half> poison, half [[UNPROMOTION]], i64 0737// CLFINITEONLY-NEXT:    [[RETVAL_SROA_0_2_VEC_INSERT:%.*]] = insertelement <2 x half> [[RETVAL_SROA_0_0_VEC_INSERT]], half [[UNPROMOTION9]], i64 1738// CLFINITEONLY-NEXT:    ret <2 x half> [[RETVAL_SROA_0_2_VEC_INSERT]]739//740// NONANS: Function Attrs: noinline nounwind optnone741// NONANS-LABEL: define dso_local nofpclass(nan) <2 x half> @defined_complex_func_f16_ret742// NONANS-SAME: (<2 x half> noundef nofpclass(nan) [[C_COERCE:%.*]]) #[[ATTR4]] {743// NONANS-NEXT:  entry:744// NONANS-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2745// NONANS-NEXT:    [[C:%.*]] = alloca { half, half }, align 2746// NONANS-NEXT:    [[COERCE:%.*]] = alloca { float, float }, align 4747// NONANS-NEXT:    store <2 x half> [[C_COERCE]], ptr [[C]], align 2748// NONANS-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 0749// NONANS-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 2750// NONANS-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 1751// NONANS-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 2752// NONANS-NEXT:    [[EXT:%.*]] = fpext nnan half [[C_REAL]] to float753// NONANS-NEXT:    [[EXT1:%.*]] = fpext nnan half [[C_IMAG]] to float754// NONANS-NEXT:    [[C_REALP2:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 0755// NONANS-NEXT:    [[C_REAL3:%.*]] = load half, ptr [[C_REALP2]], align 2756// NONANS-NEXT:    [[C_IMAGP4:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 1757// NONANS-NEXT:    [[C_IMAG5:%.*]] = load half, ptr [[C_IMAGP4]], align 2758// NONANS-NEXT:    [[EXT6:%.*]] = fpext nnan half [[C_REAL3]] to float759// NONANS-NEXT:    [[EXT7:%.*]] = fpext nnan half [[C_IMAG5]] to float760// NONANS-NEXT:    [[MUL_AC:%.*]] = fmul nnan float [[EXT]], [[EXT6]]761// NONANS-NEXT:    [[MUL_BD:%.*]] = fmul nnan float [[EXT1]], [[EXT7]]762// NONANS-NEXT:    [[MUL_AD:%.*]] = fmul nnan float [[EXT]], [[EXT7]]763// NONANS-NEXT:    [[MUL_BC:%.*]] = fmul nnan float [[EXT1]], [[EXT6]]764// NONANS-NEXT:    [[MUL_R:%.*]] = fsub nnan float [[MUL_AC]], [[MUL_BD]]765// NONANS-NEXT:    [[MUL_I:%.*]] = fadd nnan float [[MUL_AD]], [[MUL_BC]]766// NONANS-NEXT:    [[ISNAN_CMP:%.*]] = fcmp nnan uno float [[MUL_R]], [[MUL_R]]767// NONANS-NEXT:    br i1 [[ISNAN_CMP]], label [[COMPLEX_MUL_IMAG_NAN:%.*]], label [[COMPLEX_MUL_CONT:%.*]], !prof [[PROF2]]768// NONANS:       complex_mul_imag_nan:769// NONANS-NEXT:    [[ISNAN_CMP8:%.*]] = fcmp nnan uno float [[MUL_I]], [[MUL_I]]770// NONANS-NEXT:    br i1 [[ISNAN_CMP8]], label [[COMPLEX_MUL_LIBCALL:%.*]], label [[COMPLEX_MUL_CONT]], !prof [[PROF2]]771// NONANS:       complex_mul_libcall:772// NONANS-NEXT:    [[CALL:%.*]] = call nnan nofpclass(nan) <2 x float> @__mulsc3(float noundef nofpclass(nan) [[EXT]], float noundef nofpclass(nan) [[EXT1]], float noundef nofpclass(nan) [[EXT6]], float noundef nofpclass(nan) [[EXT7]]) #[[ATTR7]]773// NONANS-NEXT:    store <2 x float> [[CALL]], ptr [[COERCE]], align 4774// NONANS-NEXT:    [[COERCE_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE]], i32 0, i32 0775// NONANS-NEXT:    [[COERCE_REAL:%.*]] = load float, ptr [[COERCE_REALP]], align 4776// NONANS-NEXT:    [[COERCE_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE]], i32 0, i32 1777// NONANS-NEXT:    [[COERCE_IMAG:%.*]] = load float, ptr [[COERCE_IMAGP]], align 4778// NONANS-NEXT:    br label [[COMPLEX_MUL_CONT]]779// NONANS:       complex_mul_cont:780// NONANS-NEXT:    [[REAL_MUL_PHI:%.*]] = phi nnan float [ [[MUL_R]], [[ENTRY:%.*]] ], [ [[MUL_R]], [[COMPLEX_MUL_IMAG_NAN]] ], [ [[COERCE_REAL]], [[COMPLEX_MUL_LIBCALL]] ]781// NONANS-NEXT:    [[IMAG_MUL_PHI:%.*]] = phi nnan float [ [[MUL_I]], [[ENTRY]] ], [ [[MUL_I]], [[COMPLEX_MUL_IMAG_NAN]] ], [ [[COERCE_IMAG]], [[COMPLEX_MUL_LIBCALL]] ]782// NONANS-NEXT:    [[UNPROMOTION:%.*]] = fptrunc nnan float [[REAL_MUL_PHI]] to half783// NONANS-NEXT:    [[UNPROMOTION9:%.*]] = fptrunc nnan float [[IMAG_MUL_PHI]] to half784// NONANS-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0785// NONANS-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1786// NONANS-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 2787// NONANS-NEXT:    store half [[UNPROMOTION9]], ptr [[RETVAL_IMAGP]], align 2788// NONANS-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2789// NONANS-NEXT:    ret <2 x half> [[TMP0]]790//791// NOINFS: Function Attrs: noinline nounwind optnone792// NOINFS-LABEL: define dso_local nofpclass(inf) <2 x half> @defined_complex_func_f16_ret793// NOINFS-SAME: (<2 x half> noundef nofpclass(inf) [[C_COERCE:%.*]]) #[[ATTR4]] {794// NOINFS-NEXT:  entry:795// NOINFS-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2796// NOINFS-NEXT:    [[C:%.*]] = alloca { half, half }, align 2797// NOINFS-NEXT:    [[COERCE:%.*]] = alloca { float, float }, align 4798// NOINFS-NEXT:    store <2 x half> [[C_COERCE]], ptr [[C]], align 2799// NOINFS-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 0800// NOINFS-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 2801// NOINFS-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 1802// NOINFS-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 2803// NOINFS-NEXT:    [[EXT:%.*]] = fpext ninf half [[C_REAL]] to float804// NOINFS-NEXT:    [[EXT1:%.*]] = fpext ninf half [[C_IMAG]] to float805// NOINFS-NEXT:    [[C_REALP2:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 0806// NOINFS-NEXT:    [[C_REAL3:%.*]] = load half, ptr [[C_REALP2]], align 2807// NOINFS-NEXT:    [[C_IMAGP4:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 1808// NOINFS-NEXT:    [[C_IMAG5:%.*]] = load half, ptr [[C_IMAGP4]], align 2809// NOINFS-NEXT:    [[EXT6:%.*]] = fpext ninf half [[C_REAL3]] to float810// NOINFS-NEXT:    [[EXT7:%.*]] = fpext ninf half [[C_IMAG5]] to float811// NOINFS-NEXT:    [[MUL_AC:%.*]] = fmul ninf float [[EXT]], [[EXT6]]812// NOINFS-NEXT:    [[MUL_BD:%.*]] = fmul ninf float [[EXT1]], [[EXT7]]813// NOINFS-NEXT:    [[MUL_AD:%.*]] = fmul ninf float [[EXT]], [[EXT7]]814// NOINFS-NEXT:    [[MUL_BC:%.*]] = fmul ninf float [[EXT1]], [[EXT6]]815// NOINFS-NEXT:    [[MUL_R:%.*]] = fsub ninf float [[MUL_AC]], [[MUL_BD]]816// NOINFS-NEXT:    [[MUL_I:%.*]] = fadd ninf float [[MUL_AD]], [[MUL_BC]]817// NOINFS-NEXT:    [[ISNAN_CMP:%.*]] = fcmp ninf uno float [[MUL_R]], [[MUL_R]]818// NOINFS-NEXT:    br i1 [[ISNAN_CMP]], label [[COMPLEX_MUL_IMAG_NAN:%.*]], label [[COMPLEX_MUL_CONT:%.*]], !prof [[PROF2]]819// NOINFS:       complex_mul_imag_nan:820// NOINFS-NEXT:    [[ISNAN_CMP8:%.*]] = fcmp ninf uno float [[MUL_I]], [[MUL_I]]821// NOINFS-NEXT:    br i1 [[ISNAN_CMP8]], label [[COMPLEX_MUL_LIBCALL:%.*]], label [[COMPLEX_MUL_CONT]], !prof [[PROF2]]822// NOINFS:       complex_mul_libcall:823// NOINFS-NEXT:    [[CALL:%.*]] = call ninf nofpclass(inf) <2 x float> @__mulsc3(float noundef nofpclass(inf) [[EXT]], float noundef nofpclass(inf) [[EXT1]], float noundef nofpclass(inf) [[EXT6]], float noundef nofpclass(inf) [[EXT7]]) #[[ATTR7]]824// NOINFS-NEXT:    store <2 x float> [[CALL]], ptr [[COERCE]], align 4825// NOINFS-NEXT:    [[COERCE_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE]], i32 0, i32 0826// NOINFS-NEXT:    [[COERCE_REAL:%.*]] = load float, ptr [[COERCE_REALP]], align 4827// NOINFS-NEXT:    [[COERCE_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE]], i32 0, i32 1828// NOINFS-NEXT:    [[COERCE_IMAG:%.*]] = load float, ptr [[COERCE_IMAGP]], align 4829// NOINFS-NEXT:    br label [[COMPLEX_MUL_CONT]]830// NOINFS:       complex_mul_cont:831// NOINFS-NEXT:    [[REAL_MUL_PHI:%.*]] = phi ninf float [ [[MUL_R]], [[ENTRY:%.*]] ], [ [[MUL_R]], [[COMPLEX_MUL_IMAG_NAN]] ], [ [[COERCE_REAL]], [[COMPLEX_MUL_LIBCALL]] ]832// NOINFS-NEXT:    [[IMAG_MUL_PHI:%.*]] = phi ninf float [ [[MUL_I]], [[ENTRY]] ], [ [[MUL_I]], [[COMPLEX_MUL_IMAG_NAN]] ], [ [[COERCE_IMAG]], [[COMPLEX_MUL_LIBCALL]] ]833// NOINFS-NEXT:    [[UNPROMOTION:%.*]] = fptrunc ninf float [[REAL_MUL_PHI]] to half834// NOINFS-NEXT:    [[UNPROMOTION9:%.*]] = fptrunc ninf float [[IMAG_MUL_PHI]] to half835// NOINFS-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0836// NOINFS-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1837// NOINFS-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 2838// NOINFS-NEXT:    store half [[UNPROMOTION9]], ptr [[RETVAL_IMAGP]], align 2839// NOINFS-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2840// NOINFS-NEXT:    ret <2 x half> [[TMP0]]841//842_Complex _Float16 defined_complex_func_f16_ret(_Complex _Float16 c) {843  return c * c;844}845 846// CFINITEONLY: Function Attrs: noinline nounwind optnone847// CFINITEONLY-LABEL: define dso_local nofpclass(nan inf) float @call_variadic848// CFINITEONLY-SAME: (float noundef nofpclass(nan inf) [[F32:%.*]], double noundef nofpclass(nan inf) [[F64:%.*]], half noundef nofpclass(nan inf) [[F16:%.*]], double noundef nofpclass(nan inf) [[V2F32_COERCE:%.*]], <2 x double> noundef nofpclass(nan inf) [[V2F64:%.*]], i32 noundef [[V2F16_COERCE:%.*]], <2 x float> noundef nofpclass(nan inf) [[CF32_COERCE:%.*]], double noundef nofpclass(nan inf) [[CF64_COERCE0:%.*]], double noundef nofpclass(nan inf) [[CF64_COERCE1:%.*]], ptr noundef byval({ half, half }) align 8 [[CF16:%.*]]) #[[ATTR2]] {849// CFINITEONLY-NEXT:  entry:850// CFINITEONLY-NEXT:    [[V2F32:%.*]] = alloca <2 x float>, align 8851// CFINITEONLY-NEXT:    [[V2F16:%.*]] = alloca <2 x half>, align 4852// CFINITEONLY-NEXT:    [[CF32:%.*]] = alloca { float, float }, align 4853// CFINITEONLY-NEXT:    [[CF64:%.*]] = alloca { double, double }, align 8854// CFINITEONLY-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4855// CFINITEONLY-NEXT:    [[F64_ADDR:%.*]] = alloca double, align 8856// CFINITEONLY-NEXT:    [[F16_ADDR:%.*]] = alloca half, align 2857// CFINITEONLY-NEXT:    [[V2F32_ADDR:%.*]] = alloca <2 x float>, align 8858// CFINITEONLY-NEXT:    [[V2F64_ADDR:%.*]] = alloca <2 x double>, align 16859// CFINITEONLY-NEXT:    [[V2F16_ADDR:%.*]] = alloca <2 x half>, align 4860// CFINITEONLY-NEXT:    [[COERCE:%.*]] = alloca <2 x float>, align 8861// CFINITEONLY-NEXT:    [[COERCE3:%.*]] = alloca <2 x half>, align 4862// CFINITEONLY-NEXT:    [[COERCE4:%.*]] = alloca { float, float }, align 4863// CFINITEONLY-NEXT:    [[BYVAL_TEMP:%.*]] = alloca { double, double }, align 8864// CFINITEONLY-NEXT:    [[COERCE5:%.*]] = alloca { half, half }, align 2865// CFINITEONLY-NEXT:    store double [[V2F32_COERCE]], ptr [[V2F32]], align 8866// CFINITEONLY-NEXT:    [[V2F321:%.*]] = load <2 x float>, ptr [[V2F32]], align 8867// CFINITEONLY-NEXT:    store i32 [[V2F16_COERCE]], ptr [[V2F16]], align 4868// CFINITEONLY-NEXT:    [[V2F162:%.*]] = load <2 x half>, ptr [[V2F16]], align 4869// CFINITEONLY-NEXT:    store <2 x float> [[CF32_COERCE]], ptr [[CF32]], align 4870// CFINITEONLY-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 0871// CFINITEONLY-NEXT:    store double [[CF64_COERCE0]], ptr [[TMP0]], align 8872// CFINITEONLY-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 1873// CFINITEONLY-NEXT:    store double [[CF64_COERCE1]], ptr [[TMP1]], align 8874// CFINITEONLY-NEXT:    store float [[F32]], ptr [[F32_ADDR]], align 4875// CFINITEONLY-NEXT:    store double [[F64]], ptr [[F64_ADDR]], align 8876// CFINITEONLY-NEXT:    store half [[F16]], ptr [[F16_ADDR]], align 2877// CFINITEONLY-NEXT:    store <2 x float> [[V2F321]], ptr [[V2F32_ADDR]], align 8878// CFINITEONLY-NEXT:    store <2 x double> [[V2F64]], ptr [[V2F64_ADDR]], align 16879// CFINITEONLY-NEXT:    store <2 x half> [[V2F162]], ptr [[V2F16_ADDR]], align 4880// CFINITEONLY-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR]], align 4881// CFINITEONLY-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR]], align 4882// CFINITEONLY-NEXT:    [[CONV:%.*]] = fpext nnan ninf float [[TMP3]] to double883// CFINITEONLY-NEXT:    [[TMP4:%.*]] = load double, ptr [[F64_ADDR]], align 8884// CFINITEONLY-NEXT:    [[TMP5:%.*]] = load half, ptr [[F16_ADDR]], align 2885// CFINITEONLY-NEXT:    [[TMP6:%.*]] = load <2 x float>, ptr [[V2F32_ADDR]], align 8886// CFINITEONLY-NEXT:    [[TMP7:%.*]] = load <2 x double>, ptr [[V2F64_ADDR]], align 16887// CFINITEONLY-NEXT:    [[TMP8:%.*]] = load <2 x half>, ptr [[V2F16_ADDR]], align 4888// CFINITEONLY-NEXT:    [[CF32_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[CF32]], i32 0, i32 0889// CFINITEONLY-NEXT:    [[CF32_REAL:%.*]] = load float, ptr [[CF32_REALP]], align 4890// CFINITEONLY-NEXT:    [[CF32_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[CF32]], i32 0, i32 1891// CFINITEONLY-NEXT:    [[CF32_IMAG:%.*]] = load float, ptr [[CF32_IMAGP]], align 4892// CFINITEONLY-NEXT:    [[CF64_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 0893// CFINITEONLY-NEXT:    [[CF64_REAL:%.*]] = load double, ptr [[CF64_REALP]], align 8894// CFINITEONLY-NEXT:    [[CF64_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 1895// CFINITEONLY-NEXT:    [[CF64_IMAG:%.*]] = load double, ptr [[CF64_IMAGP]], align 8896// CFINITEONLY-NEXT:    [[CF16_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[CF16]], i32 0, i32 0897// CFINITEONLY-NEXT:    [[CF16_REAL:%.*]] = load half, ptr [[CF16_REALP]], align 8898// CFINITEONLY-NEXT:    [[CF16_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[CF16]], i32 0, i32 1899// CFINITEONLY-NEXT:    [[CF16_IMAG:%.*]] = load half, ptr [[CF16_IMAGP]], align 2900// CFINITEONLY-NEXT:    store <2 x float> [[TMP6]], ptr [[COERCE]], align 8901// CFINITEONLY-NEXT:    [[TMP9:%.*]] = load double, ptr [[COERCE]], align 8902// CFINITEONLY-NEXT:    store <2 x half> [[TMP8]], ptr [[COERCE3]], align 4903// CFINITEONLY-NEXT:    [[TMP10:%.*]] = load i32, ptr [[COERCE3]], align 4904// CFINITEONLY-NEXT:    [[COERCE4_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE4]], i32 0, i32 0905// CFINITEONLY-NEXT:    [[COERCE4_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE4]], i32 0, i32 1906// CFINITEONLY-NEXT:    store float [[CF32_REAL]], ptr [[COERCE4_REALP]], align 4907// CFINITEONLY-NEXT:    store float [[CF32_IMAG]], ptr [[COERCE4_IMAGP]], align 4908// CFINITEONLY-NEXT:    [[TMP11:%.*]] = load <2 x float>, ptr [[COERCE4]], align 4909// CFINITEONLY-NEXT:    [[BYVAL_TEMP_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[BYVAL_TEMP]], i32 0, i32 0910// CFINITEONLY-NEXT:    [[BYVAL_TEMP_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[BYVAL_TEMP]], i32 0, i32 1911// CFINITEONLY-NEXT:    store double [[CF64_REAL]], ptr [[BYVAL_TEMP_REALP]], align 8912// CFINITEONLY-NEXT:    store double [[CF64_IMAG]], ptr [[BYVAL_TEMP_IMAGP]], align 8913// CFINITEONLY-NEXT:    [[COERCE5_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE5]], i32 0, i32 0914// CFINITEONLY-NEXT:    [[COERCE5_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE5]], i32 0, i32 1915// CFINITEONLY-NEXT:    store half [[CF16_REAL]], ptr [[COERCE5_REALP]], align 2916// CFINITEONLY-NEXT:    store half [[CF16_IMAG]], ptr [[COERCE5_IMAGP]], align 2917// CFINITEONLY-NEXT:    [[TMP12:%.*]] = load <2 x half>, ptr [[COERCE5]], align 2918// CFINITEONLY-NEXT:    [[CALL:%.*]] = call nnan ninf nofpclass(nan inf) float (float, ...) @variadic(float noundef nofpclass(nan inf) [[TMP2]], double noundef nofpclass(nan inf) [[CONV]], double noundef nofpclass(nan inf) [[TMP4]], half noundef nofpclass(nan inf) [[TMP5]], double noundef nofpclass(nan inf) [[TMP9]], <2 x double> noundef nofpclass(nan inf) [[TMP7]], i32 noundef [[TMP10]], <2 x float> noundef nofpclass(nan inf) [[TMP11]], ptr noundef byval({ double, double }) align 8 [[BYVAL_TEMP]], <2 x half> noundef nofpclass(nan inf) [[TMP12]])919// CFINITEONLY-NEXT:    ret float [[CALL]]920//921// CLFINITEONLY: Function Attrs: convergent norecurse nounwind922// CLFINITEONLY-LABEL: define dso_local nofpclass(nan inf) float @call_variadic923// CLFINITEONLY-SAME: (float noundef nofpclass(nan inf) [[F32:%.*]], double noundef nofpclass(nan inf) [[F64:%.*]], half noundef nofpclass(nan inf) [[F16:%.*]], double noundef nofpclass(nan inf) [[V2F32_COERCE:%.*]], <2 x double> noundef nofpclass(nan inf) [[V2F64:%.*]], i32 noundef [[V2F16_COERCE:%.*]], <2 x float> noundef nofpclass(nan inf) [[CF32_COERCE:%.*]], double noundef nofpclass(nan inf) [[CF64_COERCE0:%.*]], double noundef nofpclass(nan inf) [[CF64_COERCE1:%.*]], ptr noundef readonly byval({ half, half }) align 8 captures(none) [[CF16:%.*]]) local_unnamed_addr #[[ATTR5]] {924// CLFINITEONLY-NEXT:  entry:925// CLFINITEONLY-NEXT:    [[BYVAL_TEMP:%.*]] = alloca { double, double }, align 8926// CLFINITEONLY-NEXT:    [[CONV:%.*]] = fpext nnan ninf float [[F32]] to double927// CLFINITEONLY-NEXT:    [[CF16_REAL:%.*]] = load half, ptr [[CF16]], align 8928// CLFINITEONLY-NEXT:    [[CF16_IMAGP:%.*]] = getelementptr inbounds nuw i8, ptr [[CF16]], i64 2929// CLFINITEONLY-NEXT:    [[CF16_IMAG:%.*]] = load half, ptr [[CF16_IMAGP]], align 2930// CLFINITEONLY-NEXT:    call void @llvm.lifetime.start.p0(ptr nonnull [[BYVAL_TEMP]]) #[[ATTR12:[0-9]+]]931// CLFINITEONLY-NEXT:    [[BYVAL_TEMP_IMAGP:%.*]] = getelementptr inbounds nuw i8, ptr [[BYVAL_TEMP]], i64 8932// CLFINITEONLY-NEXT:    store double [[CF64_COERCE0]], ptr [[BYVAL_TEMP]], align 8933// CLFINITEONLY-NEXT:    store double [[CF64_COERCE1]], ptr [[BYVAL_TEMP_IMAGP]], align 8934// CLFINITEONLY-NEXT:    [[COERCE5_SROA_0_0_VEC_INSERT:%.*]] = insertelement <2 x half> poison, half [[CF16_REAL]], i64 0935// CLFINITEONLY-NEXT:    [[COERCE5_SROA_0_2_VEC_INSERT:%.*]] = insertelement <2 x half> [[COERCE5_SROA_0_0_VEC_INSERT]], half [[CF16_IMAG]], i64 1936// CLFINITEONLY-NEXT:    [[CALL:%.*]] = tail call nnan ninf nofpclass(nan inf) float (float, ...) @variadic(float noundef nofpclass(nan inf) [[F32]], double noundef nofpclass(nan inf) [[CONV]], double noundef nofpclass(nan inf) [[F64]], half noundef nofpclass(nan inf) [[F16]], double noundef nofpclass(nan inf) [[V2F32_COERCE]], <2 x double> noundef nofpclass(nan inf) [[V2F64]], i32 noundef [[V2F16_COERCE]], <2 x float> noundef nofpclass(nan inf) [[CF32_COERCE]], ptr noundef nonnull byval({ double, double }) align 8 [[BYVAL_TEMP]], <2 x half> noundef nofpclass(nan inf) [[COERCE5_SROA_0_2_VEC_INSERT]]) #[[ATTR11]]937// CLFINITEONLY-NEXT:    call void @llvm.lifetime.end.p0(ptr nonnull [[BYVAL_TEMP]]) #[[ATTR12]]938// CLFINITEONLY-NEXT:    ret float [[CALL]]939//940// NONANS: Function Attrs: noinline nounwind optnone941// NONANS-LABEL: define dso_local nofpclass(nan) float @call_variadic942// NONANS-SAME: (float noundef nofpclass(nan) [[F32:%.*]], double noundef nofpclass(nan) [[F64:%.*]], half noundef nofpclass(nan) [[F16:%.*]], double noundef nofpclass(nan) [[V2F32_COERCE:%.*]], <2 x double> noundef nofpclass(nan) [[V2F64:%.*]], i32 noundef [[V2F16_COERCE:%.*]], <2 x float> noundef nofpclass(nan) [[CF32_COERCE:%.*]], double noundef nofpclass(nan) [[CF64_COERCE0:%.*]], double noundef nofpclass(nan) [[CF64_COERCE1:%.*]], ptr noundef byval({ half, half }) align 8 [[CF16:%.*]]) #[[ATTR2]] {943// NONANS-NEXT:  entry:944// NONANS-NEXT:    [[V2F32:%.*]] = alloca <2 x float>, align 8945// NONANS-NEXT:    [[V2F16:%.*]] = alloca <2 x half>, align 4946// NONANS-NEXT:    [[CF32:%.*]] = alloca { float, float }, align 4947// NONANS-NEXT:    [[CF64:%.*]] = alloca { double, double }, align 8948// NONANS-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4949// NONANS-NEXT:    [[F64_ADDR:%.*]] = alloca double, align 8950// NONANS-NEXT:    [[F16_ADDR:%.*]] = alloca half, align 2951// NONANS-NEXT:    [[V2F32_ADDR:%.*]] = alloca <2 x float>, align 8952// NONANS-NEXT:    [[V2F64_ADDR:%.*]] = alloca <2 x double>, align 16953// NONANS-NEXT:    [[V2F16_ADDR:%.*]] = alloca <2 x half>, align 4954// NONANS-NEXT:    [[COERCE:%.*]] = alloca <2 x float>, align 8955// NONANS-NEXT:    [[COERCE3:%.*]] = alloca <2 x half>, align 4956// NONANS-NEXT:    [[COERCE4:%.*]] = alloca { float, float }, align 4957// NONANS-NEXT:    [[BYVAL_TEMP:%.*]] = alloca { double, double }, align 8958// NONANS-NEXT:    [[COERCE5:%.*]] = alloca { half, half }, align 2959// NONANS-NEXT:    store double [[V2F32_COERCE]], ptr [[V2F32]], align 8960// NONANS-NEXT:    [[V2F321:%.*]] = load <2 x float>, ptr [[V2F32]], align 8961// NONANS-NEXT:    store i32 [[V2F16_COERCE]], ptr [[V2F16]], align 4962// NONANS-NEXT:    [[V2F162:%.*]] = load <2 x half>, ptr [[V2F16]], align 4963// NONANS-NEXT:    store <2 x float> [[CF32_COERCE]], ptr [[CF32]], align 4964// NONANS-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 0965// NONANS-NEXT:    store double [[CF64_COERCE0]], ptr [[TMP0]], align 8966// NONANS-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 1967// NONANS-NEXT:    store double [[CF64_COERCE1]], ptr [[TMP1]], align 8968// NONANS-NEXT:    store float [[F32]], ptr [[F32_ADDR]], align 4969// NONANS-NEXT:    store double [[F64]], ptr [[F64_ADDR]], align 8970// NONANS-NEXT:    store half [[F16]], ptr [[F16_ADDR]], align 2971// NONANS-NEXT:    store <2 x float> [[V2F321]], ptr [[V2F32_ADDR]], align 8972// NONANS-NEXT:    store <2 x double> [[V2F64]], ptr [[V2F64_ADDR]], align 16973// NONANS-NEXT:    store <2 x half> [[V2F162]], ptr [[V2F16_ADDR]], align 4974// NONANS-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR]], align 4975// NONANS-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR]], align 4976// NONANS-NEXT:    [[CONV:%.*]] = fpext nnan float [[TMP3]] to double977// NONANS-NEXT:    [[TMP4:%.*]] = load double, ptr [[F64_ADDR]], align 8978// NONANS-NEXT:    [[TMP5:%.*]] = load half, ptr [[F16_ADDR]], align 2979// NONANS-NEXT:    [[TMP6:%.*]] = load <2 x float>, ptr [[V2F32_ADDR]], align 8980// NONANS-NEXT:    [[TMP7:%.*]] = load <2 x double>, ptr [[V2F64_ADDR]], align 16981// NONANS-NEXT:    [[TMP8:%.*]] = load <2 x half>, ptr [[V2F16_ADDR]], align 4982// NONANS-NEXT:    [[CF32_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[CF32]], i32 0, i32 0983// NONANS-NEXT:    [[CF32_REAL:%.*]] = load float, ptr [[CF32_REALP]], align 4984// NONANS-NEXT:    [[CF32_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[CF32]], i32 0, i32 1985// NONANS-NEXT:    [[CF32_IMAG:%.*]] = load float, ptr [[CF32_IMAGP]], align 4986// NONANS-NEXT:    [[CF64_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 0987// NONANS-NEXT:    [[CF64_REAL:%.*]] = load double, ptr [[CF64_REALP]], align 8988// NONANS-NEXT:    [[CF64_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 1989// NONANS-NEXT:    [[CF64_IMAG:%.*]] = load double, ptr [[CF64_IMAGP]], align 8990// NONANS-NEXT:    [[CF16_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[CF16]], i32 0, i32 0991// NONANS-NEXT:    [[CF16_REAL:%.*]] = load half, ptr [[CF16_REALP]], align 8992// NONANS-NEXT:    [[CF16_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[CF16]], i32 0, i32 1993// NONANS-NEXT:    [[CF16_IMAG:%.*]] = load half, ptr [[CF16_IMAGP]], align 2994// NONANS-NEXT:    store <2 x float> [[TMP6]], ptr [[COERCE]], align 8995// NONANS-NEXT:    [[TMP9:%.*]] = load double, ptr [[COERCE]], align 8996// NONANS-NEXT:    store <2 x half> [[TMP8]], ptr [[COERCE3]], align 4997// NONANS-NEXT:    [[TMP10:%.*]] = load i32, ptr [[COERCE3]], align 4998// NONANS-NEXT:    [[COERCE4_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE4]], i32 0, i32 0999// NONANS-NEXT:    [[COERCE4_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE4]], i32 0, i32 11000// NONANS-NEXT:    store float [[CF32_REAL]], ptr [[COERCE4_REALP]], align 41001// NONANS-NEXT:    store float [[CF32_IMAG]], ptr [[COERCE4_IMAGP]], align 41002// NONANS-NEXT:    [[TMP11:%.*]] = load <2 x float>, ptr [[COERCE4]], align 41003// NONANS-NEXT:    [[BYVAL_TEMP_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[BYVAL_TEMP]], i32 0, i32 01004// NONANS-NEXT:    [[BYVAL_TEMP_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[BYVAL_TEMP]], i32 0, i32 11005// NONANS-NEXT:    store double [[CF64_REAL]], ptr [[BYVAL_TEMP_REALP]], align 81006// NONANS-NEXT:    store double [[CF64_IMAG]], ptr [[BYVAL_TEMP_IMAGP]], align 81007// NONANS-NEXT:    [[COERCE5_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE5]], i32 0, i32 01008// NONANS-NEXT:    [[COERCE5_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE5]], i32 0, i32 11009// NONANS-NEXT:    store half [[CF16_REAL]], ptr [[COERCE5_REALP]], align 21010// NONANS-NEXT:    store half [[CF16_IMAG]], ptr [[COERCE5_IMAGP]], align 21011// NONANS-NEXT:    [[TMP12:%.*]] = load <2 x half>, ptr [[COERCE5]], align 21012// NONANS-NEXT:    [[CALL:%.*]] = call nnan nofpclass(nan) float (float, ...) @variadic(float noundef nofpclass(nan) [[TMP2]], double noundef nofpclass(nan) [[CONV]], double noundef nofpclass(nan) [[TMP4]], half noundef nofpclass(nan) [[TMP5]], double noundef nofpclass(nan) [[TMP9]], <2 x double> noundef nofpclass(nan) [[TMP7]], i32 noundef [[TMP10]], <2 x float> noundef nofpclass(nan) [[TMP11]], ptr noundef byval({ double, double }) align 8 [[BYVAL_TEMP]], <2 x half> noundef nofpclass(nan) [[TMP12]])1013// NONANS-NEXT:    ret float [[CALL]]1014//1015// NOINFS: Function Attrs: noinline nounwind optnone1016// NOINFS-LABEL: define dso_local nofpclass(inf) float @call_variadic1017// NOINFS-SAME: (float noundef nofpclass(inf) [[F32:%.*]], double noundef nofpclass(inf) [[F64:%.*]], half noundef nofpclass(inf) [[F16:%.*]], double noundef nofpclass(inf) [[V2F32_COERCE:%.*]], <2 x double> noundef nofpclass(inf) [[V2F64:%.*]], i32 noundef [[V2F16_COERCE:%.*]], <2 x float> noundef nofpclass(inf) [[CF32_COERCE:%.*]], double noundef nofpclass(inf) [[CF64_COERCE0:%.*]], double noundef nofpclass(inf) [[CF64_COERCE1:%.*]], ptr noundef byval({ half, half }) align 8 [[CF16:%.*]]) #[[ATTR2]] {1018// NOINFS-NEXT:  entry:1019// NOINFS-NEXT:    [[V2F32:%.*]] = alloca <2 x float>, align 81020// NOINFS-NEXT:    [[V2F16:%.*]] = alloca <2 x half>, align 41021// NOINFS-NEXT:    [[CF32:%.*]] = alloca { float, float }, align 41022// NOINFS-NEXT:    [[CF64:%.*]] = alloca { double, double }, align 81023// NOINFS-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 41024// NOINFS-NEXT:    [[F64_ADDR:%.*]] = alloca double, align 81025// NOINFS-NEXT:    [[F16_ADDR:%.*]] = alloca half, align 21026// NOINFS-NEXT:    [[V2F32_ADDR:%.*]] = alloca <2 x float>, align 81027// NOINFS-NEXT:    [[V2F64_ADDR:%.*]] = alloca <2 x double>, align 161028// NOINFS-NEXT:    [[V2F16_ADDR:%.*]] = alloca <2 x half>, align 41029// NOINFS-NEXT:    [[COERCE:%.*]] = alloca <2 x float>, align 81030// NOINFS-NEXT:    [[COERCE3:%.*]] = alloca <2 x half>, align 41031// NOINFS-NEXT:    [[COERCE4:%.*]] = alloca { float, float }, align 41032// NOINFS-NEXT:    [[BYVAL_TEMP:%.*]] = alloca { double, double }, align 81033// NOINFS-NEXT:    [[COERCE5:%.*]] = alloca { half, half }, align 21034// NOINFS-NEXT:    store double [[V2F32_COERCE]], ptr [[V2F32]], align 81035// NOINFS-NEXT:    [[V2F321:%.*]] = load <2 x float>, ptr [[V2F32]], align 81036// NOINFS-NEXT:    store i32 [[V2F16_COERCE]], ptr [[V2F16]], align 41037// NOINFS-NEXT:    [[V2F162:%.*]] = load <2 x half>, ptr [[V2F16]], align 41038// NOINFS-NEXT:    store <2 x float> [[CF32_COERCE]], ptr [[CF32]], align 41039// NOINFS-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 01040// NOINFS-NEXT:    store double [[CF64_COERCE0]], ptr [[TMP0]], align 81041// NOINFS-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 11042// NOINFS-NEXT:    store double [[CF64_COERCE1]], ptr [[TMP1]], align 81043// NOINFS-NEXT:    store float [[F32]], ptr [[F32_ADDR]], align 41044// NOINFS-NEXT:    store double [[F64]], ptr [[F64_ADDR]], align 81045// NOINFS-NEXT:    store half [[F16]], ptr [[F16_ADDR]], align 21046// NOINFS-NEXT:    store <2 x float> [[V2F321]], ptr [[V2F32_ADDR]], align 81047// NOINFS-NEXT:    store <2 x double> [[V2F64]], ptr [[V2F64_ADDR]], align 161048// NOINFS-NEXT:    store <2 x half> [[V2F162]], ptr [[V2F16_ADDR]], align 41049// NOINFS-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR]], align 41050// NOINFS-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR]], align 41051// NOINFS-NEXT:    [[CONV:%.*]] = fpext ninf float [[TMP3]] to double1052// NOINFS-NEXT:    [[TMP4:%.*]] = load double, ptr [[F64_ADDR]], align 81053// NOINFS-NEXT:    [[TMP5:%.*]] = load half, ptr [[F16_ADDR]], align 21054// NOINFS-NEXT:    [[TMP6:%.*]] = load <2 x float>, ptr [[V2F32_ADDR]], align 81055// NOINFS-NEXT:    [[TMP7:%.*]] = load <2 x double>, ptr [[V2F64_ADDR]], align 161056// NOINFS-NEXT:    [[TMP8:%.*]] = load <2 x half>, ptr [[V2F16_ADDR]], align 41057// NOINFS-NEXT:    [[CF32_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[CF32]], i32 0, i32 01058// NOINFS-NEXT:    [[CF32_REAL:%.*]] = load float, ptr [[CF32_REALP]], align 41059// NOINFS-NEXT:    [[CF32_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[CF32]], i32 0, i32 11060// NOINFS-NEXT:    [[CF32_IMAG:%.*]] = load float, ptr [[CF32_IMAGP]], align 41061// NOINFS-NEXT:    [[CF64_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 01062// NOINFS-NEXT:    [[CF64_REAL:%.*]] = load double, ptr [[CF64_REALP]], align 81063// NOINFS-NEXT:    [[CF64_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 11064// NOINFS-NEXT:    [[CF64_IMAG:%.*]] = load double, ptr [[CF64_IMAGP]], align 81065// NOINFS-NEXT:    [[CF16_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[CF16]], i32 0, i32 01066// NOINFS-NEXT:    [[CF16_REAL:%.*]] = load half, ptr [[CF16_REALP]], align 81067// NOINFS-NEXT:    [[CF16_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[CF16]], i32 0, i32 11068// NOINFS-NEXT:    [[CF16_IMAG:%.*]] = load half, ptr [[CF16_IMAGP]], align 21069// NOINFS-NEXT:    store <2 x float> [[TMP6]], ptr [[COERCE]], align 81070// NOINFS-NEXT:    [[TMP9:%.*]] = load double, ptr [[COERCE]], align 81071// NOINFS-NEXT:    store <2 x half> [[TMP8]], ptr [[COERCE3]], align 41072// NOINFS-NEXT:    [[TMP10:%.*]] = load i32, ptr [[COERCE3]], align 41073// NOINFS-NEXT:    [[COERCE4_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE4]], i32 0, i32 01074// NOINFS-NEXT:    [[COERCE4_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE4]], i32 0, i32 11075// NOINFS-NEXT:    store float [[CF32_REAL]], ptr [[COERCE4_REALP]], align 41076// NOINFS-NEXT:    store float [[CF32_IMAG]], ptr [[COERCE4_IMAGP]], align 41077// NOINFS-NEXT:    [[TMP11:%.*]] = load <2 x float>, ptr [[COERCE4]], align 41078// NOINFS-NEXT:    [[BYVAL_TEMP_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[BYVAL_TEMP]], i32 0, i32 01079// NOINFS-NEXT:    [[BYVAL_TEMP_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[BYVAL_TEMP]], i32 0, i32 11080// NOINFS-NEXT:    store double [[CF64_REAL]], ptr [[BYVAL_TEMP_REALP]], align 81081// NOINFS-NEXT:    store double [[CF64_IMAG]], ptr [[BYVAL_TEMP_IMAGP]], align 81082// NOINFS-NEXT:    [[COERCE5_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE5]], i32 0, i32 01083// NOINFS-NEXT:    [[COERCE5_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE5]], i32 0, i32 11084// NOINFS-NEXT:    store half [[CF16_REAL]], ptr [[COERCE5_REALP]], align 21085// NOINFS-NEXT:    store half [[CF16_IMAG]], ptr [[COERCE5_IMAGP]], align 21086// NOINFS-NEXT:    [[TMP12:%.*]] = load <2 x half>, ptr [[COERCE5]], align 21087// NOINFS-NEXT:    [[CALL:%.*]] = call ninf nofpclass(inf) float (float, ...) @variadic(float noundef nofpclass(inf) [[TMP2]], double noundef nofpclass(inf) [[CONV]], double noundef nofpclass(inf) [[TMP4]], half noundef nofpclass(inf) [[TMP5]], double noundef nofpclass(inf) [[TMP9]], <2 x double> noundef nofpclass(inf) [[TMP7]], i32 noundef [[TMP10]], <2 x float> noundef nofpclass(inf) [[TMP11]], ptr noundef byval({ double, double }) align 8 [[BYVAL_TEMP]], <2 x half> noundef nofpclass(inf) [[TMP12]])1088// NOINFS-NEXT:    ret float [[CALL]]1089//1090float call_variadic(float f32, double f64, _Float16 f16,1091                    float2 v2f32, double2 v2f64, half2 v2f16,1092                    _Complex float cf32, _Complex double cf64, _Complex _Float16 cf16) {1093  return variadic(f32, f32, f64, f16, v2f32, v2f64, v2f16, cf32, cf64, cf16);1094}1095 1096// CFINITEONLY: Function Attrs: noinline nounwind optnone1097// CFINITEONLY-LABEL: define dso_local nofpclass(nan inf) float @call_variadic_indirect1098// CFINITEONLY-SAME: (ptr noundef [[FPTR:%.*]], float noundef nofpclass(nan inf) [[F32:%.*]], double noundef nofpclass(nan inf) [[F64:%.*]], half noundef nofpclass(nan inf) [[F16:%.*]], double noundef nofpclass(nan inf) [[V2F32_COERCE:%.*]], <2 x double> noundef nofpclass(nan inf) [[V2F64:%.*]], i32 noundef [[V2F16_COERCE:%.*]], <2 x float> noundef nofpclass(nan inf) [[CF32_COERCE:%.*]], double noundef nofpclass(nan inf) [[CF64_COERCE0:%.*]], double noundef nofpclass(nan inf) [[CF64_COERCE1:%.*]], ptr noundef byval({ half, half }) align 8 [[CF16:%.*]]) #[[ATTR2]] {1099// CFINITEONLY-NEXT:  entry:1100// CFINITEONLY-NEXT:    [[V2F32:%.*]] = alloca <2 x float>, align 81101// CFINITEONLY-NEXT:    [[V2F16:%.*]] = alloca <2 x half>, align 41102// CFINITEONLY-NEXT:    [[CF32:%.*]] = alloca { float, float }, align 41103// CFINITEONLY-NEXT:    [[CF64:%.*]] = alloca { double, double }, align 81104// CFINITEONLY-NEXT:    [[FPTR_ADDR:%.*]] = alloca ptr, align 81105// CFINITEONLY-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 41106// CFINITEONLY-NEXT:    [[F64_ADDR:%.*]] = alloca double, align 81107// CFINITEONLY-NEXT:    [[F16_ADDR:%.*]] = alloca half, align 21108// CFINITEONLY-NEXT:    [[V2F32_ADDR:%.*]] = alloca <2 x float>, align 81109// CFINITEONLY-NEXT:    [[V2F64_ADDR:%.*]] = alloca <2 x double>, align 161110// CFINITEONLY-NEXT:    [[V2F16_ADDR:%.*]] = alloca <2 x half>, align 41111// CFINITEONLY-NEXT:    [[COERCE:%.*]] = alloca <2 x float>, align 81112// CFINITEONLY-NEXT:    [[COERCE3:%.*]] = alloca <2 x half>, align 41113// CFINITEONLY-NEXT:    [[COERCE4:%.*]] = alloca { float, float }, align 41114// CFINITEONLY-NEXT:    [[BYVAL_TEMP:%.*]] = alloca { double, double }, align 81115// CFINITEONLY-NEXT:    [[COERCE5:%.*]] = alloca { half, half }, align 21116// CFINITEONLY-NEXT:    store double [[V2F32_COERCE]], ptr [[V2F32]], align 81117// CFINITEONLY-NEXT:    [[V2F321:%.*]] = load <2 x float>, ptr [[V2F32]], align 81118// CFINITEONLY-NEXT:    store i32 [[V2F16_COERCE]], ptr [[V2F16]], align 41119// CFINITEONLY-NEXT:    [[V2F162:%.*]] = load <2 x half>, ptr [[V2F16]], align 41120// CFINITEONLY-NEXT:    store <2 x float> [[CF32_COERCE]], ptr [[CF32]], align 41121// CFINITEONLY-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 01122// CFINITEONLY-NEXT:    store double [[CF64_COERCE0]], ptr [[TMP0]], align 81123// CFINITEONLY-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 11124// CFINITEONLY-NEXT:    store double [[CF64_COERCE1]], ptr [[TMP1]], align 81125// CFINITEONLY-NEXT:    store ptr [[FPTR]], ptr [[FPTR_ADDR]], align 81126// CFINITEONLY-NEXT:    store float [[F32]], ptr [[F32_ADDR]], align 41127// CFINITEONLY-NEXT:    store double [[F64]], ptr [[F64_ADDR]], align 81128// CFINITEONLY-NEXT:    store half [[F16]], ptr [[F16_ADDR]], align 21129// CFINITEONLY-NEXT:    store <2 x float> [[V2F321]], ptr [[V2F32_ADDR]], align 81130// CFINITEONLY-NEXT:    store <2 x double> [[V2F64]], ptr [[V2F64_ADDR]], align 161131// CFINITEONLY-NEXT:    store <2 x half> [[V2F162]], ptr [[V2F16_ADDR]], align 41132// CFINITEONLY-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[FPTR_ADDR]], align 81133// CFINITEONLY-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR]], align 41134// CFINITEONLY-NEXT:    [[TMP4:%.*]] = load float, ptr [[F32_ADDR]], align 41135// CFINITEONLY-NEXT:    [[CONV:%.*]] = fpext nnan ninf float [[TMP4]] to double1136// CFINITEONLY-NEXT:    [[TMP5:%.*]] = load double, ptr [[F64_ADDR]], align 81137// CFINITEONLY-NEXT:    [[TMP6:%.*]] = load half, ptr [[F16_ADDR]], align 21138// CFINITEONLY-NEXT:    [[TMP7:%.*]] = load <2 x float>, ptr [[V2F32_ADDR]], align 81139// CFINITEONLY-NEXT:    [[TMP8:%.*]] = load <2 x double>, ptr [[V2F64_ADDR]], align 161140// CFINITEONLY-NEXT:    [[TMP9:%.*]] = load <2 x half>, ptr [[V2F16_ADDR]], align 41141// CFINITEONLY-NEXT:    [[CF32_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[CF32]], i32 0, i32 01142// CFINITEONLY-NEXT:    [[CF32_REAL:%.*]] = load float, ptr [[CF32_REALP]], align 41143// CFINITEONLY-NEXT:    [[CF32_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[CF32]], i32 0, i32 11144// CFINITEONLY-NEXT:    [[CF32_IMAG:%.*]] = load float, ptr [[CF32_IMAGP]], align 41145// CFINITEONLY-NEXT:    [[CF64_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 01146// CFINITEONLY-NEXT:    [[CF64_REAL:%.*]] = load double, ptr [[CF64_REALP]], align 81147// CFINITEONLY-NEXT:    [[CF64_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 11148// CFINITEONLY-NEXT:    [[CF64_IMAG:%.*]] = load double, ptr [[CF64_IMAGP]], align 81149// CFINITEONLY-NEXT:    [[CF16_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[CF16]], i32 0, i32 01150// CFINITEONLY-NEXT:    [[CF16_REAL:%.*]] = load half, ptr [[CF16_REALP]], align 81151// CFINITEONLY-NEXT:    [[CF16_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[CF16]], i32 0, i32 11152// CFINITEONLY-NEXT:    [[CF16_IMAG:%.*]] = load half, ptr [[CF16_IMAGP]], align 21153// CFINITEONLY-NEXT:    store <2 x float> [[TMP7]], ptr [[COERCE]], align 81154// CFINITEONLY-NEXT:    [[TMP10:%.*]] = load double, ptr [[COERCE]], align 81155// CFINITEONLY-NEXT:    store <2 x half> [[TMP9]], ptr [[COERCE3]], align 41156// CFINITEONLY-NEXT:    [[TMP11:%.*]] = load i32, ptr [[COERCE3]], align 41157// CFINITEONLY-NEXT:    [[COERCE4_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE4]], i32 0, i32 01158// CFINITEONLY-NEXT:    [[COERCE4_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE4]], i32 0, i32 11159// CFINITEONLY-NEXT:    store float [[CF32_REAL]], ptr [[COERCE4_REALP]], align 41160// CFINITEONLY-NEXT:    store float [[CF32_IMAG]], ptr [[COERCE4_IMAGP]], align 41161// CFINITEONLY-NEXT:    [[TMP12:%.*]] = load <2 x float>, ptr [[COERCE4]], align 41162// CFINITEONLY-NEXT:    [[BYVAL_TEMP_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[BYVAL_TEMP]], i32 0, i32 01163// CFINITEONLY-NEXT:    [[BYVAL_TEMP_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[BYVAL_TEMP]], i32 0, i32 11164// CFINITEONLY-NEXT:    store double [[CF64_REAL]], ptr [[BYVAL_TEMP_REALP]], align 81165// CFINITEONLY-NEXT:    store double [[CF64_IMAG]], ptr [[BYVAL_TEMP_IMAGP]], align 81166// CFINITEONLY-NEXT:    [[COERCE5_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE5]], i32 0, i32 01167// CFINITEONLY-NEXT:    [[COERCE5_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE5]], i32 0, i32 11168// CFINITEONLY-NEXT:    store half [[CF16_REAL]], ptr [[COERCE5_REALP]], align 21169// CFINITEONLY-NEXT:    store half [[CF16_IMAG]], ptr [[COERCE5_IMAGP]], align 21170// CFINITEONLY-NEXT:    [[TMP13:%.*]] = load <2 x half>, ptr [[COERCE5]], align 21171// CFINITEONLY-NEXT:    [[CALL:%.*]] = call nnan ninf nofpclass(nan inf) float (float, ...) [[TMP2]](float noundef nofpclass(nan inf) [[TMP3]], double noundef nofpclass(nan inf) [[CONV]], double noundef nofpclass(nan inf) [[TMP5]], half noundef nofpclass(nan inf) [[TMP6]], double noundef nofpclass(nan inf) [[TMP10]], <2 x double> noundef nofpclass(nan inf) [[TMP8]], i32 noundef [[TMP11]], <2 x float> noundef nofpclass(nan inf) [[TMP12]], ptr noundef byval({ double, double }) align 8 [[BYVAL_TEMP]], <2 x half> noundef nofpclass(nan inf) [[TMP13]])1172// CFINITEONLY-NEXT:    ret float [[CALL]]1173//1174// CLFINITEONLY: Function Attrs: convergent norecurse nounwind1175// CLFINITEONLY-LABEL: define dso_local nofpclass(nan inf) float @call_variadic_indirect1176// CLFINITEONLY-SAME: (ptr noundef readonly captures(none) [[FPTR:%.*]], float noundef nofpclass(nan inf) [[F32:%.*]], double noundef nofpclass(nan inf) [[F64:%.*]], half noundef nofpclass(nan inf) [[F16:%.*]], double noundef nofpclass(nan inf) [[V2F32_COERCE:%.*]], <2 x double> noundef nofpclass(nan inf) [[V2F64:%.*]], i32 noundef [[V2F16_COERCE:%.*]], <2 x float> noundef nofpclass(nan inf) [[CF32_COERCE:%.*]], double noundef nofpclass(nan inf) [[CF64_COERCE0:%.*]], double noundef nofpclass(nan inf) [[CF64_COERCE1:%.*]], ptr noundef readonly byval({ half, half }) align 8 captures(none) [[CF16:%.*]]) local_unnamed_addr #[[ATTR5]] {1177// CLFINITEONLY-NEXT:  entry:1178// CLFINITEONLY-NEXT:    [[BYVAL_TEMP:%.*]] = alloca { double, double }, align 81179// CLFINITEONLY-NEXT:    [[CONV:%.*]] = fpext nnan ninf float [[F32]] to double1180// CLFINITEONLY-NEXT:    [[CF16_REAL:%.*]] = load half, ptr [[CF16]], align 81181// CLFINITEONLY-NEXT:    [[CF16_IMAGP:%.*]] = getelementptr inbounds nuw i8, ptr [[CF16]], i64 21182// CLFINITEONLY-NEXT:    [[CF16_IMAG:%.*]] = load half, ptr [[CF16_IMAGP]], align 21183// CLFINITEONLY-NEXT:    call void @llvm.lifetime.start.p0(ptr nonnull [[BYVAL_TEMP]]) #[[ATTR12]]1184// CLFINITEONLY-NEXT:    [[BYVAL_TEMP_IMAGP:%.*]] = getelementptr inbounds nuw i8, ptr [[BYVAL_TEMP]], i64 81185// CLFINITEONLY-NEXT:    store double [[CF64_COERCE0]], ptr [[BYVAL_TEMP]], align 81186// CLFINITEONLY-NEXT:    store double [[CF64_COERCE1]], ptr [[BYVAL_TEMP_IMAGP]], align 81187// CLFINITEONLY-NEXT:    [[COERCE5_SROA_0_0_VEC_INSERT:%.*]] = insertelement <2 x half> poison, half [[CF16_REAL]], i64 01188// CLFINITEONLY-NEXT:    [[COERCE5_SROA_0_2_VEC_INSERT:%.*]] = insertelement <2 x half> [[COERCE5_SROA_0_0_VEC_INSERT]], half [[CF16_IMAG]], i64 11189// CLFINITEONLY-NEXT:    [[CALL:%.*]] = tail call nnan ninf nofpclass(nan inf) float (float, ...) [[FPTR]](float noundef nofpclass(nan inf) [[F32]], double noundef nofpclass(nan inf) [[CONV]], double noundef nofpclass(nan inf) [[F64]], half noundef nofpclass(nan inf) [[F16]], double noundef nofpclass(nan inf) [[V2F32_COERCE]], <2 x double> noundef nofpclass(nan inf) [[V2F64]], i32 noundef [[V2F16_COERCE]], <2 x float> noundef nofpclass(nan inf) [[CF32_COERCE]], ptr noundef nonnull byval({ double, double }) align 8 [[BYVAL_TEMP]], <2 x half> noundef nofpclass(nan inf) [[COERCE5_SROA_0_2_VEC_INSERT]]) #[[ATTR11]]1190// CLFINITEONLY-NEXT:    call void @llvm.lifetime.end.p0(ptr nonnull [[BYVAL_TEMP]]) #[[ATTR12]]1191// CLFINITEONLY-NEXT:    ret float [[CALL]]1192//1193// NONANS: Function Attrs: noinline nounwind optnone1194// NONANS-LABEL: define dso_local nofpclass(nan) float @call_variadic_indirect1195// NONANS-SAME: (ptr noundef [[FPTR:%.*]], float noundef nofpclass(nan) [[F32:%.*]], double noundef nofpclass(nan) [[F64:%.*]], half noundef nofpclass(nan) [[F16:%.*]], double noundef nofpclass(nan) [[V2F32_COERCE:%.*]], <2 x double> noundef nofpclass(nan) [[V2F64:%.*]], i32 noundef [[V2F16_COERCE:%.*]], <2 x float> noundef nofpclass(nan) [[CF32_COERCE:%.*]], double noundef nofpclass(nan) [[CF64_COERCE0:%.*]], double noundef nofpclass(nan) [[CF64_COERCE1:%.*]], ptr noundef byval({ half, half }) align 8 [[CF16:%.*]]) #[[ATTR2]] {1196// NONANS-NEXT:  entry:1197// NONANS-NEXT:    [[V2F32:%.*]] = alloca <2 x float>, align 81198// NONANS-NEXT:    [[V2F16:%.*]] = alloca <2 x half>, align 41199// NONANS-NEXT:    [[CF32:%.*]] = alloca { float, float }, align 41200// NONANS-NEXT:    [[CF64:%.*]] = alloca { double, double }, align 81201// NONANS-NEXT:    [[FPTR_ADDR:%.*]] = alloca ptr, align 81202// NONANS-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 41203// NONANS-NEXT:    [[F64_ADDR:%.*]] = alloca double, align 81204// NONANS-NEXT:    [[F16_ADDR:%.*]] = alloca half, align 21205// NONANS-NEXT:    [[V2F32_ADDR:%.*]] = alloca <2 x float>, align 81206// NONANS-NEXT:    [[V2F64_ADDR:%.*]] = alloca <2 x double>, align 161207// NONANS-NEXT:    [[V2F16_ADDR:%.*]] = alloca <2 x half>, align 41208// NONANS-NEXT:    [[COERCE:%.*]] = alloca <2 x float>, align 81209// NONANS-NEXT:    [[COERCE3:%.*]] = alloca <2 x half>, align 41210// NONANS-NEXT:    [[COERCE4:%.*]] = alloca { float, float }, align 41211// NONANS-NEXT:    [[BYVAL_TEMP:%.*]] = alloca { double, double }, align 81212// NONANS-NEXT:    [[COERCE5:%.*]] = alloca { half, half }, align 21213// NONANS-NEXT:    store double [[V2F32_COERCE]], ptr [[V2F32]], align 81214// NONANS-NEXT:    [[V2F321:%.*]] = load <2 x float>, ptr [[V2F32]], align 81215// NONANS-NEXT:    store i32 [[V2F16_COERCE]], ptr [[V2F16]], align 41216// NONANS-NEXT:    [[V2F162:%.*]] = load <2 x half>, ptr [[V2F16]], align 41217// NONANS-NEXT:    store <2 x float> [[CF32_COERCE]], ptr [[CF32]], align 41218// NONANS-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 01219// NONANS-NEXT:    store double [[CF64_COERCE0]], ptr [[TMP0]], align 81220// NONANS-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 11221// NONANS-NEXT:    store double [[CF64_COERCE1]], ptr [[TMP1]], align 81222// NONANS-NEXT:    store ptr [[FPTR]], ptr [[FPTR_ADDR]], align 81223// NONANS-NEXT:    store float [[F32]], ptr [[F32_ADDR]], align 41224// NONANS-NEXT:    store double [[F64]], ptr [[F64_ADDR]], align 81225// NONANS-NEXT:    store half [[F16]], ptr [[F16_ADDR]], align 21226// NONANS-NEXT:    store <2 x float> [[V2F321]], ptr [[V2F32_ADDR]], align 81227// NONANS-NEXT:    store <2 x double> [[V2F64]], ptr [[V2F64_ADDR]], align 161228// NONANS-NEXT:    store <2 x half> [[V2F162]], ptr [[V2F16_ADDR]], align 41229// NONANS-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[FPTR_ADDR]], align 81230// NONANS-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR]], align 41231// NONANS-NEXT:    [[TMP4:%.*]] = load float, ptr [[F32_ADDR]], align 41232// NONANS-NEXT:    [[CONV:%.*]] = fpext nnan float [[TMP4]] to double1233// NONANS-NEXT:    [[TMP5:%.*]] = load double, ptr [[F64_ADDR]], align 81234// NONANS-NEXT:    [[TMP6:%.*]] = load half, ptr [[F16_ADDR]], align 21235// NONANS-NEXT:    [[TMP7:%.*]] = load <2 x float>, ptr [[V2F32_ADDR]], align 81236// NONANS-NEXT:    [[TMP8:%.*]] = load <2 x double>, ptr [[V2F64_ADDR]], align 161237// NONANS-NEXT:    [[TMP9:%.*]] = load <2 x half>, ptr [[V2F16_ADDR]], align 41238// NONANS-NEXT:    [[CF32_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[CF32]], i32 0, i32 01239// NONANS-NEXT:    [[CF32_REAL:%.*]] = load float, ptr [[CF32_REALP]], align 41240// NONANS-NEXT:    [[CF32_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[CF32]], i32 0, i32 11241// NONANS-NEXT:    [[CF32_IMAG:%.*]] = load float, ptr [[CF32_IMAGP]], align 41242// NONANS-NEXT:    [[CF64_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 01243// NONANS-NEXT:    [[CF64_REAL:%.*]] = load double, ptr [[CF64_REALP]], align 81244// NONANS-NEXT:    [[CF64_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 11245// NONANS-NEXT:    [[CF64_IMAG:%.*]] = load double, ptr [[CF64_IMAGP]], align 81246// NONANS-NEXT:    [[CF16_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[CF16]], i32 0, i32 01247// NONANS-NEXT:    [[CF16_REAL:%.*]] = load half, ptr [[CF16_REALP]], align 81248// NONANS-NEXT:    [[CF16_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[CF16]], i32 0, i32 11249// NONANS-NEXT:    [[CF16_IMAG:%.*]] = load half, ptr [[CF16_IMAGP]], align 21250// NONANS-NEXT:    store <2 x float> [[TMP7]], ptr [[COERCE]], align 81251// NONANS-NEXT:    [[TMP10:%.*]] = load double, ptr [[COERCE]], align 81252// NONANS-NEXT:    store <2 x half> [[TMP9]], ptr [[COERCE3]], align 41253// NONANS-NEXT:    [[TMP11:%.*]] = load i32, ptr [[COERCE3]], align 41254// NONANS-NEXT:    [[COERCE4_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE4]], i32 0, i32 01255// NONANS-NEXT:    [[COERCE4_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE4]], i32 0, i32 11256// NONANS-NEXT:    store float [[CF32_REAL]], ptr [[COERCE4_REALP]], align 41257// NONANS-NEXT:    store float [[CF32_IMAG]], ptr [[COERCE4_IMAGP]], align 41258// NONANS-NEXT:    [[TMP12:%.*]] = load <2 x float>, ptr [[COERCE4]], align 41259// NONANS-NEXT:    [[BYVAL_TEMP_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[BYVAL_TEMP]], i32 0, i32 01260// NONANS-NEXT:    [[BYVAL_TEMP_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[BYVAL_TEMP]], i32 0, i32 11261// NONANS-NEXT:    store double [[CF64_REAL]], ptr [[BYVAL_TEMP_REALP]], align 81262// NONANS-NEXT:    store double [[CF64_IMAG]], ptr [[BYVAL_TEMP_IMAGP]], align 81263// NONANS-NEXT:    [[COERCE5_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE5]], i32 0, i32 01264// NONANS-NEXT:    [[COERCE5_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE5]], i32 0, i32 11265// NONANS-NEXT:    store half [[CF16_REAL]], ptr [[COERCE5_REALP]], align 21266// NONANS-NEXT:    store half [[CF16_IMAG]], ptr [[COERCE5_IMAGP]], align 21267// NONANS-NEXT:    [[TMP13:%.*]] = load <2 x half>, ptr [[COERCE5]], align 21268// NONANS-NEXT:    [[CALL:%.*]] = call nnan nofpclass(nan) float (float, ...) [[TMP2]](float noundef nofpclass(nan) [[TMP3]], double noundef nofpclass(nan) [[CONV]], double noundef nofpclass(nan) [[TMP5]], half noundef nofpclass(nan) [[TMP6]], double noundef nofpclass(nan) [[TMP10]], <2 x double> noundef nofpclass(nan) [[TMP8]], i32 noundef [[TMP11]], <2 x float> noundef nofpclass(nan) [[TMP12]], ptr noundef byval({ double, double }) align 8 [[BYVAL_TEMP]], <2 x half> noundef nofpclass(nan) [[TMP13]])1269// NONANS-NEXT:    ret float [[CALL]]1270//1271// NOINFS: Function Attrs: noinline nounwind optnone1272// NOINFS-LABEL: define dso_local nofpclass(inf) float @call_variadic_indirect1273// NOINFS-SAME: (ptr noundef [[FPTR:%.*]], float noundef nofpclass(inf) [[F32:%.*]], double noundef nofpclass(inf) [[F64:%.*]], half noundef nofpclass(inf) [[F16:%.*]], double noundef nofpclass(inf) [[V2F32_COERCE:%.*]], <2 x double> noundef nofpclass(inf) [[V2F64:%.*]], i32 noundef [[V2F16_COERCE:%.*]], <2 x float> noundef nofpclass(inf) [[CF32_COERCE:%.*]], double noundef nofpclass(inf) [[CF64_COERCE0:%.*]], double noundef nofpclass(inf) [[CF64_COERCE1:%.*]], ptr noundef byval({ half, half }) align 8 [[CF16:%.*]]) #[[ATTR2]] {1274// NOINFS-NEXT:  entry:1275// NOINFS-NEXT:    [[V2F32:%.*]] = alloca <2 x float>, align 81276// NOINFS-NEXT:    [[V2F16:%.*]] = alloca <2 x half>, align 41277// NOINFS-NEXT:    [[CF32:%.*]] = alloca { float, float }, align 41278// NOINFS-NEXT:    [[CF64:%.*]] = alloca { double, double }, align 81279// NOINFS-NEXT:    [[FPTR_ADDR:%.*]] = alloca ptr, align 81280// NOINFS-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 41281// NOINFS-NEXT:    [[F64_ADDR:%.*]] = alloca double, align 81282// NOINFS-NEXT:    [[F16_ADDR:%.*]] = alloca half, align 21283// NOINFS-NEXT:    [[V2F32_ADDR:%.*]] = alloca <2 x float>, align 81284// NOINFS-NEXT:    [[V2F64_ADDR:%.*]] = alloca <2 x double>, align 161285// NOINFS-NEXT:    [[V2F16_ADDR:%.*]] = alloca <2 x half>, align 41286// NOINFS-NEXT:    [[COERCE:%.*]] = alloca <2 x float>, align 81287// NOINFS-NEXT:    [[COERCE3:%.*]] = alloca <2 x half>, align 41288// NOINFS-NEXT:    [[COERCE4:%.*]] = alloca { float, float }, align 41289// NOINFS-NEXT:    [[BYVAL_TEMP:%.*]] = alloca { double, double }, align 81290// NOINFS-NEXT:    [[COERCE5:%.*]] = alloca { half, half }, align 21291// NOINFS-NEXT:    store double [[V2F32_COERCE]], ptr [[V2F32]], align 81292// NOINFS-NEXT:    [[V2F321:%.*]] = load <2 x float>, ptr [[V2F32]], align 81293// NOINFS-NEXT:    store i32 [[V2F16_COERCE]], ptr [[V2F16]], align 41294// NOINFS-NEXT:    [[V2F162:%.*]] = load <2 x half>, ptr [[V2F16]], align 41295// NOINFS-NEXT:    store <2 x float> [[CF32_COERCE]], ptr [[CF32]], align 41296// NOINFS-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 01297// NOINFS-NEXT:    store double [[CF64_COERCE0]], ptr [[TMP0]], align 81298// NOINFS-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 11299// NOINFS-NEXT:    store double [[CF64_COERCE1]], ptr [[TMP1]], align 81300// NOINFS-NEXT:    store ptr [[FPTR]], ptr [[FPTR_ADDR]], align 81301// NOINFS-NEXT:    store float [[F32]], ptr [[F32_ADDR]], align 41302// NOINFS-NEXT:    store double [[F64]], ptr [[F64_ADDR]], align 81303// NOINFS-NEXT:    store half [[F16]], ptr [[F16_ADDR]], align 21304// NOINFS-NEXT:    store <2 x float> [[V2F321]], ptr [[V2F32_ADDR]], align 81305// NOINFS-NEXT:    store <2 x double> [[V2F64]], ptr [[V2F64_ADDR]], align 161306// NOINFS-NEXT:    store <2 x half> [[V2F162]], ptr [[V2F16_ADDR]], align 41307// NOINFS-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[FPTR_ADDR]], align 81308// NOINFS-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR]], align 41309// NOINFS-NEXT:    [[TMP4:%.*]] = load float, ptr [[F32_ADDR]], align 41310// NOINFS-NEXT:    [[CONV:%.*]] = fpext ninf float [[TMP4]] to double1311// NOINFS-NEXT:    [[TMP5:%.*]] = load double, ptr [[F64_ADDR]], align 81312// NOINFS-NEXT:    [[TMP6:%.*]] = load half, ptr [[F16_ADDR]], align 21313// NOINFS-NEXT:    [[TMP7:%.*]] = load <2 x float>, ptr [[V2F32_ADDR]], align 81314// NOINFS-NEXT:    [[TMP8:%.*]] = load <2 x double>, ptr [[V2F64_ADDR]], align 161315// NOINFS-NEXT:    [[TMP9:%.*]] = load <2 x half>, ptr [[V2F16_ADDR]], align 41316// NOINFS-NEXT:    [[CF32_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[CF32]], i32 0, i32 01317// NOINFS-NEXT:    [[CF32_REAL:%.*]] = load float, ptr [[CF32_REALP]], align 41318// NOINFS-NEXT:    [[CF32_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[CF32]], i32 0, i32 11319// NOINFS-NEXT:    [[CF32_IMAG:%.*]] = load float, ptr [[CF32_IMAGP]], align 41320// NOINFS-NEXT:    [[CF64_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 01321// NOINFS-NEXT:    [[CF64_REAL:%.*]] = load double, ptr [[CF64_REALP]], align 81322// NOINFS-NEXT:    [[CF64_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[CF64]], i32 0, i32 11323// NOINFS-NEXT:    [[CF64_IMAG:%.*]] = load double, ptr [[CF64_IMAGP]], align 81324// NOINFS-NEXT:    [[CF16_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[CF16]], i32 0, i32 01325// NOINFS-NEXT:    [[CF16_REAL:%.*]] = load half, ptr [[CF16_REALP]], align 81326// NOINFS-NEXT:    [[CF16_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[CF16]], i32 0, i32 11327// NOINFS-NEXT:    [[CF16_IMAG:%.*]] = load half, ptr [[CF16_IMAGP]], align 21328// NOINFS-NEXT:    store <2 x float> [[TMP7]], ptr [[COERCE]], align 81329// NOINFS-NEXT:    [[TMP10:%.*]] = load double, ptr [[COERCE]], align 81330// NOINFS-NEXT:    store <2 x half> [[TMP9]], ptr [[COERCE3]], align 41331// NOINFS-NEXT:    [[TMP11:%.*]] = load i32, ptr [[COERCE3]], align 41332// NOINFS-NEXT:    [[COERCE4_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE4]], i32 0, i32 01333// NOINFS-NEXT:    [[COERCE4_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE4]], i32 0, i32 11334// NOINFS-NEXT:    store float [[CF32_REAL]], ptr [[COERCE4_REALP]], align 41335// NOINFS-NEXT:    store float [[CF32_IMAG]], ptr [[COERCE4_IMAGP]], align 41336// NOINFS-NEXT:    [[TMP12:%.*]] = load <2 x float>, ptr [[COERCE4]], align 41337// NOINFS-NEXT:    [[BYVAL_TEMP_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[BYVAL_TEMP]], i32 0, i32 01338// NOINFS-NEXT:    [[BYVAL_TEMP_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[BYVAL_TEMP]], i32 0, i32 11339// NOINFS-NEXT:    store double [[CF64_REAL]], ptr [[BYVAL_TEMP_REALP]], align 81340// NOINFS-NEXT:    store double [[CF64_IMAG]], ptr [[BYVAL_TEMP_IMAGP]], align 81341// NOINFS-NEXT:    [[COERCE5_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE5]], i32 0, i32 01342// NOINFS-NEXT:    [[COERCE5_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE5]], i32 0, i32 11343// NOINFS-NEXT:    store half [[CF16_REAL]], ptr [[COERCE5_REALP]], align 21344// NOINFS-NEXT:    store half [[CF16_IMAG]], ptr [[COERCE5_IMAGP]], align 21345// NOINFS-NEXT:    [[TMP13:%.*]] = load <2 x half>, ptr [[COERCE5]], align 21346// NOINFS-NEXT:    [[CALL:%.*]] = call ninf nofpclass(inf) float (float, ...) [[TMP2]](float noundef nofpclass(inf) [[TMP3]], double noundef nofpclass(inf) [[CONV]], double noundef nofpclass(inf) [[TMP5]], half noundef nofpclass(inf) [[TMP6]], double noundef nofpclass(inf) [[TMP10]], <2 x double> noundef nofpclass(inf) [[TMP8]], i32 noundef [[TMP11]], <2 x float> noundef nofpclass(inf) [[TMP12]], ptr noundef byval({ double, double }) align 8 [[BYVAL_TEMP]], <2 x half> noundef nofpclass(inf) [[TMP13]])1347// NOINFS-NEXT:    ret float [[CALL]]1348//1349float call_variadic_indirect(float fptr(float, ...), float f32, double f64, _Float16 f16,1350                             float2 v2f32, double2 v2f64, half2 v2f16,1351                             _Complex float cf32, _Complex double cf64, _Complex _Float16 cf16) {1352  return (*fptr)(f32, f32, f64, f16, v2f32, v2f64, v2f16, cf32, cf64, cf16);1353}1354 1355typedef __attribute__((__vector_size__(4 * sizeof(double)))) double __m256d;1356extern __m256d extern_m256d(__m256d, ...);1357 1358// CFINITEONLY: Function Attrs: noinline nounwind optnone1359// CFINITEONLY-LABEL: define dso_local nofpclass(nan inf) <4 x double> @call_m256d1360// CFINITEONLY-SAME: (<4 x double> noundef nofpclass(nan inf) [[X:%.*]]) #[[ATTR5:[0-9]+]] {1361// CFINITEONLY-NEXT:  entry:1362// CFINITEONLY-NEXT:    [[X_ADDR:%.*]] = alloca <4 x double>, align 321363// CFINITEONLY-NEXT:    store <4 x double> [[X]], ptr [[X_ADDR]], align 321364// CFINITEONLY-NEXT:    [[TMP0:%.*]] = load <4 x double>, ptr [[X_ADDR]], align 321365// CFINITEONLY-NEXT:    [[TMP1:%.*]] = load <4 x double>, ptr [[X_ADDR]], align 321366// CFINITEONLY-NEXT:    [[CALL:%.*]] = call nnan ninf nofpclass(nan inf) <4 x double> (<4 x double>, ...) @extern_m256d(<4 x double> noundef nofpclass(nan inf) [[TMP0]], <4 x double> noundef nofpclass(nan inf) [[TMP1]])1367// CFINITEONLY-NEXT:    ret <4 x double> [[CALL]]1368//1369// CLFINITEONLY: Function Attrs: convergent norecurse nounwind1370// CLFINITEONLY-LABEL: define dso_local nofpclass(nan inf) <4 x double> @call_m256d1371// CLFINITEONLY-SAME: (<4 x double> noundef nofpclass(nan inf) [[X:%.*]]) local_unnamed_addr #[[ATTR9:[0-9]+]] {1372// CLFINITEONLY-NEXT:  entry:1373// CLFINITEONLY-NEXT:    [[CALL:%.*]] = tail call nnan ninf nofpclass(nan inf) <4 x double> (<4 x double>, ...) @extern_m256d(<4 x double> noundef nofpclass(nan inf) [[X]], <4 x double> noundef nofpclass(nan inf) [[X]]) #[[ATTR11]]1374// CLFINITEONLY-NEXT:    ret <4 x double> [[CALL]]1375//1376// NONANS: Function Attrs: noinline nounwind optnone1377// NONANS-LABEL: define dso_local nofpclass(nan) <4 x double> @call_m256d1378// NONANS-SAME: (<4 x double> noundef nofpclass(nan) [[X:%.*]]) #[[ATTR5:[0-9]+]] {1379// NONANS-NEXT:  entry:1380// NONANS-NEXT:    [[X_ADDR:%.*]] = alloca <4 x double>, align 321381// NONANS-NEXT:    store <4 x double> [[X]], ptr [[X_ADDR]], align 321382// NONANS-NEXT:    [[TMP0:%.*]] = load <4 x double>, ptr [[X_ADDR]], align 321383// NONANS-NEXT:    [[TMP1:%.*]] = load <4 x double>, ptr [[X_ADDR]], align 321384// NONANS-NEXT:    [[CALL:%.*]] = call nnan nofpclass(nan) <4 x double> (<4 x double>, ...) @extern_m256d(<4 x double> noundef nofpclass(nan) [[TMP0]], <4 x double> noundef nofpclass(nan) [[TMP1]])1385// NONANS-NEXT:    ret <4 x double> [[CALL]]1386//1387// NOINFS: Function Attrs: noinline nounwind optnone1388// NOINFS-LABEL: define dso_local nofpclass(inf) <4 x double> @call_m256d1389// NOINFS-SAME: (<4 x double> noundef nofpclass(inf) [[X:%.*]]) #[[ATTR5:[0-9]+]] {1390// NOINFS-NEXT:  entry:1391// NOINFS-NEXT:    [[X_ADDR:%.*]] = alloca <4 x double>, align 321392// NOINFS-NEXT:    store <4 x double> [[X]], ptr [[X_ADDR]], align 321393// NOINFS-NEXT:    [[TMP0:%.*]] = load <4 x double>, ptr [[X_ADDR]], align 321394// NOINFS-NEXT:    [[TMP1:%.*]] = load <4 x double>, ptr [[X_ADDR]], align 321395// NOINFS-NEXT:    [[CALL:%.*]] = call ninf nofpclass(inf) <4 x double> (<4 x double>, ...) @extern_m256d(<4 x double> noundef nofpclass(inf) [[TMP0]], <4 x double> noundef nofpclass(inf) [[TMP1]])1396// NOINFS-NEXT:    ret <4 x double> [[CALL]]1397//1398__m256d call_m256d(__m256d x) {1399  return extern_m256d(x, x);1400}1401 1402// CFINITEONLY: Function Attrs: noinline nounwind optnone1403// CFINITEONLY-LABEL: define dso_local nofpclass(nan inf) <25 x double> @call_matrix1404// CFINITEONLY-SAME: (<25 x double> noundef nofpclass(nan inf) [[X:%.*]]) #[[ATTR6:[0-9]+]] {1405// CFINITEONLY-NEXT:  entry:1406// CFINITEONLY-NEXT:    [[X_ADDR:%.*]] = alloca [25 x double], align 81407// CFINITEONLY-NEXT:    store <25 x double> [[X]], ptr [[X_ADDR]], align 81408// CFINITEONLY-NEXT:    [[TMP0:%.*]] = load <25 x double>, ptr [[X_ADDR]], align 81409// CFINITEONLY-NEXT:    [[CALL:%.*]] = call nnan ninf nofpclass(nan inf) <25 x double> @extern_matrix(<25 x double> noundef nofpclass(nan inf) [[TMP0]])1410// CFINITEONLY-NEXT:    ret <25 x double> [[CALL]]1411//1412// CLFINITEONLY: Function Attrs: convergent norecurse nounwind1413// CLFINITEONLY-LABEL: define dso_local nofpclass(nan inf) <25 x double> @call_matrix1414// CLFINITEONLY-SAME: (<25 x double> noundef nofpclass(nan inf) [[X:%.*]]) local_unnamed_addr #[[ATTR10:[0-9]+]] {1415// CLFINITEONLY-NEXT:  entry:1416// CLFINITEONLY-NEXT:    [[CALL:%.*]] = tail call nnan ninf nofpclass(nan inf) <25 x double> @extern_matrix(<25 x double> noundef nofpclass(nan inf) [[X]]) #[[ATTR11]]1417// CLFINITEONLY-NEXT:    ret <25 x double> [[CALL]]1418//1419// NONANS: Function Attrs: noinline nounwind optnone1420// NONANS-LABEL: define dso_local nofpclass(nan) <25 x double> @call_matrix1421// NONANS-SAME: (<25 x double> noundef nofpclass(nan) [[X:%.*]]) #[[ATTR6:[0-9]+]] {1422// NONANS-NEXT:  entry:1423// NONANS-NEXT:    [[X_ADDR:%.*]] = alloca [25 x double], align 81424// NONANS-NEXT:    store <25 x double> [[X]], ptr [[X_ADDR]], align 81425// NONANS-NEXT:    [[TMP0:%.*]] = load <25 x double>, ptr [[X_ADDR]], align 81426// NONANS-NEXT:    [[CALL:%.*]] = call nnan nofpclass(nan) <25 x double> @extern_matrix(<25 x double> noundef nofpclass(nan) [[TMP0]])1427// NONANS-NEXT:    ret <25 x double> [[CALL]]1428//1429// NOINFS: Function Attrs: noinline nounwind optnone1430// NOINFS-LABEL: define dso_local nofpclass(inf) <25 x double> @call_matrix1431// NOINFS-SAME: (<25 x double> noundef nofpclass(inf) [[X:%.*]]) #[[ATTR6:[0-9]+]] {1432// NOINFS-NEXT:  entry:1433// NOINFS-NEXT:    [[X_ADDR:%.*]] = alloca [25 x double], align 81434// NOINFS-NEXT:    store <25 x double> [[X]], ptr [[X_ADDR]], align 81435// NOINFS-NEXT:    [[TMP0:%.*]] = load <25 x double>, ptr [[X_ADDR]], align 81436// NOINFS-NEXT:    [[CALL:%.*]] = call ninf nofpclass(inf) <25 x double> @extern_matrix(<25 x double> noundef nofpclass(inf) [[TMP0]])1437// NOINFS-NEXT:    ret <25 x double> [[CALL]]1438//1439dx5x5_t call_matrix(dx5x5_t x) {1440  return extern_matrix(x);1441}1442