[PATCH] D20434: [MCExpr] avoid UB via negation of INT_MIN
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Fri May 20 07:15:56 PDT 2016
This revision was automatically updated to reflect the committed changes.
Closed by commit rL270218: [MCExpr] avoid UB via negation of INT_MIN (authored by spatel).
Changed prior to commit:
http://reviews.llvm.org/D20434?vs=57864&id=57930#toc
Repository:
rL LLVM
http://reviews.llvm.org/D20434
Files:
llvm/trunk/lib/MC/MCExpr.cpp
llvm/trunk/test/MC/X86/imm-comments.s
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
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,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D20434.57930.patch
Type: text/x-patch
Size: 2033 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160520/e6d428d7/attachment.bin>
More information about the llvm-commits
mailing list