]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[RS6000] lqarx and stqcx. registers
authoramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 2 Feb 2016 01:29:17 +0000 (01:29 +0000)
committeramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 2 Feb 2016 01:29:17 +0000 (01:29 +0000)
lqarx RT and stqcx. RS are valid only with even numbered gprs.  The
predicate to enforce this happens to allow a loophole, closed by this
patch.

PR target/69548
gcc/
* config/rs6000/predicates.md (quad_int_reg_operand): Don't
allow subregs.
gcc/testsuite/
* gcc.target/powerpc/pr69548.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233065 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/rs6000/predicates.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/pr69548.c [new file with mode: 0644]

index 1d89607433b99c10d23c374863ffa7ed66fe5ee4..b061339ae0643a37a512b0baf9414daea5924846 100644 (file)
@@ -1,3 +1,9 @@
+2016-02-02  Alan Modra  <amodra@gmail.com>
+
+       PR target/69548
+       * config/rs6000/predicates.md (quad_int_reg_operand): Don't
+       allow subregs.
+
 2016-02-02  Alan Modra  <amodra@gmail.com>
 
        PR target/68662
index 5adc4de6a311c84005b82259b152befd4bec1982..072291ef7d015c093347320446ce1a5f6ee07e5f 100644 (file)
 
 ;; Return 1 if op is a general purpose register that is an even register
 ;; which suitable for a load/store quad operation
+;; Subregs are not allowed here because when they are combine can
+;; create (subreg:PTI (reg:TI pseudo)) which will cause reload to
+;; think the innermost reg needs reloading, in TImode instead of
+;; PTImode.  So reload will choose a reg in TImode which has no
+;; requirement that the reg be even.
 (define_predicate "quad_int_reg_operand"
-  (match_operand 0 "register_operand")
+  (match_code "reg")
 {
   HOST_WIDE_INT r;
 
   if (!TARGET_QUAD_MEMORY && !TARGET_QUAD_MEMORY_ATOMIC)
     return 0;
 
-  if (GET_CODE (op) == SUBREG)
-    op = SUBREG_REG (op);
-
-  if (!REG_P (op))
-    return 0;
-
   r = REGNO (op);
   if (r >= FIRST_PSEUDO_REGISTER)
     return 1;
index 1f8ddd096882c9c131bb1389ec4afa25214e20f3..c96277c9381336e5cdae3ef0c4a14759306bd847 100644 (file)
@@ -1,3 +1,8 @@
+2016-02-02  Alan Modra  <amodra@gmail.com>
+
+       PR target/69548
+       * gcc.target/powerpc/pr69548.c: New test.
+
 2016-02-01  Jakub Jelinek  <jakub@redhat.com>
 
        PR rtl-optimization/69592
diff --git a/gcc/testsuite/gcc.target/powerpc/pr69548.c b/gcc/testsuite/gcc.target/powerpc/pr69548.c
new file mode 100644 (file)
index 0000000..439f588
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do assemble { target { powerpc*-*-* && lp64 } } } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+/* { dg-require-effective-target powerpc_p8vector_ok } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
+/* { dg-options "-mcpu=power8 -Os -mbig" } */
+
+__int128
+quad_exchange (__int128 *ptr, __int128 newval)
+{
+  return __atomic_exchange_n (ptr, newval, __ATOMIC_RELAXED);
+}