Hi,
references are recreated when redirecting edges in the target clone
pass. However, the references are not created with their corresponding
call statements, potentially leading to ICEs as shown in PR127023. This
patch fixes that.
Bootstrapped, LTO-bootstrapped and regtested on x86_64-linux without any
new regressions. OK for master?
Best regards,
Josef
PR ipa/127023
gcc/ChangeLog:
* multiple_target.cc (create_dispatcher_calls): Use the call
statement variant of create_reference.
gcc/testsuite/ChangeLog:
* gcc.target/i386/pr127023.c: New test.
Signed-off-by: Josef Melcr <[email protected]>
---
gcc/multiple_target.cc | 2 +-
gcc/testsuite/gcc.target/i386/pr127023.c | 16 ++++++++++++++++
2 files changed, 17 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/gcc.target/i386/pr127023.c
diff --git a/gcc/multiple_target.cc b/gcc/multiple_target.cc
index 3f8676f5943..01d3ff84bf3 100644
--- a/gcc/multiple_target.cc
+++ b/gcc/multiple_target.cc
@@ -190,7 +190,7 @@ create_dispatcher_calls (struct cgraph_node *node)
}
symtab_node *source = ref->referring;
- source->create_reference (inode, IPA_REF_ADDR);
+ source->create_reference (inode, IPA_REF_ADDR, ref->stmt);
}
else if (ref->use == IPA_REF_ALIAS)
{
diff --git a/gcc/testsuite/gcc.target/i386/pr127023.c
b/gcc/testsuite/gcc.target/i386/pr127023.c
new file mode 100644
index 00000000000..ecd6af57cf6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr127023.c
@@ -0,0 +1,16 @@
+/* PR ipa/127023 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fopenmp" } */
+/* { dg-require-ifunc "" } */
+
+__attribute__((target_clones("default", "fma4"), noinline))
+static void e(int f) {
+ if (!f)
+#pragma omp parallel
+ for (;;)
+ ;
+}
+__attribute__((target_clones("default", "fma4")))
+void g(void) {
+ e(1);
+}
--
2.55.0