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