[PATCH] rs6000: Use REAL_TYPE to copy when block move array in structure[PR65421]

Segher Boessenkool segher@kernel.crashing.org
Tue Jun 9 01:42:39 GMT 2020


Hi!

On Mon, Jun 08, 2020 at 02:22:23PM +0800, luoxhu wrote:
> On 2020/6/3 04:32, Segher Boessenkool wrote:
> > On Tue, Jun 02, 2020 at 04:41:50AM -0500, Xionghu Luo wrote:
> >> +  if (TREE_CODE (type) == RECORD_TYPE
> >> +      && rs6000_discover_homogeneous_aggregate (TYPE_MODE (type), type, NULL,
> >> +						NULL))
> >> +    {
> >> +      tree field_type = TREE_TYPE (first_field (type));
> >> +      if (field_type && TREE_CODE (field_type) == ARRAY_TYPE
> >> +	  && TREE_CODE (TREE_TYPE (field_type)) == REAL_TYPE)
> >> +	elt_mode = TYPE_MODE (TREE_TYPE (field_type));
> >> +    }
> > 
> > Homogeneous aggregates only exist in the ELFv2 ABI, while the problem
> > here is the SP float things.  You also noticed (elsewhere) that if the
> > struct contains (say) SI, SF, SI, SF, then this does not help.
> > 
> > Is there some better condition this could use, and maybe an expansion
> > that works in more cases as well?
> > 
> > And, it would be lovely if generic code could expand to something better
> > already (not expand to a block move at all, certainly not for something
> > as tiny as this).
> 
> This pr65421 is array in structure, the assignment is just struct to struct
> and won't be split by SROA to element assignment like struct contains <SF, SF>
> or <SI, SF>.

Yes, but it is a very small, fixed-length array (4 SP floats in PR65421).
So what we do currently is not very good.

> For pr65421, the arguments and return value are accessed by BLKmode after gimplify,
> since there is no IPA pass, it is never changed from pass gimple to expand.

And that is a problem (not only on Power, but everywhere that likes
registers more than it likes memory...  basically everywhere).

> In expander, the type conversion only happens on expand_assignment of "D.2909 = a;"
> (arguments assigned to local variable, stack to stack, generated by expand_block_move,
> insn #13~#20 as followed), the expand_function_start(insn #2~#9) load each element type
> to be DF already, DF to DI conversion in insn #13~#20 cause the later RTL passes fail to
> do forward propagation in 246r.fwprop1.  So my patch tries to use the actual type for
> array in structure here.  If rs6000_discover_homogeneous_aggregate is not allowed to be
> used here, how about expose and call rs6000_aggregate_candidate directly?

I think it would be best if generic code did not force this into memory
at all.

> Not clear why
> "Homogeneous aggregates only exist in the ELFv2 ABI" since double array in structure is a
> common usage?

Homogeneous arguments are a concept from the ELFv2 ABI.  This macro
return false if not
  (TARGET_HARD_FLOAT
   && DEFAULT_ABI == ABI_ELFv2
   && type && AGGREGATE_TYPE_P (type))

On other ABIs we have the exact same problem, so a good solution would
fix it for all such ABIs (but even for all targets if possible).

> To bypass block move requires very generic code change,

Yes.

> the BLK mode is determined very early
> in gimple, remove BLKmode seems huge project in stor-layout.c\function.c\expr.c etc. and not sure
> other targets like it, the ARM64 use OImode register to avoid BLKmode/stack operations, while
> X86 expand to two TImode register assignment and pointer result return.

To get good code they will have to change it to the proper access mode
in some later pass.

> Or do you mean some workaround that don't call emit_block_move to fall in expand_block_move in
> rs6000-string.c when expand_assignment of "D.2909 = a;" below?
> rtx
> store_expr (tree exp, rtx target, int call_param_p,
> 	    bool nontemporal, bool reverse)
> {
> ...
>       else if (GET_CODE (temp) == PARALLEL)
> 	emit_group_store (target, temp, TREE_TYPE (exp),
> 			  int_size_in_bytes (TREE_TYPE (exp)));
>       else if (GET_MODE (temp) == BLKmode)
> 	emit_block_move (target, temp, expr_size (exp),
> 			 (call_param_p
> 			  ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL))
> ...
> }

We can cetainly do workarounds in the target code if the generic code
cannot be fixed, or other targets are against this for some reason --
but let's try to do the proper thing first?

Thanks,


Segher


More information about the Gcc-patches mailing list