blob: 56a6fedf81ef8a2ef9028d9d8993f30d1f2c34b2 [file] [log] [blame]
Krzysztof Parzyszek78cc36f2015-03-18 15:56:43 +00001; RUN: llc -march=hexagon -mcpu=hexagonv4 -no-phi-elim-live-out-early-exit \
2; RUN: < %s | FileCheck %s
Krzysztof Parzyszek9a278f12013-02-11 21:37:55 +00003; Check that we remove the compare and induction variable instructions
4; after generating hardware loops.
5; Bug 6685.
6
7; CHECK: loop0
Krzysztof Parzyszeka72fad92017-02-10 15:33:13 +00008; CHECK-NOT: r{{[0-9]+}} = add(r{{[0-9]+}},#-1)
Krzysztof Parzyszek9a278f12013-02-11 21:37:55 +00009; CHECK-NOT: cmp.eq
10; CHECK: endloop0
11
12define i32 @test1(i32* nocapture %b, i32 %n) nounwind readonly {
13entry:
14 %cmp1 = icmp sgt i32 %n, 0
15 br i1 %cmp1, label %for.body.preheader, label %for.end
16
17for.body.preheader:
18 br label %for.body
19
20for.body: ; preds = %for.body.preheader, %for.body
21 %sum.03 = phi i32 [ %add, %for.body ], [ 0, %for.body.preheader ]
22 %arrayidx.phi = phi i32* [ %arrayidx.inc, %for.body ], [ %b, %for.body.preheader ]
23 %i.02 = phi i32 [ %inc, %for.body ], [ 0, %for.body.preheader ]
David Blaikiea79ac142015-02-27 21:17:42 +000024 %0 = load i32, i32* %arrayidx.phi, align 4
Krzysztof Parzyszek9a278f12013-02-11 21:37:55 +000025 %add = add nsw i32 %0, %sum.03
26 %inc = add nsw i32 %i.02, 1
27 %exitcond = icmp eq i32 %inc, %n
David Blaikie79e6c742015-02-27 19:29:02 +000028 %arrayidx.inc = getelementptr i32, i32* %arrayidx.phi, i32 1
Krzysztof Parzyszek9a278f12013-02-11 21:37:55 +000029 br i1 %exitcond, label %for.end.loopexit, label %for.body
30
31for.end.loopexit:
32 br label %for.end
33
34for.end:
35 %sum.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.end.loopexit ]
36 ret i32 %sum.0.lcssa
37}
38
39; This test checks that that initial loop count value is removed.
40; CHECK-NOT: ={{.}}#40
41; CHECK: loop0
Krzysztof Parzyszeka72fad92017-02-10 15:33:13 +000042; CHECK-NOT: r{{[0-9]+}} = add(r{{[0-9]+}},#-1)
Krzysztof Parzyszek9a278f12013-02-11 21:37:55 +000043; CHECK-NOT: cmp.eq
44; CHECK: endloop0
45
46define i32 @test2(i32* nocapture %b) nounwind readonly {
47entry:
48 br label %for.body
49
50for.body:
51 %sum.02 = phi i32 [ 0, %entry ], [ %add, %for.body ]
52 %arrayidx.phi = phi i32* [ %b, %entry ], [ %arrayidx.inc, %for.body ]
53 %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
David Blaikiea79ac142015-02-27 21:17:42 +000054 %0 = load i32, i32* %arrayidx.phi, align 4
Krzysztof Parzyszek9a278f12013-02-11 21:37:55 +000055 %add = add nsw i32 %0, %sum.02
56 %inc = add nsw i32 %i.01, 1
57 %exitcond = icmp eq i32 %inc, 40
David Blaikie79e6c742015-02-27 19:29:02 +000058 %arrayidx.inc = getelementptr i32, i32* %arrayidx.phi, i32 1
Krzysztof Parzyszek9a278f12013-02-11 21:37:55 +000059 br i1 %exitcond, label %for.end, label %for.body
60
61for.end:
62 ret i32 %add
63}
64
65; This test checks that we don't remove the induction variable since it's used.
66; CHECK: loop0
Krzysztof Parzyszeka72fad92017-02-10 15:33:13 +000067; CHECK: r{{[0-9]+}} = add(r{{[0-9]+}},#1)
Krzysztof Parzyszek9a278f12013-02-11 21:37:55 +000068; CHECK-NOT: cmp.eq
69; CHECK: endloop0
70define i32 @test3(i32* nocapture %b) nounwind {
71entry:
72 br label %for.body
73
74for.body:
75 %arrayidx.phi = phi i32* [ %b, %entry ], [ %arrayidx.inc, %for.body ]
76 %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
77 store i32 %i.01, i32* %arrayidx.phi, align 4
78 %inc = add nsw i32 %i.01, 1
79 %exitcond = icmp eq i32 %inc, 40
David Blaikie79e6c742015-02-27 19:29:02 +000080 %arrayidx.inc = getelementptr i32, i32* %arrayidx.phi, i32 1
Krzysztof Parzyszek9a278f12013-02-11 21:37:55 +000081 br i1 %exitcond, label %for.end, label %for.body
82
83for.end:
84 ret i32 0
85}
86
87