Minor refactoring in copy array primops:
authorÖmer Sinan Ağacan <omeragacan@gmail.com>
Fri, 22 Mar 2019 07:06:37 +0000 (10:06 +0300)
committerMarge Bot <ben+marge-bot@smart-cactus.org>
Wed, 27 Mar 2019 11:20:10 +0000 (07:20 -0400)
- `emitCopySmallArray` now checks size before generating code and
  doesn't generate any code when size is 0. `emitCopyArray` already does
  this so this makes small/large array cases the same in argument
  checking.

- In both `emitCopySmallArray` and `emitCopyArray` read the `dflags`
  after checking the argument.

compiler/codeGen/StgCmmPrim.hs

index a6f3395..714e544 100644 (file)
@@ -2174,9 +2174,10 @@ emitCopyArray :: (CmmExpr -> CmmExpr -> CmmExpr -> CmmExpr -> ByteOff
               -> CmmExpr        -- ^ offset in destination array
               -> WordOff        -- ^ number of elements to copy
               -> FCode ()
-emitCopyArray copy src0 src_off dst0 dst_off0 n = do
-    dflags <- getDynFlags
+emitCopyArray copy src0 src_off dst0 dst_off0 n =
     when (n /= 0) $ do
+        dflags <- getDynFlags
+
         -- Passed as arguments (be careful)
         src     <- assignTempE src0
         dst     <- assignTempE dst0
@@ -2236,23 +2237,24 @@ emitCopySmallArray :: (CmmExpr -> CmmExpr -> CmmExpr -> CmmExpr -> ByteOff
                    -> CmmExpr        -- ^ offset in destination array
                    -> WordOff        -- ^ number of elements to copy
                    -> FCode ()
-emitCopySmallArray copy src0 src_off dst0 dst_off n = do
-    dflags <- getDynFlags
+emitCopySmallArray copy src0 src_off dst0 dst_off n =
+    when (n /= 0) $ do
+        dflags <- getDynFlags
 
-    -- Passed as arguments (be careful)
-    src     <- assignTempE src0
-    dst     <- assignTempE dst0
+        -- Passed as arguments (be careful)
+        src     <- assignTempE src0
+        dst     <- assignTempE dst0
 
-    -- Set the dirty bit in the header.
-    emit (setInfo dst (CmmLit (CmmLabel mkSMAP_DIRTY_infoLabel)))
+        -- Set the dirty bit in the header.
+        emit (setInfo dst (CmmLit (CmmLabel mkSMAP_DIRTY_infoLabel)))
 
-    dst_p <- assignTempE $ cmmOffsetExprW dflags
-             (cmmOffsetB dflags dst (smallArrPtrsHdrSize dflags)) dst_off
-    src_p <- assignTempE $ cmmOffsetExprW dflags
-             (cmmOffsetB dflags src (smallArrPtrsHdrSize dflags)) src_off
-    let bytes = wordsToBytes dflags n
+        dst_p <- assignTempE $ cmmOffsetExprW dflags
+                 (cmmOffsetB dflags dst (smallArrPtrsHdrSize dflags)) dst_off
+        src_p <- assignTempE $ cmmOffsetExprW dflags
+                 (cmmOffsetB dflags src (smallArrPtrsHdrSize dflags)) src_off
+        let bytes = wordsToBytes dflags n
 
-    copy src dst dst_p src_p bytes
+        copy src dst dst_p src_p bytes
 
 -- | Takes an info table label, a register to return the newly
 -- allocated array in, a source array, an offset in the source array,