[llvm] r293778 - [InstCombine] Allow InstCombine to merge adjacent guards
Sanjoy Das via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 1 09:57:36 PST 2017
I should have mentioned in the commit message - this patch was
authored by Max Kazantsev.
On Wed, Feb 1, 2017 at 8:34 AM, Sanjoy Das via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: sanjoy
> Date: Wed Feb 1 10:34:55 2017
> New Revision: 293778
>
> URL: http://llvm.org/viewvc/llvm-project?rev=293778&view=rev
> Log:
> [InstCombine] Allow InstCombine to merge adjacent guards
>
> Summary:
> If there are two adjacent guards with different conditions, we can
> remove one of them and include its condition into the condition of
> another one. This patch allows InstCombine to merge them by the
> following pattern:
>
> guard(a); guard(b) -> guard(a & b).
>
> Reviewers: reames, apilipenko, igor-laevsky, anna, sanjoy
>
> Reviewed By: sanjoy
>
> Subscribers: llvm-commits
>
> Differential Revision: https://reviews.llvm.org/D29378
>
> Modified:
> llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp
> llvm/trunk/test/Transforms/InstCombine/call-guard.ll
>
> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp?rev=293778&r1=293777&r2=293778&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp (original)
> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp Wed Feb 1 10:34:55 2017
> @@ -3255,16 +3255,24 @@ Instruction *InstCombiner::visitCallInst
> }
>
> case Intrinsic::experimental_guard: {
> - Value *IIOperand = II->getArgOperand(0);
> + // Is this guard followed by another guard?
> + Instruction *NextInst = II->getNextNode();
> + Value *NextCond = nullptr;
> + if (match(NextInst,
> + m_Intrinsic<Intrinsic::experimental_guard>(m_Value(NextCond)))) {
> + Value *CurrCond = II->getArgOperand(0);
>
> - // Remove a guard if it is immediately followed by an identical guard.
> - if (match(II->getNextNode(),
> - m_Intrinsic<Intrinsic::experimental_guard>(m_Specific(IIOperand))))
> - return eraseInstFromFunction(*II);
> + // Remove a guard that it is immediately preceeded by an identical guard.
> + if (CurrCond == NextCond)
> + return eraseInstFromFunction(*NextInst);
> +
> + // Otherwise canonicalize guard(a); guard(b) -> guard(a & b).
> + II->setArgOperand(0, Builder->CreateAnd(CurrCond, NextCond));
> + return eraseInstFromFunction(*NextInst);
> + }
> break;
> }
> }
> -
> return visitCallSite(II);
> }
>
>
> Modified: llvm/trunk/test/Transforms/InstCombine/call-guard.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/call-guard.ll?rev=293778&r1=293777&r2=293778&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstCombine/call-guard.ll (original)
> +++ llvm/trunk/test/Transforms/InstCombine/call-guard.ll Wed Feb 1 10:34:55 2017
> @@ -2,8 +2,8 @@
>
> declare void @llvm.experimental.guard(i1, ...)
>
> -define void @test_guard_adjacent(i1 %A) {
> -; CHECK-LABEL: @test_guard_adjacent(
> +define void @test_guard_adjacent_same_cond(i1 %A) {
> +; CHECK-LABEL: @test_guard_adjacent_same_cond(
> ; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 %A) [ "deopt"() ]
> ; CHECK-NEXT: ret void
> call void(i1, ...) @llvm.experimental.guard( i1 %A )[ "deopt"() ]
> @@ -19,12 +19,14 @@ define void @test_guard_adjacent(i1 %A)
> ret void
> }
>
> -define void @test_guard_adjacent_neg(i1 %A, i1 %B) {
> -; CHECK-LABEL: @test_guard_adjacent_neg(
> -; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 %A) [ "deopt"() ]
> -; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 %B) [ "deopt"() ]
> +define void @test_guard_adjacent_diff_cond(i1 %A, i1 %B, i1 %C) {
> +; CHECK-LABEL: @test_guard_adjacent_diff_cond(
> +; CHECK-NEXT: %1 = and i1 %A, %B
> +; CHECK-NEXT: %2 = and i1 %1, %C
> +; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 %2, i32 123) [ "deopt"() ]
> ; CHECK-NEXT: ret void
> - call void(i1, ...) @llvm.experimental.guard( i1 %A )[ "deopt"() ]
> - call void(i1, ...) @llvm.experimental.guard( i1 %B )[ "deopt"() ]
> + call void(i1, ...) @llvm.experimental.guard( i1 %A, i32 123 )[ "deopt"() ]
> + call void(i1, ...) @llvm.experimental.guard( i1 %B, i32 456 )[ "deopt"() ]
> + call void(i1, ...) @llvm.experimental.guard( i1 %C, i32 789 )[ "deopt"() ]
> ret void
> }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list