blob: 52ab8717c15fee17574c3d447fbca789630bd9f0 [file] [log] [blame]
Bob Wilson13e80bd2009-10-27 05:50:28 +00001; RUN: llc < %s -march=arm | FileCheck %s
Chris Lattnerbaf21992007-04-03 00:13:16 +00002
Dan Gohman572645c2010-02-12 10:34:29 +00003; This loop is rewritten with an indvar which counts down, which
4; frees up a register from holding the trip count.
5
Dan Gohman04623272009-05-18 15:16:49 +00006define void @test(i32* %P, i32 %A, i32 %i) nounwind {
Chris Lattnerbaf21992007-04-03 00:13:16 +00007entry:
Bob Wilson49d9dc42010-03-16 16:59:47 +00008; CHECK: str r1, [{{r.*}}, +{{r.*}}, lsl #2]
Dan Gohman572645c2010-02-12 10:34:29 +00009 icmp eq i32 %i, 0 ; <i1>:0 [#uses=1]
10 br i1 %0, label %return, label %bb
11
12bb: ; preds = %bb, %entry
13 %indvar = phi i32 [ 0, %entry ], [ %indvar.next, %bb ] ; <i32> [#uses=2]
14 %i_addr.09.0 = sub i32 %i, %indvar ; <i32> [#uses=1]
15 %tmp2 = getelementptr i32* %P, i32 %i_addr.09.0 ; <i32*> [#uses=1]
16 store i32 %A, i32* %tmp2
17 %indvar.next = add i32 %indvar, 1 ; <i32> [#uses=2]
18 icmp eq i32 %indvar.next, %i ; <i1>:1 [#uses=1]
19 br i1 %1, label %return, label %bb
20
21return: ; preds = %bb, %entry
22 ret void
23}
24
25; This loop has a non-address use of the count-up indvar, so
26; it'll remain. Now the original store uses a negative-stride address.
27
28define void @test_with_forced_iv(i32* %P, i32 %A, i32 %i) nounwind {
29entry:
Bob Wilson13e80bd2009-10-27 05:50:28 +000030; CHECK: str r1, [{{r.*}}, -{{r.*}}, lsl #2]
Chris Lattnerbaf21992007-04-03 00:13:16 +000031 icmp eq i32 %i, 0 ; <i1>:0 [#uses=1]
32 br i1 %0, label %return, label %bb
33
34bb: ; preds = %bb, %entry
35 %indvar = phi i32 [ 0, %entry ], [ %indvar.next, %bb ] ; <i32> [#uses=2]
36 %i_addr.09.0 = sub i32 %i, %indvar ; <i32> [#uses=1]
37 %tmp2 = getelementptr i32* %P, i32 %i_addr.09.0 ; <i32*> [#uses=1]
38 store i32 %A, i32* %tmp2
Dan Gohman572645c2010-02-12 10:34:29 +000039 store i32 %indvar, i32* null
Chris Lattnerbaf21992007-04-03 00:13:16 +000040 %indvar.next = add i32 %indvar, 1 ; <i32> [#uses=2]
41 icmp eq i32 %indvar.next, %i ; <i1>:1 [#uses=1]
42 br i1 %1, label %return, label %bb
43
44return: ; preds = %bb, %entry
45 ret void
46}
47