The following test fails when I disable all optimizations but if-conversion:

#include <stdio.h>

long long func(long arg) {
   long long val = 0;
   if (arg < 0) {
      val = 0xffffffff80000000ull;
   }
   return val;
}

int main() {
   long long result = func(-1);
   if (result != 0xffffffff80000000ull) {
      printf("failed.\n");
      return 1;
   } 
   printf("passed.\n");
   return 0;
}

The return value of func is 0x80000000ull where it should be
0xffffffff80000000ull. It works correctly when I don't do any optimization or
with more optimization (-O1, -O2, -O3).

The compile command line is the following:
gcc test.c -O1 -fno-defer-pop -fno-delayed-branch -fno-guess-branch-probability
-fno-cprop-registers -fno-loop-optimize -fno-if-conversion2 -fno-tree-ccp
-fno-tree-dce -fno-tree-dominator-opts -fno-tree-dse -fno-tree-ter 
-fno-tree-lrs -fno-tree-sra -fno-tree-copyrename -fno-tree-fre -fno-tree-ch
-fno-unit-at-a-time -fno-merge-constants -fno-omit-frame-pointer -o test

there are no compiler warnings, even with -Wall

I use gcc 4.3.4, configure options:
 ../gcc-4.3.4/configure --disable-shared --disable-nls --enable-languages=c++
--with-gnu-as --with-gnu-ld --enable-__cxa_atexit


-- 
           Summary: Wrong optimization with if-conversion
           Product: gcc
           Version: 4.3.4
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: thomas at coware dot com
 GCC build triplet: i686
  GCC host triplet: i686
GCC target triplet: i686


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40987

Reply via email to