From 01a6c4bd26a599e877301568f77eb835d0a6e812 Mon Sep 17 00:00:00 2001 From: Roman Lebedev Date: Thu, 6 Aug 2020 11:10:38 +0300 Subject: [PATCH] [InstCombine] (-NSW x) s< x --> x s> 0 (PR39480) Name: (-x) s< x --> x > 0 %neg_x = sub nsw i8 0, %x ; %x must not be INT_MIN %r = icmp slt i8 %neg_x, %x => %r = icmp sgt i8 %x, 0 https://rise4fun.com/Alive/3IXb https://bugs.llvm.org/show_bug.cgi?id=39480 --- llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 5 +++++ llvm/test/Transforms/InstCombine/cmp-x-vs-neg-x.ll | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index 13dacd4..0a8ed3c 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -3738,6 +3738,11 @@ Instruction *foldICmpXNegX(ICmpInst &I) { NewRHS = Constant::getNullValue(X->getType()); break; + case ICmpInst::ICMP_SLT: + NewPred = ICmpInst::ICMP_SGT; + NewRHS = Constant::getNullValue(X->getType()); + break; + case ICmpInst::ICMP_EQ: case ICmpInst::ICMP_NE: NewPred = Pred; diff --git a/llvm/test/Transforms/InstCombine/cmp-x-vs-neg-x.ll b/llvm/test/Transforms/InstCombine/cmp-x-vs-neg-x.ll index 0a557a8..9a32a24 100644 --- a/llvm/test/Transforms/InstCombine/cmp-x-vs-neg-x.ll +++ b/llvm/test/Transforms/InstCombine/cmp-x-vs-neg-x.ll @@ -51,8 +51,7 @@ define i1 @t1(i8 %x) { define i1 @t2(i8 %x) { ; CHECK-LABEL: @t2( -; CHECK-NEXT: [[NEG_X:%.*]] = sub nsw i8 0, [[X:%.*]] -; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[NEG_X]], [[X]] +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], 0 ; CHECK-NEXT: ret i1 [[CMP]] ; %neg_x = sub nsw i8 0, %x -- 2.7.4