diff options
author | Chris Lattner <sabre@nondot.org> | 2009-08-30 22:14:17 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-08-30 22:14:17 +0000 |
commit | 0665552c615547d8e26cf0473a6adaded3af1bbf (patch) | |
tree | 7e33d1239154b44820df74566984a68693ffa6bc /test/Transforms/LICM/hoisting.ll | |
parent | 409255e329381fc19815cc18ce9798b41694d6a7 (diff) | |
download | llvm-0665552c615547d8e26cf0473a6adaded3af1bbf.tar.gz llvm-0665552c615547d8e26cf0473a6adaded3af1bbf.tar.bz2 llvm-0665552c615547d8e26cf0473a6adaded3af1bbf.tar.xz |
rename test
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@80523 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Transforms/LICM/hoisting.ll')
-rw-r--r-- | test/Transforms/LICM/hoisting.ll | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/test/Transforms/LICM/hoisting.ll b/test/Transforms/LICM/hoisting.ll new file mode 100644 index 0000000000..821c8a3fd5 --- /dev/null +++ b/test/Transforms/LICM/hoisting.ll @@ -0,0 +1,50 @@ +; RUN: llvm-as < %s | opt -licm | llvm-dis | FileCheck %s + +@X = global i32 0 ; <i32*> [#uses=1] + +declare void @foo() + +; This testcase tests for a problem where LICM hoists +; potentially trapping instructions when they are not guaranteed to execute. +define i32 @test1(i1 %c) { +; CHECK: @test1 + %A = load i32* @X ; <i32> [#uses=2] + br label %Loop +Loop: ; preds = %LoopTail, %0 + call void @foo( ) + br i1 %c, label %LoopTail, label %IfUnEqual + +IfUnEqual: ; preds = %Loop +; CHECK: IfUnEqual: +; CHECK-NEXT: sdiv i32 4, %A + %B1 = sdiv i32 4, %A ; <i32> [#uses=1] + br label %LoopTail + +LoopTail: ; preds = %IfUnEqual, %Loop + %B = phi i32 [ 0, %Loop ], [ %B1, %IfUnEqual ] ; <i32> [#uses=1] + br i1 %c, label %Loop, label %Out +Out: ; preds = %LoopTail + %C = sub i32 %A, %B ; <i32> [#uses=1] + ret i32 %C +} + + +declare void @foo2(i32) + + +;; It is ok and desirable to hoist this potentially trapping instruction. +define i32 @test2(i1 %c) { +; CHECK: @test2 +; CHECK-NEXT: load i32* @X +; CHECK-NEXT: %B = sdiv i32 4, %A + %A = load i32* @X ; <i32> [#uses=2] + br label %Loop +Loop: + ;; Should have hoisted this div! + %B = sdiv i32 4, %A ; <i32> [#uses=2] + call void @foo2( i32 %B ) + br i1 %c, label %Loop, label %Out +Out: ; preds = %Loop + %C = sub i32 %A, %B ; <i32> [#uses=1] + ret i32 %C +} |