152 lines · cpp
1// RUN: %clang_cc1 -O3 -ffp-contract=fast-honor-pragmas -triple %itanium_abi_triple -emit-llvm -o - %s | FileCheck %s2 3float fp_contract_on_1(float a, float b, float c) {4 // CHECK-LABEL: fp_contract_on_1fff(5 // CHECK: call float @llvm.fmuladd.f32(float {{.*}}, float {{.*}}, float {{.*}})6 #pragma STDC FP_CONTRACT ON7 return a * b + c;8}9 10float fp_contract_on_2(float a, float b, float c) {11 // CHECK-LABEL: fp_contract_on_2fff(12 // CHECK: fmul float13 // CHECK: fadd float14 #pragma STDC FP_CONTRACT ON15 float t = a * b;16 return t + c;17}18 19float fp_contract_off_1(float a, float b, float c) {20 // CHECK-LABEL: fp_contract_off_1fff(21 // CHECK: fmul float22 // CHECK: fadd float23 #pragma STDC FP_CONTRACT OFF24 return a * b + c;25}26 27float fp_contract_off_2(float a, float b, float c) {28 // CHECK-LABEL: fp_contract_off_2fff(29 // CHECK: fmul float30 // CHECK: fadd float31 #pragma STDC FP_CONTRACT OFF32 float t = a * b;33 return t + c;34}35 36float fp_contract_default_1(float a, float b, float c) {37 // CHECK-LABEL: fp_contract_default_1fff(38 // CHECK: fmul contract float39 // CHECK: fadd contract float40 #pragma STDC FP_CONTRACT DEFAULT41 return a * b + c;42}43 44float fp_contract_default_2(float a, float b, float c) {45 // CHECK-LABEL: fp_contract_default_2fff(46 // CHECK: fmul contract float47 // CHECK: fadd contract float48 #pragma STDC FP_CONTRACT DEFAULT49 float t = a * b;50 return t + c;51}52 53float fp_contract_clang_on_1(float a, float b, float c) {54 // CHECK-LABEL: fp_contract_clang_on_1fff(55 // CHECK: call float @llvm.fmuladd.f32(float {{.*}}, float {{.*}}, float {{.*}})56 #pragma clang fp contract(on)57 return a * b + c;58}59 60float fp_contract_clang_on_2(float a, float b, float c) {61 // CHECK-LABEL: fp_contract_clang_on_2fff(62 // CHECK: fmul float63 // CHECK: fadd float64 #pragma clang fp contract(on)65 float t = a * b;66 return t + c;67}68 69float fp_contract_clang_off_1(float a, float b, float c) {70 // CHECK-LABEL: fp_contract_clang_off_1fff(71 // CHECK: fmul float72 // CHECK: fadd float73 #pragma clang fp contract(off)74 return a * b + c;75}76 77float fp_contract_clang_off_2(float a, float b, float c) {78 // CHECK-LABEL: fp_contract_clang_off_2fff(79 // CHECK: fmul float80 // CHECK: fadd float81 #pragma clang fp contract(off)82 float t = a * b;83 return t + c;84}85 86float fp_contract_clang_fast_1(float a, float b, float c) {87 // CHECK-LABEL: fp_contract_clang_fast_1fff(88 // CHECK: fmul contract float89 // CHECK: fadd contract float90 #pragma clang fp contract(fast)91 return a * b + c;92}93 94float fp_contract_clang_fast_2(float a, float b, float c) {95 // CHECK-LABEL: fp_contract_clang_fast_2fff(96 // CHECK: fmul contract float97 // CHECK: fadd contract float98 #pragma clang fp contract(fast)99 float t = a * b;100 return t + c;101}102 103#pragma STDC FP_CONTRACT ON104 105float fp_contract_global_on_1(float a, float b, float c) {106 // CHECK-LABEL: fp_contract_global_on_1fff(107 // CHECK: call float @llvm.fmuladd.f32(float {{.*}}, float {{.*}}, float {{.*}})108 return a * b + c;109}110 111float fp_contract_global_on_2(float a, float b, float c) {112 // CHECK-LABEL: fp_contract_global_on_2fff(113 // CHECK: fmul float114 // CHECK: fadd float115 float t = a * b;116 return t + c;117}118 119#pragma STDC FP_CONTRACT OFF120 121float fp_contract_global_off_1(float a, float b, float c) {122 // CHECK-LABEL: fp_contract_global_off_1fff(123 // CHECK: fmul float124 // CHECK: fadd float125 return a * b + c;126}127 128float fp_contract_global_off_2(float a, float b, float c) {129 // CHECK-LABEL: fp_contract_global_off_2fff(130 // CHECK: fmul float131 // CHECK: fadd float132 float t = a * b;133 return t + c;134}135 136#pragma STDC FP_CONTRACT DEFAULT137 138float fp_contract_global_default_1(float a, float b, float c) {139 // CHECK-LABEL: fp_contract_global_default_1fff(140 // CHECK: fmul contract float141 // CHECK: fadd contract float142 return a * b + c;143}144 145float fp_contract_global_default_2(float a, float b, float c) {146 // CHECK-LABEL: fp_contract_global_default_2fff(147 // CHECK: fmul contract float148 // CHECK: fadd contract float149 float t = a * b;150 return t + c;151}152