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