[LLVMdev] Re: LLVM Compiler Infrastructure Tutorial
Yiping Fan
fanyp at CS.UCLA.EDU
Wed Oct 20 16:04:41 PDT 2004
Vikram,
I also agree with you. I understand that target-independent representation is very valuable
and important for software compilation.
However, when we are doing high-level synthesis (also called behavioral/architectural synthesis),
the targeting architecture is also changing. That is, we need to do architecture exploration
and the IR transfromation simultaneously. For example, after a particular pass, we may need 4
ALUs to execute the program, under a certain latency constraint; then, after another optimization pass,
we may end up with only 3 ALUs. The instruction-to-ALU binding will be different after this pass.
The samething could happen for register allocation and binding, and other synthesis pass.
Also, there are lots of synthesis passes there, such as scheduling, functional unit binding,
register binding, (FU) port binding, re-scheduling and re-binding, interconnect reduction, DSP
specific optimization, ...
Therefore, we need some architectural information (both on-disk and in-memory) associated with
the instructions after every synthesis pass.
In addition, in hardware description, there are lots of bit-vector manipulations (e.g., bit extraction,
concatenatoin ...), which are not represented in LLVM. We are thinking about to add some intrinsic
functions to LLVM, so that the original instruction set can be untouched.
Currently we use a simple CDFG (CFG, whose every node is a DFG) representation to do our
synthesis. Of cource, it is not as powerful as LLVM, and we also want to use many of your
transformation/analysis passes. That is why we want to move our project on top of your IR.
Thanks,
-Yiping
----- Original Message -----
From: Vikram Adve
To: LLVM Developers Mailing List
Cc: 'Zhiru Zhang' ; Guoling Han ; Yiping Fan
Sent: Wednesday, October 20, 2004 3:08 PM
Subject: Re: [LLVMdev] Re: LLVM Compiler Infrastructure Tutorial
Yiping,
Could you describe in a little more detail what your goals are? I agree with Reid and Misha that modifying the instruction definition is usually not advisable but to suggest alternatives, we would need to know more. Also, for some projects it could make sense to change the instruction set.
--Vikram
http://www.cs.uiuc.edu/~vadve
http://llvm.cs.uiuc.edu/
On Oct 20, 2004, at 2:41 PM, Misha Brukman wrote:
On Wed, Oct 20, 2004 at 11:59:45AM -0700, Yiping Fan wrote:
Yeah. We need to have more extra fields in the instruction. Fo
example, during high-level synthesis, we must schedule an instruction
to a certain control step (or cycle), and bind it to be execute on a
certain functional unit, etc.
Since we're talking about "execution" and "scheduling", you are creating
a back-end for LLVM, correct? In that case, we're talking about code
generation.
LLVM is a target-independent representation. Note that with LLVM, we
are trying to separate WHAT the program is doing (the meaning of the
program) from HOW it does it (which specific instructions get executed
and when, and this includes scheduling). What you are trying to add to
it is target-dependent (e.g. scheduling). That is not advisable on
several levels, one of which is breaking the target abstraction that we
have tried hard to maintain.
Take a look at the X86, PowerPC, and Sparc target code generators
(llvm/lib/Target/*). They are using a different representation,
specifically, MachineInstr, MachineBasicBlock, and MachineFunction
classes that are target-dependent (for example, they include asm opcodes
and target registers). Something target-dependent such as scheduling
and assignment to functional units would be done in this representation,
after code generation (LLVM -> Machine code).
Presumably, this (e.g. scheduling) information is not provided from the
C/C++ front-end, but computed by a pass that you would write, correct?
Then you can always compute this information on the fly, before any pass
that needs to do something with this information needs to use it. As
Reid mentioned, take a look a the Analysis interfaces and see if you can
implement this as an Analysis that could be required by a pass and
transparently ran for you by the PassManager.
Besides the in-memory exchange of the information, we also want
on-disk exchange. That introduces the write-out/parse-in problem.
Again, if this is information that's computable from bytecode alone, you
do not need to store it every time -- an Analyser pass can compute it
dynamically. Also, as a reminder, if you change the LLVM
representation, your new version may or may not be able to use the
current set of analyses and optimizations, thus forcing you to
"reinvent the wheel" in that respect.
--
Misha Brukman :: http://misha.brukman.net :: http://llvm.cs.uiuc.edu
_______________________________________________
LLVM Developers mailing list
LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
http://mail.cs.uiuc.edu/mailman/listinfo/llvmdev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20041020/4db50466/attachment.html>
More information about the llvm-dev
mailing list