https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90424

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |ASSIGNED
   Last reconfirmed|                            |2019-05-13
           Assignee|unassigned at gcc dot gnu.org      |rguenth at gcc dot 
gnu.org
     Ever confirmed|0                           |1

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Ick, C++ ... so I see for example

load<char, 8> (const void * p)
{
  W r;
  long unsigned int _3;
  V _5;

  <bb 2> [local count: 1073741824]:
  _3 = MEM[(char * {ref-all})p_2(D)];
  MEM[(char * {ref-all})&r] = _3;
  _5 = r;
  r ={v} {CLOBBER};
  return _5;

but it's not clear to me whether W is a vector type and whether r could
be re-written into SSA form or not.

Good one(?)

load<long int, 8> (const void * p)
{
  W r;
  long unsigned int _3;
  long int _4;

  <bb 2> [local count: 1073741824]:
  _3 = MEM[(char * {ref-all})p_2(D)];
  _4 = (long int) _3;
  r_6 = BIT_INSERT_EXPR <r_5(D), _4, 0 (64 bits)>;
  return r_6;


note that bit-inserting into a default-def probably isn't the best thing
to do, but well.

Another variant:

load<double, 8> (const void * p)
{
  W r;
  long unsigned int _3;
  double _4;

  <bb 2> [local count: 1073741824]:
  _3 = MEM[(char * {ref-all})p_2(D)];
  _4 = VIEW_CONVERT_EXPR<double>(_3);
  r_6 = BIT_INSERT_EXPR <r_5(D), _4, 0 (64 bits)>;
  return r_6;

so the bad variants are where we retain the aggregate copy.

So for the first case above we have

 <var_decl 0x7ffff7fefc60 r
    type <vector_type 0x7ffff69e9348 W
        type <integer_type 0x7ffff68983f0 char public string-flag type_6 QI
            size <integer_cst 0x7ffff687af18 constant 8>
            unit-size <integer_cst 0x7ffff687af30 constant 1>
            align:8 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type
0x7ffff68983f0 precision:8 min <integer_cst 0x7ffff687af60 -128> max
<integer_cst 0x7ffff687af90 127>
            pointer_to_this <pointer_type 0x7ffff69e9690>>
        sizes-gimplified V16QI
        size <integer_cst 0x7ffff687ae70 constant 128>
        unit-size <integer_cst 0x7ffff687ae88 constant 16>
        align:128 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type
0x7ffff69a0b28 nunits:16
        pointer_to_this <pointer_type 0x7ffff69e93f0>>
    addressable used tree_1 read decl_1 decl_5 V16QI t.ii:7:5 size <integer_cst
0x7ffff687ae70 128> unit-size <integer_cst 0x7ffff687ae88 16>
    align:128 warn_if_not_align:0 context <function_decl 0x7ffff69d6500 load>>

but then we fail to rewrite this into SSA because the

  MEM[(char * {ref-all})&r] = _3;

assign is a partial assign of a 'long' value into a vector<char> vector.
Currently BIT_INSERT_EXPR is restricted to insertion of vector type
components so we'd have to apply a series of VIEW_CONVERT_EXPRs to 'r'
to insert _3 or alternatively allow upper/lower halves, like inserting
v4qi into v16qi at position 0, 4, 8 or 12, where we then only would
have to VIEW_CONVERT _3.

Note in the end it will matter what targets implement, otherwise you'll
get spilling if we have to go through memory for the insertion.

I will look into changing SSA rewrite in one or other way.

Reply via email to