19cd68bfaSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*8ebb3eacSBjorn Pettersson; RUN: opt %s -passes=ipsccp -S | FileCheck %s 39cd68bfaSFlorian Hahn 49cd68bfaSFlorian Hahndeclare i1 @cond() 59cd68bfaSFlorian Hahndeclare void @use(i1) 69cd68bfaSFlorian Hahn 79cd68bfaSFlorian Hahndefine internal {i64, i64} @struct1() { 89cd68bfaSFlorian Hahn; CHECK-LABEL: @struct1( 99cd68bfaSFlorian Hahn; CHECK-NEXT: [[C:%.*]] = call i1 @cond() 109cd68bfaSFlorian Hahn; CHECK-NEXT: br i1 [[C]], label [[TRUE:%.*]], label [[FALSE:%.*]] 119cd68bfaSFlorian Hahn; CHECK: true: 129cd68bfaSFlorian Hahn; CHECK-NEXT: br label [[EXIT:%.*]] 139cd68bfaSFlorian Hahn; CHECK: false: 149cd68bfaSFlorian Hahn; CHECK-NEXT: br label [[EXIT]] 159cd68bfaSFlorian Hahn; CHECK: exit: 169cd68bfaSFlorian Hahn; CHECK-NEXT: [[R:%.*]] = phi { i64, i64 } [ { i64 20, i64 200 }, [[TRUE]] ], [ { i64 30, i64 300 }, [[FALSE]] ] 179cd68bfaSFlorian Hahn; CHECK-NEXT: ret { i64, i64 } [[R]] 189cd68bfaSFlorian Hahn; 199cd68bfaSFlorian Hahn %c = call i1 @cond() 209cd68bfaSFlorian Hahn br i1 %c, label %true, label %false 219cd68bfaSFlorian Hahn 229cd68bfaSFlorian Hahntrue: 239cd68bfaSFlorian Hahn %s.1 = insertvalue {i64, i64} undef, i64 20, 0 249cd68bfaSFlorian Hahn %s.2 = insertvalue {i64, i64} %s.1, i64 200, 1 259cd68bfaSFlorian Hahn br label %exit 269cd68bfaSFlorian Hahn 279cd68bfaSFlorian Hahnfalse: 289cd68bfaSFlorian Hahn %s.3 = insertvalue {i64, i64} undef, i64 30, 0 299cd68bfaSFlorian Hahn %s.4 = insertvalue {i64, i64} %s.3, i64 300, 1 309cd68bfaSFlorian Hahn br label %exit 319cd68bfaSFlorian Hahn 329cd68bfaSFlorian Hahnexit: 339cd68bfaSFlorian Hahn %r = phi {i64, i64} [ %s.2, %true], [ %s.4, %false ] 349cd68bfaSFlorian Hahn ret {i64, i64} %r 359cd68bfaSFlorian Hahn} 369cd68bfaSFlorian Hahn 379cd68bfaSFlorian Hahndefine void @struct1_caller() { 389cd68bfaSFlorian Hahn; CHECK-LABEL: @struct1_caller( 399cd68bfaSFlorian Hahn; CHECK-NEXT: [[S:%.*]] = call { i64, i64 } @struct1() 409cd68bfaSFlorian Hahn; CHECK-NEXT: [[V1:%.*]] = extractvalue { i64, i64 } [[S]], 0 419cd68bfaSFlorian Hahn; CHECK-NEXT: [[V2:%.*]] = extractvalue { i64, i64 } [[S]], 1 429cd68bfaSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ne i64 [[V1]], 10 439cd68bfaSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_1]]) 449cd68bfaSFlorian Hahn; CHECK-NEXT: [[T_2:%.*]] = icmp ult i64 [[V1]], 100 459cd68bfaSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_2]]) 469cd68bfaSFlorian Hahn; CHECK-NEXT: [[T_3:%.*]] = icmp ne i64 [[V2]], 0 479cd68bfaSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_3]]) 489cd68bfaSFlorian Hahn; CHECK-NEXT: [[T_4:%.*]] = icmp ult i64 [[V2]], 301 499cd68bfaSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_4]]) 509cd68bfaSFlorian Hahn; CHECK-NEXT: ret void 519cd68bfaSFlorian Hahn; 529cd68bfaSFlorian Hahn %s = call {i64, i64} @struct1() 539cd68bfaSFlorian Hahn %v1 = extractvalue {i64, i64} %s, 0 549cd68bfaSFlorian Hahn %v2 = extractvalue {i64, i64} %s, 1 559cd68bfaSFlorian Hahn 569cd68bfaSFlorian Hahn %t.1 = icmp ne i64 %v1, 10 579cd68bfaSFlorian Hahn call void @use(i1 %t.1) 589cd68bfaSFlorian Hahn %t.2 = icmp ult i64 %v1, 100 599cd68bfaSFlorian Hahn call void @use(i1 %t.2) 609cd68bfaSFlorian Hahn %t.3 = icmp ne i64 %v2, 0 619cd68bfaSFlorian Hahn call void @use(i1 %t.3) 629cd68bfaSFlorian Hahn %t.4 = icmp ult i64 %v2, 301 639cd68bfaSFlorian Hahn call void @use(i1 %t.4) 649cd68bfaSFlorian Hahn 659cd68bfaSFlorian Hahn ret void 669cd68bfaSFlorian Hahn} 679cd68bfaSFlorian Hahn 689cd68bfaSFlorian Hahndefine internal {i64, i64} @struct2() { 699cd68bfaSFlorian Hahn; CHECK-LABEL: @struct2( 709cd68bfaSFlorian Hahn; CHECK-NEXT: [[C:%.*]] = call i1 @cond() 719cd68bfaSFlorian Hahn; CHECK-NEXT: br i1 [[C]], label [[TRUE:%.*]], label [[FALSE:%.*]] 729cd68bfaSFlorian Hahn; CHECK: true: 739cd68bfaSFlorian Hahn; CHECK-NEXT: br label [[EXIT:%.*]] 749cd68bfaSFlorian Hahn; CHECK: false: 759cd68bfaSFlorian Hahn; CHECK-NEXT: br label [[EXIT]] 769cd68bfaSFlorian Hahn; CHECK: exit: 779cd68bfaSFlorian Hahn; CHECK-NEXT: [[V1:%.*]] = phi i64 [ 20, [[TRUE]] ], [ 30, [[FALSE]] ] 789cd68bfaSFlorian Hahn; CHECK-NEXT: [[V2:%.*]] = phi i64 [ 200, [[TRUE]] ], [ 300, [[FALSE]] ] 799cd68bfaSFlorian Hahn; CHECK-NEXT: [[S_1:%.*]] = insertvalue { i64, i64 } undef, i64 [[V1]], 0 809cd68bfaSFlorian Hahn; CHECK-NEXT: [[S_2:%.*]] = insertvalue { i64, i64 } [[S_1]], i64 [[V2]], 1 819cd68bfaSFlorian Hahn; CHECK-NEXT: ret { i64, i64 } [[S_2]] 829cd68bfaSFlorian Hahn; 839cd68bfaSFlorian Hahn %c = call i1 @cond() 849cd68bfaSFlorian Hahn br i1 %c, label %true, label %false 859cd68bfaSFlorian Hahn 869cd68bfaSFlorian Hahntrue: 879cd68bfaSFlorian Hahn br label %exit 889cd68bfaSFlorian Hahn 899cd68bfaSFlorian Hahnfalse: 909cd68bfaSFlorian Hahn br label %exit 919cd68bfaSFlorian Hahn 929cd68bfaSFlorian Hahnexit: 939cd68bfaSFlorian Hahn %v1 = phi i64 [ 20, %true ], [ 30, %false ] 949cd68bfaSFlorian Hahn %v2 = phi i64 [ 200, %true ], [ 300, %false ] 959cd68bfaSFlorian Hahn %s.1 = insertvalue {i64, i64} undef, i64 %v1, 0 969cd68bfaSFlorian Hahn %s.2 = insertvalue {i64, i64} %s.1, i64 %v2, 1 979cd68bfaSFlorian Hahn ret {i64, i64} %s.2 989cd68bfaSFlorian Hahn} 999cd68bfaSFlorian Hahn 1009cd68bfaSFlorian Hahndefine void @struct2_caller() { 1019cd68bfaSFlorian Hahn; CHECK-LABEL: @struct2_caller( 1029cd68bfaSFlorian Hahn; CHECK-NEXT: [[S:%.*]] = call { i64, i64 } @struct2() 1039cd68bfaSFlorian Hahn; CHECK-NEXT: [[V1:%.*]] = extractvalue { i64, i64 } [[S]], 0 1049cd68bfaSFlorian Hahn; CHECK-NEXT: [[V2:%.*]] = extractvalue { i64, i64 } [[S]], 1 10501f999aeSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 10601f999aeSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 10701f999aeSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 10801f999aeSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 10901f999aeSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 11001f999aeSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 11101f999aeSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 11201f999aeSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 1139cd68bfaSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp eq i64 [[V1]], 25 1149cd68bfaSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_1]]) 1159cd68bfaSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ult i64 [[V1]], 25 1169cd68bfaSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_2]]) 1179cd68bfaSFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp eq i64 [[V2]], 250 1189cd68bfaSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 1199cd68bfaSFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i64 [[V2]], 250 1209cd68bfaSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 1219cd68bfaSFlorian Hahn; CHECK-NEXT: ret void 1229cd68bfaSFlorian Hahn; 1239cd68bfaSFlorian Hahn %s = call {i64, i64} @struct2() 1249cd68bfaSFlorian Hahn %v1 = extractvalue {i64, i64} %s, 0 1259cd68bfaSFlorian Hahn %v2 = extractvalue {i64, i64} %s, 1 1269cd68bfaSFlorian Hahn 1279cd68bfaSFlorian Hahn %t.1 = icmp ne i64 %v1, 10 1289cd68bfaSFlorian Hahn call void @use(i1 %t.1) 1299cd68bfaSFlorian Hahn %t.2 = icmp ult i64 %v1, 100 1309cd68bfaSFlorian Hahn call void @use(i1 %t.2) 1319cd68bfaSFlorian Hahn %t.3 = icmp ne i64 %v2, 0 1329cd68bfaSFlorian Hahn call void @use(i1 %t.3) 1339cd68bfaSFlorian Hahn %t.4 = icmp ult i64 %v2, 301 1349cd68bfaSFlorian Hahn call void @use(i1 %t.4) 1359cd68bfaSFlorian Hahn 1369cd68bfaSFlorian Hahn %f.1 = icmp eq i64 %v1, 10 1379cd68bfaSFlorian Hahn call void @use(i1 %f.1) 1389cd68bfaSFlorian Hahn %f.2 = icmp ult i64 %v1, 19 1399cd68bfaSFlorian Hahn call void @use(i1 %f.2) 1409cd68bfaSFlorian Hahn %f.3 = icmp eq i64 %v2, 50 1419cd68bfaSFlorian Hahn call void @use(i1 %f.3) 1429cd68bfaSFlorian Hahn %f.4 = icmp ugt i64 %v2, 301 1439cd68bfaSFlorian Hahn call void @use(i1 %f.4) 1449cd68bfaSFlorian Hahn 1459cd68bfaSFlorian Hahn %c.1 = icmp eq i64 %v1, 25 1469cd68bfaSFlorian Hahn call void @use(i1 %c.1) 1479cd68bfaSFlorian Hahn %c.2 = icmp ult i64 %v1, 25 1489cd68bfaSFlorian Hahn call void @use(i1 %c.2) 1499cd68bfaSFlorian Hahn %c.3 = icmp eq i64 %v2, 250 1509cd68bfaSFlorian Hahn call void @use(i1 %c.3) 1519cd68bfaSFlorian Hahn %c.4 = icmp ugt i64 %v2, 250 1529cd68bfaSFlorian Hahn call void @use(i1 %c.4) 1539cd68bfaSFlorian Hahn 1549cd68bfaSFlorian Hahn ret void 1559cd68bfaSFlorian Hahn} 156