xref: /aosp_15_r20/external/llvm/test/Transforms/JumpThreading/phi-eq.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -jump-threading -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; Test whether two consecutive switches with identical structures assign the
3*9880d681SAndroid Build Coastguard Worker; proper value to the proper variable.  This is really testing
4*9880d681SAndroid Build Coastguard Worker; Instruction::isIdenticalToWhenDefined, as previously that function was
5*9880d681SAndroid Build Coastguard Worker; returning true if the value part of the operands of two phis were identical,
6*9880d681SAndroid Build Coastguard Worker; even if the incoming blocks were not.
7*9880d681SAndroid Build Coastguard Worker; NB: this function should be pruned down more.
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker%struct._GList = type { i8*, %struct._GList*, %struct._GList* }
10*9880d681SAndroid Build Coastguard Worker%struct.filter_def = type { i8*, i8* }
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker@capture_filters = external hidden global %struct._GList*, align 8
13*9880d681SAndroid Build Coastguard Worker@display_filters = external hidden global %struct._GList*, align 8
14*9880d681SAndroid Build Coastguard Worker@.str2 = external hidden unnamed_addr constant [10 x i8], align 1
15*9880d681SAndroid Build Coastguard Worker@__PRETTY_FUNCTION__.copy_filter_list = external hidden unnamed_addr constant [62 x i8], align 1
16*9880d681SAndroid Build Coastguard Worker@.str12 = external hidden unnamed_addr constant [22 x i8], align 1
17*9880d681SAndroid Build Coastguard Worker@.str13 = external hidden unnamed_addr constant [31 x i8], align 1
18*9880d681SAndroid Build Coastguard Worker@capture_edited_filters = external hidden global %struct._GList*, align 8
19*9880d681SAndroid Build Coastguard Worker@display_edited_filters = external hidden global %struct._GList*, align 8
20*9880d681SAndroid Build Coastguard Worker@__PRETTY_FUNCTION__.get_filter_list = external hidden unnamed_addr constant [44 x i8], align 1
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Workerdeclare void @g_assertion_message(i8*, i8*, i32, i8*, i8*) noreturn
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Workerdeclare void @g_free(i8*)
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Workerdeclare %struct._GList* @g_list_first(%struct._GList*)
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerdeclare noalias i8* @g_malloc(i64)
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Workerdefine void @copy_filter_list(i32 %dest_type, i32 %src_type) nounwind uwtable ssp {
31*9880d681SAndroid Build Coastguard Workerentry:
32*9880d681SAndroid Build Coastguard Worker  br label %do.body
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workerdo.body:                                          ; preds = %entry
35*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %dest_type, %src_type
36*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.else
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %do.body
39*9880d681SAndroid Build Coastguard Worker  br label %if.end
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerif.else:                                          ; preds = %do.body
42*9880d681SAndroid Build Coastguard Worker  call void @g_assertion_message_expr(i8* null, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str2, i32 0, i32 0), i32 581, i8* getelementptr inbounds ([62 x i8], [62 x i8]* @__PRETTY_FUNCTION__.copy_filter_list, i32 0, i32 0), i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str12, i32 0, i32 0)) noreturn
43*9880d681SAndroid Build Coastguard Worker  unreachable
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %if.then
46*9880d681SAndroid Build Coastguard Worker  br label %do.end
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Workerdo.end:                                           ; preds = %if.end
49*9880d681SAndroid Build Coastguard Worker  switch i32 %dest_type, label %sw.default.i [
50*9880d681SAndroid Build Coastguard Worker    i32 0, label %sw.bb.i
51*9880d681SAndroid Build Coastguard Worker    i32 1, label %sw.bb1.i
52*9880d681SAndroid Build Coastguard Worker    i32 2, label %sw.bb2.i
53*9880d681SAndroid Build Coastguard Worker    i32 3, label %sw.bb3.i
54*9880d681SAndroid Build Coastguard Worker  ]
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workersw.bb.i:                                          ; preds = %do.end
57*9880d681SAndroid Build Coastguard Worker  br label %get_filter_list.exit
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workersw.bb1.i:                                         ; preds = %do.end
60*9880d681SAndroid Build Coastguard Worker  br label %get_filter_list.exit
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Workersw.bb2.i:                                         ; preds = %do.end
63*9880d681SAndroid Build Coastguard Worker  br label %get_filter_list.exit
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workersw.bb3.i:                                         ; preds = %do.end
66*9880d681SAndroid Build Coastguard Worker  br label %get_filter_list.exit
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workersw.default.i:                                     ; preds = %do.end
69*9880d681SAndroid Build Coastguard Worker  call void @g_assertion_message(i8* null, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str2, i32 0, i32 0), i32 408, i8* getelementptr inbounds ([44 x i8], [44 x i8]* @__PRETTY_FUNCTION__.get_filter_list, i32 0, i32 0), i8* null) noreturn nounwind
70*9880d681SAndroid Build Coastguard Worker  unreachable
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerget_filter_list.exit:                             ; preds = %sw.bb3.i, %sw.bb2.i, %sw.bb1.i, %sw.bb.i
73*9880d681SAndroid Build Coastguard Worker  %0 = phi %struct._GList** [ @display_edited_filters, %sw.bb3.i ], [ @capture_edited_filters, %sw.bb2.i ], [ @display_filters, %sw.bb1.i ], [ @capture_filters, %sw.bb.i ]
74*9880d681SAndroid Build Coastguard Worker  switch i32 %src_type, label %sw.default.i5 [
75*9880d681SAndroid Build Coastguard Worker    i32 0, label %sw.bb.i1
76*9880d681SAndroid Build Coastguard Worker    i32 1, label %sw.bb1.i2
77*9880d681SAndroid Build Coastguard Worker    i32 2, label %sw.bb2.i3
78*9880d681SAndroid Build Coastguard Worker    i32 3, label %sw.bb3.i4
79*9880d681SAndroid Build Coastguard Worker  ]
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Workersw.bb.i1:                                         ; preds = %get_filter_list.exit
82*9880d681SAndroid Build Coastguard Worker  br label %get_filter_list.exit6
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Workersw.bb1.i2:                                        ; preds = %get_filter_list.exit
85*9880d681SAndroid Build Coastguard Worker  br label %get_filter_list.exit6
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Workersw.bb2.i3:                                        ; preds = %get_filter_list.exit
88*9880d681SAndroid Build Coastguard Worker  br label %get_filter_list.exit6
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Workersw.bb3.i4:                                        ; preds = %get_filter_list.exit
91*9880d681SAndroid Build Coastguard Worker  br label %get_filter_list.exit6
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Workersw.default.i5:                                    ; preds = %get_filter_list.exit
94*9880d681SAndroid Build Coastguard Worker  call void @g_assertion_message(i8* null, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str2, i32 0, i32 0), i32 408, i8* getelementptr inbounds ([44 x i8], [44 x i8]* @__PRETTY_FUNCTION__.get_filter_list, i32 0, i32 0), i8* null) noreturn nounwind
95*9880d681SAndroid Build Coastguard Worker  unreachable
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Worker; CHECK: get_filter_list.exit
98*9880d681SAndroid Build Coastguard Workerget_filter_list.exit6:                            ; preds = %sw.bb3.i4, %sw.bb2.i3, %sw.bb1.i2, %sw.bb.i1
99*9880d681SAndroid Build Coastguard Worker  %1 = phi %struct._GList** [ @display_edited_filters, %sw.bb3.i4 ], [ @capture_edited_filters, %sw.bb2.i3 ], [ @display_filters, %sw.bb1.i2 ], [ @capture_filters, %sw.bb.i1 ]
100*9880d681SAndroid Build Coastguard Worker; CHECK: %2 = load
101*9880d681SAndroid Build Coastguard Worker  %2 = load %struct._GList*, %struct._GList** %1, align 8
102*9880d681SAndroid Build Coastguard Worker; We should have jump-threading insert an additional load here for the value
103*9880d681SAndroid Build Coastguard Worker; coming out of the first switch, which is picked up by a subsequent phi
104*9880d681SAndroid Build Coastguard Worker; CHECK: %.pr = load %struct._GList*, %struct._GList** %0
105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  br label %while.cond
106*9880d681SAndroid Build Coastguard Worker  br label %while.cond
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Worker; CHECK: while.cond
109*9880d681SAndroid Build Coastguard Workerwhile.cond:                                       ; preds = %while.body, %get_filter_list.exit6
110*9880d681SAndroid Build Coastguard Worker; CHECK: {{= phi .*%.pr}}
111*9880d681SAndroid Build Coastguard Worker  %3 = load %struct._GList*, %struct._GList** %0, align 8
112*9880d681SAndroid Build Coastguard Worker; CHECK: tobool
113*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne %struct._GList* %3, null
114*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %while.body, label %while.end
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Workerwhile.body:                                       ; preds = %while.cond
117*9880d681SAndroid Build Coastguard Worker  %4 = load %struct._GList*, %struct._GList** %0, align 8
118*9880d681SAndroid Build Coastguard Worker  %5 = load %struct._GList*, %struct._GList** %0, align 8
119*9880d681SAndroid Build Coastguard Worker  %call2 = call %struct._GList* @g_list_first(%struct._GList* %5)
120*9880d681SAndroid Build Coastguard Worker  %data.i = getelementptr inbounds %struct._GList, %struct._GList* %call2, i32 0, i32 0
121*9880d681SAndroid Build Coastguard Worker  %6 = load i8*, i8** %data.i, align 8
122*9880d681SAndroid Build Coastguard Worker  %7 = bitcast i8* %6 to %struct.filter_def*
123*9880d681SAndroid Build Coastguard Worker  %name.i = getelementptr inbounds %struct.filter_def, %struct.filter_def* %7, i32 0, i32 0
124*9880d681SAndroid Build Coastguard Worker  %8 = load i8*, i8** %name.i, align 8
125*9880d681SAndroid Build Coastguard Worker  call void @g_free(i8* %8) nounwind
126*9880d681SAndroid Build Coastguard Worker  %strval.i = getelementptr inbounds %struct.filter_def, %struct.filter_def* %7, i32 0, i32 1
127*9880d681SAndroid Build Coastguard Worker  %9 = load i8*, i8** %strval.i, align 8
128*9880d681SAndroid Build Coastguard Worker  call void @g_free(i8* %9) nounwind
129*9880d681SAndroid Build Coastguard Worker  %10 = bitcast %struct.filter_def* %7 to i8*
130*9880d681SAndroid Build Coastguard Worker  call void @g_free(i8* %10) nounwind
131*9880d681SAndroid Build Coastguard Worker  %call.i = call %struct._GList* @g_list_remove_link(%struct._GList* %4, %struct._GList* %call2) nounwind
132*9880d681SAndroid Build Coastguard Worker  store %struct._GList* %call.i, %struct._GList** %0, align 8
133*9880d681SAndroid Build Coastguard Worker  br label %while.cond
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Workerwhile.end:                                        ; preds = %while.cond
136*9880d681SAndroid Build Coastguard Worker  br label %do.body4
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Workerdo.body4:                                         ; preds = %while.end
139*9880d681SAndroid Build Coastguard Worker  %11 = load %struct._GList*, %struct._GList** %0, align 8
140*9880d681SAndroid Build Coastguard Worker  %call5 = call i32 @g_list_length(%struct._GList* %11)
141*9880d681SAndroid Build Coastguard Worker  %cmp6 = icmp eq i32 %call5, 0
142*9880d681SAndroid Build Coastguard Worker  br i1 %cmp6, label %if.then7, label %if.else8
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Workerif.then7:                                         ; preds = %do.body4
145*9880d681SAndroid Build Coastguard Worker  br label %if.end9
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Workerif.else8:                                         ; preds = %do.body4
148*9880d681SAndroid Build Coastguard Worker  call void @g_assertion_message_expr(i8* null, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str2, i32 0, i32 0), i32 600, i8* getelementptr inbounds ([62 x i8], [62 x i8]* @__PRETTY_FUNCTION__.copy_filter_list, i32 0, i32 0), i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str13, i32 0, i32 0)) noreturn
149*9880d681SAndroid Build Coastguard Worker  unreachable
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Workerif.end9:                                          ; preds = %if.then7
152*9880d681SAndroid Build Coastguard Worker  br label %do.end10
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Workerdo.end10:                                         ; preds = %if.end9
155*9880d681SAndroid Build Coastguard Worker  br label %while.cond11
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Workerwhile.cond11:                                     ; preds = %cond.end, %do.end10
158*9880d681SAndroid Build Coastguard Worker  %cond10 = phi %struct._GList* [ %cond, %cond.end ], [ %2, %do.end10 ]
159*9880d681SAndroid Build Coastguard Worker  %tobool12 = icmp ne %struct._GList* %cond10, null
160*9880d681SAndroid Build Coastguard Worker  br i1 %tobool12, label %while.body13, label %while.end16
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Workerwhile.body13:                                     ; preds = %while.cond11
163*9880d681SAndroid Build Coastguard Worker  %data = getelementptr inbounds %struct._GList, %struct._GList* %cond10, i32 0, i32 0
164*9880d681SAndroid Build Coastguard Worker  %12 = load i8*, i8** %data, align 8
165*9880d681SAndroid Build Coastguard Worker  %13 = bitcast i8* %12 to %struct.filter_def*
166*9880d681SAndroid Build Coastguard Worker  %14 = load %struct._GList*, %struct._GList** %0, align 8
167*9880d681SAndroid Build Coastguard Worker  %name = getelementptr inbounds %struct.filter_def, %struct.filter_def* %13, i32 0, i32 0
168*9880d681SAndroid Build Coastguard Worker  %15 = load i8*, i8** %name, align 8
169*9880d681SAndroid Build Coastguard Worker  %strval = getelementptr inbounds %struct.filter_def, %struct.filter_def* %13, i32 0, i32 1
170*9880d681SAndroid Build Coastguard Worker  %16 = load i8*, i8** %strval, align 8
171*9880d681SAndroid Build Coastguard Worker  %call.i7 = call noalias i8* @g_malloc(i64 16) nounwind
172*9880d681SAndroid Build Coastguard Worker  %17 = bitcast i8* %call.i7 to %struct.filter_def*
173*9880d681SAndroid Build Coastguard Worker  %call1.i = call noalias i8* @g_strdup(i8* %15) nounwind
174*9880d681SAndroid Build Coastguard Worker  %name.i8 = getelementptr inbounds %struct.filter_def, %struct.filter_def* %17, i32 0, i32 0
175*9880d681SAndroid Build Coastguard Worker  store i8* %call1.i, i8** %name.i8, align 8
176*9880d681SAndroid Build Coastguard Worker  %call2.i = call noalias i8* @g_strdup(i8* %16) nounwind
177*9880d681SAndroid Build Coastguard Worker  %strval.i9 = getelementptr inbounds %struct.filter_def, %struct.filter_def* %17, i32 0, i32 1
178*9880d681SAndroid Build Coastguard Worker  store i8* %call2.i, i8** %strval.i9, align 8
179*9880d681SAndroid Build Coastguard Worker  %18 = bitcast %struct.filter_def* %17 to i8*
180*9880d681SAndroid Build Coastguard Worker  %call3.i = call %struct._GList* @g_list_append(%struct._GList* %14, i8* %18) nounwind
181*9880d681SAndroid Build Coastguard Worker  store %struct._GList* %call3.i, %struct._GList** %0, align 8
182*9880d681SAndroid Build Coastguard Worker  %tobool15 = icmp ne %struct._GList* %cond10, null
183*9880d681SAndroid Build Coastguard Worker  br i1 %tobool15, label %cond.true, label %cond.false
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Workercond.true:                                        ; preds = %while.body13
186*9880d681SAndroid Build Coastguard Worker  %next = getelementptr inbounds %struct._GList, %struct._GList* %cond10, i32 0, i32 1
187*9880d681SAndroid Build Coastguard Worker  %19 = load %struct._GList*, %struct._GList** %next, align 8
188*9880d681SAndroid Build Coastguard Worker  br label %cond.end
189*9880d681SAndroid Build Coastguard Worker
190*9880d681SAndroid Build Coastguard Workercond.false:                                       ; preds = %while.body13
191*9880d681SAndroid Build Coastguard Worker  br label %cond.end
192*9880d681SAndroid Build Coastguard Worker
193*9880d681SAndroid Build Coastguard Workercond.end:                                         ; preds = %cond.false, %cond.true
194*9880d681SAndroid Build Coastguard Worker  %cond = phi %struct._GList* [ %19, %cond.true ], [ null, %cond.false ]
195*9880d681SAndroid Build Coastguard Worker  br label %while.cond11
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Workerwhile.end16:                                      ; preds = %while.cond11
198*9880d681SAndroid Build Coastguard Worker  ret void
199*9880d681SAndroid Build Coastguard Worker}
200*9880d681SAndroid Build Coastguard Worker
201*9880d681SAndroid Build Coastguard Workerdeclare void @g_assertion_message_expr(i8*, i8*, i32, i8*, i8*) noreturn
202*9880d681SAndroid Build Coastguard Worker
203*9880d681SAndroid Build Coastguard Workerdeclare i32 @g_list_length(%struct._GList*)
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Workerdeclare noalias i8* @g_strdup(i8*)
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Workerdeclare %struct._GList* @g_list_append(%struct._GList*, i8*)
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Workerdeclare %struct._GList* @g_list_remove_link(%struct._GList*, %struct._GList*)
210