SimplCore.lhs 24.8 KB
Newer Older
1
2
3
4
5
6
%
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
%
\section[SimplCore]{Driver for simplifying @Core@ programs}

\begin{code}
7
{-# OPTIONS -w #-}
8
9
10
-- The above warning supression flag is a temporary kludge.
-- While working on this module you are encouraged to remove it and fix
-- any warnings in the module. See
Ian Lynagh's avatar
Ian Lynagh committed
11
--     http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
12
13
-- for details

14
module SimplCore ( core2core, simplifyExpr ) where
15
16
17

#include "HsVersions.h"

18
import DynFlags		( CoreToDo(..), SimplifierSwitch(..),
chak's avatar
chak committed
19
			  SimplifierMode(..), DynFlags, DynFlag(..), dopt,
20
			  getCoreToDo )
21
import CoreSyn
22
import HscTypes		( HscEnv(..), ModGuts(..), ExternalPackageState(..),
23
			  Dependencies( dep_mods ), 
24
			  hscEPS, hptRules )
25
import CSE		( cseProgram )
26
27
import Rules		( RuleBase, emptyRuleBase, mkRuleBase, unionRuleBase,
			  extendRuleBaseList, pprRuleBase, ruleCheckProgram,
28
			  addSpecInfo, addIdSpecialisations )
29
import PprCore		( pprCoreBindings, pprCoreExpr, pprRules )
30
import OccurAnal	( occurAnalysePgm, occurAnalyseExpr )
31
import IdInfo		( setNewStrictnessInfo, newStrictnessInfo, 
32
			  setWorkerInfo, workerInfo, setSpecInfoHead,
33
			  setInlinePragInfo, inlinePragInfo,
34
			  setSpecInfo, specInfo, specInfoRules )
35
import CoreUtils	( coreBindsSize )
36
import Simplify		( simplTopBinds, simplExpr )
37
import SimplEnv		( SimplEnv, simplBinders, mkSimplEnv, setInScopeSet )
38
import SimplMonad
39
import ErrUtils		( dumpIfSet, dumpIfSet_dyn, showPass )
40
import CoreLint		( endPass, endIteration )
41
42
import FloatIn		( floatInwards )
import FloatOut		( floatOutwards )
43
import FamInstEnv
44
import Id		( Id, modifyIdInfo, idInfo, isExportedId, isLocalId,
45
			  idSpecialisation, idName )
46
import VarSet
47
import VarEnv
48
import NameEnv		( lookupNameEnv )
49
50
51
import LiberateCase	( liberateCase )
import SAT		( doStaticArgs )
import Specialise	( specProgram)
52
import SpecConstr	( specConstrProgram)
53
import DmdAnal		( dmdAnalPgm )
54
import WorkWrap	        ( wwTopBinds )
55
56
#ifdef OLD_STRICTNESS
import StrictAnal	( saBinds )
57
import CprAnalyse       ( cprAnalyse )
58
#endif
59
import Vectorise        ( vectorise )
60

61
import UniqSupply	( UniqSupply, mkSplitUniqSupply, splitUniqSupply )
62
63
import IO		( hPutStr, stderr )
import Outputable
64
import List		( partition )
65
import Maybes		( orElse )
66
67
68
69
70
71
72
73
74
\end{code}

%************************************************************************
%*									*
\subsection{The driver for the simplifier}
%*									*
%************************************************************************

\begin{code}
75
76
77
core2core :: HscEnv
	  -> ModGuts
	  -> IO ModGuts
78

79
core2core hsc_env guts
80
  = do
81
        let dflags = hsc_dflags hsc_env
82
	    core_todos = getCoreToDo dflags
83

84
	us <- mkSplitUniqSupply 's'
85
	let (cp_us, ru_us) = splitUniqSupply us
86

87
		-- COMPUTE THE RULE BASE TO USE
88
	(imp_rule_base, guts') <- prepareRules hsc_env guts ru_us
89

90
		-- DO THE BUSINESS
91
	(stats, guts'') <- doCorePasses hsc_env imp_rule_base cp_us
92
			 		(zeroSimplCount dflags) 
93
					guts' core_todos
94

95
	dumpIfSet_dyn dflags Opt_D_dump_simpl_stats
96
97
98
		  "Grand total simplifier statistics"
		  (pprSimplCount stats)

99
	return guts''
100
101


102
simplifyExpr :: DynFlags -- includes spec of what core-to-core passes to do
103
104
	     -> CoreExpr
	     -> IO CoreExpr
105
106
-- simplifyExpr is called by the driver to simplify an
-- expression typed in at the interactive prompt
107
simplifyExpr dflags expr
108
  = do	{
109
110
	; showPass dflags "Simplify"

111
112
	; us <-  mkSplitUniqSupply 's'

113
	; let (expr', _counts) = initSmpl dflags emptyRuleBase emptyFamInstEnvs us $
114
				 simplExprGently gentleSimplEnv expr
115

116
	; dumpIfSet_dyn dflags Opt_D_dump_simpl "Simplified expression"
117
118
119
120
121
			(pprCoreExpr expr')

	; return expr'
	}

122
gentleSimplEnv :: SimplEnv
123
gentleSimplEnv = mkSimplEnv SimplGently  (isAmongSimpl [])
124

125
doCorePasses :: HscEnv
126
             -> RuleBase        -- the imported main rule base
127
             -> UniqSupply      -- uniques
128
129
	     -> SimplCount      -- simplifier stats
             -> ModGuts	        -- local binds in (with rules attached)
130
             -> [CoreToDo]      -- which passes to do
131
             -> IO (SimplCount, ModGuts)
132

133
doCorePasses hsc_env rb us stats guts []
134
  = return (stats, guts)
135

136
137
138
doCorePasses hsc_env rb us stats guts (CoreDoPasses to_dos1 : to_dos2) 
  = doCorePasses hsc_env rb us stats guts (to_dos1 ++ to_dos2) 

139
doCorePasses hsc_env rb us stats guts (to_do : to_dos) 
140
  = do
141
	let (us1, us2) = splitUniqSupply us
142
143
	(stats1, guts1) <- doCorePass to_do hsc_env us1 rb guts
	doCorePasses hsc_env rb us2 (stats `plusSimplCount` stats1) guts1 to_dos
144

145
146
doCorePass :: CoreToDo -> HscEnv -> UniqSupply -> RuleBase
	   -> ModGuts -> IO (SimplCount, ModGuts)
147
148
149
150
151
152
153
154
155
156
doCorePass (CoreDoSimplify mode sws)   = {-# SCC "Simplify" #-}      simplifyPgm mode sws
doCorePass CoreCSE		       = {-# SCC "CommonSubExpr" #-} trBinds  cseProgram
doCorePass CoreLiberateCase	       = {-# SCC "LiberateCase" #-}  liberateCase
doCorePass CoreDoFloatInwards          = {-# SCC "FloatInwards" #-}  trBinds  floatInwards
doCorePass (CoreDoFloatOutwards f)     = {-# SCC "FloatOutwards" #-} trBindsU (floatOutwards f)
doCorePass CoreDoStaticArgs	       = {-# SCC "StaticArgs" #-}    trBinds  doStaticArgs
doCorePass CoreDoStrictness	       = {-# SCC "Stranal" #-}       trBinds  dmdAnalPgm
doCorePass CoreDoWorkerWrapper         = {-# SCC "WorkWrap" #-}      trBindsU wwTopBinds
doCorePass CoreDoSpecialising          = {-# SCC "Specialise" #-}    trBindsU specProgram
doCorePass CoreDoSpecConstr	       = {-# SCC "SpecConstr" #-}    trBindsU specConstrProgram
157
doCorePass CoreDoGlomBinds	       = trBinds glomBinds
158
doCorePass CoreDoVectorisation         = {-# SCC "Vectorise" #-}     vectorise
159
doCorePass CoreDoPrintCore	       = observe printCore
160
doCorePass (CoreDoRuleCheck phase pat) = ruleCheck phase pat
161
162
doCorePass CoreDoNothing	       = observe (\ _ _ -> return ())
#ifdef OLD_STRICTNESS		       
163
doCorePass CoreDoOldStrictness	       = {-# SCC "OldStrictness" #-} trBinds doOldStrictness
164
165
#else
doCorePass CoreDoOldStrictness	       = panic "CoreDoOldStrictness"
166
#endif
167
doCorePass (CoreDoPasses _) = panic "CoreDoPasses"
168

169
#ifdef OLD_STRICTNESS
170
doOldStrictness dfs binds
171
172
173
  = do binds1 <- saBinds dfs binds
       binds2 <- cprAnalyse dfs binds1
       return binds2
174
175
#endif

176
printCore _ binds = dumpIfSet True "Print Core" (pprCoreBindings binds)
177

178
179
180
181
182
ruleCheck phase pat hsc_env us rb guts 
  =  do let dflags = hsc_dflags hsc_env
	showPass dflags "RuleCheck"
        printDump (ruleCheckProgram phase pat rb (mg_binds guts))
	return (zeroSimplCount dflags, guts)
183

184
185
186
-- Most passes return no stats and don't change rules
trBinds :: (DynFlags -> [CoreBind] -> IO [CoreBind])
	-> HscEnv -> UniqSupply -> RuleBase -> ModGuts
187
	-> IO (SimplCount, ModGuts)
188
189
trBinds do_pass hsc_env us rb guts
  = do	{ binds' <- do_pass dflags (mg_binds guts)
190
	; return (zeroSimplCount dflags, guts { mg_binds = binds' }) }
191
192
193
194
195
  where
    dflags = hsc_dflags hsc_env

trBindsU :: (DynFlags -> UniqSupply -> [CoreBind] -> IO [CoreBind])
	-> HscEnv -> UniqSupply -> RuleBase -> ModGuts
196
	-> IO (SimplCount, ModGuts)
197
198
trBindsU do_pass hsc_env us rb guts
  = do	{ binds' <- do_pass dflags us (mg_binds guts)
199
	; return (zeroSimplCount dflags, guts { mg_binds = binds' }) }
200
201
202
203
204
205
  where
    dflags = hsc_dflags hsc_env

-- Observer passes just peek; don't modify the bindings at all
observe :: (DynFlags -> [CoreBind] -> IO a)
	-> HscEnv -> UniqSupply -> RuleBase -> ModGuts
206
	-> IO (SimplCount, ModGuts)
207
208
observe do_pass hsc_env us rb guts 
  = do	{ binds <- do_pass dflags (mg_binds guts)
209
	; return (zeroSimplCount dflags, guts) }
210
211
  where
    dflags = hsc_dflags hsc_env
212
213
214
\end{code}


215

216
217
218
219
220
221
%************************************************************************
%*									*
\subsection{Dealing with rules}
%*									*
%************************************************************************

222
223
-- prepareLocalRuleBase takes the CoreBinds and rules defined in this module.
-- It attaches those rules that are for local Ids to their binders, and
224
-- returns the remainder attached to Ids in an IdSet.  
225
226

\begin{code}
227
prepareRules :: HscEnv 
228
	     -> ModGuts
229
	     -> UniqSupply
230
231
	     -> IO (RuleBase, 		-- Rule base for imported things, incl
					-- (a) rules defined in this module (orphans)
232
233
234
					-- (b) rules from other modules in home package
					-- but not things from other packages

235
236
237
		    ModGuts)		-- Modified fields are 
					--	(a) Bindings have rules attached,
					-- 	(b) Rules are now just orphan rules
238

239
prepareRules hsc_env@(HscEnv { hsc_dflags = dflags, hsc_HPT = hpt })
240
	     guts@(ModGuts { mg_binds = binds, mg_deps = deps, mg_rules = local_rules })
241
	     us 
242
  = do	{ let 	-- Simplify the local rules; boringly, we need to make an in-scope set
243
244
		-- from the local binders, to avoid warnings from Simplify.simplVar
	      local_ids        = mkInScopeSet (mkVarSet (bindersOfBinds binds))
245
	      env	       = setInScopeSet gentleSimplEnv local_ids 
246
	      (better_rules,_) = initSmpl dflags emptyRuleBase emptyFamInstEnvs us $
247
				 (mapM (simplRule env) local_rules)
248
	      home_pkg_rules   = hptRules hsc_env (dep_mods deps)
249

250
251
		-- Find the rules for locally-defined Ids; then we can attach them
		-- to the binders in the top-level bindings
252
253
254
255
256
257
258
259
260
261
262
263
264
		-- 
		-- Reason
		-- 	- It makes the rules easier to look up
		--	- It means that transformation rules and specialisations for
		--	  locally defined Ids are handled uniformly
		--	- It keeps alive things that are referred to only from a rule
		--	  (the occurrence analyser knows about rules attached to Ids)
		--	- It makes sure that, when we apply a rule, the free vars
		--	  of the RHS are more likely to be in scope
		--	- The imported rules are carried in the in-scope set
		--	  which is extended on each iteration by the new wave of
		--	  local binders; any rules which aren't on the binding will
		--	  thereby get dropped
265
	      (rules_for_locals, rules_for_imps) = partition isLocalRule better_rules
266
267
	      local_rule_base = extendRuleBaseList emptyRuleBase rules_for_locals
	      binds_w_rules   = updateBinders local_rule_base binds
268

269
270
271
	      hpt_rule_base = mkRuleBase home_pkg_rules
	      imp_rule_base = extendRuleBaseList hpt_rule_base rules_for_imps

272
	; dumpIfSet_dyn dflags Opt_D_dump_rules "Transformation rules"
273
		(vcat [text "Local rules", pprRules better_rules,
274
		       text "",
275
		       text "Imported rules", pprRuleBase imp_rule_base])
276

277
278
	; return (imp_rule_base, guts { mg_binds = binds_w_rules, 
					mg_rules = rules_for_imps })
279
    }
280

281
updateBinders :: RuleBase -> [CoreBind] -> [CoreBind]
282
updateBinders local_rules binds
283
  = map update_bndrs binds
284
  where
285
286
287
    update_bndrs (NonRec b r) = NonRec (update_bndr b) r
    update_bndrs (Rec prs)    = Rec [(update_bndr b, r) | (b,r) <- prs]

288
289
    update_bndr bndr = case lookupNameEnv local_rules (idName bndr) of
			  Nothing    -> bndr
290
291
292
			  Just rules -> bndr `addIdSpecialisations` rules
				-- The binder might have some existing rules,
				-- arising from specialisation pragmas
293
294
\end{code}

295

296
297
298
299
300
We must do some gentle simplification on the template (but not the RHS)
of each rule.  The case that forced me to add this was the fold/build rule,
which without simplification looked like:
	fold k z (build (/\a. g a))  ==>  ...
This doesn't match unless you do eta reduction on the build argument.
301

302
\begin{code}
303
simplRule env rule@(BuiltinRule {})
304
  = return rule
305
simplRule env rule@(Rule { ru_bndrs = bndrs, ru_args = args, ru_rhs = rhs })
306
307
308
309
  = do (env, bndrs') <- simplBinders env bndrs
       args' <- mapM (simplExprGently env) args
       rhs' <- simplExprGently env rhs
       return (rule { ru_bndrs = bndrs', ru_args = args', ru_rhs = rhs' })
310

311
312
-- It's important that simplExprGently does eta reduction.
-- For example, in a rule like:
313
--	augment g (build h) 
314
-- we do not want to get
315
--	augment (\a. g a) (build h)
316
-- otherwise we don't match when given an argument like
317
--	(\a. h a a)
318
319
320
321
322
323
--
-- The simplifier does indeed do eta reduction (it's in
-- Simplify.completeLam) but only if -O is on.
\end{code}

\begin{code}
324
simplExprGently :: SimplEnv -> CoreExpr -> SimplM CoreExpr
325
326
327
328
329
330
-- Simplifies an expression 
-- 	does occurrence analysis, then simplification
--	and repeats (twice currently) because one pass
--	alone leaves tons of crud.
-- Used (a) for user expressions typed in at the interactive prompt
--	(b) the LHS and RHS of a RULE
331
332
333
334
335
--
-- The name 'Gently' suggests that the SimplifierMode is SimplGently,
-- and in fact that is so.... but the 'Gently' in simplExprGently doesn't
-- enforce that; it just simplifies the expression twice

336
337
simplExprGently env expr = do
    expr1 <- simplExpr env (occurAnalyseExpr expr)
338
    simplExpr env (occurAnalyseExpr expr1)
339
340
\end{code}

341
342
343
344
345
346
347

%************************************************************************
%*									*
\subsection{Glomming}
%*									*
%************************************************************************

348
\begin{code}
349
glomBinds :: DynFlags -> [CoreBind] -> IO [CoreBind]
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
-- Glom all binds together in one Rec, in case any
-- transformations have introduced any new dependencies
--
-- NB: the global invariant is this:
--	*** the top level bindings are never cloned, and are always unique ***
--
-- We sort them into dependency order, but applying transformation rules may
-- make something at the top refer to something at the bottom:
--	f = \x -> p (q x)
--	h = \y -> 3
--	
--	RULE:  p (q x) = h x
--
-- Applying this rule makes f refer to h, 
-- although it doesn't appear to in the source program.  
-- This pass lets us control where it happens.
--
-- NOTICE that this cannot happen for rules whose head is a locally-defined
-- function.  It only happens for rules whose head is an imported function
-- (p in the example above).  So, for example, the rule had been
--	RULE: f (p x) = h x
-- then the rule for f would be attached to f itself (in its IdInfo) 
-- by prepareLocalRuleBase and h would be regarded by the occurrency 
-- analyser as free in f.

375
glomBinds dflags binds
376
  = do { showPass dflags "GlomBinds" ;
377
378
379
380
381
382
	 let { recd_binds = [Rec (flattenBinds binds)] } ;
	 return recd_binds }
	-- Not much point in printing the result... 
	-- just consumes output bandwidth
\end{code}

383

384
385
386
387
388
389
390
%************************************************************************
%*									*
\subsection{The driver for the simplifier}
%*									*
%************************************************************************

\begin{code}
391
simplifyPgm :: SimplifierMode
392
	    -> [SimplifierSwitch]
393
	    -> HscEnv
394
	    -> UniqSupply
395
396
	    -> RuleBase
	    -> ModGuts
397
	    -> IO (SimplCount, ModGuts)  -- New bindings
398

399
simplifyPgm mode switches hsc_env us imp_rule_base guts
400
  = do {
401
	showPass dflags "Simplify";
402

403
404
	(termination_msg, it_count, counts_out, binds') 
	   <- do_iteration us 1 (zeroSimplCount dflags) (mg_binds guts) ;
405

406
407
	dumpIfSet (dopt Opt_D_verbose_core2core dflags 
                   && dopt Opt_D_dump_simpl_stats dflags)
408
409
410
411
412
		  "Simplifier statistics"
		  (vcat [text termination_msg <+> text "after" <+> ppr it_count <+> text "iterations",
			 text "",
			 pprSimplCount counts_out]);

413
	endPass dflags ("Simplify phase " ++ phase_info ++ " done") Opt_D_dump_simpl_phases binds';
414

415
	return (counts_out, guts { mg_binds = binds' })
416
417
    }
  where
418
419
420
421
422
423
424
    dflags 	   = hsc_dflags hsc_env
    phase_info	   = case mode of
		   	  SimplGently  -> "gentle"
		   	  SimplPhase n -> show n
		   
    sw_chkr	   = isAmongSimpl switches
    max_iterations = intSwitchSet sw_chkr MaxSimplifierIterations `orElse` 2
425
 
426
    do_iteration us iteration_no counts binds
427
428
429
430
431
432
433
434
	-- iteration_no is the number of the iteration we are
	-- about to begin, with '1' for the first
      | iteration_no > max_iterations	-- Stop if we've run out of iterations
      = do {
#ifdef DEBUG
	    if  max_iterations > 2 then
		hPutStr stderr ("NOTE: Simplifier still going after " ++ 
				show max_iterations ++ 
435
			    	" iterations; bailing out.  Size = " ++ show (coreBindsSize binds) ++ "\n" )
436
437
438
439
440
	    else 
		return ();
#endif
		-- Subtract 1 from iteration_no to get the
		-- number of iterations we actually completed
441
	    return ("Simplifier baled out", iteration_no - 1, counts, binds)
442
443
	}

444
445
      -- Try and force thunks off the binds; significantly reduces
      -- space usage, especially with -O.  JRS, 000620.
446
      | let sz = coreBindsSize binds in sz == sz
447
448
      = do {
		-- Occurrence analysis
449
	   let { tagged_binds = {-# SCC "OccAnal" #-} occurAnalysePgm binds } ;
450
	   dumpIfSet_dyn dflags Opt_D_dump_occur_anal "Occurrence analysis"
451
452
		     (pprCoreBindings tagged_binds);

453
454
455
456
457
	   	-- Get any new rules, and extend the rule base
		-- We need to do this regularly, because simplification can
		-- poke on IdInfo thunks, which in turn brings in new rules
		-- behind the scenes.  Otherwise there's a danger we'll simply
		-- miss the rules for Ids hidden inside imported inlinings
458
459
	   eps <- hscEPS hsc_env ;
	   let	{ rule_base' = unionRuleBase imp_rule_base (eps_rule_base eps)
460
		; simpl_env  = mkSimplEnv mode sw_chkr 
461
		; simpl_binds = {-# SCC "SimplTopBinds" #-} 
462
463
				simplTopBinds simpl_env tagged_binds
		; fam_envs = (eps_fam_inst_env eps, mg_fam_inst_env guts) } ;
464
465
	   
		-- Simplify the program
466
467
468
469
470
471
472
		-- We do this with a *case* not a *let* because lazy pattern
		-- matching bit us with bad space leak!
		-- With a let, we ended up with
		--   let
		--	t = initSmpl ...
		--	counts' = snd t
		--   in
473
		-- 	case t of {(_,counts') -> if counts'=0 then ... }
474
475
		-- So the conditional didn't force counts', because the
		-- selection got duplicated.  Sigh!
476
	   case initSmpl dflags rule_base' fam_envs us1 simpl_binds of {
477
	  	(binds', counts') -> do {
478

479
	   let	{ all_counts = counts `plusSimplCount` counts'
480
		; herald     = "Simplifier phase " ++ phase_info ++ 
481
482
483
			      ", iteration " ++ show iteration_no ++
			      " out of " ++ show max_iterations
	        } ;
484
485
486

		-- Stop if nothing happened; don't dump output
	   if isZeroSimplCount counts' then
487
		return ("Simplifier reached fixed point", iteration_no, 
488
			all_counts, binds')
489
	   else do {
490
491
492
493
494
		-- Short out indirections
		-- We do this *after* at least one run of the simplifier 
		-- because indirection-shorting uses the export flag on *occurrences*
		-- and that isn't guaranteed to be ok until after the first run propagates
		-- stuff from the binding site to its occurrences
495
496
497
		--
		-- ToDo: alas, this means that indirection-shorting does not happen at all
		--	 if the simplifier does nothing (not common, I know, but unsavoury)
498
	   let { binds'' = {-# SCC "ZapInd" #-} shortOutIndirections binds' } ;
499
500

		-- Dump the result of this iteration
501
	   dumpIfSet_dyn dflags Opt_D_dump_simpl_iterations herald
502
		         (pprSimplCount counts') ;
503
	   endIteration dflags herald Opt_D_dump_simpl_iterations binds'' ;
504

505
		-- Loop
506
  	   do_iteration us2 (iteration_no + 1) all_counts binds''
507
	}  } } }
508
509
510
      where
  	  (us1, us2) = splitUniqSupply us
\end{code}
511
512
513
514


%************************************************************************
%*									*
515
		Shorting out indirections
516
517
518
%*									*
%************************************************************************

519
If we have this:
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629

	x_local = <expression>
	...bindings...
	x_exported = x_local

where x_exported is exported, and x_local is not, then we replace it with this:

	x_exported = <expression>
	x_local = x_exported
	...bindings...

Without this we never get rid of the x_exported = x_local thing.  This
save a gratuitous jump (from \tr{x_exported} to \tr{x_local}), and
makes strictness information propagate better.  This used to happen in
the final phase, but it's tidier to do it here.

STRICTNESS: if we have done strictness analysis, we want the strictness info on
x_local to transfer to x_exported.  Hence the copyIdInfo call.

RULES: we want to *add* any RULES for x_local to x_exported.

Note [Rules and indirection-zapping]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Problem: what if x_exported has a RULE that mentions something in ...bindings...?
Then the things mentioned can be out of scope!  Solution
 a) Make sure that in this pass the usage-info from x_exported is 
	available for ...bindings...
 b) If there are any such RULES, rec-ify the entire top-level. 
    It'll get sorted out next time round

Messing up the rules
~~~~~~~~~~~~~~~~~~~~
The example that went bad on me at one stage was this one:
	
    iterate :: (a -> a) -> a -> [a]
	[Exported]
    iterate = iterateList	
    
    iterateFB c f x = x `c` iterateFB c f (f x)
    iterateList f x =  x : iterateList f (f x)
    	[Not exported]
    
    {-# RULES
    "iterate"	forall f x.	iterate f x = build (\c _n -> iterateFB c f x)
    "iterateFB" 		iterateFB (:) = iterateList
     #-}

This got shorted out to:

    iterateList :: (a -> a) -> a -> [a]
    iterateList = iterate
    
    iterateFB c f x = x `c` iterateFB c f (f x)
    iterate f x =  x : iterate f (f x)
    
    {-# RULES
    "iterate"	forall f x.	iterate f x = build (\c _n -> iterateFB c f x)
    "iterateFB" 		iterateFB (:) = iterate
     #-}

And now we get an infinite loop in the rule system 
	iterate f x -> build (\cn -> iterateFB c f x)
		    -> iterateFB (:) f x
		    -> iterate f x

Tiresome old solution: 
	don't do shorting out if f has rewrite rules (see shortableIdInfo)

New solution (I think): 
	use rule switching-off pragmas to get rid 
	of iterateList in the first place


Other remarks
~~~~~~~~~~~~~
If more than one exported thing is equal to a local thing (i.e., the
local thing really is shared), then we do one only:
\begin{verbatim}
	x_local = ....
	x_exported1 = x_local
	x_exported2 = x_local
==>
	x_exported1 = ....

	x_exported2 = x_exported1
\end{verbatim}

We rely on prior eta reduction to simplify things like
\begin{verbatim}
	x_exported = /\ tyvars -> x_local tyvars
==>
	x_exported = x_local
\end{verbatim}
Hence,there's a possibility of leaving unchanged something like this:
\begin{verbatim}
	x_local = ....
	x_exported1 = x_local Int
\end{verbatim}
By the time we've thrown away the types in STG land this 
could be eliminated.  But I don't think it's very common
and it's dangerous to do this fiddling in STG land 
because we might elminate a binding that's mentioned in the
unfolding for something.

\begin{code}
type IndEnv = IdEnv Id		-- Maps local_id -> exported_id

shortOutIndirections :: [CoreBind] -> [CoreBind]
shortOutIndirections binds
  | isEmptyVarEnv ind_env = binds
630
631
  | no_need_to_flatten	  = binds'			-- See Note [Rules and indirect-zapping]
  | otherwise 		  = [Rec (flattenBinds binds')]	-- for this no_need_to_flatten stuff
632
633
  where
    ind_env 	       = makeIndEnv binds
634
635
    exp_ids 	       = varSetElems ind_env	-- These exported Ids are the subjects
    exp_id_set	       = mkVarSet exp_ids	-- of the indirection-elimination
636
    no_need_to_flatten = all (null . specInfoRules . idSpecialisation) exp_ids
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
    binds' 	       = concatMap zap binds

    zap (NonRec bndr rhs) = [NonRec b r | (b,r) <- zapPair (bndr,rhs)]
    zap (Rec pairs)	  = [Rec (concatMap zapPair pairs)]

    zapPair (bndr, rhs)
	| bndr `elemVarSet` exp_id_set 		   = []
	| Just exp_id <- lookupVarEnv ind_env bndr = [(transferIdInfo exp_id bndr, rhs),
						      (bndr, Var exp_id)]
	| otherwise				   = [(bndr,rhs)]
			     
makeIndEnv :: [CoreBind] -> IndEnv
makeIndEnv binds
  = foldr add_bind emptyVarEnv binds
  where
    add_bind :: CoreBind -> IndEnv -> IndEnv
    add_bind (NonRec exported_id rhs) env = add_pair (exported_id, rhs) env
    add_bind (Rec pairs)	      env = foldr add_pair env pairs

    add_pair :: (Id,CoreExpr) -> IndEnv -> IndEnv
    add_pair (exported_id, Var local_id) env
	| shortMeOut env exported_id local_id = extendVarEnv env local_id exported_id
    add_pair (exported_id, rhs) env
	= env
			
shortMeOut ind_env exported_id local_id
-- The if-then-else stuff is just so I can get a pprTrace to see
-- how often I don't get shorting out becuase of IdInfo stuff
  = if isExportedId exported_id &&		-- Only if this is exported

       isLocalId local_id &&			-- Only if this one is defined in this
						-- 	module, so that we *can* change its
				 	 	-- 	binding to be the exported thing!

       not (isExportedId local_id) &&		-- Only if this one is not itself exported,
					   	--	since the transformation will nuke it
   
       not (local_id `elemVarEnv` ind_env)	-- Only if not already substituted for
    then
	True

{- No longer needed
679
	if isEmptySpecInfo (specInfo (idInfo exported_id)) 	-- Only if no rules
680
681
682
683
684
685
686
687
688
689
690
691
692
	then True	-- See note on "Messing up rules"
	else 
#ifdef DEBUG 
          pprTrace "shortMeOut:" (ppr exported_id)
#endif
                                                False
-}
    else
	False


-----------------
transferIdInfo :: Id -> Id -> Id
693
694
695
696
697
698
-- If we have
--	lcl_id = e; exp_id = lcl_id
-- and lcl_id has useful IdInfo, we don't want to discard it by going
--	gbl_id = e; lcl_id = gbl_id
-- Instead, transfer IdInfo from lcl_id to exp_id
-- Overwriting, rather than merging, seems to work ok.
699
700
701
702
703
704
transferIdInfo exported_id local_id
  = modifyIdInfo transfer exported_id
  where
    local_info = idInfo local_id
    transfer exp_info = exp_info `setNewStrictnessInfo` newStrictnessInfo local_info
				 `setWorkerInfo`        workerInfo local_info
705
				 `setInlinePragInfo`	inlinePragInfo local_info
706
707
708
709
710
				 `setSpecInfo`	        addSpecInfo (specInfo exp_info) new_info
    new_info = setSpecInfoHead (idName exported_id) 
			       (specInfo local_info)
	-- Remember to set the function-name field of the
	-- rules as we transfer them from one function to another
711
\end{code}