message: Mark signed-int operations in ConstantPropagationAnalysis
  Summary: While undefined behavior C++-wise, the two's complement implementation of modern processors matches the required Java semantics.
diff: @@ -23,6 +23,15 @@ std::enable_if_t<std::is_integral<T>::value, int> fpclassify(T x) {
  #include "Transform.h"
  #include "Walkers.h"
  +// While undefined behavior C++-wise, the two's complement implementation of
  +// modern processors matches the required Java semantics. So silence ubsan.
  +#if defined(__clang__)
  +#define NO_UBSAN_ARITH \
  + __attribute__((no_sanitize("signed-integer-overflow", "shift")))
  +#else
  +#define NO_UBSAN_ARITH
  +#endif
  +
  namespace {
  /*
  @@ -274,8 +283,8 @@ bool PrimitiveAnalyzer::analyze_cmp(const IRInstruction* insn,
  return true;
  }
  -bool PrimitiveAnalyzer::analyze_binop_lit(const IRInstruction* insn,
  - ConstantEnvironment* env) {
  +bool PrimitiveAnalyzer::analyze_binop_lit(
  + const IRInstruction* insn, ConstantEnvironment* env) NO_UBSAN_ARITH {
  auto op = insn->opcode();
  int32_t lit = insn->get_literal();
  TRACE(CONSTP, 5, "Attempting to fold %s with literal %lu", SHOW(insn), lit);
  @@ -413,7 +422,7 @@ bool is_binop64(IROpcode op) {
  }
  bool PrimitiveAnalyzer::analyze_binop(const IRInstruction* insn,
  - ConstantEnvironment* env) {
  + ConstantEnvironment* env) NO_UBSAN_ARITH {
  auto op = insn->opcode();
  TRACE(CONSTP, 5, "Attempting to fold %s", SHOW(insn));
  auto cst_left = env->get<SignedConstantDomain>(insn->src(0)).get_constant();
  