diff --git a/llvm/lib/CodeGen/TypePromotion.cpp b/llvm/lib/CodeGen/TypePromotion.cpp --- a/llvm/lib/CodeGen/TypePromotion.cpp +++ b/llvm/lib/CodeGen/TypePromotion.cpp @@ -484,7 +484,10 @@ continue; if (auto *Const = dyn_cast(Op)) { - Constant *NewConst = (SafeWrap.contains(I) && i == 1) + // For subtract, we don't need to sext the constant. We only put it in + // SafeWrap because SafeWrap.size() is used elsewhere. + Constant *NewConst = (SafeWrap.contains(I) && i == 1 && + I->getOpcode() != Instruction::Sub) ? ConstantExpr::getSExt(Const, ExtTy) : ConstantExpr::getZExt(Const, ExtTy); I->setOperand(i, NewConst); diff --git a/llvm/test/Transforms/TypePromotion/ARM/icmps.ll b/llvm/test/Transforms/TypePromotion/ARM/icmps.ll --- a/llvm/test/Transforms/TypePromotion/ARM/icmps.ll +++ b/llvm/test/Transforms/TypePromotion/ARM/icmps.ll @@ -361,3 +361,14 @@ %3 = select i1 %2, i32 1, i32 0 ret i32 %3 } + +define i1 @pr55490() { +; CHECK-LABEL: @pr55490( +; CHECK-NEXT: [[TMP1:%.*]] = sub i32 10, 8 +; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], 3 +; CHECK-NEXT: ret i1 [[TMP2]] +; + %1 = sub i4 -6, -8 + %2 = icmp ult i4 %1, 3 + ret i1 %2 +}