Reapply commit 143028 with a fix: the problem was casting a ConstantExpr Mul
using BinaryOperator (which only works for instructions) when it should have
been a cast to OverflowingBinaryOperator (which also works for constants).
While there, correct a few other dubious looking uses of BinaryOperator.
Thanks to Chad Rosier for the testcase.  Original commit message:
My super-optimizer noticed that we weren't folding this expression to
true: (x *nsw x) sgt 0, where x = (y | 1).  This occurs in 464.h264ref.

llvm-svn: 143125
4 files changed
tree: 549235a3d77f2fa1bbf942846babfe218480ace9
  1. clang/
  2. compiler-rt/
  3. debuginfo-tests/
  4. libcxx/
  5. libcxxabi/
  6. lldb/
  7. llvm/
  8. polly/