From 9e68557e6437a7cb997cf571542b3638839dcaa0 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 18 Jan 2022 10:42:45 +0100 Subject: [PATCH] [LVI] Handle commuted SPF min/max operands We need to check that the operands of the min/max are the operands of the select, but we don't care which order they are in. --- llvm/lib/Analysis/LazyValueInfo.cpp | 3 ++- llvm/test/Transforms/CorrelatedValuePropagation/basic.ll | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Analysis/LazyValueInfo.cpp b/llvm/lib/Analysis/LazyValueInfo.cpp index 10cb28a0b37d4a..e095cdaff5bf97 100644 --- a/llvm/lib/Analysis/LazyValueInfo.cpp +++ b/llvm/lib/Analysis/LazyValueInfo.cpp @@ -828,7 +828,8 @@ Optional LazyValueInfoImpl::solveBlockValueSelect( // Is this a min specifically of our two inputs? (Avoid the risk of // ValueTracking getting smarter looking back past our immediate inputs.) if (SelectPatternResult::isMinOrMax(SPR.Flavor) && - LHS == SI->getTrueValue() && RHS == SI->getFalseValue()) { + ((LHS == SI->getTrueValue() && RHS == SI->getFalseValue()) || + (RHS == SI->getTrueValue() && LHS == SI->getFalseValue()))) { ConstantRange ResultCR = [&]() { switch (SPR.Flavor) { default: diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll b/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll index e8cf350216611a..a16209c1422a1b 100644 --- a/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll +++ b/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll @@ -665,8 +665,7 @@ define i1 @umin_rhs_overdefined_lhs_range(i32 %a, i32 %b) { ; CHECK-NEXT: call void @llvm.assume(i1 [[ASSUME]]) ; CHECK-NEXT: [[CMP:%.*]] = icmp uge i32 [[A:%.*]], [[B]] ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 [[B]], i32 [[A]] -; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i32 [[SEL]], 42 -; CHECK-NEXT: ret i1 [[CMP2]] +; CHECK-NEXT: ret i1 true ; %assume = icmp ult i32 %b, 42 call void @llvm.assume(i1 %assume)