leonardchan added inline comments.

================
Comment at: lib/CodeGen/CGExprScalar.cpp:1016
+  if (DstScale > SrcScale) {
+    // Need to allocate space before shifting left
+    ResultWidth = SrcWidth + DstScale - SrcScale;
----------------
rjmccall wrote:
> In IR, this isn't really "allocating" space.
My bad. Poor comment wording.


================
Comment at: lib/CodeGen/CGExprScalar.cpp:1034
+  if (DstFPSema.isSaturated() &&
+      (CGF.getContext().getCorrespondingSaturatedType(SrcTy) != DstTy)) {
+    auto Mask = APInt::getBitsSetFrom(
----------------
rjmccall wrote:
> Why is this condition based on the formal types exactly matching rather than 
> something about the FP semantics being different?  Formal types can 
> correspond to the same format, right?
> 
> We need to check for saturation if we're either (1) decreasing the magnitude 
> of the highest usable bit or (2) going signed->unsigned, (2) we're going 
> signed->unsigned, or (3) we're going unsigned->signed without increasing the 
> number of integral bits.  And I'd expect the checks we have to do in each 
> case to be different.
For simplicity, I more or less copied the logic from `APFixedPoint::convert()` 
which performs a saturation check that covers all of these cases if the 
destination semantics were saturated.

Added another condition that checks if we need to perform saturation checks. I 
think your (1) and (3) might be the same thing since I think we only really 
need to check if the magnitude decreases or if going from signed -> unsigned. 

I think though that the IR emission would be the same since both cases will 
require checking for a change in the magnitude (via the mask). The only 
difference is that if going from signed->unsigned, the min saturation is zero 
if the value is negative.


================
Comment at: lib/Sema/SemaExpr.cpp:5889
+    case Type::STK_MemberPointer:
+      llvm_unreachable("Unimplemented conversion from FixedPoint to type");
+    }
----------------
rjmccall wrote:
> Is there something I'm missing that actually diagnoses the unimplemented 
> cases here?  There's a lot of code that seems to assume that any two 
> arithmetic types can be converted to each other, and we do prefer not to 
> crash the compiler, especially on valid code.
The plan was to implement these in other patches. I wasn't sure if 
`llvm_unreachable()` was ok to use as a placeholder for features that will 
eventually be implemented.

Added diagnostics here for now to be eventually removed once these casts are 
implemented in later patches.


Repository:
  rC Clang

https://reviews.llvm.org/D50616



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

Reply via email to