fix types in generated C for comparison MachOps
authorSimon Marlow <simonmar@microsoft.com>
Tue, 14 Nov 2006 16:00:27 +0000 (16:00 +0000)
committerSimon Marlow <simonmar@microsoft.com>
Tue, 14 Nov 2006 16:00:27 +0000 (16:00 +0000)
C comparisons have type 'int', but our generated code assumed they had
type 'StgWord', leading to (very) occasional warnings from gcc.

compiler/cmm/PprC.hs

index 90599d7..6d63e87 100644 (file)
@@ -356,6 +356,20 @@ pprMachOpApp op args
        isMulMayOfloOp _ = False
 
 pprMachOpApp mop args
+  | Just ty <- machOpNeedsCast mop 
+  = ty <> parens (pprMachOpApp' mop args)
+  | otherwise
+  = pprMachOpApp' mop args
+
+-- Comparisons in C have type 'int', but we want type W_ (this is what
+-- resultRepOfMachOp says).  The other C operations inherit their type
+-- from their operands, so no casting is required.
+machOpNeedsCast :: MachOp -> Maybe SDoc
+machOpNeedsCast mop
+  | isComparisonMachOp mop = Just mkW_
+  | otherwise              = Nothing
+
+pprMachOpApp' mop args
  = case args of
     -- dyadic
     [x,y] -> pprArg x <+> pprMachOp_for_C mop <+> pprArg y