[llvm] r348367 - [InstCombine] simplify icmps with same operands based on dominating cmp
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 5 07:04:01 PST 2018
Author: spatel
Date: Wed Dec 5 07:04:00 2018
New Revision: 348367
URL: http://llvm.org/viewvc/llvm-project?rev=348367&view=rev
Log:
[InstCombine] simplify icmps with same operands based on dominating cmp
The tests here are based on the motivating cases from D54827.
More background:
1. We don't get these cases in general with SimplifyCFG because the root
of the pattern match is an icmp, not a branch. I'm not sure how often
we encounter this pattern vs. the seemingly more likely case with
branches, but I don't see evidence to leave the minimal pattern
unoptimized.
2. This has a chance of increasing compile-time because we're using a
ValueTracking call to handle the match. The motivating cases could be
handled with a simpler pair of calls to isImpliedTrueByMatchingCmp/
isImpliedFalseByMatchingCmp, but I saw that we have a more
comprehensive wrapper around those, so we might as well use it here
unless there's evidence that it's significantly slower.
3. Ideally, we'd handle the fold to constants in InstSimplify, but as
with the existing code here, we could extend this to handle cases
where the result is not a constant, but a new combined predicate.
That would mean splitting the logic across the 2 passes and possibly
duplicating the pattern-matching cost.
4. As mentioned in D54827, this seems like the kind of thing that should
be handled in Correlated Value Propagation, but that pass is currently
limited to dealing with instructions with constant operands, so extending
this bit of InstCombine is the smallest/easiest way to get these patterns
optimized.
Modified:
llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
llvm/trunk/test/Transforms/InstCombine/icmp-dom.ll
Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp?rev=348367&r1=348366&r2=348367&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp Wed Dec 5 07:04:00 2018
@@ -1385,6 +1385,11 @@ Instruction *InstCombiner::foldICmpWithD
if (TrueBB == FalseBB)
return nullptr;
+ // Try to simplify this compare to T/F based on the dominating condition.
+ Optional<bool> Imp = isImpliedCondition(DomCond, &Cmp, DL, TrueBB == CmpBB);
+ if (Imp)
+ return replaceInstUsesWith(Cmp, ConstantInt::get(Cmp.getType(), *Imp));
+
CmpInst::Predicate Pred = Cmp.getPredicate();
Value *X = Cmp.getOperand(0), *Y = Cmp.getOperand(1);
ICmpInst::Predicate DomPred;
Modified: llvm/trunk/test/Transforms/InstCombine/icmp-dom.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/icmp-dom.ll?rev=348367&r1=348366&r2=348367&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/icmp-dom.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/icmp-dom.ll Wed Dec 5 07:04:00 2018
@@ -166,8 +166,7 @@ define i1 @trueblock_cmp_is_false(i32 %x
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
; CHECK: t:
-; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[X]], [[Y]]
-; CHECK-NEXT: ret i1 [[CMP2]]
+; CHECK-NEXT: ret i1 false
; CHECK: f:
; CHECK-NEXT: ret i1 [[CMP]]
;
@@ -187,8 +186,7 @@ define i1 @trueblock_cmp_is_false_commut
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
; CHECK: t:
-; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[Y]], [[X]]
-; CHECK-NEXT: ret i1 [[CMP2]]
+; CHECK-NEXT: ret i1 false
; CHECK: f:
; CHECK-NEXT: ret i1 [[CMP]]
;
@@ -208,8 +206,7 @@ define i1 @trueblock_cmp_is_true(i32 %x,
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
; CHECK: t:
-; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i32 [[X]], [[Y]]
-; CHECK-NEXT: ret i1 [[CMP2]]
+; CHECK-NEXT: ret i1 true
; CHECK: f:
; CHECK-NEXT: ret i1 [[CMP]]
;
@@ -229,8 +226,7 @@ define i1 @trueblock_cmp_is_true_commute
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
; CHECK: t:
-; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i32 [[Y]], [[X]]
-; CHECK-NEXT: ret i1 [[CMP2]]
+; CHECK-NEXT: ret i1 true
; CHECK: f:
; CHECK-NEXT: ret i1 [[CMP]]
;
@@ -252,8 +248,7 @@ define i1 @falseblock_cmp_is_false(i32 %
; CHECK: t:
; CHECK-NEXT: ret i1 [[CMP]]
; CHECK: f:
-; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[X]], [[Y]]
-; CHECK-NEXT: ret i1 [[CMP2]]
+; CHECK-NEXT: ret i1 false
;
entry:
%cmp = icmp sle i32 %x, %y
@@ -273,8 +268,7 @@ define i1 @falseblock_cmp_is_false_commu
; CHECK: t:
; CHECK-NEXT: ret i1 [[CMP]]
; CHECK: f:
-; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[Y]], [[X]]
-; CHECK-NEXT: ret i1 [[CMP2]]
+; CHECK-NEXT: ret i1 false
;
entry:
%cmp = icmp eq i32 %x, %y
@@ -294,8 +288,7 @@ define i1 @falseblock_cmp_is_true(i32 %x
; CHECK: t:
; CHECK-NEXT: ret i1 [[CMP]]
; CHECK: f:
-; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i32 [[X]], [[Y]]
-; CHECK-NEXT: ret i1 [[CMP2]]
+; CHECK-NEXT: ret i1 true
;
entry:
%cmp = icmp ult i32 %x, %y
@@ -315,8 +308,7 @@ define i1 @falseblock_cmp_is_true_commut
; CHECK: t:
; CHECK-NEXT: ret i1 [[CMP]]
; CHECK: f:
-; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i32 [[Y]], [[X]]
-; CHECK-NEXT: ret i1 [[CMP2]]
+; CHECK-NEXT: ret i1 true
;
entry:
%cmp = icmp sgt i32 %x, %y
More information about the llvm-commits
mailing list