Hi,
Consider libgomp.fortran/declare-simd-3.f90:
...
subroutine bar
use declare_simd_2_mod
real :: b(128)
integer :: i
!$omp simd
do i = 1, 128
b(i) = i * 2.0
end do
!$omp simd
do i = 1, 128
b(i) = foo (7.0_8, 5 * i, b(i))
end do
do i = 1, 128
if (b(i).ne.(7.0 + 10.0 * i * i)) call abort
end do
end subroutine bar
...
when compiling declare-simd-3.f90 with '-O0 -fopenmp -flto
-fno-use-linker-plugin', we run into an ICE with backtrace:
...
ICE backtrace:
...
src/libgomp/testsuite/libgomp.fortran/declare-simd-3.f90: At top level:
src/libgomp/testsuite/libgomp.fortran/declare-simd-3.f90:7:0: internal
compiler error: in estimate_function_body_sizes, at
ipa-inline-analysis.c:2486
use declare_simd_2_mod
0xc9319d estimate_function_body_sizes
src/gcc/ipa-inline-analysis.c:2486
0xc950dd compute_inline_parameters(cgraph_node*, bool)
src/gcc/ipa-inline-analysis.c:2953
0xc9813b inline_analyze_function(cgraph_node*)
src/gcc/ipa-inline-analysis.c:4078
0xc98205 inline_summary_t::insert(cgraph_node*, inline_summary*)
src/gcc/ipa-inline-analysis.c:4105
0x9a6213 symbol_table::call_cgraph_insertion_hooks(cgraph_node*)
src/gcc/cgraph.c:371
0xdefa0e simd_clone_create
src/gcc/omp-low.c:18738
0xdf5012 expand_simd_clones
src/gcc/omp-low.c:19799
0xdf519b ipa_omp_simd_clone
src/gcc/omp-low.c:19839
0xdf520a execute
src/gcc/omp-low.c:19867
Please submit a full bug report,
...
During pass_omp_simd_clone, we call simd_clone_create for foo, and
execute the !old_node->definition part:
...
tree old_decl = old_node->decl;
tree new_decl = copy_node (old_node->decl);
DECL_NAME (new_decl)
= clone_function_name (old_decl, "simdclone");
SET_DECL_ASSEMBLER_NAME (new_decl, DECL_NAME (new_decl));
SET_DECL_RTL (new_decl, NULL);
DECL_STATIC_CONSTRUCTOR (new_decl) = 0;
DECL_STATIC_DESTRUCTOR (new_decl) = 0;
new_node = old_node->create_version_clone (new_decl, vNULL, NULL);
if (old_node->in_other_partition)
new_node->in_other_partition = 1;
symtab->call_cgraph_insertion_hooks (new_node);
...
The 'symtab->call_cgraph_insertion_hooks (new_node)' calls
'inline_summary_t::insert', a hook inserted during pass_ipa_inline.
During execution of the hook we stumble over the fact that the new node
has no 'struct function' in estimate_function_body_sizes:
...
struct function *my_function = DECL_STRUCT_FUNCTION (node->decl);
...
gcc_assert (my_function && my_function->cfg);
...
The patch fixes the ICE by removing the call to
'symtab->call_cgraph_insertion_hooks'.
[ The pass before pass_omp_simd_clone is pass_dispatcher_calls. It has a
function create_target_clone, similar to simd_clone_create, with a
node.defition and !node.defition part. The !node.defition part does not
call 'symtab->call_cgraph_insertion_hooks (new_node)'. ]
Bootstrapped and reg-tested on x86_64.
OK for stage1 trunk?
Thanks,
- Tom
Don't call call_cgraph_insertion_hooks in simd_clone_create
2016-02-08 Tom de Vries <t...@codesourcery.com>
PR lto/67709
* omp-low.c (simd_clone_create): Remove call to
symtab->call_cgraph_insertion_hooks.
* testsuite/libgomp.fortran/declare-simd-4.f90: New test.
---
gcc/omp-low.c | 1 -
libgomp/testsuite/libgomp.fortran/declare-simd-4.f90 | 7 +++++++
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/gcc/omp-low.c b/gcc/omp-low.c
index d41688b..fcbb3e0 100644
--- a/gcc/omp-low.c
+++ b/gcc/omp-low.c
@@ -18735,7 +18735,6 @@ simd_clone_create (struct cgraph_node *old_node)
new_node = old_node->create_version_clone (new_decl, vNULL, NULL);
if (old_node->in_other_partition)
new_node->in_other_partition = 1;
- symtab->call_cgraph_insertion_hooks (new_node);
}
if (new_node == NULL)
return new_node;
diff --git a/libgomp/testsuite/libgomp.fortran/declare-simd-4.f90 b/libgomp/testsuite/libgomp.fortran/declare-simd-4.f90
new file mode 100644
index 0000000..bfdf9cf
--- /dev/null
+++ b/libgomp/testsuite/libgomp.fortran/declare-simd-4.f90
@@ -0,0 +1,7 @@
+! { dg-do run { target { vect_simd_clones && lto } } }
+! { dg-options "-fno-inline -flto -fno-use-linker-plugin" }
+! { dg-additional-sources declare-simd-3.f90 }
+! { dg-additional-options "-msse2" { target sse2_runtime } }
+! { dg-additional-options "-mavx" { target avx_runtime } }
+
+include 'declare-simd-2.f90'