lebedev.ri added inline comments.
================
Comment at: lib/Sema/SemaChecking.cpp:8667-8679
+ bool Result; // The result of the comparison
+ if ((Op == BO_GT && ValueType == LimitType::Max && ConstOnRight) ||
+ (Op == BO_GT && ValueType == LimitType::Min && !ConstOnRight) ||
+ (Op == BO_LT && ValueType == LimitType::Max && !ConstOnRight) ||
+ (Op == BO_LT && ValueType == LimitType::Min && ConstOnRight)) {
+ Result = false;
+ } else if ((Op == BO_GE && ValueType == LimitType::Max && !ConstOnRight) ||
----------------
rsmith wrote:
> The exhaustive case analysis is a little hard to verify. Perhaps something
> like this would be clearer:
>
> ```
> bool ConstIsLowerBound = (Op == BO_LT || Op == BO_LE) ^ ConstOnRight;
> bool ResultWhenConstEqualsOther = (Op == BO_LE || Op == BO_GE);
> bool ResultWhenConstNeOther = ConstIsLowerBound ^ ValueType == LimitType::Max;
> if (ResultWhenConstEqualsOther != ResultWhenConstNeOther)
> return false;
> ```
Oh, that looks better indeed :)
I did consider doing something like that, but my variant ended up looking worse
than even the current `if()`'s
================
Comment at: lib/Sema/SemaChecking.cpp:8940
+ } else if (!T->hasUnsignedIntegerRepresentation())
+ IsComparisonConstant = E->isIntegerConstantExpr(S.Context);
+
----------------
rsmith wrote:
> It seems suboptimal to evaluate both sides of the comparison and then
> evaluate the entire comparison again in this case. Presumably the point is to
> catch comparisons whose operands are not of integral type (eg, floating
> point), but we could get that benefit and also catch more integral cases by
> switching from `isIntegerConstantExpr` to the more appropriate
> `EvaluateAsRValue`.
>
> I'm fine with a cleanup to avoid the repeated evaluation here being deferred
> to a later patch.
If we look at this code closely, if `hasUnsignedIntegerRepresentation() ==
false`, we always do `return AnalyzeImpConvsInComparison(S, E);`, regardless of
`E->isIntegerConstantExpr(S.Context)`.
So if i move more stuff into `if (T->isIntegralType(S.Context))`, then `
E->isIntegerConstantExpr(S.Context);` is simply gone.
At least the current tests say so.
================
Comment at: lib/Sema/SemaChecking.cpp:8949
+ if (T->isIntegralType(S.Context)) {
+ if (CheckTautologicalComparison(S, E))
+ return AnalyzeImpConvsInComparison(S, E);
----------------
rsmith wrote:
> Pass `LHSValue` and `RHSValue` in here rather than recomputing them.
We can even go one step further, and pass the `bool IsConstLiteralOnRHS`
Repository:
rL LLVM
https://reviews.llvm.org/D38101
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits