[cfe-commits] [QUESTION] - asm multi-alt constraints, AsmStmt reworking
Dale Johannesen
dalej at apple.com
Thu Jul 29 16:20:28 PDT 2010
On Jul 29, 2010, at 3:57 PMPDT, John Thompson wrote:
> Dale, thanks for your response on llvm-dev. I'm moving the
> discussion here since the brainstorming in the latter part has to do
> with Clang.
>
> My coworker here (who you know, but I won't mention here)
Hmm, who could need such protection? Can't think of anyone....
It depends what your goal is. If you're after 100% compatibility with
gcc, you're probably right that the existing implementation doesn't
cut it. But constraints are basically a user hook into the internals
of gcc's register allocator, and llvm's is completely different; I
don't that's an achievable or particularly desirable goal. This was
sufficient to handle all existing asm code at Apple in a functionally
correct fashion, although not necessarily producing the same code gcc
does. In fact, I was expecting to have to revise it after the initial
implementation, but I have not had to do that.
A lot of people regard inline asm as a necessary but undesirable
backward compatibility hack, and some haven't given up hope it can be
made to go away some day. So there's not much interest in putting a
lot of effort into it.
I think you should define what you're trying to accomplish before
getting too deep into this. It is very messy.
> feels that alternative constraint selecting needs to be done in the
> backend, since it's hard for the front-end to know the current state
> of things. Here's what he said in two emails:
>
> > I may misunderstand (because this stuff is very complicated), but
> I think that the only time the alternatives can be chosen is when
> code generation happens. For example, if one alternative is "r" and
> the other is "m" then you need to know if the value is in a register
> or memory to choose and that decision isn't made until much later
> than Clang interacts with. The problem with looking at llvm-gcc or
> gcc in general is that they mix up the front and back ends freely
> and the lines are very gray.
>
> and (refering to some code with alternative constraints
> "r,K" (old_value)):
>
> > My question still stands -- how can a constraint be selected that
> early and be accurately fulfilled? In this case, I'm asking if
> old_value is a constant that fits in 16-bits. You only know that in
> the backend -- the function may get inlined, etc. In GCC, this
> happens inside reload which is really late.
>
> Any thoughts?
>
> I did look at ChooseConstraintTuple, which seems to treat the
> constraints like this. Ignoring the names and expressions, if I
> have set of constraints like this:
>
> "=a,=b", "c,d", "e,f"
>
> it will look at expression types and do weighting to select one or
> the other of the two alternatives, i.e. either:
>
> "=a", "c", "e"
>
> or
>
> "=b", "d", "f"
>
> First, do I understand this correctly?
>
> If this is the case, then Clang should concatenate the set chosen
> and put it in the LLVM asm statement output. For example, if the
> first was chosen, then the following would be output to LLVM;
>
> "=a,c,e"
>
> Meanwhile, I have been trying to persue it on the Clang side. Here's
> some description of what I've been doing and what my original
> thoughts were.
>
> In trying to come up with a solution for the inline asm multiple
> alternative constraints inside Clang, my first step was to try come
> up with a representation that wouldn't require much change to other
> parts of Clang, but then I started thinking that perhaps the
> structure of AsmStmt could be improved, per the FIXIT comment
> already in it.
>
> But first, the enclosed patch shows what I've been playing around
> with already with respect to ConstraintInfo.
>
> It might be unclear in the patch, with the interleaving, so here's a
> high-level description. What I did was to change the ContraintInfo
> class in the TargetInfo to be two classes, ConstraintInfo and
> SubConstraintInfo, where ConstraintInfo stores an array of
> SubConstraintInfo's, i.e.:
>
> class SubConstraintInfo // for each constraint alternative
> {
> const char *getConstraintStr();
> // ...
> };
>
> class ConstraintInfo
> {
> SubConstraintInfo subConstraints[4];
> int count;
> int selectedIndex;
> const char *getConstraintStr() { return
> subConstraints[selectedIndex]; }
> // ...
> };
>
> where the two class have similar functions. Then my thinking was
> that the semantic analysis can analyse the multiple alternative
> constraints based on the expression typing, and set up the outer
> class to return only that info by setting the selectedIndex. (I
> haven't done that part yet. Right now it just uses the first
> alternative.)
>
> I did it this way to minimize the effect on the code using the
> previous (1-layer) ConstraintInfo class. Once the alternatives are
> chosen, the class is used just as before (mostly, with a small
> change to the code generator, which wasn't using the constraint
> string from ConstraintInfo.
>
> But in trying to figure out how to do the analysis part, I've been
> starting to feel that a bit of an overhaul of the AsmStmt might
> provide a cleaner structure. The current AsmStmt stores the
> components of separate lists, i.e. the expressions for the in/out,
> the name structures, and the raw constraint strings, and as the
> FIXME comment indicated, perhaps it might be better to group them
> into an array of structures, additionally replacing the raw
> constraint strings with something like the above ConstraintInfo
> moved to AST and also stored in AsmStmt, such that the code
> generator wouldn't have to parse the constraints a second time on
> the fly from the raw constraint strings.
>
> I'm thinking also that more of the information from the constraints
> could be abstracted from the constraint strings. Currently there's
> no indication of something being a constant or float or the size.
> I'm thinking some of the architecture-specific constraints could be
> abstracted too in a way shared by multiple architectures. These
> would be set up by the Target-specific constraint validation
> functions.
> But perhaps the first step would be to do the easier thing, and add
> an analyser somewhere to try to select the best matching
> constraint. I'm not quite sure how to do that yet, but I hoping
> hoping for some feedback before I get too much deeper into it, to
> make sure I'm in the right direction.
>
> So, if others would also like to comment also, please do. Again,
> the questions are:
>
> Should the constraint selection be done in LLVM or Clang?
>
> If in Clang, is my approached described a reasonable one, first the
> quick one using the ConstrainInfo created on-the-fly, perhaps
> followed by reworking AsmStmt a bit to store the abstracted
> constraint info in AsmStmt?
>
> Thanks.
>
> -John
>
> --
> John Thompson
> John.Thompson.JTSoftware at gmail.com
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20100729/12c7bfa1/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: multaltconstraints.patch
Type: application/octet-stream
Size: 10127 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20100729/12c7bfa1/attachment.obj>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20100729/12c7bfa1/attachment-0001.html>
More information about the cfe-commits
mailing list