From 3d94a0d81dd28d03e5f29d85892c52746798f0c4 Mon Sep 17 00:00:00 2001 From: Sjoerd Meijer Date: Wed, 19 Oct 2016 13:43:02 +0000 Subject: [PATCH] Reapply r284571 (with the new tests fixed). llvm-svn: 284588 --- lib/Target/ARM/ARMAsmPrinter.cpp | 29 ++++++++++--------- test/CodeGen/ARM/build-attributes-fn-attr0.ll | 11 +++++++ test/CodeGen/ARM/build-attributes-fn-attr1.ll | 17 +++++++++++ test/CodeGen/ARM/build-attributes-fn-attr2.ll | 16 ++++++++++ test/CodeGen/ARM/build-attributes-fn-attr3.ll | 17 +++++++++++ test/CodeGen/ARM/build-attributes-fn-attr4.ll | 16 ++++++++++ test/CodeGen/ARM/build-attributes-fn-attr5.ll | 16 ++++++++++ test/CodeGen/ARM/build-attributes-fn-attr6.ll | 22 ++++++++++++++ 8 files changed, 130 insertions(+), 14 deletions(-) create mode 100644 test/CodeGen/ARM/build-attributes-fn-attr0.ll create mode 100644 test/CodeGen/ARM/build-attributes-fn-attr1.ll create mode 100644 test/CodeGen/ARM/build-attributes-fn-attr2.ll create mode 100644 test/CodeGen/ARM/build-attributes-fn-attr3.ll create mode 100644 test/CodeGen/ARM/build-attributes-fn-attr4.ll create mode 100644 test/CodeGen/ARM/build-attributes-fn-attr5.ll create mode 100644 test/CodeGen/ARM/build-attributes-fn-attr6.ll diff --git a/lib/Target/ARM/ARMAsmPrinter.cpp b/lib/Target/ARM/ARMAsmPrinter.cpp index 836dbc5d985..3fe14094a24 100644 --- a/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/lib/Target/ARM/ARMAsmPrinter.cpp @@ -633,17 +633,15 @@ static ARMBuildAttrs::CPUArch getArchForCPU(StringRef CPU, return ARMBuildAttrs::v4; } -// Returns true if all functions have the same function attribute value -static bool haveAllFunctionsAttribute(const Module &M, StringRef Attr, - StringRef Value) { - for (auto &F : M) - if (F.getFnAttribute(Attr).getValueAsString() != Value) - return false; - - return true; +// Returns true if all functions have the same function attribute value. +// It also returns true when the module has no functions. +static bool checkFunctionsAttributeConsistency(const Module &M, StringRef Attr, + StringRef Value) { + return !any_of(M, [&](const Function &F) { + return F.getFnAttribute(Attr).getValueAsString() != Value; + }); } - void ARMAsmPrinter::emitAttributes() { MCTargetStreamer &TS = *OutStreamer->getTargetStreamer(); ARMTargetStreamer &ATS = static_cast(TS); @@ -781,13 +779,15 @@ void ARMAsmPrinter::emitAttributes() { } // Set FP Denormals. - if (haveAllFunctionsAttribute(*MMI->getModule(), "denormal-fp-math", - "preserve-sign") || + if (checkFunctionsAttributeConsistency(*MMI->getModule(), + "denormal-fp-math", + "preserve-sign") || TM.Options.FPDenormalMode == FPDenormal::PreserveSign) ATS.emitAttribute(ARMBuildAttrs::ABI_FP_denormal, ARMBuildAttrs::PreserveFPSign); - else if (haveAllFunctionsAttribute(*MMI->getModule(), "denormal-fp-math", - "positive-zero") || + else if (checkFunctionsAttributeConsistency(*MMI->getModule(), + "denormal-fp-math", + "positive-zero") || TM.Options.FPDenormalMode == FPDenormal::PositiveZero) ATS.emitAttribute(ARMBuildAttrs::ABI_FP_denormal, ARMBuildAttrs::PositiveZero); @@ -821,7 +821,8 @@ void ARMAsmPrinter::emitAttributes() { } // Set FP exceptions and rounding - if (haveAllFunctionsAttribute(*MMI->getModule(), "no-trapping-math", "true") || + if (checkFunctionsAttributeConsistency(*MMI->getModule(), + "no-trapping-math", "true") || TM.Options.NoTrappingFPMath) ATS.emitAttribute(ARMBuildAttrs::ABI_FP_exceptions, ARMBuildAttrs::Not_Allowed); diff --git a/test/CodeGen/ARM/build-attributes-fn-attr0.ll b/test/CodeGen/ARM/build-attributes-fn-attr0.ll new file mode 100644 index 00000000000..2fb3e032e5d --- /dev/null +++ b/test/CodeGen/ARM/build-attributes-fn-attr0.ll @@ -0,0 +1,11 @@ +; Check FP options -fno-trapping-math and -fdenormal-fp-math. They are passed +; as function attributes, which map on to build attributes ABI_FP_exceptions +; ABI_FP_denormal. In the backend we therefore have a check to see if all +; functions have consistent function attributes values. This check also returns +; true when the compilation unit does not have any functions (i.e. the +; attributes are consistent), which is what we check with this regression test. + +; RUN: llc < %s -mtriple=armv7-linux-gnueabi -mcpu=cortex-a15 | FileCheck %s --check-prefix=CHECK + +; CHECK: .eabi_attribute 20, 2 +; CHECK: .eabi_attribute 21, 0 diff --git a/test/CodeGen/ARM/build-attributes-fn-attr1.ll b/test/CodeGen/ARM/build-attributes-fn-attr1.ll new file mode 100644 index 00000000000..4d6ce7c9756 --- /dev/null +++ b/test/CodeGen/ARM/build-attributes-fn-attr1.ll @@ -0,0 +1,17 @@ +; Check FP options -fno-trapping-math and -fdenormal-fp-math. They are passed as +; function attributes, which map on to build attributes ABI_FP_exceptions ABI_FP_denormal. +; In the backend we have a check to see if all functions have consistent function +; attributes values. This checks the "default" behaviour when these FP function +; attributes are not set at all. + +; RUN: llc < %s -mtriple=armv7-linux-gnueabi -mcpu=cortex-a15 | FileCheck %s --check-prefix=CHECK + +; CHECK: .eabi_attribute 20, 1 +; CHECK: .eabi_attribute 21, 1 + +define i32 @foo_no_fn_attr() local_unnamed_addr #0 { +entry: + ret i32 42 +} + +attributes #0 = { minsize norecurse nounwind optsize readnone } diff --git a/test/CodeGen/ARM/build-attributes-fn-attr2.ll b/test/CodeGen/ARM/build-attributes-fn-attr2.ll new file mode 100644 index 00000000000..0272d613991 --- /dev/null +++ b/test/CodeGen/ARM/build-attributes-fn-attr2.ll @@ -0,0 +1,16 @@ +; Check FP options -fno-trapping-math and -fdenormal-fp-math. They are passed +; as function attributes, which map on to build attributes ABI_FP_exceptions +; ABI_FP_denormal. In the backend we therefore have a check to see if all +; functions have consistent function attributes values. +; Here we test correct output for no-trapping-math=false + +; RUN: llc < %s -mtriple=armv7-linux-gnueabi -mcpu=cortex-a15 | FileCheck %s --check-prefix=CHECK + +; CHECK: .eabi_attribute 21, 1 + +define i32 @foo() local_unnamed_addr #0 { +entry: + ret i32 42 +} + +attributes #0 = { minsize norecurse nounwind optsize readnone "no-trapping-math"="false" } diff --git a/test/CodeGen/ARM/build-attributes-fn-attr3.ll b/test/CodeGen/ARM/build-attributes-fn-attr3.ll new file mode 100644 index 00000000000..a454abac3b5 --- /dev/null +++ b/test/CodeGen/ARM/build-attributes-fn-attr3.ll @@ -0,0 +1,17 @@ +; Check FP options -fno-trapping-math and -fdenormal-fp-math. They are passed +; as function attributes, which map on to build attributes ABI_FP_exceptions +; ABI_FP_denormal. In the backend we therefore have a check to see if all +; functions have consistent function attributes values. +; Here we check values no-trapping-math=true and denormal-fp-math=ieee. + +; RUN: llc < %s -mtriple=armv7-linux-gnueabi -mcpu=cortex-a15 | FileCheck %s --check-prefix=CHECK + +; CHECK: .eabi_attribute 20, 1 +; CHECK: .eabi_attribute 21, 0 + +define i32 @foo() local_unnamed_addr #0 { +entry: + ret i32 42 +} + +attributes #0 = { minsize norecurse nounwind optsize readnone "no-trapping-math"="true" "denormal-fp-math"="ieee"} diff --git a/test/CodeGen/ARM/build-attributes-fn-attr4.ll b/test/CodeGen/ARM/build-attributes-fn-attr4.ll new file mode 100644 index 00000000000..6d2faac0052 --- /dev/null +++ b/test/CodeGen/ARM/build-attributes-fn-attr4.ll @@ -0,0 +1,16 @@ +; Check FP option -fdenormal-fp-math. This passed as function attribute, +; which map on to build attributes ABI_FP_denormal. In the backend we +; therefore have a check to see if all functions have consistent function +; attributes values. +; Here we check the denormal-fp-math=positive-zero value. + +; RUN: llc < %s -mtriple=armv7-linux-gnueabi -mcpu=cortex-a15 | FileCheck %s --check-prefix=CHECK + +; CHECK: .eabi_attribute 20, 0 + +define i32 @foo1() local_unnamed_addr #0 { +entry: + ret i32 42 +} + +attributes #0 = { minsize norecurse nounwind optsize readnone "denormal-fp-math"="positive-zero"} diff --git a/test/CodeGen/ARM/build-attributes-fn-attr5.ll b/test/CodeGen/ARM/build-attributes-fn-attr5.ll new file mode 100644 index 00000000000..e631d2e3b55 --- /dev/null +++ b/test/CodeGen/ARM/build-attributes-fn-attr5.ll @@ -0,0 +1,16 @@ +; Check FP option -fdenormal-fp-math. This passed as function attribute, +; which map on to build attributes ABI_FP_denormal. In the backend we +; therefore have a check to see if all functions have consistent function +; attributes values. +; Here we check the denormal-fp-math=preserve-sign value. + +; RUN: llc < %s -mtriple=armv7-linux-gnueabi -mcpu=cortex-a15 | FileCheck %s --check-prefix=CHECK + +; CHECK: .eabi_attribute 20, 2 + +define i32 @foo1() local_unnamed_addr #0 { +entry: + ret i32 42 +} + +attributes #0 = { minsize norecurse nounwind optsize readnone "denormal-fp-math"="preserve-sign"} diff --git a/test/CodeGen/ARM/build-attributes-fn-attr6.ll b/test/CodeGen/ARM/build-attributes-fn-attr6.ll new file mode 100644 index 00000000000..57443b0af0d --- /dev/null +++ b/test/CodeGen/ARM/build-attributes-fn-attr6.ll @@ -0,0 +1,22 @@ +; Check FP options -fno-trapping-math and -fdenormal-fp-math. They are passed +; as function attributes, which map on to build attributes ABI_FP_exceptions +; ABI_FP_denormal. In the backend we therefore have a check to see if all +; functions have consistent function attributes values. Here we check two +; functions have inconsistent values, and that a default is returned. + +; RUN: llc < %s -mtriple=armv7-linux-gnueabi -mcpu=cortex-a15 | FileCheck %s --check-prefix=CHECK + +; CHECK: .eabi_attribute 20, 1 + +define i32 @foo1() local_unnamed_addr #0 { +entry: + ret i32 42 +} + +define i32 @foo2() local_unnamed_addr #1 { +entry: + ret i32 42 +} + +attributes #0 = { minsize norecurse nounwind optsize readnone "denormal-fp-math"="preserve-sign"} +attributes #0 = { minsize norecurse nounwind optsize readnone "denormal-fp-math"="positive-zero"}