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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Priority|P4                          |P3
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2016-06-08
          Component|target                      |c++
                 CC|                            |gjl at gcc dot gnu.org
               Host|x86_64-apple-darwin15       |x86_64
     Ever confirmed|0                           |1
      Known to fail|                            |7.0
              Build|x86_64-apple-darwin15       |

--- Comment #4 from Georg-Johann Lay <gjl at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #1)
> On x86_64 I get
> 
> main:
> .LFB0:
>         .cfi_startproc
> .L2:
>         movb    1, %al
>         testb   $1, %al
>         je      .L2
>         xorl    %eax, %eax
>         ret
> 
> and thus it works fine there.  Target issue.

Sorry, I cannot follow your argument.  Test case:

#define REG (*(unsigned char volatile*)0x31)
void foo ()
{
    while ((REG & 1) == 1);
}

worsks fine then compiled as C, but for C++

$ avr-gcc -x c++ foo.c -S -Os -fdump-tree-all

I see the following .ssa dump:

;; Function void foo() (_Z3foov, funcdef_no=0, decl_uid=1976, cgraph_uid=0,
symbol_order=0)

void foo() ()
{
  volatile unsigned char * _1;
  unsigned char _2;
  int _3;
  int _4;
  bool retval.0_6;

  <bb 2>:
  _1 = 49B;
  _2 = *_1;
  _3 = (int) _2;
  _4 = _3 & 1;
  retval.0_6 = _4 != 0;
  if (retval.0_6 != 0)
    goto <bb 2>;
  else
    goto <bb 3>;

  <bb 3>:
  return;
}


The dump is missing a {v} qualifier which is present in the dump generated for
C code:

  ...
  _2 ={v} *_1;
  ...

The missing qualifier results in the mentioned wrong optimization in load
invariant motion, see .lim2 dump.

I used avr-gcc built from trunk SVN 236978 from 2016-06-11:

$ ../../gcc.gnu.org/trunk/configure --target=avr
--prefix=/local/gnu/install/gcc-7 --disable-shared --disable-nls --with-dwarf2
--enable-target-optspace=yes --with-gnu-as --with-gnu-ld target_alias=avr
--enable-languages=c,c++,lto

Reply via email to