This change fixes an issue where functions
decorated with:
pragma omp declare simd
that return void via a typedef would crash
GCC with an ICE while compiling a program
containing such a function, by using
VOID_TYPE_P instead of directly comparing
to void_type_node. New testcase added.
PR middle-end/111856
gcc/ChangeLog:
* omp-simd-clone.cc (simd_clone_adjust_return_type): Use VOID_TYPE_P
when checking for void return type in adjusted functions.
(simd_clone_adjust): Likewise.
gcc/testsuite/ChangeLog:
* gcc.dg/gomp/pr111856.c: New test.
Signed-off-by: Kevin Stefanov <[email protected]>
---
I have replaced my previous use of
TREE_CODE with VOID_TYPE_P as per
the review and added a new test case
to compile the example openMP program
and ensure no ICE.
Bugzilla link:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111856
I have been unable to check for merge
conflicts with trunk. Upon running:
git pull --rebase origin master
I get the following error:
fatal: unable to access 'https://gcc.gnu.org/git/gcc.git/': The requested URL
returned error: 429
I'm guessing this has to do with the
recently strengthened security measures
against LLM-related scraping bots?
Bootstrapped and regression tested on
x86_64-pc-linux-gnu with enable-languages=all.
gcc/omp-simd-clone.cc | 4 ++--
gcc/testsuite/gcc.dg/gomp/pr111856.c | 11 +++++++++++
2 files changed, 13 insertions(+), 2 deletions(-)
create mode 100644 gcc/testsuite/gcc.dg/gomp/pr111856.c
diff --git a/gcc/omp-simd-clone.cc b/gcc/omp-simd-clone.cc
index 7564846fac4..4f189f243a0 100644
--- a/gcc/omp-simd-clone.cc
+++ b/gcc/omp-simd-clone.cc
@@ -715,7 +715,7 @@ simd_clone_adjust_return_type (struct cgraph_node *node)
tree t;
/* Adjust the function return type. */
- if (orig_rettype == void_type_node)
+ if (VOID_TYPE_P (orig_rettype))
return;
t = TREE_TYPE (TREE_TYPE (fndecl));
if (INTEGRAL_TYPE_P (t) || POINTER_TYPE_P (t))
@@ -1370,7 +1370,7 @@ simd_clone_adjust (struct cgraph_node *node)
simd_clone_adjust_argument_types (node);
targetm.simd_clone.adjust (node);
tree retval = NULL_TREE;
- if (orig_rettype != void_type_node)
+ if (!VOID_TYPE_P (orig_rettype))
{
poly_uint64 veclen;
if (INTEGRAL_TYPE_P (orig_rettype) || POINTER_TYPE_P (orig_rettype))
diff --git a/gcc/testsuite/gcc.dg/gomp/pr111856.c
b/gcc/testsuite/gcc.dg/gomp/pr111856.c
new file mode 100644
index 00000000000..ef162f58531
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr111856.c
@@ -0,0 +1,11 @@
+/* PR middle-end/111856 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp-simd -O2" } */
+
+typedef void T;
+int array[1000];
+#pragma omp declare simd notinbranch simdlen(4)
+T foo (int i)
+{
+ array[i] = 555;
+}
--
2.55.0