Index: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td =================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td @@ -111,7 +111,9 @@ // t2_so_imm_neg - Match an immediate that is a negation of a t2_so_imm. def t2_so_imm_neg_asmoperand : AsmOperandClass { let Name = "T2SOImmNeg"; } def t2_so_imm_neg : Operand, PatLeaf<(imm), [{ - int64_t Value = -(int)N->getZExtValue(); + int64_t Value = N->getZExtValue(); + if (Value == 1LL<<31) return false; // INT_MIN cannot be negated + Value = -(int)Value; return Value && ARM_AM::getT2SOImmVal(Value) != -1; }], t2_so_imm_neg_XFORM> { let ParserMatchClass = t2_so_imm_neg_asmoperand; Index: llvm/trunk/test/CodeGen/Thumb/ispositive.ll =================================================================== --- llvm/trunk/test/CodeGen/Thumb/ispositive.ll +++ llvm/trunk/test/CodeGen/Thumb/ispositive.ll @@ -9,3 +9,12 @@ ret i32 %1 } +define i32 @test2(i32 %X) { +entry: +; CHECK-LABEL: test2: +; CHECK: lsls r1, r1, #31 +; CHECK-NEXT: adds + %tmp1 = sub i32 %X, 2147483648 + ret i32 %tmp1 +} +