Date: Sat, 18 Nov 2000 09:19:35 -0600 (CST) | |
From: Vikram Adve <vadve@cs.uiuc.edu> | |
To: Chris Lattner <lattner@cs.uiuc.edu> | |
Subject: a few thoughts | |
I've been mulling over the virtual machine problem and I had some | |
thoughts about some things for us to think about discuss: | |
1. We need to be clear on our goals for the VM. Do we want to emphasize | |
portability and safety like the Java VM? Or shall we focus on the | |
architecture interface first (i.e., consider the code generation and | |
processor issues), since the architecture interface question is also | |
important for portable Java-type VMs? | |
This is important because the audiences for these two goals are very | |
different. Architects and many compiler people care much more about | |
the second question. The Java compiler and OS community care much more | |
about the first one. | |
Also, while the architecture interface question is important for | |
Java-type VMs, the design constraints are very different. | |
2. Design issues to consider (an initial list that we should continue | |
to modify). Note that I'm not trying to suggest actual solutions here, | |
but just various directions we can pursue: | |
a. A single-assignment VM, which we've both already been thinking about. | |
b. A strongly-typed VM. One question is do we need the types to be | |
explicitly declared or should they be inferred by the dynamic compiler? | |
c. How do we get more high-level information into the VM while keeping | |
to a low-level VM design? | |
o Explicit array references as operands? An alternative is | |
to have just an array type, and let the index computations be | |
separate 3-operand instructions. | |
o Explicit instructions to handle aliasing, e.g.s: | |
-- an instruction to say "I speculate that these two values are not | |
aliased, but check at runtime", like speculative execution in | |
EPIC? | |
-- or an instruction to check whether two values are aliased and | |
execute different code depending on the answer, somewhat like | |
predicated code in EPIC | |
o (This one is a difficult but powerful idea.) | |
A "thread-id" field on every instruction that allows the static | |
compiler to generate a set of parallel threads, and then have | |
the runtime compiler and hardware do what they please with it. | |
This has very powerful uses, but thread-id on every instruction | |
is expensive in terms of instruction size and code size. | |
We would need to compactly encode it somehow. | |
Also, this will require some reading on at least two other | |
projects: | |
-- Multiscalar architecture from Wisconsin | |
-- Simultaneous multithreading architecture from Washington | |
o Or forget all this and stick to a traditional instruction set? | |
BTW, on an unrelated note, after the meeting yesterday, I did remember | |
that you had suggested doing instruction scheduling on SSA form instead | |
of a dependence DAG earlier in the semester. When we talked about | |
it yesterday, I didn't remember where the idea had come from but I | |
remembered later. Just giving credit where its due... | |
Perhaps you can save the above as a file under RCS so you and I can | |
continue to expand on this. | |
--Vikram | |