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,7 @@ continue; if (auto *Const = dyn_cast(Op)) { - Constant *NewConst = SafeWrap.contains(I) + Constant *NewConst = (SafeWrap.contains(I) && i == 1) ? 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 @@ -348,3 +348,16 @@ if.end: ret void } + +define i32 @degenerateicmp() { +; CHECK-LABEL: @degenerateicmp( +; CHECK-NEXT: [[TMP1:%.*]] = sub i32 190, 0 +; CHECK-NEXT: [[TMP2:%.*]] = icmp ugt i32 225, [[TMP1]] +; CHECK-NEXT: [[TMP3:%.*]] = select i1 [[TMP2]], i32 1, i32 0 +; CHECK-NEXT: ret i32 [[TMP3]] +; + %1 = sub i8 -66, 0 + %2 = icmp ugt i8 -31, %1 + %3 = select i1 %2, i32 1, i32 0 + ret i32 %3 +}