Fix undefined behavior (negation of INT_MIN) in ARM backend.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 24 Aug 2012 00:35:46 +0000 (00:35 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 24 Aug 2012 00:35:46 +0000 (00:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@162520 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMInstrInfo.td
lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp

index 992aba5803f6e066c2f060c5c80dbb273c827071..6d60a76a431ed66cc63ede32755e391e1027d828 100644 (file)
@@ -275,7 +275,7 @@ def imm16_31 : ImmLeaf<i32, [{
 
 def so_imm_neg_asmoperand : AsmOperandClass { let Name = "ARMSOImmNeg"; }
 def so_imm_neg : Operand<i32>, PatLeaf<(imm), [{
-    int64_t Value = -(int)N->getZExtValue();
+    unsigned Value = -(unsigned)N->getZExtValue();
     return Value && ARM_AM::getSOImmVal(Value) != -1;
   }], imm_neg_XFORM> {
   let ParserMatchClass = so_imm_neg_asmoperand;
index 94f1082b5f6db37065743d1e4dd666e81f8cf538..191756490400f3ebd771802ddda0ed3671339b6f 100644 (file)
@@ -783,7 +783,7 @@ getT2Imm8s4OpValue(const MCInst &MI, unsigned OpIdx,
 
   // Immediate is always encoded as positive. The 'U' bit controls add vs sub.
   if (Imm8 < 0)
-    Imm8 = -Imm8;
+    Imm8 = -(uint32_t)Imm8;
 
   // Scaled by 4.
   Imm8 /= 4;