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

Georg-Johann Lay <gjl at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
          Component|middle-end                  |tree-optimization
            Summary|[6/7/8 Regression] Expand   |[6/7/8 Regression] Wrong
                   |uses wrong multiply routine |extension of multiply
                   |                            |multiply operand

--- Comment #16 from Georg-Johann Lay <gjl at gcc dot gnu.org> ---
Presumably a bug in VRP, at least with

$ avr-gcc-8 -S -Os pr57503.c -mmcu=atmega8 -fdump-rtl-expand -fno-tree-vrp

the .expand dump is correct and reads as follows:


(note 5 4 8 2 NOTE_INSN_FUNCTION_BEG)
(insn 8 5 9 2 (set (reg:HI 49 [ ab ])
        (mult:HI (zero_extend:HI (reg/v:QI 45 [ a ]))
            (zero_extend:HI (reg/v:QI 46 [ b ])))) "pr57503.c":4 -1
     (nil))
(insn 9 8 10 2 (parallel [
            (set (reg:SI 48)
                (mult:SI (zero_extend:SI (reg:HI 49 [ ab ]))
                    (sign_extend:SI (reg/v:HI 47 [ c ]))))
            (clobber (reg:HI 26 r26))
            (clobber (reg:DI 18 r18))
        ]) "pr57503.c":5 -1
     (nil))

With VRP in action, the code prior to .vrp1 reads:

func1 (unsigned char a, unsigned char b, int c)
{
  unsigned int ab;
  int _1;
  int _2;
  int _3;
  long int _4;
  long int _5;
  long int _10;

  <bb 2> [local count: 1073741825]:
  _1 = (int) a_6(D);
  _2 = (int) b_7(D);
  _3 = _1 * _2;
  ab_8 = (unsigned int) _3;
  _4 = (long int) ab_8;
  _5 = (long int) c_9(D);
  _10 = _4 * _5;
  return _10;

}


Then VRP changes the code as follows:

func1 (unsigned char a, unsigned char b, int c)
{
  unsigned int ab;
  int _1;
  int _2;
  int _3;
  long int _4;
  long int _5;
  long int _10;

  <bb 2> [local count: 1073741825]:
  _1 = (int) a_6(D);
  _2 = (int) b_7(D);
  _3 = _1 * _2;
  ab_8 = (unsigned int) _3;
  _4 = (long int) _3;
  _5 = (long int) c_9(D);
  _10 = _4 * _5;
  return _10;

}

Notice the _3 (of type int) instead ob ab_8 (of type unsigned int).

Reply via email to