I have been fighting with a simple problem for the past few nights.  In my
GIMPLE pass I create a variable, an ssa name for that variable, and then assign
it to the LHS of a call I build:

  call = gimple_build_call(fndecl, 0);
  decl = create_tmp_var(TREE_TYPE(TREE_TYPE(test_decode_fndecl)), "FOO");
  ssa  = make_ssa_name(decl, call);
  gimple_set_lhs(call, ssa);
  gsi_insert_before(&gsi, call, GSI_SAME_STMT);

I verify the GIMPLE and it looks proper:

  char * FOO.2;
  /* some gimple code */
  FOO.2_8 = fn();
  strcat(&mylocal, FOO.2_8);

However, when I build with -Os the GIMPLE looks like:
  char * FOO.2;
  /* some gimple code */
  fn();
  strcat(&mylocal, FOO.2_8);

And the compiler segfaults in "ptr_deref_may_alias_decl_p" for 'ptr' FOO.2_8 and
'decl' mylocal arguments.  The segfault occurs because TREE_TYPE(ptr) is NULL
and calling POINTER_TYPE_P(TREE_TYPE(ptr)) dereferences a NULL.  

After more debugging, it is eliminate_unnecessary_stmts() which tries to remove
the 'FOO.2_8 = fn();' statement.  In that routine, the LHS is considered "dead"
and because of that the routine sets the LHS to NULL.

So, I guess my question is, how can I force this stmt to hang around?  I looked
at eliminate_unnecessary_stmts, and do not see any specific flags I can set to
the stmt to make 'em hang around, and I do not know what to do to make LHS
appear not "dead."  Even if I set 'ssa' TREE_USED and 'decl' as DECL_PRESERVE_P.

Thanks for any information!

-Matt

Reply via email to