diff options
author | Dale Johannesen <dalej@apple.com> | 2008-12-05 21:47:27 +0000 |
---|---|---|
committer | Dale Johannesen <dalej@apple.com> | 2008-12-05 21:47:27 +0000 |
commit | 203af58aea3ae341d38e5c2c5b390b0c31d25557 (patch) | |
tree | 8f120f606205a8437f8acacb0e52492d0841e82f /test | |
parent | b51deb929ca95ce62e622b0475a05d83f26ab04d (diff) | |
download | external_llvm-203af58aea3ae341d38e5c2c5b390b0c31d25557.zip external_llvm-203af58aea3ae341d38e5c2c5b390b0c31d25557.tar.gz external_llvm-203af58aea3ae341d38e5c2c5b390b0c31d25557.tar.bz2 |
Make LoopStrengthReduce smarter about hoisting things out of
loops when they can be subsumed into addressing modes.
Change X86 addressing mode check to realize that
some PIC references need an extra register.
(I believe this is correct for Linux, if not, I'm sure
someone will tell me.)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60608 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r-- | test/CodeGen/X86/loop-strength-reduce-2.ll | 30 | ||||
-rw-r--r-- | test/CodeGen/X86/loop-strength-reduce-3.ll | 30 | ||||
-rw-r--r-- | test/CodeGen/X86/loop-strength-reduce.ll | 7 |
3 files changed, 64 insertions, 3 deletions
diff --git a/test/CodeGen/X86/loop-strength-reduce-2.ll b/test/CodeGen/X86/loop-strength-reduce-2.ll new file mode 100644 index 0000000..1375793 --- /dev/null +++ b/test/CodeGen/X86/loop-strength-reduce-2.ll @@ -0,0 +1,30 @@ +; RUN: llvm-as < %s | llc -march=x86 -relocation-model=pic | \ +; RUN: grep {A-} | count 1 +; +; Make sure the common loop invariant A is hoisted up to preheader, +; since too many registers are needed to subsume it into the addressing modes. + +@A = global [16 x [16 x i32]] zeroinitializer, align 32 ; <[16 x [16 x i32]]*> [#uses=2] + +define void @test(i32 %row, i32 %N.in) nounwind { +entry: + %N = bitcast i32 %N.in to i32 ; <i32> [#uses=1] + %tmp5 = icmp sgt i32 %N.in, 0 ; <i1> [#uses=1] + br i1 %tmp5, label %cond_true, label %return + +cond_true: ; preds = %cond_true, %entry + %indvar = phi i32 [ 0, %entry ], [ %indvar.next, %cond_true ] ; <i32> [#uses=2] + %i.0.0 = bitcast i32 %indvar to i32 ; <i32> [#uses=2] + %tmp2 = add i32 %i.0.0, 1 ; <i32> [#uses=1] + %tmp = getelementptr [16 x [16 x i32]]* @A, i32 0, i32 %row, i32 %tmp2 ; <i32*> [#uses=1] + store i32 4, i32* %tmp + %tmp5.upgrd.1 = add i32 %i.0.0, 2 ; <i32> [#uses=1] + %tmp7 = getelementptr [16 x [16 x i32]]* @A, i32 0, i32 %row, i32 %tmp5.upgrd.1 ; <i32*> [#uses=1] + store i32 5, i32* %tmp7 + %indvar.next = add i32 %indvar, 1 ; <i32> [#uses=2] + %exitcond = icmp eq i32 %indvar.next, %N ; <i1> [#uses=1] + br i1 %exitcond, label %return, label %cond_true + +return: ; preds = %cond_true, %entry + ret void +} diff --git a/test/CodeGen/X86/loop-strength-reduce-3.ll b/test/CodeGen/X86/loop-strength-reduce-3.ll new file mode 100644 index 0000000..b6bb814 --- /dev/null +++ b/test/CodeGen/X86/loop-strength-reduce-3.ll @@ -0,0 +1,30 @@ +; RUN: llvm-as < %s | llc -mtriple=i386-apple-darwin -relocation-model=dynamic-no-pic | \ +; RUN: grep {A+} | count 2 +; +; Make sure the common loop invariant A is not hoisted up to preheader, +; since it can be subsumed it into the addressing modes. + +@A = global [16 x [16 x i32]] zeroinitializer, align 32 ; <[16 x [16 x i32]]*> [#uses=2] + +define void @test(i32 %row, i32 %N.in) nounwind { +entry: + %N = bitcast i32 %N.in to i32 ; <i32> [#uses=1] + %tmp5 = icmp sgt i32 %N.in, 0 ; <i1> [#uses=1] + br i1 %tmp5, label %cond_true, label %return + +cond_true: ; preds = %cond_true, %entry + %indvar = phi i32 [ 0, %entry ], [ %indvar.next, %cond_true ] ; <i32> [#uses=2] + %i.0.0 = bitcast i32 %indvar to i32 ; <i32> [#uses=2] + %tmp2 = add i32 %i.0.0, 1 ; <i32> [#uses=1] + %tmp = getelementptr [16 x [16 x i32]]* @A, i32 0, i32 %row, i32 %tmp2 ; <i32*> [#uses=1] + store i32 4, i32* %tmp + %tmp5.upgrd.1 = add i32 %i.0.0, 2 ; <i32> [#uses=1] + %tmp7 = getelementptr [16 x [16 x i32]]* @A, i32 0, i32 %row, i32 %tmp5.upgrd.1 ; <i32*> [#uses=1] + store i32 5, i32* %tmp7 + %indvar.next = add i32 %indvar, 1 ; <i32> [#uses=2] + %exitcond = icmp eq i32 %indvar.next, %N ; <i1> [#uses=1] + br i1 %exitcond, label %return, label %cond_true + +return: ; preds = %cond_true, %entry + ret void +} diff --git a/test/CodeGen/X86/loop-strength-reduce.ll b/test/CodeGen/X86/loop-strength-reduce.ll index 8bacbd9..8737101 100644 --- a/test/CodeGen/X86/loop-strength-reduce.ll +++ b/test/CodeGen/X86/loop-strength-reduce.ll @@ -1,7 +1,8 @@ -; RUN: llvm-as < %s | llc -march=x86 | \ -; RUN: grep {A(} | count 1 +; RUN: llvm-as < %s | llc -march=x86 -relocation-model=static | \ +; RUN: grep {A+} | count 2 ; -; Make sure the common loop invariant _A(reg) is hoisted up to preheader. +; Make sure the common loop invariant A is not hoisted up to preheader, +; since it can be subsumed into the addressing mode in all uses. @A = internal global [16 x [16 x i32]] zeroinitializer, align 32 ; <[16 x [16 x i32]]*> [#uses=2] |