[gcc(refs/users/marxin/heads/test-pragma)] Test patch.
Martin Liska
marxin@gcc.gnu.org
Thu Dec 9 13:52:14 GMT 2021
https://gcc.gnu.org/g:d7cfc27a862cf7088587defa1a74259a9d3c64e1
commit d7cfc27a862cf7088587defa1a74259a9d3c64e1
Author: Martin Liska <mliska@suse.cz>
Date: Thu Dec 9 14:51:57 2021 +0100
Test patch.
Diff:
---
gcc/attribs.c | 13 ++++++++++++-
gcc/testsuite/gcc.target/powerpc/pr103515.c | 30 +++++++++++++++++++++++++++++
2 files changed, 42 insertions(+), 1 deletion(-)
diff --git a/gcc/attribs.c b/gcc/attribs.c
index 32c941506f4..01a9ed66485 100644
--- a/gcc/attribs.c
+++ b/gcc/attribs.c
@@ -607,7 +607,18 @@ decl_attributes (tree *node, tree attributes, int flags,
if (TREE_CODE (*node) == FUNCTION_DECL
&& optimization_current_node != optimization_default_node
&& !DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node))
- DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node) = optimization_current_node;
+ {
+ DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node) = optimization_current_node;
+ tree cur_tree
+ = build_target_option_node (&global_options, &global_options_set);
+ tree old_tree = DECL_FUNCTION_SPECIFIC_TARGET (*node);
+ if (!old_tree)
+ old_tree = target_option_default_node;
+ /* The changes on optimization options can cause the changes in
+ target options, update it accordingly if it's changed. */
+ if (old_tree != cur_tree)
+ DECL_FUNCTION_SPECIFIC_TARGET (*node) = cur_tree;
+ }
/* If this is a function and the user used #pragma GCC target, add the
options to the attribute((target(...))) list. */
diff --git a/gcc/testsuite/gcc.target/powerpc/pr103515.c b/gcc/testsuite/gcc.target/powerpc/pr103515.c
new file mode 100644
index 00000000000..698b9a93037
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr103515.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-rtl-loop2_unroll-optimized" } */
+
+/* The pragma specified for foo2 should not affect foo1.
+ Verify compiler won't perform unrolling for foo1. */
+
+#define N 1024
+extern int a1[N], b1[N], c1[N];
+extern int a2[N], b2[N], c2[N];
+extern int n;
+
+void
+foo1 ()
+{
+ int i;
+ for (i = 0; i < n; i++)
+ c1[i] += a1[i] + b1[i];
+}
+
+#pragma GCC optimize("O3,unroll-loops")
+void
+foo2 ()
+{
+ int i;
+ for (i = 0; i < n; i++)
+ c2[i] += a2[i] + b2[i];
+}
+
+/* { dg-final { scan-rtl-dump-times "optimized: loop unrolled" 1 "loop2_unroll" } } */
+
More information about the Gcc-cvs
mailing list