diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index f28ce858a169a1..7984dcdb8987a4 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -1297,6 +1297,8 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) { Value *I0 = II->getArgOperand(0), *I1 = II->getArgOperand(1); // umin(x, 1) == zext(x != 0) if (match(I1, m_One())) { + assert(II->getType()->getScalarSizeInBits() != 1 && + "Expected simplify of umin with max constant"); Value *Zero = Constant::getNullValue(I0->getType()); Value *Cmp = Builder.CreateICmpNE(I0, Zero); return CastInst::Create(Instruction::ZExt, Cmp, II->getType()); diff --git a/llvm/test/Transforms/InstCombine/minmax-intrinsics.ll b/llvm/test/Transforms/InstCombine/minmax-intrinsics.ll index 7fb4f80c5cadba..2f84f415f76a79 100644 --- a/llvm/test/Transforms/InstCombine/minmax-intrinsics.ll +++ b/llvm/test/Transforms/InstCombine/minmax-intrinsics.ll @@ -1,6 +1,7 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -S -passes=instcombine < %s | FileCheck %s +declare i1 @llvm.umin.i1(i1, i1) declare i8 @llvm.umin.i8(i8, i8) declare i8 @llvm.umax.i8(i8, i8) declare i8 @llvm.smin.i8(i8, i8) @@ -2477,3 +2478,15 @@ define <3 x i8> @smin_unary_shuffle_ops_uses(<3 x i8> %x, <3 x i8> %y) { %r = call <3 x i8> @llvm.smin.v3i8(<3 x i8> %sx, <3 x i8> %sy) ret <3 x i8> %r } + +; This would assert/crash because we tried to zext to i1. + +@g = external dso_local global i32, align 4 + +define i1 @PR57986() { +; CHECK-LABEL: @PR57986( +; CHECK-NEXT: ret i1 ptrtoint (i32* @g to i1) +; + %umin = call i1 @llvm.umin.i1(i1 ptrtoint (i32* @g to i1), i1 true) + ret i1 %umin +}