From 52cba3c47b25a78402e542ff63dc905fc5b26b62 Mon Sep 17 00:00:00 2001 From: "Edward Z. Yang" Date: Mon, 16 May 2011 12:55:20 +0100 Subject: [PATCH] Amend comment per Marlow's comments. Signed-off-by: Edward Z. Yang --- compiler/codeGen/StgCmmUtils.hs | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/compiler/codeGen/StgCmmUtils.hs b/compiler/codeGen/StgCmmUtils.hs index ad9ebf1..d917811 100644 --- a/compiler/codeGen/StgCmmUtils.hs +++ b/compiler/codeGen/StgCmmUtils.hs @@ -340,22 +340,23 @@ emitRtsCall' res pkg fun args _vols safe -- * Regs.h claims that BaseReg should be saved last and loaded first -- * This might not have been tickled before since BaseReg is callee save -- * Regs.h saves SparkHd, ParkT1, SparkBase and SparkLim --- EZY: This code is very dodgy, because callerSaves only ever --- returns true in the current universe for registers NOT in +-- +-- This code isn't actually used right now, because callerSaves +-- only ever returns true in the current universe for registers NOT in -- system_regs (just do a grep for CALLER_SAVES in --- includes/stg/MachRegs.h). Thus, this is all one giant no-op. What we are --- actually interested in is saving are the non-system registers, which --- we is what the old code generator actually does at this point. --- Unfortunately, we can't do that here either, because we don't --- liveness information, and thus there's not an easy way to tell which --- specific global registers need to be saved (the 'vols' argument in --- the old code generator.) One possible hack is to save all of them --- unconditionally, but unless we have very clever dead /memory/ --- elimination (unlikely), this will still leave a dead, unnecessary --- memory assignment. And really, we shouldn't be doing the workaround --- at this point in the pipeline, see Note [Register parameter passing]. --- Right now the workaround is to avoid inlining across unsafe foreign --- calls in rewriteAssignments. +-- includes/stg/MachRegs.h). It's all one giant no-op, and for +-- good reason: having to save system registers on every foreign call +-- would be very expensive, so we avoid assigning them to those +-- registers when we add support for an architecture. +-- +-- Note that the old code generator actually does more work here: it +-- also saves other global registers. We can't (nor want) to do that +-- here, as we don't have liveness information. And really, we +-- shouldn't be doing the workaround at this point in the pipeline, see +-- Note [Register parameter passing] and the ToDo on CmmCall in +-- cmm/CmmNode.hs. Right now the workaround is to avoid inlining across +-- unsafe foreign calls in rewriteAssignments, but this is strictly +-- temporary. callerSaveVolatileRegs :: (CmmAGraph, CmmAGraph) callerSaveVolatileRegs = (caller_save, caller_load) where -- 1.7.10.4