[GHC] #1603: a miscompilation of (`rem` 0x40000000)::Int with -O -fvia-C

GHC trac at galois.com
Thu Nov 8 11:50:16 EST 2007


#1603: a miscompilation of (`rem` 0x40000000)::Int with -O -fvia-C
--------------------------+-------------------------------------------------
 Reporter:  Isaac Dupree  |          Owner:            
     Type:  bug           |         Status:  new       
 Priority:  normal        |      Milestone:  6.8 branch
Component:  Compiler      |        Version:  6.8.1     
 Severity:  normal        |     Resolution:            
 Keywords:                |     Difficulty:  Unknown   
 Testcase:  numeric/1603  |   Architecture:  Multiple  
       Os:  Multiple      |  
--------------------------+-------------------------------------------------
Changes (by simonmar):

  * testcase:  => numeric/1603
  * version:  6.6.1 => 6.8.1
  * os:  Linux => Multiple
  * architecture:  x86 => Multiple
  * milestone:  6.8.2 => 6.8 branch

Comment:

 gcc is being too clever.  It is assuming that because the first argument
 to % is the result of converting an unsigned to a signed integer, that its
 value is therefore non-negative, and uses this knowledge to optimise the
 code it generates for 'x % 0x40000000'.  I believe gcc is entitled to make
 this optimisation, because arithmetic in C is only defined within the
 bounds of the types, and that includes type conversions.  Unfortunately
 the `-fwrapv` option doesn't apply to type conversions, apparently.

 I don't see an easy fix (but suggestions are welcome).  We use unsigned
 types everywhere in our back end, only converting to signed types in order
 to perform signed operations.  This strategy apparently relies on
 undefined C behaviour.

 I've added a test (will be pushed shortly).

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/1603#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the Glasgow-haskell-bugs mailing list