summaryrefslogtreecommitdiff
path: root/compiler/NOTES
blob: 645d27eaed6d638dde2db7d63d95f09aacc26fdb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
More type functions
~~~~~~~~~~~~~~~~~~~
* Allow {tv = TYPE ty) as a non-rec binding in Core
* Use this to make equality constraints more uniform
* Can a Dict can contain an EqPred?  
  How does that differ from an EqInst?
* Make DictBinds into Core

* In zonking, do we need to zonk the kinds of coercion variables?

Type functions
~~~~~~~~~~~~~~
* A Given inst should be a CoVar, not a coercion

* finaliseEqInst should not need to call zonk

* Why do we need fromGivenEqDict?  How could we construct 	
	a Dict that had an EqPred?
	newDictBndr should make an EqInst directly

* tc_co should be accessed only inside Inst

* Inst.mkImplicTy needs a commment about filtering out EqInsts
  How *do* we deal with wanted equalities?

* Inst.instType behaves inconsistently for EqInsts: it should
  return an EqPred, like the instType' hack in pprDictsTheta

  Consequences: adjust the uses of instType in TcSimplify

* tcDeref* functions are unused, except in tcGenericNormalizeFamInst, when
  we can equally well use TcMType.lookupTcTyVar

* Coercion.mkEqPredCoI looks very peculiar.




-------------------------
*** unexpected failure for jtod_circint(opt)


	New back end thoughts

-----------------------------------------------------------------------------
Codegen notes

* jumps to ImpossibleBranch should be removed.

* Profiling:
	- when updating a closure with an indirection to a function,
	  we should make a permanent indirection.

	- check that we're bumping the scc count appropriately

* check perf & binary sizes against the HEAD

-----------------------------------------------------------------------------
C backend notes

* use STGCALL macros for foreign calls (doesn't look like volatile regs
  are handled properly at the mo).

-----------------------------------------------------------------------------
Cmm parser notes

* switches

* need to cater for unexported procedures/info tables?

* We should be able to get rid of entry labels, use info labels only.
  - we need a %ENTRY_LBL(info_lbl) macro, so that instead of
     JMP_(foo_entry) we can write jump %ENTRY_LBL(foo_info).

-----------------------------------------------------------------------------

* Move arg-descr from LFInfo to ClosureInfo? 
  But: only needed for functions

* Move all of CgClosure.link_caf into NewCaf, and newDynCaf

* If the case binder is dead, and the constr is nullary,
  do we need to assign to Node?


-------------------------------
NB: all floats are let-binds, but some non-rec lets
    may be unlifted (with RHS ok-for-speculation)


simplArg:  [use strictness]
	   [used for non-top-lvl non-rec RHS or function arg]
  if strict-type || demanded
	simplStrictExpr
  else
	simplExpr ---> (floats,expr)
	float all the floats if exposes constr app, return expr

simpl (applied lambda)	    ==> simplNonRecBind
simpl (Let (NonRec ...) ..) ==> simplNonRecBind

simpl (Let (Rec ...)    ..) ==> simplRecBind

simplRecBind:
  simplify binders (but not its IdInfo)
  simplify the pairs one at a time
	using simplRecPair

simplNonRecBind:	[was simplBeta]
	[used for non-top-lvl non-rec bindings]
  - check for PreInlineUnconditionally
  - simplify binder, including its IdInfo
  - simplArg
  - if strict-type 
	addCaseBind [which makes a let if ok-for-spec]
    else
	completeLazyBind

simplLazyBind:	[binder already simplified, but not its IdInfo]
	  	[used for both rec and top-lvl non-rec]
		[must not be strict/unboxed; case not allowed]
  - check for PreInlineUnconditionally
  - substituteIdInfo and add result to in-scope 
	[so that rules are available in rec rhs]
  - simplExpr --> (floats,expr)
  - float: lifted floats only
	if exposes constructor or pap (even if non-triv args)
	or if top level
  - completeLazyBind
  

completeLazyBind: 	[given a simplified RHS]
	[used for both rec and non-rec bindings, top level and not]
  - try discarding dead
  - try PostInlineUnconditionally
  - let-bind coerce arg and repeat
  - try rhs tylam (float)
  - try eta expand (float)    [not if any float is unlifted && (non-spec || top_lvl || rec)]
  - let-bind constructor args [not if any float is ..as above..]

  - add unfolding [this is the only place we add an unfolding]
    add arity




Eta expansion
~~~~~~~~~~~~~~
For eta expansion, we want to catch things like

	case e of (a,b) -> \x -> case a of (p,q) -> \y -> r

If the \x was on the RHS of a let, we'd eta expand to bring the two
lambdas together.  And in general that's a good thing to do.  Perhaps
we should eta expand wherever we find a (value) lambda?  Then the eta
expansion at a let RHS can concentrate solely on the PAP case.