[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