]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
RISC-V: generate builtin macro for compilation with strict alignment
authorEdwin Lu <ewlu@rivosinc.com>
Tue, 29 Aug 2023 15:34:13 +0000 (08:34 -0700)
committerEdwin Lu <ewlu@rivosinc.com>
Tue, 29 Aug 2023 15:45:45 +0000 (08:45 -0700)
Distinguish between explicit -mstrict-align and cpu tune param
for slow_unaligned_access=true/false.

Tested for regressions using rv32/64 multilib with newlib/linux

gcc/ChangeLog:

* config/riscv/riscv-c.cc (riscv_cpu_cpp_builtins): Generate
__riscv_unaligned_avoid with value 1 or
__riscv_unaligned_slow with value 1 or
__riscv_unaligned_fast with value 1
* config/riscv/riscv.cc (riscv_option_override): Define
riscv_user_wants_strict_align. Set
riscv_user_wants_strict_align to TARGET_STRICT_ALIGN
* config/riscv/riscv.h: Declare riscv_user_wants_strict_align

gcc/testsuite/ChangeLog:

* gcc.target/riscv/attribute-1.c: Check for
__riscv_unaligned_slow or __riscv_unaligned_fast
* gcc.target/riscv/attribute-4.c: Check for
__riscv_unaligned_avoid
* gcc.target/riscv/attribute-5.c: Check for
__riscv_unaligned_slow or __riscv_unaligned_fast
* gcc.target/riscv/predef-align-1.c: New test.
* gcc.target/riscv/predef-align-2.c: New test.
* gcc.target/riscv/predef-align-3.c: New test.
* gcc.target/riscv/predef-align-4.c: New test.
* gcc.target/riscv/predef-align-5.c: New test.
* gcc.target/riscv/predef-align-6.c: New test.

Reviewed-by: Jeff Law <jlaw@ventanamicro.com>
Signed-off-by: Edwin Lu <ewlu@rivosinc.com>
Co-authored-by: Vineet Gupta <vineetg@rivosinc.com>
12 files changed:
gcc/config/riscv/riscv-c.cc
gcc/config/riscv/riscv.cc
gcc/config/riscv/riscv.h
gcc/testsuite/gcc.target/riscv/attribute-1.c
gcc/testsuite/gcc.target/riscv/attribute-4.c
gcc/testsuite/gcc.target/riscv/attribute-5.c
gcc/testsuite/gcc.target/riscv/predef-align-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/predef-align-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/predef-align-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/predef-align-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/predef-align-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/predef-align-6.c [new file with mode: 0644]

index 2937c160071f030b9c389107b78a5bfea32e0d8a..283052ae313186bfff28517adee0a43a99fc3acb 100644 (file)
@@ -108,6 +108,13 @@ riscv_cpu_cpp_builtins (cpp_reader *pfile)
 
     }
 
+  if (riscv_user_wants_strict_align)
+    builtin_define_with_int_value ("__riscv_unaligned_avoid", 1);
+  else if (riscv_slow_unaligned_access_p)
+    builtin_define_with_int_value ("__riscv_unaligned_slow", 1);
+  else
+    builtin_define_with_int_value ("__riscv_unaligned_fast", 1);
+
   if (TARGET_MIN_VLEN != 0)
     builtin_define_with_int_value ("__riscv_v_min_vlen", TARGET_MIN_VLEN);
 
index bab6ed70b2d221c371b7edb995a18ef21ea7a186..db538579ac6d7eda54d116b6fc5810e8c0c065d3 100644 (file)
@@ -248,6 +248,9 @@ struct riscv_tune_info {
 /* Whether unaligned accesses execute very slowly.  */
 bool riscv_slow_unaligned_access_p;
 
+/* Whether user explicitly passed -mstrict-align.  */
+bool riscv_user_wants_strict_align;
+
 /* Stack alignment to assume/maintain.  */
 unsigned riscv_stack_boundary;
 
@@ -7180,6 +7183,12 @@ riscv_option_override (void)
      -m[no-]strict-align is left unspecified, heed -mtune's advice.  */
   riscv_slow_unaligned_access_p = (cpu->tune_param->slow_unaligned_access
                                   || TARGET_STRICT_ALIGN);
+
+  /* Make a note if user explicity passed -mstrict-align for later
+     builtin macro generation.  Can't use target_flags_explicitly since
+     it is set even for -mno-strict-align.  */
+  riscv_user_wants_strict_align = TARGET_STRICT_ALIGN;
+
   if ((target_flags_explicit & MASK_STRICT_ALIGN) == 0
       && cpu->tune_param->slow_unaligned_access)
     target_flags |= MASK_STRICT_ALIGN;
index e18a00812978080504a9fadd19531620de9dbb9d..e093db09d31e73085eb8d79fcc1e1f4ade797896 100644 (file)
@@ -1036,6 +1036,7 @@ while (0)
 #ifndef USED_FOR_TARGET
 extern const enum reg_class riscv_regno_to_class[];
 extern bool riscv_slow_unaligned_access_p;
+extern bool riscv_user_wants_strict_align;
 extern unsigned riscv_stack_boundary;
 extern unsigned riscv_bytes_per_vector_chunk;
 extern poly_uint16 riscv_vector_chunks;
index bc919c586b676f8a27f08cee02fe6c69862525f1..abfb0b498e0c919157303fea5c1282d0497dcb17 100644 (file)
@@ -2,5 +2,17 @@
 /* { dg-options "-mriscv-attribute" } */
 int foo()
 {
+
+/* In absence of -m[no-]strict-align, default mcpu is currently 
+   set to rocket.  rocket has slow_unaligned_access=true.  */
+#if !defined(__riscv_unaligned_slow)
+#error "__riscv_unaligned_slow is not set"
+#endif
+
+#if defined(__riscv_unaligned_avoid) || defined(__riscv_unaligned_fast)
+#error "__riscv_unaligned_avoid or __riscv_unaligned_fast is unexpectedly set"
+#endif
+
+return 0;
 }
 /* { dg-final { scan-assembler ".attribute arch" } } */
index 7c565c4963ec2c9d7f688017cde93ce2de9fadf0..545f87cb8992977e3121d56b1da6ba385db34ab9 100644 (file)
@@ -2,5 +2,15 @@
 /* { dg-options "-mriscv-attribute -mstrict-align" } */
 int foo()
 {
+
+#if !defined(__riscv_unaligned_avoid)
+#error "__riscv_unaligned_avoid is not set"
+#endif
+
+#if defined(__riscv_unaligned_fast) || defined(__riscv_unaligned_slow)
+#error "__riscv_unaligned_fast or __riscv_unaligned_slow is unexpectedly set"
+#endif
+
+  return 0;
 }
 /* { dg-final { scan-assembler ".attribute unaligned_access, 0" } } */
index ee9cf693be6c93bd574cd9416783c1cbb1f50380..753043c31e935f16077070393e3b1cc1338902ed 100644 (file)
@@ -2,5 +2,16 @@
 /* { dg-options "-mriscv-attribute -mno-strict-align" } */
 int foo()
 {
+
+/* Default mcpu is rocket which has slow_unaligned_access=true.  */
+#if !defined(__riscv_unaligned_slow)
+#error "__riscv_unaligned_slow is not set"
+#endif
+
+#if defined(__riscv_unaligned_avoid) || defined(__riscv_unaligned_fast)
+#error "__riscv_unaligned_avoid or __riscv_unaligned_fast is unexpectedly set"
+#endif
+
+return 0;
 }
 /* { dg-final { scan-assembler ".attribute unaligned_access, 1" } } */
diff --git a/gcc/testsuite/gcc.target/riscv/predef-align-1.c b/gcc/testsuite/gcc.target/riscv/predef-align-1.c
new file mode 100644 (file)
index 0000000..9dde37a
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-mtune=thead-c906" } */
+
+int main() {
+
+/* thead-c906 default is cpu tune param unaligned access fast */
+#if !defined(__riscv_unaligned_fast)
+#error "__riscv_unaligned_fast is not set"
+#endif
+
+#if defined(__riscv_unaligned_avoid) || defined(__riscv_unaligned_slow)
+#error "__riscv_unaligned_avoid or __riscv_unaligned_slow is unexpectedly set"
+#endif
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/riscv/predef-align-2.c b/gcc/testsuite/gcc.target/riscv/predef-align-2.c
new file mode 100644 (file)
index 0000000..33d604f
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-mtune=thead-c906 -mstrict-align" } */
+
+int main() {
+
+#if !defined(__riscv_unaligned_avoid)
+#error "__riscv_unaligned_avoid is not set"
+#endif
+
+#if defined(__riscv_unaligned_fast) || defined(__riscv_unaligned_slow)
+#error "__riscv_unaligned_fast or __riscv_unaligned_slow is unexpectedly set"
+#endif
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/riscv/predef-align-3.c b/gcc/testsuite/gcc.target/riscv/predef-align-3.c
new file mode 100644 (file)
index 0000000..daf5718
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-mtune=thead-c906 -mno-strict-align" } */
+
+int main() {
+
+/* thead-c906 default is cpu tune param unaligned access fast */
+#if !defined(__riscv_unaligned_fast)
+#error "__riscv_unaligned_fast is not set"
+#endif
+
+#if defined(__riscv_unaligned_avoid) || defined(__riscv_unaligned_slow)
+#error "__riscv_unaligned_avoid or __riscv_unaligned_slow is unexpectedly set"
+#endif
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/riscv/predef-align-4.c b/gcc/testsuite/gcc.target/riscv/predef-align-4.c
new file mode 100644 (file)
index 0000000..d46a46f
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-mtune=rocket" } */
+
+int main() {
+
+/* rocket default is cpu tune param unaligned access slow */
+#if !defined(__riscv_unaligned_slow)
+#error "__riscv_unaligned_slow is not set"
+#endif
+
+#if defined(__riscv_unaligned_avoid) || defined(__riscv_unaligned_fast)
+#error "__riscv_unaligned_avoid or __riscv_unaligned_fast is unexpectedly set"
+#endif
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/riscv/predef-align-5.c b/gcc/testsuite/gcc.target/riscv/predef-align-5.c
new file mode 100644 (file)
index 0000000..3aa25f8
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-mtune=rocket -mstrict-align" } */
+
+int main() {
+
+#if !defined(__riscv_unaligned_avoid)
+#error "__riscv_unaligned_avoid is not set"
+#endif
+
+#if defined(__riscv_unaligned_fast) || defined(__riscv_unaligned_slow)
+#error "__riscv_unaligned_fast or __riscv_unaligned_slow is unexpectedly set"
+#endif
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/riscv/predef-align-6.c b/gcc/testsuite/gcc.target/riscv/predef-align-6.c
new file mode 100644 (file)
index 0000000..cb64d7e
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-mtune=rocket -mno-strict-align" } */
+
+int main() {
+
+/* rocket default is cpu tune param unaligned access slow */
+#if !defined(__riscv_unaligned_slow)
+#error "__riscv_unaligned_slow is not set"
+#endif
+
+#if defined(__riscv_unaligned_avoid) || defined(__riscv_unaligned_fast)
+#error "__riscv_unaligned_avoid or __riscv_unaligned_fast is unexpectedly set"
+#endif
+
+  return 0;
+}