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