LSR critical edge splitting fix for PR13756.
[oota-llvm.git] / test / Transforms / LoopStrengthReduce / 2008-08-14-ShadowIV.ll
1 ; RUN: opt < %s -loop-reduce -S | grep "phi double" | count 1
2
3 define void @foobar(i32 %n) nounwind {
4 entry:
5         icmp eq i32 %n, 0               ; <i1>:0 [#uses=2]
6         br i1 %0, label %return, label %bb.nph
7
8 bb.nph:         ; preds = %entry
9         %umax = select i1 %0, i32 1, i32 %n             ; <i32> [#uses=1]
10         br label %bb
11
12 bb:             ; preds = %bb, %bb.nph
13         %i.03 = phi i32 [ 0, %bb.nph ], [ %indvar.next, %bb ]           ; <i32> [#uses=3]
14         tail call void @bar( i32 %i.03 ) nounwind
15         uitofp i32 %i.03 to double              ; <double>:1 [#uses=1]
16         tail call void @foo( double %1 ) nounwind
17         %indvar.next = add i32 %i.03, 1         ; <i32> [#uses=2]
18         %exitcond = icmp eq i32 %indvar.next, %umax             ; <i1> [#uses=1]
19         br i1 %exitcond, label %return, label %bb
20
21 return:         ; preds = %bb, %entry
22         ret void
23 }
24
25 ; Unable to eliminate cast because the mantissa bits for double are not enough
26 ; to hold all of i64 IV bits.
27 define void @foobar2(i64 %n) nounwind {
28 entry:
29         icmp eq i64 %n, 0               ; <i1>:0 [#uses=2]
30         br i1 %0, label %return, label %bb.nph
31
32 bb.nph:         ; preds = %entry
33         %umax = select i1 %0, i64 1, i64 %n             ; <i64> [#uses=1]
34         br label %bb
35
36 bb:             ; preds = %bb, %bb.nph
37         %i.03 = phi i64 [ 0, %bb.nph ], [ %indvar.next, %bb ]           ; <i64> [#uses=3]
38         trunc i64 %i.03 to i32          ; <i32>:1 [#uses=1]
39         tail call void @bar( i32 %1 ) nounwind
40         uitofp i64 %i.03 to double              ; <double>:2 [#uses=1]
41         tail call void @foo( double %2 ) nounwind
42         %indvar.next = add i64 %i.03, 1         ; <i64> [#uses=2]
43         %exitcond = icmp eq i64 %indvar.next, %umax             ; <i1> [#uses=1]
44         br i1 %exitcond, label %return, label %bb
45
46 return:         ; preds = %bb, %entry
47         ret void
48 }
49
50 ; Unable to eliminate cast due to potentional overflow.
51 define void @foobar3() nounwind {
52 entry:
53         tail call i32 (...)* @nn( ) nounwind            ; <i32>:0 [#uses=1]
54         icmp eq i32 %0, 0               ; <i1>:1 [#uses=1]
55         br i1 %1, label %return, label %bb
56
57 bb:             ; preds = %bb, %entry
58         %i.03 = phi i32 [ 0, %entry ], [ %3, %bb ]              ; <i32> [#uses=3]
59         tail call void @bar( i32 %i.03 ) nounwind
60         uitofp i32 %i.03 to double              ; <double>:2 [#uses=1]
61         tail call void @foo( double %2 ) nounwind
62         add i32 %i.03, 1                ; <i32>:3 [#uses=2]
63         tail call i32 (...)* @nn( ) nounwind            ; <i32>:4 [#uses=1]
64         icmp ugt i32 %4, %3             ; <i1>:5 [#uses=1]
65         br i1 %5, label %bb, label %return
66
67 return:         ; preds = %bb, %entry
68         ret void
69 }
70
71 ; Unable to eliminate cast due to overflow.
72 define void @foobar4() nounwind {
73 entry:
74         br label %bb.nph
75
76 bb.nph:         ; preds = %entry
77         br label %bb
78
79 bb:             ; preds = %bb, %bb.nph
80         %i.03 = phi i8 [ 0, %bb.nph ], [ %indvar.next, %bb ]            ; <i32> [#uses=3]
81         %tmp2 = sext i8 %i.03 to i32            ; <i32>:0 [#uses=1]
82         tail call void @bar( i32 %tmp2 ) nounwind
83         %tmp3 = uitofp i8 %i.03 to double               ; <double>:1 [#uses=1]
84         tail call void @foo( double %tmp3 ) nounwind
85         %indvar.next = add i8 %i.03, 1          ; <i32> [#uses=2]
86         %tmp = sext i8 %indvar.next to i32
87         %exitcond = icmp eq i32 %tmp, 32767             ; <i1> [#uses=1]
88         br i1 %exitcond, label %return, label %bb
89
90 return:         ; preds = %bb, %entry
91         ret void
92 }
93
94 declare void @bar(i32)
95
96 declare void @foo(double)
97
98 declare i32 @nn(...)
99