Index: llvm/trunk/lib/MC/MCExpr.cpp =================================================================== --- llvm/trunk/lib/MC/MCExpr.cpp +++ llvm/trunk/lib/MC/MCExpr.cpp @@ -663,8 +663,10 @@ /// -(a - b + const) ==> (b - a - const) if (Value.getSymA() && !Value.getSymB()) return false; + + // The cast avoids undefined behavior if the constant is INT64_MIN. Res = MCValue::get(Value.getSymB(), Value.getSymA(), - -Value.getConstant()); + -(uint64_t)Value.getConstant()); break; case MCUnaryExpr::Not: if (!Value.isAbsolute()) @@ -697,9 +699,10 @@ return false; case MCBinaryExpr::Sub: // Negate RHS and add. + // The cast avoids undefined behavior if the constant is INT64_MIN. return EvaluateSymbolicAdd(Asm, Layout, Addrs, InSet, LHSValue, RHSValue.getSymB(), RHSValue.getSymA(), - -RHSValue.getConstant(), Res); + -(uint64_t)RHSValue.getConstant(), Res); case MCBinaryExpr::Add: return EvaluateSymbolicAdd(Asm, Layout, Addrs, InSet, LHSValue, Index: llvm/trunk/test/MC/X86/imm-comments.s =================================================================== --- llvm/trunk/test/MC/X86/imm-comments.s +++ llvm/trunk/test/MC/X86/imm-comments.s @@ -11,8 +11,8 @@ movabsq $9223372036854775807, %rax -# FIXME: This line causes UB failure. -# movabsq $-9223372036854775808, %rax +# This line should not induce undefined behavior via negation of INT64_MIN. +movabsq $-9223372036854775808, %rax # CHECK: movb $127, %al # CHECK: movb $-128, %al @@ -24,5 +24,5 @@ # CHECK: movl $-2147483648, %eax # imm = 0xFFFFFFFF80000000 # CHECK: movabsq $9223372036854775807, %rax # imm = 0x7FFFFFFFFFFFFFFF -# FIXME-CHECK: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000 +# CHECK: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000