Don't pass FPOpFusion::Strict to the backend

This restores the behavior prior to D31167 where the code-gen default was
FPC_On which mapped to FPOpFusion::Standard.  After merging the FE
state (on/off) and the code-gen state (on/fast/off), the default became off to
match the front-end.

In other words, the front-end controls when to fuse along the language
standards and the backend shouldn't override this by splitting fused
intrinsics as FPOpFusion::Strict would imply.

Differential Revision: https://reviews.llvm.org/D32301

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@300858 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Adam Nemet 2017-04-20 17:09:35 +00:00
parent 3e6188d584
commit c4727f2079
2 changed files with 21 additions and 1 deletions

View File

@ -369,7 +369,9 @@ static void initTargetOptions(llvm::TargetOptions &Options,
// Set FP fusion mode.
switch (LangOpts.getDefaultFPContractMode()) {
case LangOptions::FPC_Off:
Options.AllowFPOpFusion = llvm::FPOpFusion::Strict;
// Preserve any contraction performed by the front-end. (Strict performs
// splitting of the muladd instrinsic in the backend.)
Options.AllowFPOpFusion = llvm::FPOpFusion::Standard;
break;
case LangOptions::FPC_On:
Options.AllowFPOpFusion = llvm::FPOpFusion::Standard;

View File

@ -0,0 +1,18 @@
// RUN: %clang_cc1 -O3 -triple=aarch64-apple-ios -S -o - %s | FileCheck %s
// REQUIRES: aarch64-registered-target
float fma_test1(float a, float b, float c) {
#pragma STDC FP_CONTRACT ON
// CHECK-LABEL: fma_test1:
// CHECK: fmadd
float x = a * b + c;
return x;
}
float fma_test2(float a, float b, float c) {
// CHECK-LABEL: fma_test2:
// CHECK: fmul
// CHECK: fadd
float x = a * b + c;
return x;
}