rsmith added inline comments.

================
Comment at: lib/CodeGen/CGExprScalar.cpp:1036
+    return;
+  // That's it. We can't rule out any more cases with the data we have.
+
----------------
I don't like the overlap between the implicit truncation check and this check. 
I think you should aim for exactly one of those checks to fire for any given 
integer conversion. There are the following cases:

 * Dst is smaller than Src: if the value changes at all (with sign change or 
without), then the truncation check already catches it, and catching it here 
does not seem useful
 * Dst is the same size as Src or larger: sign change is the only problem, and 
is only possible if exactly one of Src and Dst is signed

So I think you should bail out of this function if either Src and Dst are both 
unsigned or both are signed, and also if Src is larger than Dst (because we 
treat that case as a lossy truncation rather than as a sign change).

And when you do emit a check here, the only thing you need to check is if the 
signed value is negative (if so, you definitely changed the sign, and if not, 
you definitely didn't -- except in the truncation cases that the truncation 
sanitizer catches).


================
Comment at: lib/CodeGen/CGExprScalar.cpp:1050-1051
+    // NOTE: if it is unsigned, then the comparison is naturally always 
'false'.
+    llvm::ICmpInst::Predicate Pred =
+        VSigned ? llvm::ICmpInst::ICMP_SLT : llvm::ICmpInst::ICMP_ULT;
+    // Get the zero of the same type with which we will be comparing.
----------------
If `!VSigned`, the result is a constant `false`; you don't need to emit an 
`icmp` to work that out.


Repository:
  rC Clang

https://reviews.llvm.org/D50250



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

Reply via email to