1 // RUN: %clang_cc1 -no-opaque-pointers -fexperimental-strict-floating-point \ 2 // RUN: -triple x86_64-linux-gnu -emit-llvm -o - %s \ 3 // RUN: | FileCheck %s -check-prefixes=CHECK 4 5 // RUN: %clang_cc1 -no-opaque-pointers -triple i386--linux -emit-llvm -o - %s \ 6 // RUN: | FileCheck %s -check-prefixes=CHECK-EXT 7 8 // RUN: %clang_cc1 -no-opaque-pointers -fexperimental-strict-floating-point \ 9 // RUN: -mreassociate -freciprocal-math -ffp-contract=fast \ 10 // RUN: -ffast-math -triple x86_64-linux-gnu \ 11 // RUN: -emit-llvm -o - %s \ 12 // RUN: | FileCheck %s -check-prefixes=CHECK-FAST 13 14 // RUN: %clang_cc1 -no-opaque-pointers -triple i386--linux -mreassociate -freciprocal-math \ 15 // RUN: -ffp-contract=fast -ffast-math -emit-llvm -o - %s \ 16 // RUN: | FileCheck %s -check-prefixes=CHECK-FAST 17 18 float a = 1.0f, b = 2.0f, c = 3.0f; 19 #pragma float_control(precise, off) 20 float res2 = a + b + c; 21 int val3 = __FLT_EVAL_METHOD__; 22 #pragma float_control(precise, on) 23 float res3 = a + b + c; 24 int val4 = __FLT_EVAL_METHOD__; 25 26 // CHECK: @val3 = global i32 -1 27 // CHECK: @val4 = global i32 0 28 29 // CHECK-EXT: @val3 = global i32 -1 30 // CHECK-EXT: @val4 = global i32 2 31 32 // CHECK-FAST: @val3 = global i32 -1 33 // CHECK-FAST: @val4 = global i32 -1 34 35 float res; 36 int add(float a, float b, float c) { 37 // CHECK: fadd float 38 // CHECK: load float, float* 39 // CHECK: fadd float 40 // CHECK: store float 41 // CHECK: ret i32 0 42 res = a + b + c; 43 return __FLT_EVAL_METHOD__; 44 } 45 46 int add_precise(float a, float b, float c) { 47 #pragma float_control(precise, on) 48 // CHECK: fadd float 49 // CHECK: load float, float* 50 // CHECK: fadd float 51 // CHECK: store float 52 // CHECK: ret i32 0 53 res = a + b + c; 54 return __FLT_EVAL_METHOD__; 55 } 56 57 #pragma float_control(push) 58 #pragma float_control(precise, on) 59 int add_precise_1(float a, float b, float c) { 60 // CHECK: fadd float 61 // CHECK: load float, float* 62 // CHECK: fadd float 63 // CHECK: store float 64 // CHECK: ret i32 0 65 res = a + b + c; 66 return __FLT_EVAL_METHOD__; 67 } 68 #pragma float_control(pop) 69 70 int add_not_precise(float a, float b, float c) { 71 // Fast-math is enabled with this pragma. 72 #pragma float_control(precise, off) 73 // CHECK: fadd fast float 74 // CHECK: load float, float* 75 // CHECK: fadd fast float 76 // CHECK: float {{.*}}, float* 77 // CHECK: ret i32 -1 78 res = a + b + c; 79 return __FLT_EVAL_METHOD__; 80 } 81 82 #pragma float_control(push) 83 // Fast-math is enabled with this pragma. 84 #pragma float_control(precise, off) 85 int add_not_precise_1(float a, float b, float c) { 86 // CHECK: fadd fast float 87 // CHECK: load float, float* 88 // CHECK: fadd fast float 89 // CHECK: float {{.*}}, float* 90 // CHECK: ret i32 -1 91 res = a + b + c; 92 return __FLT_EVAL_METHOD__; 93 } 94 #pragma float_control(pop) 95 96 int getFPEvalMethod() { 97 // CHECK: ret i32 0 98 return __FLT_EVAL_METHOD__; 99 } 100 101 float res1; 102 int whatever(float a, float b, float c) { 103 #pragma float_control(precise, off) 104 // CHECK: load float, float* 105 // CHECK: fadd fast float 106 // CHECK: store float {{.*}}, float* 107 // CHECK: store i32 -1 108 // CHECK: store i32 0 109 // CHECK: ret i32 -1 110 res1 = a + b + c; 111 int val1 = __FLT_EVAL_METHOD__; 112 { 113 #pragma float_control(precise, on) 114 int val2 = __FLT_EVAL_METHOD__; 115 } 116 return __FLT_EVAL_METHOD__; 117 } 118