1; RUN: opt -S -indvars < %s | FileCheck %s
2
3target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
4target triple = "x86_64-apple-macosx10.11.0"
5
6; SCEVExpander would try to RAUW %val_2 with %c.lcssa, breaking "def
7; dominates uses".
8
9define void @pr27232(i32 %val) {
10; CHECK-LABEL: @pr27232(
11entry:
12  br i1 undef, label %loop_0.cond, label %for.body.us
13
14for.body.us:
15  br label %loop_0.cond
16
17loop_0.cond:
18  %val_2 = phi i32 [ %val, %for.body.us ], [ undef, %entry ]
19  br i1 true, label %loop_0.ph, label %loop_1.ph
20
21loop_0.ph:
22  br label %loop_0
23
24loop_1.exit:
25  br label %loop_1.ph
26
27loop_1.ph:
28  %c.lcssa = phi i32 [ 0, %loop_0.cond ], [ %val_2, %loop_1.exit ]
29  br label %loop_1
30
31loop_0:
32  br i1 undef, label %loop_0, label %loop_1.exit
33
34loop_1:
35  %d.1 = phi i32 [ %c.lcssa, %loop_1 ], [ %val_2, %loop_1.ph ]
36  %t.1 = phi i32 [ %val_2, %loop_1 ], [ %c.lcssa, %loop_1.ph ]
37  br i1 undef, label %leave, label %loop_1
38
39leave:
40  ret void
41}
42
43
44; @ReplaceArg_0 and @ReplaceArg_1 used to trigger a failed cast<>
45; assertion in SCEVExpander.
46
47define void @ReplaceArg_0(i32 %val) {
48; CHECK-LABEL: @ReplaceArg_0(
49entry:
50  br i1 undef, label %loop_0.cond, label %for.body.us
51
52for.body.us:
53  br label %loop_0.cond
54
55loop_0.cond:
56  br i1 true, label %loop_0.ph, label %loop_1.ph
57
58loop_0.ph:
59  br label %loop_0
60
61loop_1.exit:
62  br label %loop_1.ph
63
64loop_1.ph:
65  %c.lcssa = phi i32 [ 0, %loop_0.cond ], [ %val, %loop_1.exit ]
66  br label %loop_1
67
68loop_0:
69  br i1 undef, label %loop_0, label %loop_1.exit
70
71loop_1:
72  %d.1 = phi i32 [ %c.lcssa, %loop_1 ], [ %val, %loop_1.ph ]
73  %t.1 = phi i32 [ %val, %loop_1 ], [ %c.lcssa, %loop_1.ph ]
74  br i1 undef, label %leave, label %loop_1
75
76leave:
77  ret void
78}
79
80define void @ReplaceArg_1(i32 %val) {
81; CHECK-LABEL: @ReplaceArg_1(
82entry:
83  br i1 undef, label %loop_0.cond, label %for.body.us
84
85for.body.us:
86  br label %loop_0.cond
87
88loop_0.cond:
89  br i1 true, label %loop_0.ph, label %loop_1.ph
90
91loop_0.ph:
92  br label %loop_0
93
94loop_1.exit:
95  br label %loop_1.ph
96
97loop_1.ph:
98  %c.lcssa = phi i32 [ 0, %loop_0.cond ], [ %val, %loop_1.exit ]
99  br label %loop_1
100
101loop_0:
102  br i1 undef, label %loop_0, label %loop_1.exit
103
104loop_1:
105  %t.1 = phi i32 [ %val, %loop_1 ], [ %c.lcssa, %loop_1.ph ]
106  %d.1 = phi i32 [ %c.lcssa, %loop_1 ], [ %val, %loop_1.ph ]
107  br i1 undef, label %leave, label %loop_1
108
109leave:
110  ret void
111}
112