On Mon, Nov 29, 2021 at 11:56 PM Qing Zhao <qing.z...@oracle.com> wrote: > > Peter, > > Thanks a lot for the patch. > > Richard, how do you think of the patch? > > (The major concern for me is: > > With the current patch proposed by Peter, we will generate the call > to .DEFERRED_INIT for a variable with OPAQUE_TYPE during gimplification phase, > However, if this variable is in register, then the call to > .DEFERRED_INIT will NOT be expanded during RTL expansion phase. This > unexpanded call to .DEFERRED_INIT might cause some potential IR issue later?
I think that's inconsistent indeed. Peter, what are "opaque" registers? rs6000-modes.def suggests that there's __vector_pair and __vector_quad, what's the GIMPLE types for those? It seems they are either SSA names or expanded to pseudo registers but there's no constants for them. > > If the above is a real issue, should we skip initialization for all > OPAQUE_TYPE variables even when they are in memory and can be initialized > with memset? > then we should update “is_var_need_auto_init” in gimplify.c > instead. However, the issue with this approach is, we might miss the > opportunity to initialize an OPAQUE_TYPE variable if it will be in memory? > ). I think we need to bite the bullet at some point to do register initialization not via expand_assignment but directly based on what the LHS expands to. Can they be initialized? I see they can be copied at least. If such "things" cannot be initialized they should indeed be exempt from auto-init. The documentation suggests that they act as bit-bucked but even bit-buckets should be initializable, thus why exactly does CONST0_RTX not exist for them? Richard. > > Thanks. > > Qing > > > > On Nov 29, 2021, at 3:56 PM, Peter Bergner <berg...@linux.ibm.com> wrote: > > > > Sorry for dropping the ball on testing the patch from the bugzilla! > > > > The following patch fixes the ICE reported in the bugzilla on the > > pre-existing > > gcc testsuite test case, bootstraps and shows no testsuite regressions > > on powerpc64le-linux. Ok for trunk? > > > > Peter > > > > > > For -ftrivial-auto-var-init=*, skip initializing the register variable if it > > is an opaque type, because CONST0_RTX(mode) is not defined for opaque modes. > > > > gcc/ > > PR middle-end/103127 > > * internal-fn.c (expand_DEFERRED_INIT): Skip if VAR_TYPE is opaque. > > > > diff --git a/gcc/internal-fn.c b/gcc/internal-fn.c > > index 0cba95411a6..7cc0e9d5293 100644 > > --- a/gcc/internal-fn.c > > +++ b/gcc/internal-fn.c > > @@ -3070,6 +3070,10 @@ expand_DEFERRED_INIT (internal_fn, gcall *stmt) > > } > > else > > { > > + /* Skip variables of opaque types that are in a register. */ > > + if (OPAQUE_TYPE_P (var_type)) > > + return; > > + > > /* If this variable is in a register use expand_assignment. > > For boolean scalars force zero-init. */ > > tree init; >