1a3f55b026fc24db6a4e275a8e4110d071122b99dRafael Espindola// RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o - | FileCheck %s 2fda0f1f5a278548b012401be07e287c1697fc41cChris Lattner 33858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// PR9322 and rdar://6970405 43858938b043bac2f046304ff99a54905acdcc6ddChris Lattner 5fda0f1f5a278548b012401be07e287c1697fc41cChris Lattner// CHECK: @test1 6fda0f1f5a278548b012401be07e287c1697fc41cChris Lattner// CHECK-NOT: switch 73858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: @dead 8fda0f1f5a278548b012401be07e287c1697fc41cChris Lattner// CHECK: add nsw i32 {{.*}}, 1 9fda0f1f5a278548b012401be07e287c1697fc41cChris Lattner// CHECK-NOT: switch 103858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: @dead 11fda0f1f5a278548b012401be07e287c1697fc41cChris Lattner// CHECK: ret void 123858938b043bac2f046304ff99a54905acdcc6ddChris Lattnerint i; 133858938b043bac2f046304ff99a54905acdcc6ddChris Lattnervoid dead(); 143858938b043bac2f046304ff99a54905acdcc6ddChris Lattner 15fda0f1f5a278548b012401be07e287c1697fc41cChris Lattnervoid test1() { 16fda0f1f5a278548b012401be07e287c1697fc41cChris Lattner switch (1) 17fda0f1f5a278548b012401be07e287c1697fc41cChris Lattner case 1: 18fda0f1f5a278548b012401be07e287c1697fc41cChris Lattner ++i; 19fda0f1f5a278548b012401be07e287c1697fc41cChris Lattner 20fda0f1f5a278548b012401be07e287c1697fc41cChris Lattner switch (0) 21fda0f1f5a278548b012401be07e287c1697fc41cChris Lattner case 1: 223858938b043bac2f046304ff99a54905acdcc6ddChris Lattner dead(); 23fda0f1f5a278548b012401be07e287c1697fc41cChris Lattner} 243858938b043bac2f046304ff99a54905acdcc6ddChris Lattner 253858938b043bac2f046304ff99a54905acdcc6ddChris Lattner 263858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK: @test2 273858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: switch 283858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: @dead 293858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK: add nsw i32 {{.*}}, 2 303858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: switch 313858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: @dead 323858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK: ret void 333858938b043bac2f046304ff99a54905acdcc6ddChris Lattnervoid test2() { 343858938b043bac2f046304ff99a54905acdcc6ddChris Lattner switch (4) { 353858938b043bac2f046304ff99a54905acdcc6ddChris Lattner case 1: 363858938b043bac2f046304ff99a54905acdcc6ddChris Lattner dead(); 373858938b043bac2f046304ff99a54905acdcc6ddChris Lattner break; 383858938b043bac2f046304ff99a54905acdcc6ddChris Lattner case 4: 393858938b043bac2f046304ff99a54905acdcc6ddChris Lattner i += 2; 403858938b043bac2f046304ff99a54905acdcc6ddChris Lattner // Fall off the end of the switch. 413858938b043bac2f046304ff99a54905acdcc6ddChris Lattner } 423858938b043bac2f046304ff99a54905acdcc6ddChris Lattner} 433858938b043bac2f046304ff99a54905acdcc6ddChris Lattner 443858938b043bac2f046304ff99a54905acdcc6ddChris Lattner 453858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK: @test3 463858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: switch 473858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: @dead 483858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK: add nsw i32 {{.*}}, 2 493858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: switch 503858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: @dead 513858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK: ret void 523858938b043bac2f046304ff99a54905acdcc6ddChris Lattnervoid test3() { 533858938b043bac2f046304ff99a54905acdcc6ddChris Lattner switch (4) { 543858938b043bac2f046304ff99a54905acdcc6ddChris Lattner case 1: 553858938b043bac2f046304ff99a54905acdcc6ddChris Lattner dead(); 563858938b043bac2f046304ff99a54905acdcc6ddChris Lattner break; 573858938b043bac2f046304ff99a54905acdcc6ddChris Lattner case 4: { 583858938b043bac2f046304ff99a54905acdcc6ddChris Lattner i += 2; 593858938b043bac2f046304ff99a54905acdcc6ddChris Lattner break; 603858938b043bac2f046304ff99a54905acdcc6ddChris Lattner } 613858938b043bac2f046304ff99a54905acdcc6ddChris Lattner } 623858938b043bac2f046304ff99a54905acdcc6ddChris Lattner} 633858938b043bac2f046304ff99a54905acdcc6ddChris Lattner 643858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK: @test4 653858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: switch 663858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: @dead 673858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK: add nsw i32 {{.*}}, 2 683858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: switch 693858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: @dead 703858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK: ret void 713858938b043bac2f046304ff99a54905acdcc6ddChris Lattnervoid test4() { 723858938b043bac2f046304ff99a54905acdcc6ddChris Lattner switch (4) { 733858938b043bac2f046304ff99a54905acdcc6ddChris Lattner case 1: 743858938b043bac2f046304ff99a54905acdcc6ddChris Lattner dead(); 753858938b043bac2f046304ff99a54905acdcc6ddChris Lattner break; 763858938b043bac2f046304ff99a54905acdcc6ddChris Lattner default: { 773858938b043bac2f046304ff99a54905acdcc6ddChris Lattner i += 2; 783858938b043bac2f046304ff99a54905acdcc6ddChris Lattner break; 793858938b043bac2f046304ff99a54905acdcc6ddChris Lattner } 803858938b043bac2f046304ff99a54905acdcc6ddChris Lattner } 813858938b043bac2f046304ff99a54905acdcc6ddChris Lattner} 823858938b043bac2f046304ff99a54905acdcc6ddChris Lattner 833858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// This shouldn't crash codegen, but we don't have to optimize out the switch 843858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// in this case. 853858938b043bac2f046304ff99a54905acdcc6ddChris Lattnervoid test5() { 863858938b043bac2f046304ff99a54905acdcc6ddChris Lattner switch (1) { 873858938b043bac2f046304ff99a54905acdcc6ddChris Lattner int x; // eliding var decl? 883858938b043bac2f046304ff99a54905acdcc6ddChris Lattner case 1: 893858938b043bac2f046304ff99a54905acdcc6ddChris Lattner x = 4; 903f06e274736eab9821ce0dc2bd8e166fe0e3aa7eChris Lattner i = x; 913858938b043bac2f046304ff99a54905acdcc6ddChris Lattner break; 923858938b043bac2f046304ff99a54905acdcc6ddChris Lattner } 933858938b043bac2f046304ff99a54905acdcc6ddChris Lattner} 943858938b043bac2f046304ff99a54905acdcc6ddChris Lattner 953858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK: @test6 963858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: switch 973858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: @dead 983858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK: ret void 993858938b043bac2f046304ff99a54905acdcc6ddChris Lattnervoid test6() { 1003858938b043bac2f046304ff99a54905acdcc6ddChris Lattner // Neither case is reachable. 1013858938b043bac2f046304ff99a54905acdcc6ddChris Lattner switch (40) { 1023858938b043bac2f046304ff99a54905acdcc6ddChris Lattner case 1: 1033858938b043bac2f046304ff99a54905acdcc6ddChris Lattner dead(); 1043858938b043bac2f046304ff99a54905acdcc6ddChris Lattner break; 1053858938b043bac2f046304ff99a54905acdcc6ddChris Lattner case 4: { 1063858938b043bac2f046304ff99a54905acdcc6ddChris Lattner dead(); 1073858938b043bac2f046304ff99a54905acdcc6ddChris Lattner break; 1083858938b043bac2f046304ff99a54905acdcc6ddChris Lattner } 1093858938b043bac2f046304ff99a54905acdcc6ddChris Lattner } 1103858938b043bac2f046304ff99a54905acdcc6ddChris Lattner} 1113858938b043bac2f046304ff99a54905acdcc6ddChris Lattner 1123858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK: @test7 1133858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: switch 1143858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: @dead 1153858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK: add nsw i32 1163858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: switch 1173858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: @dead 1183858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK: ret void 1193858938b043bac2f046304ff99a54905acdcc6ddChris Lattnervoid test7() { 1203858938b043bac2f046304ff99a54905acdcc6ddChris Lattner switch (4) { 1213858938b043bac2f046304ff99a54905acdcc6ddChris Lattner case 1: 1223858938b043bac2f046304ff99a54905acdcc6ddChris Lattner dead(); 1233858938b043bac2f046304ff99a54905acdcc6ddChris Lattner break; 1243858938b043bac2f046304ff99a54905acdcc6ddChris Lattner { 1253858938b043bac2f046304ff99a54905acdcc6ddChris Lattner case 4: // crazy brace scenario 1263858938b043bac2f046304ff99a54905acdcc6ddChris Lattner ++i; 1273858938b043bac2f046304ff99a54905acdcc6ddChris Lattner } 1283858938b043bac2f046304ff99a54905acdcc6ddChris Lattner break; 1293858938b043bac2f046304ff99a54905acdcc6ddChris Lattner } 1303858938b043bac2f046304ff99a54905acdcc6ddChris Lattner} 1313858938b043bac2f046304ff99a54905acdcc6ddChris Lattner 1323858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK: @test8 1333858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: switch 1343858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: @dead 1353858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK: add nsw i32 1363858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: switch 1373858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: @dead 1383858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK: ret void 1393858938b043bac2f046304ff99a54905acdcc6ddChris Lattnervoid test8() { 1403858938b043bac2f046304ff99a54905acdcc6ddChris Lattner switch (4) { 1413858938b043bac2f046304ff99a54905acdcc6ddChris Lattner case 1: 1423858938b043bac2f046304ff99a54905acdcc6ddChris Lattner dead(); 1433858938b043bac2f046304ff99a54905acdcc6ddChris Lattner break; 1443858938b043bac2f046304ff99a54905acdcc6ddChris Lattner case 4: 1453858938b043bac2f046304ff99a54905acdcc6ddChris Lattner ++i; 1463858938b043bac2f046304ff99a54905acdcc6ddChris Lattner // Fall off the end of the switch. 1473858938b043bac2f046304ff99a54905acdcc6ddChris Lattner } 1483858938b043bac2f046304ff99a54905acdcc6ddChris Lattner} 1493858938b043bac2f046304ff99a54905acdcc6ddChris Lattner 1503858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK: @test9 1513858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: switch 1523858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: @dead 1533858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK: add nsw i32 1543858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK: add nsw i32 1553858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: switch 1563858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK-NOT: @dead 1573858938b043bac2f046304ff99a54905acdcc6ddChris Lattner// CHECK: ret void 1583858938b043bac2f046304ff99a54905acdcc6ddChris Lattnervoid test9(int i) { 1593858938b043bac2f046304ff99a54905acdcc6ddChris Lattner switch (1) { 1603858938b043bac2f046304ff99a54905acdcc6ddChris Lattner case 5: 1613858938b043bac2f046304ff99a54905acdcc6ddChris Lattner dead(); 1623858938b043bac2f046304ff99a54905acdcc6ddChris Lattner case 1: 1633858938b043bac2f046304ff99a54905acdcc6ddChris Lattner ++i; 1643858938b043bac2f046304ff99a54905acdcc6ddChris Lattner // Fall through is fine. 1653858938b043bac2f046304ff99a54905acdcc6ddChris Lattner case 4: 1663858938b043bac2f046304ff99a54905acdcc6ddChris Lattner ++i; 1673858938b043bac2f046304ff99a54905acdcc6ddChris Lattner break; 1683858938b043bac2f046304ff99a54905acdcc6ddChris Lattner } 1693858938b043bac2f046304ff99a54905acdcc6ddChris Lattner} 1703858938b043bac2f046304ff99a54905acdcc6ddChris Lattner 1719467110fcef8a3e4caf9e5d022cff0322afe6e8bChris Lattner// CHECK: @test10 1729467110fcef8a3e4caf9e5d022cff0322afe6e8bChris Lattner// CHECK-NOT: switch 1739467110fcef8a3e4caf9e5d022cff0322afe6e8bChris Lattner// CHECK: ret i32 174035287d73947320d2ff65b7d9a5c3d990427eee3Chris Lattnerint test10(void) { 175035287d73947320d2ff65b7d9a5c3d990427eee3Chris Lattner switch(8) { 176035287d73947320d2ff65b7d9a5c3d990427eee3Chris Lattner case 8: 177035287d73947320d2ff65b7d9a5c3d990427eee3Chris Lattner break; 178035287d73947320d2ff65b7d9a5c3d990427eee3Chris Lattner case 4: 179035287d73947320d2ff65b7d9a5c3d990427eee3Chris Lattner break; 180035287d73947320d2ff65b7d9a5c3d990427eee3Chris Lattner default: 181035287d73947320d2ff65b7d9a5c3d990427eee3Chris Lattner dead(); 182035287d73947320d2ff65b7d9a5c3d990427eee3Chris Lattner } 183035287d73947320d2ff65b7d9a5c3d990427eee3Chris Lattner 184035287d73947320d2ff65b7d9a5c3d990427eee3Chris Lattner return 0; 185035287d73947320d2ff65b7d9a5c3d990427eee3Chris Lattner} 1869467110fcef8a3e4caf9e5d022cff0322afe6e8bChris Lattner 1879467110fcef8a3e4caf9e5d022cff0322afe6e8bChris Lattner// CHECK: @test11 1889467110fcef8a3e4caf9e5d022cff0322afe6e8bChris Lattner// CHECK-NOT: switch 1899467110fcef8a3e4caf9e5d022cff0322afe6e8bChris Lattner// CHECK: ret void 1909467110fcef8a3e4caf9e5d022cff0322afe6e8bChris Lattnervoid test11() { 1919467110fcef8a3e4caf9e5d022cff0322afe6e8bChris Lattner switch (1) { 1929467110fcef8a3e4caf9e5d022cff0322afe6e8bChris Lattner case 1: 1939467110fcef8a3e4caf9e5d022cff0322afe6e8bChris Lattner break; 1949467110fcef8a3e4caf9e5d022cff0322afe6e8bChris Lattner case 42: ; 1959467110fcef8a3e4caf9e5d022cff0322afe6e8bChris Lattner int x; // eliding var decl? 1969467110fcef8a3e4caf9e5d022cff0322afe6e8bChris Lattner x = 4; 1979467110fcef8a3e4caf9e5d022cff0322afe6e8bChris Lattner break; 1989467110fcef8a3e4caf9e5d022cff0322afe6e8bChris Lattner } 1999467110fcef8a3e4caf9e5d022cff0322afe6e8bChris Lattner} 2003f06e274736eab9821ce0dc2bd8e166fe0e3aa7eChris Lattner 2013f06e274736eab9821ce0dc2bd8e166fe0e3aa7eChris Lattner// CHECK: @test12 2023f06e274736eab9821ce0dc2bd8e166fe0e3aa7eChris Lattner// CHECK-NOT: switch 2033f06e274736eab9821ce0dc2bd8e166fe0e3aa7eChris Lattner// CHECK: ret void 2043f06e274736eab9821ce0dc2bd8e166fe0e3aa7eChris Lattnervoid test12() { 2053f06e274736eab9821ce0dc2bd8e166fe0e3aa7eChris Lattner switch (1) { 2063f06e274736eab9821ce0dc2bd8e166fe0e3aa7eChris Lattner case 2: { 2073f06e274736eab9821ce0dc2bd8e166fe0e3aa7eChris Lattner int a; // Ok to skip this vardecl. 2083f06e274736eab9821ce0dc2bd8e166fe0e3aa7eChris Lattner a = 42; 2093f06e274736eab9821ce0dc2bd8e166fe0e3aa7eChris Lattner } 2103f06e274736eab9821ce0dc2bd8e166fe0e3aa7eChris Lattner case 1: 2113f06e274736eab9821ce0dc2bd8e166fe0e3aa7eChris Lattner break; 2123f06e274736eab9821ce0dc2bd8e166fe0e3aa7eChris Lattner case 42: ; 2133f06e274736eab9821ce0dc2bd8e166fe0e3aa7eChris Lattner int x; // eliding var decl? 2143f06e274736eab9821ce0dc2bd8e166fe0e3aa7eChris Lattner x = 4; 2153f06e274736eab9821ce0dc2bd8e166fe0e3aa7eChris Lattner break; 2163f06e274736eab9821ce0dc2bd8e166fe0e3aa7eChris Lattner } 2173f06e274736eab9821ce0dc2bd8e166fe0e3aa7eChris Lattner} 2183f06e274736eab9821ce0dc2bd8e166fe0e3aa7eChris Lattner 219c07833795aa6e569de5bb90945f5017b9969288dEric Christopher// Verify that case 42 only calls test14 once. 220b11f9198111796ada02b57f62cdea92134fde9f7Chris Lattner// CHECK: @test13 221c07833795aa6e569de5bb90945f5017b9969288dEric Christopher// CHECK: call void @test13(i32 97) 222c07833795aa6e569de5bb90945f5017b9969288dEric Christopher// CHECK-NEXT: br label %[[EPILOG2:[0-9.a-z]+]] 223c07833795aa6e569de5bb90945f5017b9969288dEric Christopher// CHECK: [[EPILOG2]] 224c07833795aa6e569de5bb90945f5017b9969288dEric Christopher// CHECK-NEXT: br label [[EPILOG:%[0-9.a-z]+]] 225c07833795aa6e569de5bb90945f5017b9969288dEric Christopher// CHECK: call void @test13(i32 42) 226c07833795aa6e569de5bb90945f5017b9969288dEric Christopher// CHECK-NEXT: br label [[EPILOG]] 227b11f9198111796ada02b57f62cdea92134fde9f7Chris Lattnervoid test13(int x) { 228b11f9198111796ada02b57f62cdea92134fde9f7Chris Lattner switch (x) { 229c07833795aa6e569de5bb90945f5017b9969288dEric Christopher case 42: test13(97); // fallthrough 230421048698b6b6bf86754190bcfe98a0ed82ee5b5Chris Lattner case 11: break; 231c07833795aa6e569de5bb90945f5017b9969288dEric Christopher default: test13(42); break; 232421048698b6b6bf86754190bcfe98a0ed82ee5b5Chris Lattner } 233421048698b6b6bf86754190bcfe98a0ed82ee5b5Chris Lattner} 234421048698b6b6bf86754190bcfe98a0ed82ee5b5Chris Lattner 235