1; RUN: opt -S -loop-rotate < %s | FileCheck %s
2target 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"
3target triple = "x86_64-apple-darwin10.0.0"
4
5; PR5319 - The "arrayidx" gep should be hoisted, not duplicated.  We should
6; end up with one phi node.
7define void @test1() nounwind ssp {
8; CHECK-LABEL: @test1(
9entry:
10  %array = alloca [20 x i32], align 16
11  br label %for.cond
12
13for.cond:                                         ; preds = %for.body, %entry
14  %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
15  %cmp = icmp slt i32 %i.0, 100
16  %arrayidx = getelementptr inbounds [20 x i32]* %array, i64 0, i64 0
17  br i1 %cmp, label %for.body, label %for.end
18
19; CHECK: for.body:
20; CHECK-NEXT: phi i32 [ 0
21; CHECK-NEXT: store i32 0
22
23for.body:                                         ; preds = %for.cond
24  store i32 0, i32* %arrayidx, align 16
25  %inc = add nsw i32 %i.0, 1
26  br label %for.cond
27
28for.end:                                          ; preds = %for.cond
29  %arrayidx.lcssa = phi i32* [ %arrayidx, %for.cond ]
30  call void @g(i32* %arrayidx.lcssa) nounwind
31  ret void
32}
33
34declare void @g(i32*)
35
36; CHECK-LABEL: @test2(
37define void @test2() nounwind ssp {
38entry:
39  %array = alloca [20 x i32], align 16
40  br label %for.cond
41
42for.cond:                                         ; preds = %for.body, %entry
43  %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
44  %cmp = icmp slt i32 %i.0, 100
45; CHECK: call void @f
46; CHECK-NOT: call void @f
47  call void @f() noduplicate
48  br i1 %cmp, label %for.body, label %for.end
49
50for.body:                                         ; preds = %for.cond
51  %inc = add nsw i32 %i.0, 1
52  call void @h()
53  br label %for.cond
54
55for.end:                                          ; preds = %for.cond
56  ret void
57; CHECK: }
58}
59
60declare void @f() noduplicate
61declare void @h()
62