]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR c++/84151 - unnecessary volatile load with static member.
authorJason Merrill <jason@redhat.com>
Fri, 16 Feb 2018 21:34:57 +0000 (16:34 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 16 Feb 2018 21:34:57 +0000 (16:34 -0500)
* call.c (build_new_method_call_1): Avoid loading from a volatile
lvalue used as the object argument for a static member function.

From-SVN: r257768

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/g++.dg/tree-ssa/volatile1.C [new file with mode: 0644]

index 807ed46048237aa0d3fd940f5863a6b807846170..9f396c338aef708b4e4136c671ab09f86581b41b 100644 (file)
@@ -1,3 +1,9 @@
+2018-02-16  Jason Merrill  <jason@redhat.com>
+
+       PR c++/84151 - unnecessary volatile load with static member.
+       * call.c (build_new_method_call_1): Avoid loading from a volatile
+       lvalue used as the object argument for a static member function.
+
 2017-09-15  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
index 8090dbf29e6f8600bcdd0d776d3856cf68db08f3..9dbb274b3ad2d43fa99c01b9041f5af93fbd5e53 100644 (file)
@@ -8437,8 +8437,14 @@ build_new_method_call_1 (tree instance, tree fns, vec<tree, va_gc> **args,
              if (TREE_CODE (TREE_TYPE (fn)) != METHOD_TYPE
                  && !is_dummy_object (instance)
                  && TREE_SIDE_EFFECTS (instance))
-               call = build2 (COMPOUND_EXPR, TREE_TYPE (call),
-                              instance, call);
+               {
+                 /* But avoid the implicit lvalue-rvalue conversion when 'a'
+                    is volatile.  */
+                 tree a = instance;
+                 if (TREE_THIS_VOLATILE (a))
+                   a = build_this (a);
+                 call = build2 (COMPOUND_EXPR, TREE_TYPE (call), a, call);
+               }
              else if (call != error_mark_node
                       && DECL_DESTRUCTOR_P (cand->fn)
                       && !VOID_TYPE_P (TREE_TYPE (call)))
diff --git a/gcc/testsuite/g++.dg/tree-ssa/volatile1.C b/gcc/testsuite/g++.dg/tree-ssa/volatile1.C
new file mode 100644 (file)
index 0000000..00f04a0
--- /dev/null
@@ -0,0 +1,28 @@
+// PR c++/84151
+// { dg-additional-options "-fdump-tree-gimple" }
+// { dg-final { scan-tree-dump-not {\*this} "gimple" } }
+
+struct A {
+  static int& bar(int& a) {
+    return a;
+  }
+  static int i;
+
+  int foo() volatile {
+    int v = c;
+    return i + bar(v);
+  }
+
+  int c;
+};
+
+int A::i = 0;
+
+A a;
+
+int main() {
+  a.c = 2;
+  a.foo();
+
+  return 0;
+}