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