On Thu, 13 Feb 2014, Richard Biener wrote:

> 
> Cilk+ builds INDIRECT_REFs when expanding builtins (oops) and thus
> those can leak into MEM_EXRs which will lead to ICEs later.
> The following patch properly builds a MEM_REF instead.  Grepping
> for INDIRECT_REF I found another suspicious use (just removed,
> it cannot have triggered and it looks bogus) and the use of
> a langhook instead of proper GIMPLE interfaces (function also
> used during expansion).
> 
> Bootstrap / testing in progress together with some other stuff.
> 
> Ok?

Btw, this exposes that Cilk+ is LTO-ignorant - it doesn't properly
register its global trees (bah, more global trees...).  So
the types_compatible_p call ICEs.  Trying to process them in
lto/lto.c:read_cgraph_and_symbols doesn't seem to work though.

So I'm opting to remove the assert and leave fixing LTO for
somebody who cares about Cilk+.

Simpifies the patch as follows, bootstrapped & tested on
x86_64-unknown-linux-gnu.

Richard.

2014-02-13  Richard Biener  <rguent...@suse.de>

        * cilk-common.c (cilk_arrow): Build a MEM_REF, not an INDIRECT_REF.
        (get_frame_arg): Drop the assert with langhook types_compatible_p.
        Do not strip INDIRECT_REFs.

Index: gcc/cilk-common.c
===================================================================
--- gcc/cilk-common.c   (revision 207725)
+++ gcc/cilk-common.c   (working copy)
@@ -66,8 +66,7 @@ cilk_dot (tree frame, int field_number,
 tree
 cilk_arrow (tree frame_ptr, int field_number, bool volatil)
 {
-  return cilk_dot (fold_build1 (INDIRECT_REF, 
-                               TREE_TYPE (TREE_TYPE (frame_ptr)), frame_ptr), 
+  return cilk_dot (build_simple_mem_ref (frame_ptr), 
                   field_number, volatil);
 }
 
@@ -287,12 +286,9 @@ get_frame_arg (tree call)
 
   argtype = TREE_TYPE (argtype);
   
-  gcc_assert (!lang_hooks.types_compatible_p
-             || lang_hooks.types_compatible_p (argtype, cilk_frame_type_decl));
-
   /* If it is passed in as an address, then just use the value directly 
      since the function is inlined.  */
-  if (TREE_CODE (arg) == INDIRECT_REF || TREE_CODE (arg) == ADDR_EXPR)
+  if (TREE_CODE (arg) == ADDR_EXPR)
     return TREE_OPERAND (arg, 0);
   return arg;
 }

Reply via email to