aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2024-07-17 18:11:26 +0200
committerUros Bizjak <ubizjak@gmail.com>2024-07-17 18:12:38 +0200
commit0841fd4c42ab053be951b7418233f0478282d020 (patch)
treeb0fabe41fc2ba53f49b2d80feab3c197d2891be4
parent3412b6e9949a2e289921420e4e826210de6fe7f9 (diff)
downloadgcc-0841fd4c42ab053be951b7418233f0478282d020.zip
gcc-0841fd4c42ab053be951b7418233f0478282d020.tar.gz
gcc-0841fd4c42ab053be951b7418233f0478282d020.tar.bz2
alpha: Fix duplicate !tlsgd!62 assemble error [PR115526]
Add missing "cannot_copy" attribute to instructions that have to stay in 1-1 correspondence with another insn. PR target/115526 gcc/ChangeLog: * config/alpha/alpha.md (movdi_er_high_g): Add cannot_copy attribute. (movdi_er_tlsgd): Ditto. (movdi_er_tlsldm): Ditto. (call_value_osf_<tls>): Ditto. gcc/testsuite/ChangeLog: * gcc.target/alpha/pr115526.c: New test.
-rw-r--r--gcc/config/alpha/alpha.md10
-rw-r--r--gcc/testsuite/gcc.target/alpha/pr115526.c46
2 files changed, 53 insertions, 3 deletions
diff --git a/gcc/config/alpha/alpha.md b/gcc/config/alpha/alpha.md
index 1e2de5a..bd92392 100644
--- a/gcc/config/alpha/alpha.md
+++ b/gcc/config/alpha/alpha.md
@@ -3902,7 +3902,8 @@
else
return "ldq %0,%2(%1)\t\t!literal!%3";
}
- [(set_attr "type" "ldsym")])
+ [(set_attr "type" "ldsym")
+ (set_attr "cannot_copy" "true")])
(define_split
[(set (match_operand:DI 0 "register_operand")
@@ -3926,7 +3927,8 @@
return "lda %0,%2(%1)\t\t!tlsgd";
else
return "lda %0,%2(%1)\t\t!tlsgd!%3";
-})
+}
+ [(set_attr "cannot_copy" "true")])
(define_insn "movdi_er_tlsldm"
[(set (match_operand:DI 0 "register_operand" "=r")
@@ -3939,7 +3941,8 @@
return "lda %0,%&(%1)\t\t!tlsldm";
else
return "lda %0,%&(%1)\t\t!tlsldm!%2";
-})
+}
+ [(set_attr "cannot_copy" "true")])
(define_insn "*movdi_er_gotdtp"
[(set (match_operand:DI 0 "register_operand" "=r")
@@ -5908,6 +5911,7 @@
"HAVE_AS_TLS"
"ldq $27,%1($29)\t\t!literal!%2\;jsr $26,($27),%1\t\t!lituse_<tls>!%2\;ldah $29,0($26)\t\t!gpdisp!%*\;lda $29,0($29)\t\t!gpdisp!%*"
[(set_attr "type" "jsr")
+ (set_attr "cannot_copy" "true")
(set_attr "length" "16")])
;; We must use peep2 instead of a split because we need accurate life
diff --git a/gcc/testsuite/gcc.target/alpha/pr115526.c b/gcc/testsuite/gcc.target/alpha/pr115526.c
new file mode 100644
index 0000000..2f57903
--- /dev/null
+++ b/gcc/testsuite/gcc.target/alpha/pr115526.c
@@ -0,0 +1,46 @@
+/* PR target/115526 */
+/* { dg-do assemble } */
+/* { dg-options "-O2 -Wno-attributes -fvisibility=hidden -fPIC -mcpu=ev4" } */
+
+struct _ts {
+ struct _dtoa_state *interp;
+};
+struct Bigint {
+ int k;
+} *_Py_dg_strtod_bs;
+struct _dtoa_state {
+ struct Bigint p5s;
+ struct Bigint *freelist[];
+};
+extern _Thread_local struct _ts _Py_tss_tstate;
+typedef struct Bigint Bigint;
+int pow5mult_k;
+long _Py_dg_strtod_ndigits;
+void PyMem_Free();
+void Bfree(Bigint *v) {
+ if (v)
+ {
+ if (v->k)
+ PyMem_Free();
+ else {
+ struct _dtoa_state *interp = _Py_tss_tstate.interp;
+ interp->freelist[v->k] = v;
+ }
+ }
+}
+static Bigint *pow5mult(Bigint *b) {
+ for (;;) {
+ if (pow5mult_k & 1) {
+ Bfree(b);
+ if (b == 0)
+ return 0;
+ }
+ if (!(pow5mult_k >>= 1))
+ break;
+ }
+ return 0;
+}
+void _Py_dg_strtod() {
+ if (_Py_dg_strtod_ndigits)
+ pow5mult(_Py_dg_strtod_bs);
+}