// RUN: %clang_cc1 -no-opaque-pointers -fexperimental-strict-floating-point  \
// RUN: -triple x86_64-linux-gnu -emit-llvm -o - %s  \
// RUN: | FileCheck %s -check-prefixes=CHECK

// RUN: %clang_cc1 -no-opaque-pointers -triple i386--linux -emit-llvm -o - %s \
// RUN: | FileCheck %s -check-prefixes=CHECK-EXT

// RUN: %clang_cc1 -no-opaque-pointers -fexperimental-strict-floating-point  \
// RUN: -mreassociate -freciprocal-math -ffp-contract=fast \
// RUN: -ffast-math -triple x86_64-linux-gnu \
// RUN: -emit-llvm -o - %s \
// RUN: | FileCheck %s -check-prefixes=CHECK-FAST

// RUN: %clang_cc1 -no-opaque-pointers -triple i386--linux -mreassociate -freciprocal-math \
// RUN: -ffp-contract=fast -ffast-math -emit-llvm -o - %s \
// RUN: | FileCheck %s -check-prefixes=CHECK-FAST

float a = 1.0f, b = 2.0f, c = 3.0f;
#pragma float_control(precise, off)
float res2 = a + b + c;
int val3 = __FLT_EVAL_METHOD__;
#pragma float_control(precise, on)
float res3 = a + b + c;
int val4 = __FLT_EVAL_METHOD__;

// CHECK: @val3 = global i32 -1
// CHECK: @val4 = global i32 0

// CHECK-EXT: @val3 = global i32 -1
// CHECK-EXT: @val4 = global i32 2

// CHECK-FAST: @val3 = global i32 -1
// CHECK-FAST: @val4 = global i32 -1

float res;
int add(float a, float b, float c) {
  // CHECK: fadd float
  // CHECK: load float, float*
  // CHECK: fadd float
  // CHECK: store float
  // CHECK: ret i32 0
  res = a + b + c;
  return __FLT_EVAL_METHOD__;
}

int add_precise(float a, float b, float c) {
#pragma float_control(precise, on)
  // CHECK: fadd float
  // CHECK: load float, float*
  // CHECK: fadd float
  // CHECK: store float
  // CHECK: ret i32 0
  res = a + b + c;
  return __FLT_EVAL_METHOD__;
}

#pragma float_control(push)
#pragma float_control(precise, on)
int add_precise_1(float a, float b, float c) {
  // CHECK: fadd float
  // CHECK: load float, float*
  // CHECK: fadd float
  // CHECK: store float
  // CHECK: ret i32 0
  res = a + b + c;
  return __FLT_EVAL_METHOD__;
}
#pragma float_control(pop)

int add_not_precise(float a, float b, float c) {
  // Fast-math is enabled with this pragma.
#pragma float_control(precise, off)
  // CHECK: fadd fast float
  // CHECK: load float, float*
  // CHECK: fadd fast float
  // CHECK: float {{.*}}, float*
  // CHECK: ret i32 -1
  res = a + b + c;
  return __FLT_EVAL_METHOD__;
}

#pragma float_control(push)
// Fast-math is enabled with this pragma.
#pragma float_control(precise, off)
int add_not_precise_1(float a, float b, float c) {
  // CHECK: fadd fast float
  // CHECK: load float, float*
  // CHECK: fadd fast float
  // CHECK: float {{.*}}, float*
  // CHECK: ret i32 -1
  res = a + b + c;
  return __FLT_EVAL_METHOD__;
}
#pragma float_control(pop)

int getFPEvalMethod() {
  // CHECK: ret i32 0
  return __FLT_EVAL_METHOD__;
}

float res1;
int whatever(float a, float b, float c) {
#pragma float_control(precise, off)
  // CHECK: load float, float*
  // CHECK: fadd fast float
  // CHECK: store float {{.*}}, float*
  // CHECK: store i32 -1
  // CHECK: store i32 0
  // CHECK: ret i32 -1
  res1 = a + b + c;
  int val1 = __FLT_EVAL_METHOD__;
  {
#pragma float_control(precise, on)
    int val2 = __FLT_EVAL_METHOD__;
  }
  return __FLT_EVAL_METHOD__;
}
