This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c/38364] New: -ftrapv triggers integer miscompilation


Seen on Ubuntu Hardy using r142342.

regehr@john-home:~/volatile/tmp73$ current-gcc -O2 -Wall small.c -o small
regehr@john-home:~/volatile/tmp73$ ./small
0
regehr@john-home:~/volatile/tmp73$ current-gcc -O2 -ftrapv -Wall small.c -o
small
regehr@john-home:~/volatile/tmp73$ ./small
1
regehr@john-home:~/volatile/tmp73$ current-gcc -v
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: ../configure --program-prefix=current-
--enable-languages=c,c++ --prefix=/home/regehr : (reconfigured) ../configure
--program-prefix=current- --enable-languages=c,c++ --prefix=/home/regehr :
(reconfigured) ../configure --program-prefix=current- --enable-languages=c,c++
--prefix=/home/regehr : (reconfigured) ../configure --program-prefix=current-
--prefix=/home/regehr --enable-languages=c,c++ --no-create --no-recursion
Thread model: posix
gcc version 4.4.0 20081202 (experimental) (GCC) 
regehr@john-home:~/volatile/tmp73$ cat small.c
#include <stdio.h>
#include <stdint.h>

static inline int16_t
safe_mul_int16_t_s_s (int16_t si1, int16_t si2)
{
  if (si1 > 0)
    {
      if (si2 > 0)
        {
          if (si1 > ((32767) / si2))
            {
              return si1;
            }
        }
      else
        {
          if (si2 < ((-32767 - 1) / si1))
            {
              return si1;
            }
        }
    }
  else
    {
      if (si2 > 0)
        {
          if (si1 < ((-32767 - 1) / si2))
            {
              return si1;
            }
        }
      else
        {
          if ((si1 != 0) && (si2 < ((32767) / si1)))
            {
              return si1;
            }
        }
    }
  return si1 * si2;
}

static inline int8_t
safe_sub_int8_t_s_s (int8_t si1, int8_t si2)
{
  if (((si1 ^ si2) &
       (((si1 ^ ((si1 ^ si2) & (1 << (sizeof (int8_t) * 8 - 1)))) -
         si2) ^ si2)) < 0)
    {
      return si1;
    }
  return si1 - si2;
}

uint32_t g_38;

int32_t func_53 (int32_t p_54, uint32_t p_55);
int32_t func_53 (int32_t p_54, uint32_t p_55)
{
  safe_mul_int16_t_s_s (1, 1);
  return 1;
}

int32_t func_97 (uint16_t p_99);
int32_t func_97 (uint16_t p_99)
{
  g_38 = p_99;
  return 1;
}

int32_t func_120 (int32_t p_124);
int32_t func_120 (int32_t p_124)
{
  if (safe_sub_int8_t_s_s (p_124, 1))
    safe_mul_int16_t_s_s (1, func_97 (1));
  return p_124;
}

int32_t func_14 (uint32_t p_16);
int32_t func_14 (uint32_t p_16)
{
  uint32_t l_438 = 0;
  func_97 (p_16 < (1 != func_120 (l_438)));
  return p_16;
}

int main (void)
{
  func_14 (1);
  printf ("%d\n", g_38);
  return 0;
}


-- 
           Summary: -ftrapv triggers integer miscompilation
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: regehr at cs dot utah dot edu
 GCC build triplet: i686-pc-linux-gnu
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]