For immediate encodings of icmp, zero or sign extend first.  Then
determine if the value is negative and flip the sign accordingly.
rdar://10422026

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@144258 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/ARM/ARMFastISel.cpp b/lib/Target/ARM/ARMFastISel.cpp
index 44c88aa..4c47ff9 100644
--- a/lib/Target/ARM/ARMFastISel.cpp
+++ b/lib/Target/ARM/ARMFastISel.cpp
@@ -1216,7 +1216,6 @@
 
   // Check to see if the 2nd operand is a constant that we can encode directly
   // in the compare.
-  uint64_t Imm;
   int EncodedImm = 0;
   bool EncodeImm = false;
   bool isNegativeImm = false;
@@ -1224,10 +1223,11 @@
     if (SrcVT == MVT::i32 || SrcVT == MVT::i16 || SrcVT == MVT::i8 ||
         SrcVT == MVT::i1) {
       const APInt &CIVal = ConstInt->getValue();
-
-      isNegativeImm = CIVal.isNegative();
-      Imm = (isNegativeImm) ? (-CIVal).getZExtValue() : CIVal.getZExtValue();
-      EncodedImm = (int)Imm;
+      EncodedImm = (isZExt) ? (int)CIVal.getZExtValue() : (int)CIVal.getSExtValue();
+      if (EncodedImm < 0) {
+        isNegativeImm = true;
+        EncodedImm = -EncodedImm;
+      }
       EncodeImm = isThumb2 ? (ARM_AM::getT2SOImmVal(EncodedImm) != -1) :
         (ARM_AM::getSOImmVal(EncodedImm) != -1);
     }