blob: 299c18c871e81551df3a3763db32527e78f93e9f [file] [log] [blame]
Dmitri Gribenkob137c9e2012-12-30 01:28:40 +00001; RUN: opt -S -loop-rotate < %s | FileCheck %s
Daniel Jasperaec2fa32016-12-19 08:22:17 +00002; RUN: opt -S -passes='require<targetir>,require<assumptions>,loop(rotate)' < %s | FileCheck %s
Justin Bognerd0d23412016-05-03 22:02:31 +00003
Chris Lattnerb01c24a2010-09-06 01:10:22 +00004target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
5target triple = "x86_64-apple-darwin10.0.0"
6
7; PR5319 - The "arrayidx" gep should be hoisted, not duplicated. We should
8; end up with one phi node.
9define void @test1() nounwind ssp {
Stephen Linc1c7a132013-07-14 01:42:54 +000010; CHECK-LABEL: @test1(
Chris Lattnerb01c24a2010-09-06 01:10:22 +000011entry:
12 %array = alloca [20 x i32], align 16
13 br label %for.cond
14
15for.cond: ; preds = %for.body, %entry
16 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
17 %cmp = icmp slt i32 %i.0, 100
David Blaikie79e6c742015-02-27 19:29:02 +000018 %arrayidx = getelementptr inbounds [20 x i32], [20 x i32]* %array, i64 0, i64 0
Chris Lattnerb01c24a2010-09-06 01:10:22 +000019 br i1 %cmp, label %for.body, label %for.end
20
21; CHECK: for.body:
22; CHECK-NEXT: phi i32 [ 0
23; CHECK-NEXT: store i32 0
24
25for.body: ; preds = %for.cond
26 store i32 0, i32* %arrayidx, align 16
27 %inc = add nsw i32 %i.0, 1
28 br label %for.cond
29
30for.end: ; preds = %for.cond
31 %arrayidx.lcssa = phi i32* [ %arrayidx, %for.cond ]
32 call void @g(i32* %arrayidx.lcssa) nounwind
33 ret void
34}
35
36declare void @g(i32*)
37
Stephen Linc1c7a132013-07-14 01:42:54 +000038; CHECK-LABEL: @test2(
James Molloy4f6fb952012-12-20 16:04:27 +000039define void @test2() nounwind ssp {
40entry:
41 %array = alloca [20 x i32], align 16
42 br label %for.cond
43
44for.cond: ; preds = %for.body, %entry
45 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
46 %cmp = icmp slt i32 %i.0, 100
47; CHECK: call void @f
48; CHECK-NOT: call void @f
49 call void @f() noduplicate
50 br i1 %cmp, label %for.body, label %for.end
51
52for.body: ; preds = %for.cond
53 %inc = add nsw i32 %i.0, 1
54 call void @h()
55 br label %for.cond
56
57for.end: ; preds = %for.cond
58 ret void
59; CHECK: }
60}
61
62declare void @f() noduplicate
63declare void @h()