ebevhan added inline comments.

================
Comment at: clang/lib/CodeGen/CGExprScalar.cpp:3444
   case BO_NE:
+    return Builder.CreateICmpNE(FullLHS, FullRHS);
+  case BO_Mul:
----------------
ebevhan wrote:
> rjmccall wrote:
> > leonardchan wrote:
> > > ebevhan wrote:
> > > > rjmccall wrote:
> > > > > leonardchan wrote:
> > > > > > rjmccall wrote:
> > > > > > > Are padding bits guaranteed zero or unspecified?  Or are we just 
> > > > > > > not really supporting padding bits all the way to IRGen at this 
> > > > > > > time?
> > > > > > I believe the consensus was leaving them unspecified, so operations 
> > > > > > that can cause overflow into them would result in undefined 
> > > > > > behavior.
> > > > > If I'm understanding you correctly, you're saying that (1) we are 
> > > > > assuming that inputs are zero-padded and (2) we are taking advantage 
> > > > > of the non-saturating-overflow-is-UB rule to avoid clearing the 
> > > > > padding bits after arithmetic.  That's actually what I meant by 
> > > > > "guaranteed zero", so we have our labels reversed, but at least we 
> > > > > understand each other now.
> > > > > 
> > > > > (I suppose you're thinking of this as "unspecified" because 
> > > > > non-saturating arithmetic can leave an unspecified value there.  I 
> > > > > think of this as a "guarantee" because it's basically a 
> > > > > representational invariant: it's a precondition for correctness that 
> > > > > the bit is zero, and all operations guarantee that the bit will be 
> > > > > zero in their well-defined cases (but overflow is not well-defined).  
> > > > > Just a difference in perspective, I guess.)
> > > > > 
> > > > > Is this written down somewhere?  Are there targets that use the 
> > > > > opposite ABI rule that we might need to support someday?
> > > > > 
> > > > > At any rate, I think it's worth adding a short comment here 
> > > > > explaining why it's okay to do a normal comparison despite the 
> > > > > possibility of padding bits.  Along those lines, is there any value 
> > > > > in communicating to the backend that padded-unsigned comparisons 
> > > > > could reasonably be done with either a signed or unsigned comparison? 
> > > > >  Are there interesting targets where one or the other is cheaper?
> > > > > Is this written down somewhere? Are there targets that use the 
> > > > > opposite ABI rule that we might need to support someday?
> > > > 
> > > > What exactly do you mean by 'opposite'? That the padding is cleared 
> > > > after every operation?
> > > > 
> > > > It was (and still is) the case in our downstream implementation that 
> > > > all unsigned operations explicitly clear the padding bit after every 
> > > > operation, leading to defined behavior on overflow for such types.
> > > Yes. We assume inputs are zero padded, and that non-saturating overflow 
> > > is undefined so we do not need to clear the padding after writing a new 
> > > value. Sorry for the misunderstanding. I see what you mean by guaranteed 
> > > zero.
> > > 
> > > Overflow in general is controlled by the `FX_FRACT_OVERFLOW` and 
> > > `FX_ACCUM_OVERFLOW` pragmas, where if these are set to `DEFAULT`, 
> > > operations that can overflow with these types is undefined according to 
> > > the standard (4.1.3). In terms of padding bits, clause 6.2.6.3 mentions 
> > > that the values of padding bits are "unspecified". I imagine this means 
> > > that we can assume the value to be whatever we want it to, so we can 
> > > assume that these values are a guaranteed zero.
> > > 
> > > I believe @ebevhan requested this being added since his downstream 
> > > implementation used padding to match the scales of signed and unsigned 
> > > types, so he may be able to offer more information on targets with 
> > > different ABIs. We don't plan to use any special hardware, so we're 
> > > following the "typical desktop processor" layout that uses the whole 
> > > underlying int and no padding (mentioned in Annex 3).
> > > 
> > > In the same section, the standard also mentions types for other targets 
> > > that may have padding, so there could be some value in indicating to the 
> > > backend that for these particular targets, this part of the operand is 
> > > padding, so select an appropriate operation that performs a comparison on 
> > > this size type. But I don't know much about these processors and would 
> > > just be guessing at how they work.
> > Okay.  If we ever have a target that uses an ABI that (1) includes padding 
> > but (2) considers it to be "unspecified" in the sense of "it can validly be 
> > non-zero", we'll have to change this code, but I agree it's the right move 
> > to not preemptively generalize to cover that possibility.
> To clarify on our use case, we have the padding on the unsigned types mostly 
> to harmonize the behavior of unsigned and signed types. The only real native 
> support is for signed types, but if the unsigned types are padded and then 
> use signed operations to implement them, you get (almost) the same level of 
> performance out of unsigned ones.
> 
> The primary difference between the upstream CG and our implementation is that 
> the padding bit is always set to zero after operations. This means that 
> overflow on the unsigned types is essentially defined as modulo wraparound 
> instead of UB, and unsigned types will always contain a valid value.
Oops, did not mean to submit that comment further up. Was left over from an 
earlier session.


Repository:
  rC Clang

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

https://reviews.llvm.org/D57219



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

Reply via email to