[PATCH] D115670: Correct behavior of Vector boolean-operations, implement vector operator-

Craig Topper via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Dec 13 14:29:02 PST 2021


craig.topper added inline comments.


================
Comment at: clang/lib/AST/ExprConstant.cpp:2915
   case BO_EQ:
-    Result = (LHSValue == RHSValue);
+    Result = -(LHSValue == RHSValue);
     break;
----------------
craig.topper wrote:
> erichkeane wrote:
> > efriedma wrote:
> > > Using "operator=" to assign an int to an APInt is going to lead to weird/confusing results.  For example, I think this produces the wrong result if you have an int128_t vector.
> > Can you clarify your comment? The result type of one of these compare-ops is either an i8 or an i32 I think, so I would expect it to 'just work', right?  
> > 
> > What problem of operator= on an APInt gives the wrong result?  I guess I've never seen/don't know how to repro what you mean.
> > 
> > I DID try to get a test wtih a 'compare op' on an __int128 vector, but that ends up asserting in GetSignedVectorType
> Don't compare ops produce a result with the same number of bits as the input? If the compare is a vector of int128 the result should also be a vector of int128. APInt::operator= takes a uint64_t as input and will zero extend it to 128 bits. I think we want to sign extend here.
> 
> I assume the APInt for result already been given its bit width before this call?
The easy fix is probably just to do the assignment like it was before and then do `Result.negate()`.


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

https://reviews.llvm.org/D115670



More information about the cfe-commits mailing list