This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH, PR67709 ] Don't call call_cgraph_insertion_hooks in simd_clone_create


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  <tom@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'

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]