diff --git a/lib/IR/ConstantRange.cpp b/lib/IR/ConstantRange.cpp index 6e0b5a0fc86..396c39b5b3a 100644 --- a/lib/IR/ConstantRange.cpp +++ b/lib/IR/ConstantRange.cpp @@ -872,9 +872,12 @@ ConstantRange ConstantRange::intrinsic(Intrinsic::ID IntrinsicID, return Ops[0].smin(Ops[1]); case Intrinsic::smax: return Ops[0].smax(Ops[1]); - case Intrinsic::abs: - // TODO: Make use of poison flag. - return Ops[0].abs(); + case Intrinsic::abs: { + const APInt *IntMinIsPoison = Ops[1].getSingleElement(); + assert(IntMinIsPoison && "Must be known (immarg)"); + assert(IntMinIsPoison->getBitWidth() == 1 && "Must be boolean"); + return Ops[0].abs(IntMinIsPoison->getBoolValue()); + } default: assert(!isIntrinsicSupported(IntrinsicID) && "Shouldn't be supported"); llvm_unreachable("Unsupported intrinsic"); diff --git a/test/Transforms/CorrelatedValuePropagation/minmaxabs.ll b/test/Transforms/CorrelatedValuePropagation/minmaxabs.ll index ef5bf4d7c2a..040bc8ae901 100644 --- a/test/Transforms/CorrelatedValuePropagation/minmaxabs.ll +++ b/test/Transforms/CorrelatedValuePropagation/minmaxabs.ll @@ -141,8 +141,7 @@ define void @test_abs3(i32 %x) { ; CHECK-NEXT: [[A:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true) ; CHECK-NEXT: br label [[SPLIT:%.*]] ; CHECK: split: -; CHECK-NEXT: [[C1:%.*]] = icmp sge i32 [[A]], 0 -; CHECK-NEXT: call void @use(i1 [[C1]]) +; CHECK-NEXT: call void @use(i1 true) ; CHECK-NEXT: [[C2:%.*]] = icmp sgt i32 [[A]], 0 ; CHECK-NEXT: call void @use(i1 [[C2]]) ; CHECK-NEXT: ret void