diff options
author | Chen Li <meloli87@gmail.com> | 2015-07-22 05:26:29 +0000 |
---|---|---|
committer | Chen Li <meloli87@gmail.com> | 2015-07-22 05:26:29 +0000 |
commit | c0f3a158f0cd7cbcb8ea83ba2056be32d97a2fa5 (patch) | |
tree | 807daf91b076973ac6a5826b6c13097ad4a39662 /llvm/test/Transforms/LoopUnswitch/LIV-loop-condtion.ll | |
parent | e345173146271cc95e1364827465d8680c423472 (diff) | |
download | bcm5719-llvm-c0f3a158f0cd7cbcb8ea83ba2056be32d97a2fa5.tar.gz bcm5719-llvm-c0f3a158f0cd7cbcb8ea83ba2056be32d97a2fa5.zip |
[LoopUnswitch] Code refactoring to separate trivial loop unswitch and non-trivial loop unswitch in processCurrentLoop()
Summary: The current code in LoopUnswtich::processCurrentLoop() mixes trivial loop unswitch and non-trivial loop unswitch together. It goes over all basic blocks in the loop and checks if a condition is trivial or non-trivial unswitch condition. However, trivial unswitch condition can only occur in the loop header basic block (where it controls whether or not the loop does something at all). This refactoring separate trivial loop unswitch and non-trivial loop unswitch. Before going over all basic blocks in the loop, it checks if the loop header contains a trivial unswitch condition. If so, unswitch it. Otherwise, go over all blocks like before but don't check trivial condition any more since they are not possible to be in the other blocks. This code has no functionality change.
Reviewers: meheff, reames, broune
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D11276
llvm-svn: 242873
Diffstat (limited to 'llvm/test/Transforms/LoopUnswitch/LIV-loop-condtion.ll')
-rw-r--r-- | llvm/test/Transforms/LoopUnswitch/LIV-loop-condtion.ll | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/llvm/test/Transforms/LoopUnswitch/LIV-loop-condtion.ll b/llvm/test/Transforms/LoopUnswitch/LIV-loop-condtion.ll new file mode 100644 index 00000000000..dd436f474ea --- /dev/null +++ b/llvm/test/Transforms/LoopUnswitch/LIV-loop-condtion.ll @@ -0,0 +1,28 @@ +; RUN: opt < %s -loop-unswitch -loop-unswitch-threshold=0 -S 2>&1 | FileCheck %s + +; This is to test trivial loop unswitch only happens when trivial condition +; itself is an LIV loop condition (not partial LIV which could occur in and/or). + +define i32 @test(i1 %cond1, i32 %var1) { +entry: + br label %loop_begin + +loop_begin: + %var3 = phi i32 [%var1, %entry], [%var2, %do_something] + %cond2 = icmp eq i32 %var3, 10 + %cond.and = and i1 %cond1, %cond2 + +; %cond.and only has %cond1 as LIV so no unswitch should happen. +; CHECK: br i1 %cond.and, label %do_something, label %loop_exit + br i1 %cond.and, label %do_something, label %loop_exit + +do_something: + %var2 = add i32 %var3, 1 + call void @some_func() noreturn nounwind + br label %loop_begin + +loop_exit: + ret i32 0 +} + +declare void @some_func() noreturn
\ No newline at end of file |