From 9ebeac678855a1bc2492a9630f0300518e2755dc Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 30 Jul 2020 22:54:53 +0200 Subject: [PATCH] [ConstantRange][CVP] Make use of abs poison flag Pass the abs poison flag to the underlying ConstantRange implementation, allowing CVP to simplify based on it. Importantly, this recognizes that abs with poison flag is actually non-negative... --- llvm/lib/IR/ConstantRange.cpp | 9 ++++++--- llvm/test/Transforms/CorrelatedValuePropagation/minmaxabs.ll | 3 +-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/llvm/lib/IR/ConstantRange.cpp b/llvm/lib/IR/ConstantRange.cpp index 6e0b5a0..396c39b 100644 --- a/llvm/lib/IR/ConstantRange.cpp +++ b/llvm/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/llvm/test/Transforms/CorrelatedValuePropagation/minmaxabs.ll b/llvm/test/Transforms/CorrelatedValuePropagation/minmaxabs.ll index ef5bf4d..040bc8a 100644 --- a/llvm/test/Transforms/CorrelatedValuePropagation/minmaxabs.ll +++ b/llvm/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 -- 2.7.4