Fix up shortcut for slow calls
authorPatrick Palka <patrick@parcs.ath.cx>
Wed, 27 Nov 2013 14:04:25 +0000 (09:04 -0500)
committerSimon Marlow <marlowsd@gmail.com>
Thu, 28 Nov 2013 12:52:23 +0000 (12:52 +0000)
compiler/cmm/CmmInfo.hs
compiler/codeGen/StgCmmLayout.hs

index 641f29b..42c9e6b 100644 (file)
@@ -496,16 +496,16 @@ funInfoTable dflags info_ptr
 -- Takes the info pointer of a function, returns the function's arity
 funInfoArity :: DynFlags -> CmmExpr -> CmmExpr
 funInfoArity dflags iptr
-  = cmmToWord dflags (cmmLoadIndex dflags rep fun_info offset)
+  = cmmToWord dflags (cmmLoadIndex dflags rep fun_info (offset `div` rep_bytes))
   where
    fun_info = funInfoTable dflags iptr
    rep = cmmBits (widthFromBytes rep_bytes)
 
    (rep_bytes, offset)
-    | tablesNextToCode dflags = ( pc_REP_StgFunInfoExtraFwd_arity pc
-                                , oFFSET_StgFunInfoExtraFwd_arity dflags )
-    | otherwise               = ( pc_REP_StgFunInfoExtraRev_arity pc
+    | tablesNextToCode dflags = ( pc_REP_StgFunInfoExtraRev_arity pc
                                 , oFFSET_StgFunInfoExtraRev_arity dflags )
+    | otherwise               = ( pc_REP_StgFunInfoExtraFwd_arity pc
+                                , oFFSET_StgFunInfoExtraFwd_arity dflags )
 
    pc = sPlatformConstants (settings dflags)
 
index 9a73491..4f71568 100644 (file)
@@ -191,23 +191,23 @@ slowCall fun stg_args
         let n_args = length stg_args
         if n_args > arity && optLevel dflags >= 2
            then do
+             funv <- (CmmReg . CmmLocal) `fmap` assignTemp fun
+             fun_iptr <- (CmmReg . CmmLocal) `fmap`
+                    assignTemp (closureInfoPtr dflags (cmmUntag dflags funv))
+
              fast_code <- getCode $
                 emitCall (NativeNodeCall, NativeReturn)
-                  (entryCode dflags (closureInfoPtr dflags fun))
-                  (nonVArgs ((P,Just fun):argsreps))
+                  (entryCode dflags fun_iptr)
+                  (nonVArgs ((P,Just funv):argsreps))
 
              slow_lbl <- newLabelC
              fast_lbl <- newLabelC
              is_tagged_lbl <- newLabelC
              end_lbl <- newLabelC
 
-             funv <- (CmmReg . CmmLocal) `fmap` assignTemp fun
-
-             let correct_arity = cmmEqWord dflags (funInfoArity dflags funv)
+             let correct_arity = cmmEqWord dflags (funInfoArity dflags fun_iptr)
                                                   (mkIntExpr dflags n_args)
 
-             pprTrace "fast call" (int n_args) $ return ()
-
              emit (mkCbranch (cmmIsTagged dflags funv) is_tagged_lbl slow_lbl
                    <*> mkLabel is_tagged_lbl
                    <*> mkCbranch correct_arity fast_lbl slow_lbl