Index: llvm/trunk/lib/Target/ARM/ARMCodeGenPrepare.cpp =================================================================== --- llvm/trunk/lib/Target/ARM/ARMCodeGenPrepare.cpp +++ llvm/trunk/lib/Target/ARM/ARMCodeGenPrepare.cpp @@ -271,13 +271,6 @@ return true; } - // Otherwise, if an instruction is using a negative immediate we will need - // to fix it up during the promotion. - for (auto &Op : I->operands()) { - if (auto *Const = dyn_cast(Op)) - if (Const->isNegative()) - return false; - } return false; } @@ -370,19 +363,9 @@ }; auto FixConst = [&](ConstantInt *Const, Instruction *I) { - Constant *NewConst = nullptr; - if (isSafeOverflow(I)) { - NewConst = (Const->isNegative()) ? - ConstantExpr::getSExt(Const, ExtTy) : - ConstantExpr::getZExt(Const, ExtTy); - } else { - uint64_t NewVal = *Const->getValue().getRawData(); - if (Const->getType() == Type::getInt16Ty(Ctx)) - NewVal &= 0xFFFF; - else - NewVal &= 0xFF; - NewConst = ConstantInt::get(ExtTy, NewVal); - } + Constant *NewConst = isSafeOverflow(I) && Const->isNegative() ? + ConstantExpr::getSExt(Const, ExtTy) : + ConstantExpr::getZExt(Const, ExtTy); I->replaceUsesOfWith(Const, NewConst); }; Index: llvm/trunk/test/CodeGen/ARM/arm-cgp-icmps.ll =================================================================== --- llvm/trunk/test/CodeGen/ARM/arm-cgp-icmps.ll +++ llvm/trunk/test/CodeGen/ARM/arm-cgp-icmps.ll @@ -1,4 +1,4 @@ -; RUN: llc -mtriple=thumbv8.main -mcpu=cortex-m33 %s -arm-disable-cgp=false -o - | FileCheck %s --check-prefix=CHECK-COMMON --check-prefix=CHECK-NODSP +; RUN: llc -mtriple=thumbv8m.main -mcpu=cortex-m33 %s -arm-disable-cgp=false -o - | FileCheck %s --check-prefix=CHECK-COMMON --check-prefix=CHECK-NODSP ; RUN: llc -mtriple=thumbv7em %s -arm-disable-cgp=false -arm-enable-scalar-dsp=true -o - | FileCheck %s --check-prefix=CHECK-COMMON --check-prefix=CHECK-DSP ; RUN: llc -mtriple=thumbv8 %s -arm-disable-cgp=false -arm-enable-scalar-dsp=true -arm-enable-scalar-dsp-imms=true -o - | FileCheck %s --check-prefix=CHECK-COMMON --check-prefix=CHECK-DSP-IMM @@ -279,3 +279,12 @@ ret i32 %res } +; CHECK-COMMON-LABEL: icmp_i15 +; CHECK-COMMON: movw [[MINUS_ONE:r[0-9]+]], #32767 +define i32 @icmp_i15(i15 zeroext %arg0, i15 zeroext %arg1) { + %xor = xor i15 %arg0, -1 + %cmp = icmp eq i15 %xor, %arg1 + %res = select i1 %cmp, i32 21, i32 42 + ret i32 %res +} +