https://gcc.gnu.org/g:af974df94751195ce72e86d7b88e5d5444375b45

commit r15-5803-gaf974df94751195ce72e86d7b88e5d5444375b45
Author: Andrew Pinski <quic_apin...@quicinc.com>
Date:   Tue Nov 19 00:19:57 2024 -0800

    aarch64: Mark __builtin_aarch64_im_lane_boundsi as leaf and nothrow 
[PR117665]
    
    __builtin_aarch64_im_lane_boundsi is known not to throw or call back into 
another
    function since it will either folded into an NOP or will produce a compiler 
error.
    
    This fixes the ICE by fixing the missed optimization. It does not fix the 
underlying
    issue with fold_marked_statements; which I filed as PR 117668.
    
    Built and tested for aarch64-linux-gnu.
    
            PR target/117665
    
    gcc/ChangeLog:
    
            * config/aarch64/aarch64-builtins.cc 
(aarch64_init_simd_builtin_functions):
            Pass nothrow and leaf as attributes to aarch64_general_add_builtin 
for
            __builtin_aarch64_im_lane_boundsi.
    
    gcc/testsuite/ChangeLog:
    
            * g++.target/aarch64/lane-bound-1.C: New test.
            * gcc.target/aarch64/lane-bound-3.c: New test.
    
    Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>

Diff:
---
 gcc/config/aarch64/aarch64-builtins.cc          |  6 +++++-
 gcc/testsuite/g++.target/aarch64/lane-bound-1.C | 21 +++++++++++++++++++
 gcc/testsuite/gcc.target/aarch64/lane-bound-3.c | 27 +++++++++++++++++++++++++
 3 files changed, 53 insertions(+), 1 deletion(-)

diff --git a/gcc/config/aarch64/aarch64-builtins.cc 
b/gcc/config/aarch64/aarch64-builtins.cc
index b860e22f01f4..e26ee323a2de 100644
--- a/gcc/config/aarch64/aarch64-builtins.cc
+++ b/gcc/config/aarch64/aarch64-builtins.cc
@@ -1482,10 +1482,14 @@ aarch64_init_simd_builtin_functions (bool 
called_from_pragma)
                                                      size_type_node,
                                                      intSI_type_node,
                                                      NULL);
+      /* aarch64_im_lane_boundsi should be leaf and nothrow as it
+        is expanded as nop or will cause an user error.  */
+      tree attrs = aarch64_add_attribute ("nothrow", NULL_TREE);
+      attrs = aarch64_add_attribute ("leaf", attrs);
       aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_LANE_CHECK]
        = aarch64_general_add_builtin ("__builtin_aarch64_im_lane_boundsi",
                                       lane_check_fpr,
-                                      AARCH64_SIMD_BUILTIN_LANE_CHECK);
+                                      AARCH64_SIMD_BUILTIN_LANE_CHECK, attrs);
     }
 
   for (i = 0; i < ARRAY_SIZE (aarch64_simd_builtin_data); i++, fcode++)
diff --git a/gcc/testsuite/g++.target/aarch64/lane-bound-1.C 
b/gcc/testsuite/g++.target/aarch64/lane-bound-1.C
new file mode 100644
index 000000000000..cb3e99816a1c
--- /dev/null
+++ b/gcc/testsuite/g++.target/aarch64/lane-bound-1.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+// { dg-options "" }
+#include <arm_neon.h>
+
+// vgetq_lane_u64 should not cause any
+// exceptions to thrown so even at -O0
+// removeme should have been removed.
+void removeme()
+__attribute__((error("nothrow")));
+int _setjmp();
+void hh(uint64x2_t c, int __b)
+{
+  try {
+    vgetq_lane_u64(c, __b);
+    // { dg-error "must be a constant immediate" "" { target *-*-* } 0 }
+  } catch (...)
+  {
+        removeme(); // { dg-bogus "declared with attribute error" }
+  }
+}
+
diff --git a/gcc/testsuite/gcc.target/aarch64/lane-bound-3.c 
b/gcc/testsuite/gcc.target/aarch64/lane-bound-3.c
new file mode 100644
index 000000000000..9e0dad372cb9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/lane-bound-3.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+/* PR target/117665 */
+/* __builtin_aarch64_im_lane_boundsi was causing an abnormal
+   edge to the setjmp but then the builtin was folded into a nop
+   and that edge was never removed but the edge was not needed in
+   the first place. */
+
+#include <arm_neon.h>
+
+__attribute__((always_inline))
+static inline
+void h(uint64x2_t c, int __b) {
+   /* Use vgetq_lane_u64 to get a 
+     __builtin_aarch64_im_lane_boundsi */
+   vgetq_lane_u64(c, __b);
+
+  __builtin_unreachable();
+}
+
+int _setjmp();
+void hh(uint64x2_t c) {
+  int __b = 0;
+  if (_setjmp())
+    h(c, 0);
+}

Reply via email to