StgCmmPrim: remove an unnecessary instruction in doNewArrayOp
authorMichal Terepeta <michal.terepeta@gmail.com>
Sun, 14 Apr 2019 19:21:17 +0000 (21:21 +0200)
committerMarge Bot <ben+marge-bot@smart-cactus.org>
Sat, 20 Apr 2019 03:32:08 +0000 (23:32 -0400)
Previously we would generate a local variable pointing after the array
header and use it to initialize the array elements. But we already use
stores with offset, so it's easy to just add the header to those offsets
during compilation and avoid generating the local variable (which would
become a LEA instruction when using native codegen; LLVM already
optimizes it away).

Signed-off-by: Michal Terepeta <michal.terepeta@gmail.com>
compiler/codeGen/StgCmmPrim.hs

index e5aacd1..0a66756 100644 (file)
@@ -2143,11 +2143,8 @@ doNewArrayOp res_r rep info payload n init = do
     emit $ mkAssign arr base
 
     -- Initialise all elements of the array
-    p <- assignTemp $ cmmOffsetB dflags (CmmReg arr) (hdrSize dflags rep)
-    let initialization =
-            [ mkStore (cmmOffsetW dflags (CmmReg (CmmLocal p)) off) init
-            | off <- [0.. n - 1]
-            ]
+    let mkOff off = cmmOffsetW dflags (CmmReg arr) (hdrSizeW dflags rep + off)
+        initialization = [ mkStore (mkOff off) init | off <- [0.. n - 1] ]
     emit (catAGraphs initialization)
 
     emit $ mkAssign (CmmLocal res_r) (CmmReg arr)