Hi.

The flag is set based on optimization option:
gcc/common/config/i386/i386-common.c:    { OPT_LEVELS_2_PLUS, OPT_free, NULL, 1 
},

and so that it should be also per-function. The only usage of the flag is
in gate of a RTL pass, so that it will use on function selection.

Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

Ready to be installed?
Thanks,
Martin

gcc/ChangeLog:

2020-01-02  Martin Liska  <mli...@suse.cz>

        PR tree-optimization/92860
        * common.opt: Make flag_ree as optimization
        attribute.

gcc/testsuite/ChangeLog:

2020-01-02  Martin Liska  <mli...@suse.cz>

        PR tree-optimization/92860
        * gcc.dg/pr92860.c: New test.
---
 gcc/common.opt                 |  2 +-
 gcc/testsuite/gcc.dg/pr92860.c | 53 ++++++++++++++++++++++++++++++++++
 2 files changed, 54 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/pr92860.c


diff --git a/gcc/common.opt b/gcc/common.opt
index a22ab004d65..02c7cddbb26 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -2426,7 +2426,7 @@ Common Ignore
 Does nothing.  Preserved for backward compatibility.
 
 free
-Common Report Var(flag_ree) Init(0)
+Common Report Var(flag_ree) Init(0) Optimization
 Turn on Redundant Extensions Elimination pass.
 
 fshow-column
diff --git a/gcc/testsuite/gcc.dg/pr92860.c b/gcc/testsuite/gcc.dg/pr92860.c
new file mode 100644
index 00000000000..74207a9d53c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr92860.c
@@ -0,0 +1,53 @@
+/* PR tree-optimization/92860.  */
+/* Testcase derived from 20111227-1.c to ensure that REE is combining
+   redundant zero extends with zero extend to wider mode.  */
+/* { dg-do compile  { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-fdump-rtl-ree" } */
+
+extern void abort (void);
+
+unsigned short s;
+unsigned int i;
+unsigned long l;
+unsigned char v = -1;
+
+void
+__attribute__ ((optimize("-O2")))
+baz()
+{
+}
+
+void __attribute__((noinline,noclone))
+bar (int t)
+{
+  if (t == 2 && s != 0xff)
+    abort ();
+  if (t == 1 && i != 0xff)
+    abort ();
+  if (t == 0 && l != 0xff)
+    abort ();
+}
+
+void __attribute__((noinline,noclone))
+foo (unsigned char *a, int t)
+{
+  unsigned char r = v;
+
+  if (t == 2)
+    s = (unsigned short) r;
+  else if (t == 1)
+    i = (unsigned int) r;
+  else if (t == 0)
+    l = (unsigned long) r;
+  bar (t);
+}
+
+int main(void)
+{
+  foo (&v, 0);
+  foo (&v, 1);
+  foo (&v, 2);
+  return 0;
+}
+
+/* { dg-final { scan-rtl-dump-not "Elimination opportunities" "ree" } }  */

Reply via email to