brintos

brintos / llvm-project-archived public Read only

0
0
Text · 20.3 KiB · ceafa97 Raw
361 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 22// RUN: %clang_cc1 -triple x86_64-unknown-unknown \3// RUN: -fbfloat16-excess-precision=fast -emit-llvm -o - %s \4// RUN: | FileCheck -check-prefixes=CHECK-EXT %s5 6// RUN: %clang_cc1 -triple x86_64-unknown-unknown \7// RUN: -fbfloat16-excess-precision=fast -target-feature +fullbf16 \8// RUN: -emit-llvm -o - %s | FileCheck -check-prefixes=CHECK-NO-EXT %s9 10// RUN: %clang_cc1 -triple x86_64-unknown-unknown \11// RUN: -fbfloat16-excess-precision=standard -emit-llvm -o - %s \12// RUN: | FileCheck -check-prefixes=CHECK-EXT %s13 14// RUN: %clang_cc1 -triple x86_64-unknown-unknown \15// RUN: -fbfloat16-excess-precision=standard -target-feature +fullbf16 \16// RUN: -emit-llvm -o - %s | FileCheck -check-prefixes=CHECK-NO-EXT %s17 18// RUN: %clang_cc1 -triple x86_64-unknown-unknown \19// RUN: -fbfloat16-excess-precision=none -emit-llvm -o - %s \20// RUN: | FileCheck -check-prefixes=CHECK-NO-EXT %s21 22// RUN: %clang_cc1 -triple x86_64-unknown-unknown \23// RUN: -fbfloat16-excess-precision=none -target-feature +fullbf16 \24// RUN: -emit-llvm -o - %s \25// RUN: | FileCheck -check-prefixes=CHECK-NO-EXT %s26 27// RUN: %clang_cc1 -triple x86_64-unknown-unknown \28// RUN: -fbfloat16-excess-precision=fast \29// RUN: -emit-llvm -ffp-eval-method=source -o - %s \30// RUN: | FileCheck -check-prefixes=CHECK-EXT %s31 32// RUN: %clang_cc1 -triple x86_64-unknown-unknown \33// RUN: -fbfloat16-excess-precision=fast -target-feature +fullbf16 \34// RUN: -emit-llvm -ffp-eval-method=source -o - %s \35// RUN: | FileCheck -check-prefixes=CHECK-NO-EXT %s36 37// RUN: %clang_cc1 -triple x86_64-unknown-unknown \38// RUN: -fbfloat16-excess-precision=standard \39// RUN: -emit-llvm -ffp-eval-method=source -o - %s \40// RUN: | FileCheck -check-prefixes=CHECK-EXT %s41 42// RUN: %clang_cc1 -triple x86_64-unknown-unknown \43// RUN: -fbfloat16-excess-precision=standard  -target-feature +fullbf16 \44// RUN: -emit-llvm -ffp-eval-method=source -o - %s \45// RUN: | FileCheck -check-prefixes=CHECK-NO-EXT %s46 47// RUN: %clang_cc1 -triple x86_64-unknown-unknown \48// RUN: -fbfloat16-excess-precision=none \49// RUN: -emit-llvm -ffp-eval-method=source -o - %s \50// RUN: | FileCheck -check-prefixes=CHECK-NO-EXT %s51 52// RUN: %clang_cc1 -triple x86_64-unknown-unknown \53// RUN: -fbfloat16-excess-precision=none -target-feature +fullbf16 \54// RUN: -emit-llvm -ffp-eval-method=source -o - %s \55// RUN: | FileCheck -check-prefixes=CHECK-NO-EXT %s56 57// RUN: %clang_cc1 -triple x86_64-unknown-unknown \58// RUN: -fbfloat16-excess-precision=fast \59// RUN: -emit-llvm -ffp-eval-method=double -o - %s \60// RUN: | FileCheck -check-prefixes=CHECK-EXT-DBL %s61 62// RUN: %clang_cc1 -triple x86_64-unknown-unknown \63// RUN: -fbfloat16-excess-precision=fast -target-feature +fullbf16 \64// RUN: -emit-llvm -ffp-eval-method=double -o - %s \65// RUN: | FileCheck -check-prefixes=CHECK-EXT-DBL %s66 67// RUN: %clang_cc1 -triple x86_64-unknown-unknown \68// RUN: -fbfloat16-excess-precision=standard \69// RUN: -emit-llvm -ffp-eval-method=double -o - %s \70// RUN: | FileCheck -check-prefixes=CHECK-EXT-DBL %s71 72// RUN: %clang_cc1 -triple x86_64-unknown-unknown \73// RUN: -fbfloat16-excess-precision=standard -target-feature +fullbf16 \74// RUN: -emit-llvm -ffp-eval-method=double -o - %s \75// RUN: | FileCheck -check-prefixes=CHECK-EXT-DBL %s76 77// RUN: %clang_cc1 -triple x86_64-unknown-unknown \78// RUN: -fbfloat16-excess-precision=none \79// RUN: -emit-llvm -ffp-eval-method=double -o - %s \80// RUN: | FileCheck -check-prefixes=CHECK-EXT-DBL %s81 82// RUN: %clang_cc1 -triple x86_64-unknown-unknown \83// RUN: -fbfloat16-excess-precision=none -target-feature +fullbf16 \84// RUN: -emit-llvm -ffp-eval-method=double -o - %s \85// RUN: | FileCheck -check-prefixes=CHECK-EXT-DBL %s86 87// RUN: %clang_cc1 -triple x86_64-unknown-unknown \88// RUN: -fbfloat16-excess-precision=fast \89// RUN: -emit-llvm -ffp-eval-method=extended -o - %s \90// RUN: | FileCheck -check-prefixes=CHECK-EXT-FP80 %s91 92// RUN: %clang_cc1 -triple x86_64-unknown-unknown \93// RUN: -fbfloat16-excess-precision=fast -target-feature +fullbf16 \94// RUN: -emit-llvm -ffp-eval-method=extended -o - %s \95// RUN: | FileCheck -check-prefixes=CHECK-EXT-FP80 %s96 97// RUN: %clang_cc1 -triple x86_64-unknown-unknown \98// RUN: -fbfloat16-excess-precision=standard \99// RUN: -emit-llvm -ffp-eval-method=extended -o - %s \100// RUN: | FileCheck -check-prefixes=CHECK-EXT-FP80 %s101 102// RUN: %clang_cc1 -triple x86_64-unknown-unknown \103// RUN: -fbfloat16-excess-precision=standard -target-feature +fullbf16 \104// RUN: -emit-llvm -ffp-eval-method=extended -o - %s \105// RUN: | FileCheck -check-prefixes=CHECK-EXT-FP80 %s106 107// RUN: %clang_cc1 -triple x86_64-unknown-unknown \108// RUN: -fbfloat16-excess-precision=none \109// RUN: -emit-llvm -ffp-eval-method=extended -o - %s \110// RUN: | FileCheck -check-prefixes=CHECK-EXT-FP80 %s111 112// RUN: %clang_cc1 -triple x86_64-unknown-unknown \113// RUN: -fbfloat16-excess-precision=none -target-feature +fullbf16 \114// RUN: -emit-llvm -ffp-eval-method=extended -o - %s \115// RUN: | FileCheck -check-prefixes=CHECK-EXT-FP80 %s116 117// RUN: %clang_cc1 -triple x86_64-unknown-unknown \118// RUN: -fbfloat16-excess-precision=none \119// RUN: -ffp-contract=on -emit-llvm -o - %s \120// RUN: | FileCheck -check-prefixes=CHECK-CONTRACT %s121 122// RUN: %clang_cc1 -triple x86_64-unknown-unknown \123// RUN: -fbfloat16-excess-precision=none -target-feature +fullbf16 \124// RUN: -ffp-contract=on -emit-llvm -o - %s \125// RUN: | FileCheck -check-prefixes=CHECK-CONTRACT %s126 127// RUN: %clang_cc1 -triple x86_64-unknown-unknown \128// RUN: -fbfloat16-excess-precision=none \129// RUN: -fmath-errno -ffp-contract=on -fno-rounding-math \130// RUN: -ffp-eval-method=source -emit-llvm -o - %s \131// RUN: | FileCheck -check-prefixes=CHECK-CONTRACT %s132 133// RUN: %clang_cc1 -triple x86_64-unknown-unknown \134// RUN: -fbfloat16-excess-precision=none -target-feature +fullbf16 \135// RUN: -fmath-errno -ffp-contract=on -fno-rounding-math \136// RUN: -ffp-eval-method=source -emit-llvm -o - %s \137// RUN: | FileCheck -check-prefixes=CHECK-CONTRACT %s138 139// RUN: %clang_cc1 -triple x86_64-unknown-unknown \140// RUN: -fbfloat16-excess-precision=none \141// RUN: -fmath-errno -ffp-contract=on -fno-rounding-math \142// RUN: -ffp-eval-method=double -emit-llvm -o - %s \143// RUN: | FileCheck -check-prefixes=CHECK-CONTRACT-DBL %s144 145// RUN: %clang_cc1 -triple x86_64-unknown-unknown \146// RUN: -fbfloat16-excess-precision=none -target-feature +fullbf16 \147// RUN: -fmath-errno -ffp-contract=on -fno-rounding-math \148// RUN: -ffp-eval-method=double -emit-llvm -o - %s \149// RUN: | FileCheck -check-prefixes=CHECK-CONTRACT-DBL %s150 151// RUN: %clang_cc1 -triple x86_64-unknown-unknown \152// RUN: -fbfloat16-excess-precision=none \153// RUN: -fmath-errno -ffp-contract=on -fno-rounding-math \154// RUN: -ffp-eval-method=extended -emit-llvm -o - %s \155// RUN: | FileCheck -check-prefixes=CHECK-CONTRACT-EXT %s156 157// RUN: %clang_cc1 -triple x86_64-unknown-unknown \158// RUN: -fbfloat16-excess-precision=none -target-feature +fullbf16 \159// RUN: -fmath-errno -ffp-contract=on -fno-rounding-math \160// RUN: -ffp-eval-method=extended -emit-llvm -o - %s \161// RUN: | FileCheck -check-prefixes=CHECK-CONTRACT-EXT %s162 163// RUN: %clang_cc1 -triple x86_64-unknown-unknown \164// RUN: -fbfloat16-excess-precision=none \165// RUN: -fapprox-func -fmath-errno -fno-signed-zeros -mreassociate \166// RUN: -freciprocal-math -ffp-contract=on -fno-rounding-math \167// RUN: -funsafe-math-optimizations -emit-llvm -o - %s \168// RUN: | FileCheck -check-prefixes=CHECK-UNSAFE %s169 170// RUN: %clang_cc1 -triple x86_64-unknown-unknown \171// RUN: -fbfloat16-excess-precision=none -target-feature +fullbf16 \172// RUN: -fapprox-func -fmath-errno -fno-signed-zeros -mreassociate \173// RUN: -freciprocal-math -ffp-contract=on -fno-rounding-math \174// RUN: -funsafe-math-optimizations -emit-llvm -o - %s \175// RUN: | FileCheck -check-prefixes=CHECK-UNSAFE %s176 177// CHECK-EXT-LABEL: define dso_local bfloat @f178// CHECK-EXT-SAME: (bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]], bfloat noundef [[C:%.*]], bfloat noundef [[D:%.*]]) #[[ATTR0:[0-9]+]] {179// CHECK-EXT-NEXT:  entry:180// CHECK-EXT-NEXT:    [[A_ADDR:%.*]] = alloca bfloat, align 2181// CHECK-EXT-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 2182// CHECK-EXT-NEXT:    [[C_ADDR:%.*]] = alloca bfloat, align 2183// CHECK-EXT-NEXT:    [[D_ADDR:%.*]] = alloca bfloat, align 2184// CHECK-EXT-NEXT:    store bfloat [[A]], ptr [[A_ADDR]], align 2185// CHECK-EXT-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 2186// CHECK-EXT-NEXT:    store bfloat [[C]], ptr [[C_ADDR]], align 2187// CHECK-EXT-NEXT:    store bfloat [[D]], ptr [[D_ADDR]], align 2188// CHECK-EXT-NEXT:    [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2189// CHECK-EXT-NEXT:    [[EXT:%.*]] = fpext bfloat [[TMP0]] to float190// CHECK-EXT-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2191// CHECK-EXT-NEXT:    [[EXT1:%.*]] = fpext bfloat [[TMP1]] to float192// CHECK-EXT-NEXT:    [[MUL:%.*]] = fmul float [[EXT]], [[EXT1]]193// CHECK-EXT-NEXT:    [[TMP2:%.*]] = load bfloat, ptr [[C_ADDR]], align 2194// CHECK-EXT-NEXT:    [[EXT2:%.*]] = fpext bfloat [[TMP2]] to float195// CHECK-EXT-NEXT:    [[TMP3:%.*]] = load bfloat, ptr [[D_ADDR]], align 2196// CHECK-EXT-NEXT:    [[EXT3:%.*]] = fpext bfloat [[TMP3]] to float197// CHECK-EXT-NEXT:    [[MUL4:%.*]] = fmul float [[EXT2]], [[EXT3]]198// CHECK-EXT-NEXT:    [[ADD:%.*]] = fadd float [[MUL]], [[MUL4]]199// CHECK-EXT-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD]] to bfloat200// CHECK-EXT-NEXT:    ret bfloat [[UNPROMOTION]]201//202// CHECK-NO-EXT-LABEL: define dso_local bfloat @f203// CHECK-NO-EXT-SAME: (bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]], bfloat noundef [[C:%.*]], bfloat noundef [[D:%.*]]) #[[ATTR0:[0-9]+]] {204// CHECK-NO-EXT-NEXT:  entry:205// CHECK-NO-EXT-NEXT:    [[A_ADDR:%.*]] = alloca bfloat, align 2206// CHECK-NO-EXT-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 2207// CHECK-NO-EXT-NEXT:    [[C_ADDR:%.*]] = alloca bfloat, align 2208// CHECK-NO-EXT-NEXT:    [[D_ADDR:%.*]] = alloca bfloat, align 2209// CHECK-NO-EXT-NEXT:    store bfloat [[A]], ptr [[A_ADDR]], align 2210// CHECK-NO-EXT-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 2211// CHECK-NO-EXT-NEXT:    store bfloat [[C]], ptr [[C_ADDR]], align 2212// CHECK-NO-EXT-NEXT:    store bfloat [[D]], ptr [[D_ADDR]], align 2213// CHECK-NO-EXT-NEXT:    [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2214// CHECK-NO-EXT-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2215// CHECK-NO-EXT-NEXT:    [[MUL:%.*]] = fmul bfloat [[TMP0]], [[TMP1]]216// CHECK-NO-EXT-NEXT:    [[TMP2:%.*]] = load bfloat, ptr [[C_ADDR]], align 2217// CHECK-NO-EXT-NEXT:    [[TMP3:%.*]] = load bfloat, ptr [[D_ADDR]], align 2218// CHECK-NO-EXT-NEXT:    [[MUL1:%.*]] = fmul bfloat [[TMP2]], [[TMP3]]219// CHECK-NO-EXT-NEXT:    [[ADD:%.*]] = fadd bfloat [[MUL]], [[MUL1]]220// CHECK-NO-EXT-NEXT:    ret bfloat [[ADD]]221//222// CHECK-EXT-DBL-LABEL: define dso_local bfloat @f223// CHECK-EXT-DBL-SAME: (bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]], bfloat noundef [[C:%.*]], bfloat noundef [[D:%.*]]) #[[ATTR0:[0-9]+]] {224// CHECK-EXT-DBL-NEXT:  entry:225// CHECK-EXT-DBL-NEXT:    [[A_ADDR:%.*]] = alloca bfloat, align 2226// CHECK-EXT-DBL-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 2227// CHECK-EXT-DBL-NEXT:    [[C_ADDR:%.*]] = alloca bfloat, align 2228// CHECK-EXT-DBL-NEXT:    [[D_ADDR:%.*]] = alloca bfloat, align 2229// CHECK-EXT-DBL-NEXT:    store bfloat [[A]], ptr [[A_ADDR]], align 2230// CHECK-EXT-DBL-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 2231// CHECK-EXT-DBL-NEXT:    store bfloat [[C]], ptr [[C_ADDR]], align 2232// CHECK-EXT-DBL-NEXT:    store bfloat [[D]], ptr [[D_ADDR]], align 2233// CHECK-EXT-DBL-NEXT:    [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2234// CHECK-EXT-DBL-NEXT:    [[CONV:%.*]] = fpext bfloat [[TMP0]] to double235// CHECK-EXT-DBL-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2236// CHECK-EXT-DBL-NEXT:    [[CONV1:%.*]] = fpext bfloat [[TMP1]] to double237// CHECK-EXT-DBL-NEXT:    [[MUL:%.*]] = fmul double [[CONV]], [[CONV1]]238// CHECK-EXT-DBL-NEXT:    [[TMP2:%.*]] = load bfloat, ptr [[C_ADDR]], align 2239// CHECK-EXT-DBL-NEXT:    [[CONV2:%.*]] = fpext bfloat [[TMP2]] to double240// CHECK-EXT-DBL-NEXT:    [[TMP3:%.*]] = load bfloat, ptr [[D_ADDR]], align 2241// CHECK-EXT-DBL-NEXT:    [[CONV3:%.*]] = fpext bfloat [[TMP3]] to double242// CHECK-EXT-DBL-NEXT:    [[MUL4:%.*]] = fmul double [[CONV2]], [[CONV3]]243// CHECK-EXT-DBL-NEXT:    [[ADD:%.*]] = fadd double [[MUL]], [[MUL4]]244// CHECK-EXT-DBL-NEXT:    [[CONV5:%.*]] = fptrunc double [[ADD]] to bfloat245// CHECK-EXT-DBL-NEXT:    ret bfloat [[CONV5]]246//247// CHECK-EXT-FP80-LABEL: define dso_local bfloat @f248// CHECK-EXT-FP80-SAME: (bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]], bfloat noundef [[C:%.*]], bfloat noundef [[D:%.*]]) #[[ATTR0:[0-9]+]] {249// CHECK-EXT-FP80-NEXT:  entry:250// CHECK-EXT-FP80-NEXT:    [[A_ADDR:%.*]] = alloca bfloat, align 2251// CHECK-EXT-FP80-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 2252// CHECK-EXT-FP80-NEXT:    [[C_ADDR:%.*]] = alloca bfloat, align 2253// CHECK-EXT-FP80-NEXT:    [[D_ADDR:%.*]] = alloca bfloat, align 2254// CHECK-EXT-FP80-NEXT:    store bfloat [[A]], ptr [[A_ADDR]], align 2255// CHECK-EXT-FP80-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 2256// CHECK-EXT-FP80-NEXT:    store bfloat [[C]], ptr [[C_ADDR]], align 2257// CHECK-EXT-FP80-NEXT:    store bfloat [[D]], ptr [[D_ADDR]], align 2258// CHECK-EXT-FP80-NEXT:    [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2259// CHECK-EXT-FP80-NEXT:    [[CONV:%.*]] = fpext bfloat [[TMP0]] to x86_fp80260// CHECK-EXT-FP80-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2261// CHECK-EXT-FP80-NEXT:    [[CONV1:%.*]] = fpext bfloat [[TMP1]] to x86_fp80262// CHECK-EXT-FP80-NEXT:    [[MUL:%.*]] = fmul x86_fp80 [[CONV]], [[CONV1]]263// CHECK-EXT-FP80-NEXT:    [[TMP2:%.*]] = load bfloat, ptr [[C_ADDR]], align 2264// CHECK-EXT-FP80-NEXT:    [[CONV2:%.*]] = fpext bfloat [[TMP2]] to x86_fp80265// CHECK-EXT-FP80-NEXT:    [[TMP3:%.*]] = load bfloat, ptr [[D_ADDR]], align 2266// CHECK-EXT-FP80-NEXT:    [[CONV3:%.*]] = fpext bfloat [[TMP3]] to x86_fp80267// CHECK-EXT-FP80-NEXT:    [[MUL4:%.*]] = fmul x86_fp80 [[CONV2]], [[CONV3]]268// CHECK-EXT-FP80-NEXT:    [[ADD:%.*]] = fadd x86_fp80 [[MUL]], [[MUL4]]269// CHECK-EXT-FP80-NEXT:    [[CONV5:%.*]] = fptrunc x86_fp80 [[ADD]] to bfloat270// CHECK-EXT-FP80-NEXT:    ret bfloat [[CONV5]]271//272// CHECK-CONTRACT-LABEL: define dso_local bfloat @f273// CHECK-CONTRACT-SAME: (bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]], bfloat noundef [[C:%.*]], bfloat noundef [[D:%.*]]) #[[ATTR0:[0-9]+]] {274// CHECK-CONTRACT-NEXT:  entry:275// CHECK-CONTRACT-NEXT:    [[A_ADDR:%.*]] = alloca bfloat, align 2276// CHECK-CONTRACT-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 2277// CHECK-CONTRACT-NEXT:    [[C_ADDR:%.*]] = alloca bfloat, align 2278// CHECK-CONTRACT-NEXT:    [[D_ADDR:%.*]] = alloca bfloat, align 2279// CHECK-CONTRACT-NEXT:    store bfloat [[A]], ptr [[A_ADDR]], align 2280// CHECK-CONTRACT-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 2281// CHECK-CONTRACT-NEXT:    store bfloat [[C]], ptr [[C_ADDR]], align 2282// CHECK-CONTRACT-NEXT:    store bfloat [[D]], ptr [[D_ADDR]], align 2283// CHECK-CONTRACT-NEXT:    [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2284// CHECK-CONTRACT-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2285// CHECK-CONTRACT-NEXT:    [[TMP2:%.*]] = load bfloat, ptr [[C_ADDR]], align 2286// CHECK-CONTRACT-NEXT:    [[TMP3:%.*]] = load bfloat, ptr [[D_ADDR]], align 2287// CHECK-CONTRACT-NEXT:    [[MUL1:%.*]] = fmul bfloat [[TMP2]], [[TMP3]]288// CHECK-CONTRACT-NEXT:    [[TMP4:%.*]] = call bfloat @llvm.fmuladd.bf16(bfloat [[TMP0]], bfloat [[TMP1]], bfloat [[MUL1]])289// CHECK-CONTRACT-NEXT:    ret bfloat [[TMP4]]290//291// CHECK-CONTRACT-DBL-LABEL: define dso_local bfloat @f292// CHECK-CONTRACT-DBL-SAME: (bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]], bfloat noundef [[C:%.*]], bfloat noundef [[D:%.*]]) #[[ATTR0:[0-9]+]] {293// CHECK-CONTRACT-DBL-NEXT:  entry:294// CHECK-CONTRACT-DBL-NEXT:    [[A_ADDR:%.*]] = alloca bfloat, align 2295// CHECK-CONTRACT-DBL-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 2296// CHECK-CONTRACT-DBL-NEXT:    [[C_ADDR:%.*]] = alloca bfloat, align 2297// CHECK-CONTRACT-DBL-NEXT:    [[D_ADDR:%.*]] = alloca bfloat, align 2298// CHECK-CONTRACT-DBL-NEXT:    store bfloat [[A]], ptr [[A_ADDR]], align 2299// CHECK-CONTRACT-DBL-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 2300// CHECK-CONTRACT-DBL-NEXT:    store bfloat [[C]], ptr [[C_ADDR]], align 2301// CHECK-CONTRACT-DBL-NEXT:    store bfloat [[D]], ptr [[D_ADDR]], align 2302// CHECK-CONTRACT-DBL-NEXT:    [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2303// CHECK-CONTRACT-DBL-NEXT:    [[CONV:%.*]] = fpext bfloat [[TMP0]] to double304// CHECK-CONTRACT-DBL-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2305// CHECK-CONTRACT-DBL-NEXT:    [[CONV1:%.*]] = fpext bfloat [[TMP1]] to double306// CHECK-CONTRACT-DBL-NEXT:    [[TMP2:%.*]] = load bfloat, ptr [[C_ADDR]], align 2307// CHECK-CONTRACT-DBL-NEXT:    [[CONV2:%.*]] = fpext bfloat [[TMP2]] to double308// CHECK-CONTRACT-DBL-NEXT:    [[TMP3:%.*]] = load bfloat, ptr [[D_ADDR]], align 2309// CHECK-CONTRACT-DBL-NEXT:    [[CONV3:%.*]] = fpext bfloat [[TMP3]] to double310// CHECK-CONTRACT-DBL-NEXT:    [[MUL4:%.*]] = fmul double [[CONV2]], [[CONV3]]311// CHECK-CONTRACT-DBL-NEXT:    [[TMP4:%.*]] = call double @llvm.fmuladd.f64(double [[CONV]], double [[CONV1]], double [[MUL4]])312// CHECK-CONTRACT-DBL-NEXT:    [[CONV5:%.*]] = fptrunc double [[TMP4]] to bfloat313// CHECK-CONTRACT-DBL-NEXT:    ret bfloat [[CONV5]]314//315// CHECK-CONTRACT-EXT-LABEL: define dso_local bfloat @f316// CHECK-CONTRACT-EXT-SAME: (bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]], bfloat noundef [[C:%.*]], bfloat noundef [[D:%.*]]) #[[ATTR0:[0-9]+]] {317// CHECK-CONTRACT-EXT-NEXT:  entry:318// CHECK-CONTRACT-EXT-NEXT:    [[A_ADDR:%.*]] = alloca bfloat, align 2319// CHECK-CONTRACT-EXT-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 2320// CHECK-CONTRACT-EXT-NEXT:    [[C_ADDR:%.*]] = alloca bfloat, align 2321// CHECK-CONTRACT-EXT-NEXT:    [[D_ADDR:%.*]] = alloca bfloat, align 2322// CHECK-CONTRACT-EXT-NEXT:    store bfloat [[A]], ptr [[A_ADDR]], align 2323// CHECK-CONTRACT-EXT-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 2324// CHECK-CONTRACT-EXT-NEXT:    store bfloat [[C]], ptr [[C_ADDR]], align 2325// CHECK-CONTRACT-EXT-NEXT:    store bfloat [[D]], ptr [[D_ADDR]], align 2326// CHECK-CONTRACT-EXT-NEXT:    [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2327// CHECK-CONTRACT-EXT-NEXT:    [[CONV:%.*]] = fpext bfloat [[TMP0]] to x86_fp80328// CHECK-CONTRACT-EXT-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2329// CHECK-CONTRACT-EXT-NEXT:    [[CONV1:%.*]] = fpext bfloat [[TMP1]] to x86_fp80330// CHECK-CONTRACT-EXT-NEXT:    [[TMP2:%.*]] = load bfloat, ptr [[C_ADDR]], align 2331// CHECK-CONTRACT-EXT-NEXT:    [[CONV2:%.*]] = fpext bfloat [[TMP2]] to x86_fp80332// CHECK-CONTRACT-EXT-NEXT:    [[TMP3:%.*]] = load bfloat, ptr [[D_ADDR]], align 2333// CHECK-CONTRACT-EXT-NEXT:    [[CONV3:%.*]] = fpext bfloat [[TMP3]] to x86_fp80334// CHECK-CONTRACT-EXT-NEXT:    [[MUL4:%.*]] = fmul x86_fp80 [[CONV2]], [[CONV3]]335// CHECK-CONTRACT-EXT-NEXT:    [[TMP4:%.*]] = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 [[CONV]], x86_fp80 [[CONV1]], x86_fp80 [[MUL4]])336// CHECK-CONTRACT-EXT-NEXT:    [[CONV5:%.*]] = fptrunc x86_fp80 [[TMP4]] to bfloat337// CHECK-CONTRACT-EXT-NEXT:    ret bfloat [[CONV5]]338//339// CHECK-UNSAFE-LABEL: define dso_local bfloat @f340// CHECK-UNSAFE-SAME: (bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]], bfloat noundef [[C:%.*]], bfloat noundef [[D:%.*]]) #[[ATTR0:[0-9]+]] {341// CHECK-UNSAFE-NEXT:  entry:342// CHECK-UNSAFE-NEXT:    [[A_ADDR:%.*]] = alloca bfloat, align 2343// CHECK-UNSAFE-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 2344// CHECK-UNSAFE-NEXT:    [[C_ADDR:%.*]] = alloca bfloat, align 2345// CHECK-UNSAFE-NEXT:    [[D_ADDR:%.*]] = alloca bfloat, align 2346// CHECK-UNSAFE-NEXT:    store bfloat [[A]], ptr [[A_ADDR]], align 2347// CHECK-UNSAFE-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 2348// CHECK-UNSAFE-NEXT:    store bfloat [[C]], ptr [[C_ADDR]], align 2349// CHECK-UNSAFE-NEXT:    store bfloat [[D]], ptr [[D_ADDR]], align 2350// CHECK-UNSAFE-NEXT:    [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2351// CHECK-UNSAFE-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2352// CHECK-UNSAFE-NEXT:    [[TMP2:%.*]] = load bfloat, ptr [[C_ADDR]], align 2353// CHECK-UNSAFE-NEXT:    [[TMP3:%.*]] = load bfloat, ptr [[D_ADDR]], align 2354// CHECK-UNSAFE-NEXT:    [[MUL1:%.*]] = fmul reassoc nsz arcp afn bfloat [[TMP2]], [[TMP3]]355// CHECK-UNSAFE-NEXT:    [[TMP4:%.*]] = call reassoc nsz arcp afn bfloat @llvm.fmuladd.bf16(bfloat [[TMP0]], bfloat [[TMP1]], bfloat [[MUL1]])356// CHECK-UNSAFE-NEXT:    ret bfloat [[TMP4]]357//358__bf16 f(__bf16 a, __bf16 b, __bf16 c, __bf16 d) {359    return a * b + c * d;360}361