rjmccall added a comment.

In D82663#2144219 <https://reviews.llvm.org/D82663#2144219>, @ebevhan wrote:

> In D82663#2142426 <https://reviews.llvm.org/D82663#2142426>, @rjmccall wrote:
>
> > Would it be sensible to use a technical design more like what the matrix 
> > folks are doing, where LLVM provides a small interface for emitting 
> > operations with various semantics?  FixedPointSemantics would move to that 
> > header, and Clang would just call into it.  That way you get a lot more 
> > flexibility in how you generate code, and the Clang IRGen logic is still 
> > transparently correct.  If you want to add intrinsics or otherwise change 
> > the IR patterns used for various operations, you don't have to rewrite a 
> > bunch of Clang IRGen logic every time, you just have to update the tests.  
> > It'd then be pretty straightforward to have internal helper functions in 
> > that interface for computing things like whether you should use signed or 
> > unsigned intrinsics given the desired FixedPointSemantics.
>
>
> This seems like a reasonable thing to do for other reasons as well. Also 
> moving the actual APFixedPoint class to LLVM would make it easier to reuse 
> the fixedpoint calculation code for constant folding in LLVM, for example.


Just to say "I told you so", I'm pretty sure I told people this would happen. :)

>> My interest here is mainly in (1) keeping IRGen's logic as obviously correct 
>> as possible, (2) not hard-coding a bunch of things that really feel like 
>> workarounds for backend limitations, and (3) not complicating core 
>> abstractions like FixedPointSemantics with unnecessary extra rules for 
>> appropriate use, like having to pass an extra "for codegen" flag to get 
>> optimal codegen.  If IRGen can just pass down the high-level semantics it 
>> wants to some library that will make intelligent decisions about how to emit 
>> IR, that seems best.
> 
> Just to clarify something here; would the interface in LLVM still emit signed 
> operations for unsigned with padding?

If that's the best IR pattern to emit, yes.

> If so, why does dealing with the padding bit detail in LLVM rather than Clang 
> make more sense?

Because frontends should be able to just say "I have a value of a type with 
these semantics, I need you to do these operations, go do them".  The whole 
purpose of this interface would be to go down a level of abstraction by picking 
the best IR to represent those operations.

Maybe we're not in agreement about what this interface looks like — I'm 
imagining something like

  struct FixedPointEmitter {
    IRBuilder &B;
    FixedPointEmitter(IRBuilder &B) : B(B) {}
  
    Value *convert(Value *src, FixedPointSemantics srcSemantics, 
FixedPointSemantics destSemantics);
    Value *add(Value *lhs, FixedPointSemantics lhsSemantics, Value *rhs, 
FixedPointSemantics rhsSemantics)
  };



> The regular IRBuilder is relatively straightforward in its behavior.  I 
> suspect that if anything, LLVM would be equally unwilling to take to take 
> IRBuilder patches that emitted signed intrinsics for certain unsigned 
> operations only due to a detail in Embedded-C's implementation of fixedpoint 
> support.

Most things in IRBuilder don't have variant representations beyond what's 
expressed by the value type.  The fact that we've chosen to do so here 
necessitates a more complex interface.

> Regarding backend limitations, I guess I could propose an alternate solution. 
> If we change FixedPointSemantics to strip the padding bit for both saturating 
> and nonsaturating operations, it may be possible to detect in isel that the 
> corresponding signed operation could be used instead when we promote the type 
> of an unsigned one. For example, if we emit i15 umul.fix scale 15, we could 
> tell in lowering that i16 smul.fix scale 15 is legal and use that instead. 
> Same for all the other intrinsics, including the non-fixedpoint 
> uadd.sat/usub.sat.
> 
> The issue with this approach (which is why I didn't really want to do it) is 
> that it's not testable. No upstream target has these intrinsics marked as 
> legal. I doubt anyone would accept a patch with no tests.
>  It may also be less efficient than just emitting the signed operations in 
> the first place, because we are forced to trunc and zext in IR before and 
> after every operation.

I don't want to tell you the best IR to use to get good code; I just want 
frontends to have a reasonably canonical interface to use that matches up well 
with the information we have.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D82663/new/

https://reviews.llvm.org/D82663



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to