brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.7 KiB · 68c2f76 Raw
388 lines · c
1// RUN: %clang_cc1 -triple x86_64-unknown-unknown \2// RUN: -ffloat16-excess-precision=fast -emit-llvm -o - %s \3// RUN: | FileCheck -check-prefixes=CHECK-EXT %s4 5// RUN: %clang_cc1 -triple x86_64-unknown-unknown \6// RUN: -ffloat16-excess-precision=fast -target-feature +avx512fp16 \7// RUN: -emit-llvm -o - %s | FileCheck -check-prefixes=CHECK-NO-EXT %s8 9// RUN: %clang_cc1 -triple x86_64-unknown-unknown \10// RUN: -ffloat16-excess-precision=standard -emit-llvm -o - %s \11// RUN: | FileCheck -check-prefixes=CHECK-EXT %s12 13// RUN: %clang_cc1 -triple x86_64-unknown-unknown \14// RUN: -ffloat16-excess-precision=standard -target-feature +avx512fp16 \15// RUN: -emit-llvm -o - %s | FileCheck -check-prefixes=CHECK-NO-EXT %s16 17// RUN: %clang_cc1 -triple x86_64-unknown-unknown \18// RUN: -ffloat16-excess-precision=none -emit-llvm -o - %s \19// RUN: | FileCheck -check-prefixes=CHECK-NO-EXT %s20 21// RUN: %clang_cc1 -triple x86_64-unknown-unknown \22// RUN: -ffloat16-excess-precision=none -target-feature +avx512fp16 \23// RUN: -emit-llvm -o - %s \24// RUN: | FileCheck -check-prefixes=CHECK-NO-EXT %s25 26// RUN: %clang_cc1 -triple x86_64-unknown-unknown \27// RUN: -ffloat16-excess-precision=fast \28// RUN: -emit-llvm -ffp-eval-method=source -o - %s \29// RUN: | FileCheck -check-prefixes=CHECK-EXT %s30 31// RUN: %clang_cc1 -triple x86_64-unknown-unknown \32// RUN: -ffloat16-excess-precision=fast -target-feature +avx512fp16 \33// RUN: -emit-llvm -ffp-eval-method=source -o - %s \34// RUN: | FileCheck -check-prefixes=CHECK-NO-EXT %s35 36// RUN: %clang_cc1 -triple x86_64-unknown-unknown \37// RUN: -ffloat16-excess-precision=standard \38// RUN: -emit-llvm -ffp-eval-method=source -o - %s \39// RUN: | FileCheck -check-prefixes=CHECK-EXT %s40 41// RUN: %clang_cc1 -triple x86_64-unknown-unknown \42// RUN: -ffloat16-excess-precision=standard  -target-feature +avx512fp16 \43// RUN: -emit-llvm -ffp-eval-method=source -o - %s \44// RUN: | FileCheck -check-prefixes=CHECK-NO-EXT %s45 46// RUN: %clang_cc1 -triple x86_64-unknown-unknown \47// RUN: -ffloat16-excess-precision=none \48// RUN: -emit-llvm -ffp-eval-method=source -o - %s \49// RUN: | FileCheck -check-prefixes=CHECK-NO-EXT %s50 51// RUN: %clang_cc1 -triple x86_64-unknown-unknown \52// RUN: -ffloat16-excess-precision=none -target-feature +avx512fp16 \53// RUN: -emit-llvm -ffp-eval-method=source -o - %s \54// RUN: | FileCheck -check-prefixes=CHECK-NO-EXT %s55 56// RUN: %clang_cc1 -triple x86_64-unknown-unknown \57// RUN: -ffloat16-excess-precision=fast \58// RUN: -emit-llvm -ffp-eval-method=double -o - %s \59// RUN: | FileCheck -check-prefixes=CHECK-EXT-DBL %s60 61// RUN: %clang_cc1 -triple x86_64-unknown-unknown \62// RUN: -ffloat16-excess-precision=fast -target-feature +avx512fp16 \63// RUN: -emit-llvm -ffp-eval-method=double -o - %s \64// RUN: | FileCheck -check-prefixes=CHECK-EXT-DBL %s65 66// RUN: %clang_cc1 -triple x86_64-unknown-unknown \67// RUN: -ffloat16-excess-precision=standard \68// RUN: -emit-llvm -ffp-eval-method=double -o - %s \69// RUN: | FileCheck -check-prefixes=CHECK-EXT-DBL %s70 71// RUN: %clang_cc1 -triple x86_64-unknown-unknown \72// RUN: -ffloat16-excess-precision=standard -target-feature +avx512fp16 \73// RUN: -emit-llvm -ffp-eval-method=double -o - %s \74// RUN: | FileCheck -check-prefixes=CHECK-EXT-DBL %s75 76// RUN: %clang_cc1 -triple x86_64-unknown-unknown \77// RUN: -ffloat16-excess-precision=none \78// RUN: -emit-llvm -ffp-eval-method=double -o - %s \79// RUN: | FileCheck -check-prefixes=CHECK-EXT-DBL %s80 81// RUN: %clang_cc1 -triple x86_64-unknown-unknown \82// RUN: -ffloat16-excess-precision=none -target-feature +avx512fp16 \83// RUN: -emit-llvm -ffp-eval-method=double -o - %s \84// RUN: | FileCheck -check-prefixes=CHECK-EXT-DBL %s85 86// RUN: %clang_cc1 -triple x86_64-unknown-unknown \87// RUN: -ffloat16-excess-precision=fast \88// RUN: -emit-llvm -ffp-eval-method=extended -o - %s \89// RUN: | FileCheck -check-prefixes=CHECK-EXT-FP80 %s90 91// RUN: %clang_cc1 -triple x86_64-unknown-unknown \92// RUN: -ffloat16-excess-precision=fast -target-feature +avx512fp16 \93// RUN: -emit-llvm -ffp-eval-method=extended -o - %s \94// RUN: | FileCheck -check-prefixes=CHECK-EXT-FP80 %s95 96// RUN: %clang_cc1 -triple x86_64-unknown-unknown \97// RUN: -ffloat16-excess-precision=standard \98// RUN: -emit-llvm -ffp-eval-method=extended -o - %s \99// RUN: | FileCheck -check-prefixes=CHECK-EXT-FP80 %s100 101// RUN: %clang_cc1 -triple x86_64-unknown-unknown \102// RUN: -ffloat16-excess-precision=standard -target-feature +avx512fp16 \103// RUN: -emit-llvm -ffp-eval-method=extended -o - %s \104// RUN: | FileCheck -check-prefixes=CHECK-EXT-FP80 %s105 106// RUN: %clang_cc1 -triple x86_64-unknown-unknown \107// RUN: -ffloat16-excess-precision=none \108// RUN: -emit-llvm -ffp-eval-method=extended -o - %s \109// RUN: | FileCheck -check-prefixes=CHECK-EXT-FP80 %s110 111// RUN: %clang_cc1 -triple x86_64-unknown-unknown \112// RUN: -ffloat16-excess-precision=none -target-feature +avx512fp16 \113// RUN: -emit-llvm -ffp-eval-method=extended -o - %s \114// RUN: | FileCheck -check-prefixes=CHECK-EXT-FP80 %s115 116// RUN: %clang_cc1 -triple x86_64-unknown-unknown \117// RUN: -ffloat16-excess-precision=none \118// RUN: -ffp-contract=on -emit-llvm -o - %s \119// RUN: | FileCheck -check-prefixes=CHECK-CONTRACT %s120 121// RUN: %clang_cc1 -triple x86_64-unknown-unknown \122// RUN: -ffloat16-excess-precision=none -target-feature +avx512fp16 \123// RUN: -ffp-contract=on -emit-llvm -o - %s \124// RUN: | FileCheck -check-prefixes=CHECK-CONTRACT %s125 126// RUN: %clang_cc1 -triple x86_64-unknown-unknown \127// RUN: -ffloat16-excess-precision=none \128// RUN: -fmath-errno -ffp-contract=on -fno-rounding-math \129// RUN: -ffp-eval-method=source -emit-llvm -o - %s \130// RUN: | FileCheck -check-prefixes=CHECK-CONTRACT %s131 132// RUN: %clang_cc1 -triple x86_64-unknown-unknown \133// RUN: -ffloat16-excess-precision=none -target-feature +avx512fp16 \134// RUN: -fmath-errno -ffp-contract=on -fno-rounding-math \135// RUN: -ffp-eval-method=source -emit-llvm -o - %s \136// RUN: | FileCheck -check-prefixes=CHECK-CONTRACT %s137 138// RUN: %clang_cc1 -triple x86_64-unknown-unknown \139// RUN: -ffloat16-excess-precision=none \140// RUN: -fmath-errno -ffp-contract=on -fno-rounding-math \141// RUN: -ffp-eval-method=double -emit-llvm -o - %s \142// RUN: | FileCheck -check-prefixes=CHECK-CONTRACT-DBL %s143 144// RUN: %clang_cc1 -triple x86_64-unknown-unknown \145// RUN: -ffloat16-excess-precision=none -target-feature +avx512fp16 \146// RUN: -fmath-errno -ffp-contract=on -fno-rounding-math \147// RUN: -ffp-eval-method=double -emit-llvm -o - %s \148// RUN: | FileCheck -check-prefixes=CHECK-CONTRACT-DBL %s149 150// RUN: %clang_cc1 -triple x86_64-unknown-unknown \151// RUN: -ffloat16-excess-precision=none \152// RUN: -fmath-errno -ffp-contract=on -fno-rounding-math \153// RUN: -ffp-eval-method=extended -emit-llvm -o - %s \154// RUN: | FileCheck -check-prefixes=CHECK-CONTRACT-EXT %s155 156// RUN: %clang_cc1 -triple x86_64-unknown-unknown \157// RUN: -ffloat16-excess-precision=none -target-feature +avx512fp16 \158// RUN: -fmath-errno -ffp-contract=on -fno-rounding-math \159// RUN: -ffp-eval-method=extended -emit-llvm -o - %s \160// RUN: | FileCheck -check-prefixes=CHECK-CONTRACT-EXT %s161 162// RUN: %clang_cc1 -triple x86_64-unknown-unknown \163// RUN: -ffloat16-excess-precision=none \164// RUN: -fapprox-func -fmath-errno -fno-signed-zeros -mreassociate \165// RUN: -freciprocal-math -ffp-contract=on -fno-rounding-math \166// RUN: -funsafe-math-optimizations -emit-llvm -o - %s \167// RUN: | FileCheck -check-prefixes=CHECK-UNSAFE %s168 169// RUN: %clang_cc1 -triple x86_64-unknown-unknown \170// RUN: -ffloat16-excess-precision=none -target-feature +avx512fp16 \171// RUN: -fapprox-func -fmath-errno -fno-signed-zeros -mreassociate \172// RUN: -freciprocal-math -ffp-contract=on -fno-rounding-math \173// RUN: -funsafe-math-optimizations -emit-llvm -o - %s \174// RUN: | FileCheck -check-prefixes=CHECK-UNSAFE %s175 176// CHECK-EXT-LABEL: @f(177// CHECK-EXT-NEXT:  entry:178// CHECK-EXT-NEXT:    [[A_ADDR:%.*]] = alloca half179// CHECK-EXT-NEXT:    [[B_ADDR:%.*]] = alloca half180// CHECK-EXT-NEXT:    [[C_ADDR:%.*]] = alloca half181// CHECK-EXT-NEXT:    [[D_ADDR:%.*]] = alloca half182// CHECK-EXT-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]]183// CHECK-EXT-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]]184// CHECK-EXT-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]]185// CHECK-EXT-NEXT:    store half [[D:%.*]], ptr [[D_ADDR]]186// CHECK-EXT-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]]187// CHECK-EXT-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float188// CHECK-EXT-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]]189// CHECK-EXT-NEXT:    [[EXT1:%.*]] = fpext half [[TMP1]] to float190// CHECK-EXT-NEXT:    [[MUL:%.*]] = fmul float [[EXT]], [[EXT1]]191// CHECK-EXT-NEXT:    [[TMP2:%.*]] = load half, ptr [[C_ADDR]]192// CHECK-EXT-NEXT:    [[EXT2:%.*]] = fpext half [[TMP2]] to float193// CHECK-EXT-NEXT:    [[TMP3:%.*]] = load half, ptr [[D_ADDR]]194// CHECK-EXT-NEXT:    [[EXT3:%.*]] = fpext half [[TMP3]] to float195// CHECK-EXT-NEXT:    [[MUL4:%.*]] = fmul float [[EXT2]], [[EXT3]]196// CHECK-EXT-NEXT:    [[ADD:%.*]] = fadd float [[MUL]], [[MUL4]]197// CHECK-EXT-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD]] to half198// CHECK-EXT-NEXT:    ret half [[UNPROMOTION]]199//200// CHECK-NO-EXT-LABEL: @f(201// CHECK-NO-EXT-NEXT:  entry:202// CHECK-NO-EXT-NEXT:    [[A_ADDR:%.*]] = alloca half203// CHECK-NO-EXT-NEXT:    [[B_ADDR:%.*]] = alloca half204// CHECK-NO-EXT-NEXT:    [[C_ADDR:%.*]] = alloca half205// CHECK-NO-EXT-NEXT:    [[D_ADDR:%.*]] = alloca half206// CHECK-NO-EXT-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]]207// CHECK-NO-EXT-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]]208// CHECK-NO-EXT-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]]209// CHECK-NO-EXT-NEXT:    store half [[D:%.*]], ptr [[D_ADDR]]210// CHECK-NO-EXT-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]]211// CHECK-NO-EXT-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]]212// CHECK-NO-EXT-NEXT:    [[MUL:%.*]] = fmul half [[TMP0]], [[TMP1]]213// CHECK-NO-EXT-NEXT:    [[TMP2:%.*]] = load half, ptr [[C_ADDR]]214// CHECK-NO-EXT-NEXT:    [[TMP3:%.*]] = load half, ptr [[D_ADDR]]215// CHECK-NO-EXT-NEXT:    [[MUL1:%.*]] = fmul half [[TMP2]], [[TMP3]]216// CHECK-NO-EXT-NEXT:    [[ADD:%.*]] = fadd half [[MUL]], [[MUL1]]217// CHECK-NO-EXT-NEXT:    ret half [[ADD]]218//219// CHECK-EXT-DBL-LABEL: @f(220// CHECK-EXT-DBL-NEXT:  entry:221// CHECK-EXT-DBL-NEXT:    [[A_ADDR:%.*]] = alloca half222// CHECK-EXT-DBL-NEXT:    [[B_ADDR:%.*]] = alloca half223// CHECK-EXT-DBL-NEXT:    [[C_ADDR:%.*]] = alloca half224// CHECK-EXT-DBL-NEXT:    [[D_ADDR:%.*]] = alloca half225// CHECK-EXT-DBL-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]]226// CHECK-EXT-DBL-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]]227// CHECK-EXT-DBL-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]]228// CHECK-EXT-DBL-NEXT:    store half [[D:%.*]], ptr [[D_ADDR]]229// CHECK-EXT-DBL-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]]230// CHECK-EXT-DBL-NEXT:    [[CONV:%.*]] = fpext half [[TMP0]] to double231// CHECK-EXT-DBL-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]]232// CHECK-EXT-DBL-NEXT:    [[CONV1:%.*]] = fpext half [[TMP1]] to double233// CHECK-EXT-DBL-NEXT:    [[MUL:%.*]] = fmul double [[CONV]], [[CONV1]]234// CHECK-EXT-DBL-NEXT:    [[TMP2:%.*]] = load half, ptr [[C_ADDR]]235// CHECK-EXT-DBL-NEXT:    [[CONV2:%.*]] = fpext half [[TMP2]] to double236// CHECK-EXT-DBL-NEXT:    [[TMP3:%.*]] = load half, ptr [[D_ADDR]]237// CHECK-EXT-DBL-NEXT:    [[CONV3:%.*]] = fpext half [[TMP3]] to double238// CHECK-EXT-DBL-NEXT:    [[MUL4:%.*]] = fmul double [[CONV2]], [[CONV3]]239// CHECK-EXT-DBL-NEXT:    [[ADD:%.*]] = fadd double [[MUL]], [[MUL4]]240// CHECK-EXT-DBL-NEXT:    [[CONV5:%.*]] = fptrunc double [[ADD]] to half241// CHECK-EXT-DBL-NEXT:    ret half [[CONV5]]242//243// CHECK-EXT-FP80-LABEL: @f(244// CHECK-EXT-FP80-NEXT:  entry:245// CHECK-EXT-FP80-NEXT:    [[A_ADDR:%.*]] = alloca half246// CHECK-EXT-FP80-NEXT:    [[B_ADDR:%.*]] = alloca half247// CHECK-EXT-FP80-NEXT:    [[C_ADDR:%.*]] = alloca half248// CHECK-EXT-FP80-NEXT:    [[D_ADDR:%.*]] = alloca half249// CHECK-EXT-FP80-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]]250// CHECK-EXT-FP80-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]]251// CHECK-EXT-FP80-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]]252// CHECK-EXT-FP80-NEXT:    store half [[D:%.*]], ptr [[D_ADDR]]253// CHECK-EXT-FP80-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]]254// CHECK-EXT-FP80-NEXT:    [[CONV:%.*]] = fpext half [[TMP0]] to x86_fp80255// CHECK-EXT-FP80-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]]256// CHECK-EXT-FP80-NEXT:    [[CONV1:%.*]] = fpext half [[TMP1]] to x86_fp80257// CHECK-EXT-FP80-NEXT:    [[MUL:%.*]] = fmul x86_fp80 [[CONV]], [[CONV1]]258// CHECK-EXT-FP80-NEXT:    [[TMP2:%.*]] = load half, ptr [[C_ADDR]]259// CHECK-EXT-FP80-NEXT:    [[CONV2:%.*]] = fpext half [[TMP2]] to x86_fp80260// CHECK-EXT-FP80-NEXT:    [[TMP3:%.*]] = load half, ptr [[D_ADDR]]261// CHECK-EXT-FP80-NEXT:    [[CONV3:%.*]] = fpext half [[TMP3]] to x86_fp80262// CHECK-EXT-FP80-NEXT:    [[MUL4:%.*]] = fmul x86_fp80 [[CONV2]], [[CONV3]]263// CHECK-EXT-FP80-NEXT:    [[ADD:%.*]] = fadd x86_fp80 [[MUL]], [[MUL4]]264// CHECK-EXT-FP80-NEXT:    [[CONV5:%.*]] = fptrunc x86_fp80 [[ADD]] to half265// CHECK-EXT-FP80-NEXT:    ret half [[CONV5]]266//267// CHECK-CONTRACT-LABEL: @f(268// CHECK-CONTRACT-NEXT:  entry:269// CHECK-CONTRACT-NEXT:    [[A_ADDR:%.*]] = alloca half270// CHECK-CONTRACT-NEXT:    [[B_ADDR:%.*]] = alloca half271// CHECK-CONTRACT-NEXT:    [[C_ADDR:%.*]] = alloca half272// CHECK-CONTRACT-NEXT:    [[D_ADDR:%.*]] = alloca half273// CHECK-CONTRACT-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]]274// CHECK-CONTRACT-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]]275// CHECK-CONTRACT-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]]276// CHECK-CONTRACT-NEXT:    store half [[D:%.*]], ptr [[D_ADDR]]277// CHECK-CONTRACT-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]]278// CHECK-CONTRACT-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]]279// CHECK-CONTRACT-NEXT:    [[TMP2:%.*]] = load half, ptr [[C_ADDR]]280// CHECK-CONTRACT-NEXT:    [[TMP3:%.*]] = load half, ptr [[D_ADDR]]281// CHECK-CONTRACT-NEXT:    [[MUL1:%.*]] = fmul half [[TMP2]], [[TMP3]]282// CHECK-CONTRACT-NEXT:    [[TMP4:%.*]] = call half @llvm.fmuladd.f16(half [[TMP0]], half [[TMP1]], half [[MUL1]])283// CHECK-CONTRACT-NEXT:    ret half [[TMP4]]284//285// CHECK-CONTRACT-DBL-LABEL: @f(286// CHECK-CONTRACT-DBL-NEXT:  entry:287// CHECK-CONTRACT-DBL-NEXT:    [[A_ADDR:%.*]] = alloca half288// CHECK-CONTRACT-DBL-NEXT:    [[B_ADDR:%.*]] = alloca half289// CHECK-CONTRACT-DBL-NEXT:    [[C_ADDR:%.*]] = alloca half290// CHECK-CONTRACT-DBL-NEXT:    [[D_ADDR:%.*]] = alloca half291// CHECK-CONTRACT-DBL-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]]292// CHECK-CONTRACT-DBL-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]]293// CHECK-CONTRACT-DBL-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]]294// CHECK-CONTRACT-DBL-NEXT:    store half [[D:%.*]], ptr [[D_ADDR]]295// CHECK-CONTRACT-DBL-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]]296// CHECK-CONTRACT-DBL-NEXT:    [[CONV:%.*]] = fpext half [[TMP0]] to double297// CHECK-CONTRACT-DBL-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]]298// CHECK-CONTRACT-DBL-NEXT:    [[CONV1:%.*]] = fpext half [[TMP1]] to double299// CHECK-CONTRACT-DBL-NEXT:    [[TMP2:%.*]] = load half, ptr [[C_ADDR]]300// CHECK-CONTRACT-DBL-NEXT:    [[CONV2:%.*]] = fpext half [[TMP2]] to double301// CHECK-CONTRACT-DBL-NEXT:    [[TMP3:%.*]] = load half, ptr [[D_ADDR]]302// CHECK-CONTRACT-DBL-NEXT:    [[CONV3:%.*]] = fpext half [[TMP3]] to double303// CHECK-CONTRACT-DBL-NEXT:    [[MUL4:%.*]] = fmul double [[CONV2]], [[CONV3]]304// CHECK-CONTRACT-DBL-NEXT:    [[TMP4:%.*]] = call double @llvm.fmuladd.f64(double [[CONV]], double [[CONV1]], double [[MUL4]])305// CHECK-CONTRACT-DBL-NEXT:    [[CONV5:%.*]] = fptrunc double [[TMP4]] to half306// CHECK-CONTRACT-DBL-NEXT:    ret half [[CONV5]]307//308// CHECK-CONTRACT-EXT-LABEL: @f(309// CHECK-CONTRACT-EXT-NEXT:  entry:310// CHECK-CONTRACT-EXT-NEXT:    [[A_ADDR:%.*]] = alloca half311// CHECK-CONTRACT-EXT-NEXT:    [[B_ADDR:%.*]] = alloca half312// CHECK-CONTRACT-EXT-NEXT:    [[C_ADDR:%.*]] = alloca half313// CHECK-CONTRACT-EXT-NEXT:    [[D_ADDR:%.*]] = alloca half314// CHECK-CONTRACT-EXT-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]]315// CHECK-CONTRACT-EXT-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]]316// CHECK-CONTRACT-EXT-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]]317// CHECK-CONTRACT-EXT-NEXT:    store half [[D:%.*]], ptr [[D_ADDR]]318// CHECK-CONTRACT-EXT-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]]319// CHECK-CONTRACT-EXT-NEXT:    [[CONV:%.*]] = fpext half [[TMP0]] to x86_fp80320// CHECK-CONTRACT-EXT-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]]321// CHECK-CONTRACT-EXT-NEXT:    [[CONV1:%.*]] = fpext half [[TMP1]] to x86_fp80322// CHECK-CONTRACT-EXT-NEXT:    [[TMP2:%.*]] = load half, ptr [[C_ADDR]]323// CHECK-CONTRACT-EXT-NEXT:    [[CONV2:%.*]] = fpext half [[TMP2]] to x86_fp80324// CHECK-CONTRACT-EXT-NEXT:    [[TMP3:%.*]] = load half, ptr [[D_ADDR]]325// CHECK-CONTRACT-EXT-NEXT:    [[CONV3:%.*]] = fpext half [[TMP3]] to x86_fp80326// CHECK-CONTRACT-EXT-NEXT:    [[MUL4:%.*]] = fmul x86_fp80 [[CONV2]], [[CONV3]]327// CHECK-CONTRACT-EXT-NEXT:    [[TMP4:%.*]] = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 [[CONV]], x86_fp80 [[CONV1]], x86_fp80 [[MUL4]])328// CHECK-CONTRACT-EXT-NEXT:    [[CONV5:%.*]] = fptrunc x86_fp80 [[TMP4]] to half329// CHECK-CONTRACT-EXT-NEXT:    ret half [[CONV5]]330//331// CHECK-UNSAFE-LABEL: @f(332// CHECK-UNSAFE-NEXT:  entry:333// CHECK-UNSAFE-NEXT:    [[A_ADDR:%.*]] = alloca half334// CHECK-UNSAFE-NEXT:    [[B_ADDR:%.*]] = alloca half335// CHECK-UNSAFE-NEXT:    [[C_ADDR:%.*]] = alloca half336// CHECK-UNSAFE-NEXT:    [[D_ADDR:%.*]] = alloca half337// CHECK-UNSAFE-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]]338// CHECK-UNSAFE-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]]339// CHECK-UNSAFE-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]]340// CHECK-UNSAFE-NEXT:    store half [[D:%.*]], ptr [[D_ADDR]]341// CHECK-UNSAFE-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]]342// CHECK-UNSAFE-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]]343// CHECK-UNSAFE-NEXT:    [[TMP2:%.*]] = load half, ptr [[C_ADDR]]344// CHECK-UNSAFE-NEXT:    [[TMP3:%.*]] = load half, ptr [[D_ADDR]]345// CHECK-UNSAFE-NEXT:    [[MUL1:%.*]] = fmul reassoc nsz arcp afn half [[TMP2]], [[TMP3]]346// CHECK-UNSAFE-NEXT:    [[TMP4:%.*]] = call reassoc nsz arcp afn half @llvm.fmuladd.f16(half [[TMP0]], half [[TMP1]], half [[MUL1]])347// CHECK-UNSAFE-NEXT:    ret half [[TMP4]]348//349_Float16 f(_Float16 a, _Float16 b, _Float16 c, _Float16 d) {350    return a * b + c * d;351}352 353// CHECK-EXT-LABEL: @getFEM(354// CHECK-EXT-NEXT:  entry:355// CHECK-EXT-NEXT:    ret i32 0356//357// CHECK-NO-EXT-LABEL: @getFEM(358// CHECK-NO-EXT-NEXT:  entry:359// CHECK-NO-EXT-NEXT:    ret i32 0360//361// CHECK-EXT-DBL-LABEL: @getFEM(362// CHECK-EXT-DBL-NEXT:  entry:363// CHECK-EXT-DBL-NEXT:    ret i32 1364//365// CHECK-EXT-FP80-LABEL: @getFEM(366// CHECK-EXT-FP80-NEXT:  entry:367// CHECK-EXT-FP80-NEXT:    ret i32 2368//369// CHECK-CONTRACT-LABEL: @getFEM(370// CHECK-CONTRACT-NEXT:  entry:371// CHECK-CONTRACT-NEXT:    ret i32 0372//373// CHECK-CONTRACT-DBL-LABEL: @getFEM(374// CHECK-CONTRACT-DBL-NEXT:  entry:375// CHECK-CONTRACT-DBL-NEXT:    ret i32 1376//377// CHECK-CONTRACT-EXT-LABEL: @getFEM(378// CHECK-CONTRACT-EXT-NEXT:  entry:379// CHECK-CONTRACT-EXT-NEXT:    ret i32 2380//381// CHECK-UNSAFE-LABEL: @getFEM(382// CHECK-UNSAFE-NEXT:  entry:383// CHECK-UNSAFE-NEXT:    ret i32 0384//385int getFEM() {386  return __FLT_EVAL_METHOD__;387}388