1*67e74705SXin Li // RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o - | FileCheck %s 2*67e74705SXin Li 3*67e74705SXin Li // PR9322 and rdar://6970405 4*67e74705SXin Li 5*67e74705SXin Li // CHECK: @test1 6*67e74705SXin Li // CHECK-NOT: switch 7*67e74705SXin Li // CHECK-NOT: @dead 8*67e74705SXin Li // CHECK: add nsw i32 {{.*}}, 1 9*67e74705SXin Li // CHECK-NOT: switch 10*67e74705SXin Li // CHECK-NOT: @dead 11*67e74705SXin Li // CHECK: ret void 12*67e74705SXin Li int i; 13*67e74705SXin Li void dead(); 14*67e74705SXin Li test1()15*67e74705SXin Livoid test1() { 16*67e74705SXin Li switch (1) 17*67e74705SXin Li case 1: 18*67e74705SXin Li ++i; 19*67e74705SXin Li 20*67e74705SXin Li switch (0) 21*67e74705SXin Li case 1: 22*67e74705SXin Li dead(); 23*67e74705SXin Li } 24*67e74705SXin Li 25*67e74705SXin Li 26*67e74705SXin Li // CHECK: @test2 27*67e74705SXin Li // CHECK-NOT: switch 28*67e74705SXin Li // CHECK-NOT: @dead 29*67e74705SXin Li // CHECK: add nsw i32 {{.*}}, 2 30*67e74705SXin Li // CHECK-NOT: switch 31*67e74705SXin Li // CHECK-NOT: @dead 32*67e74705SXin Li // CHECK: ret void test2()33*67e74705SXin Livoid test2() { 34*67e74705SXin Li switch (4) { 35*67e74705SXin Li case 1: 36*67e74705SXin Li dead(); 37*67e74705SXin Li break; 38*67e74705SXin Li case 4: 39*67e74705SXin Li i += 2; 40*67e74705SXin Li // Fall off the end of the switch. 41*67e74705SXin Li } 42*67e74705SXin Li } 43*67e74705SXin Li 44*67e74705SXin Li 45*67e74705SXin Li // CHECK: @test3 46*67e74705SXin Li // CHECK-NOT: switch 47*67e74705SXin Li // CHECK-NOT: @dead 48*67e74705SXin Li // CHECK: add nsw i32 {{.*}}, 2 49*67e74705SXin Li // CHECK-NOT: switch 50*67e74705SXin Li // CHECK-NOT: @dead 51*67e74705SXin Li // CHECK: ret void test3()52*67e74705SXin Livoid test3() { 53*67e74705SXin Li switch (4) { 54*67e74705SXin Li case 1: 55*67e74705SXin Li dead(); 56*67e74705SXin Li break; 57*67e74705SXin Li case 4: { 58*67e74705SXin Li i += 2; 59*67e74705SXin Li break; 60*67e74705SXin Li } 61*67e74705SXin Li } 62*67e74705SXin Li } 63*67e74705SXin Li 64*67e74705SXin Li // CHECK: @test4 65*67e74705SXin Li // CHECK-NOT: switch 66*67e74705SXin Li // CHECK-NOT: @dead 67*67e74705SXin Li // CHECK: add nsw i32 {{.*}}, 2 68*67e74705SXin Li // CHECK-NOT: switch 69*67e74705SXin Li // CHECK-NOT: @dead 70*67e74705SXin Li // CHECK: ret void test4()71*67e74705SXin Livoid test4() { 72*67e74705SXin Li switch (4) { 73*67e74705SXin Li case 1: 74*67e74705SXin Li dead(); 75*67e74705SXin Li break; 76*67e74705SXin Li default: { 77*67e74705SXin Li i += 2; 78*67e74705SXin Li break; 79*67e74705SXin Li } 80*67e74705SXin Li } 81*67e74705SXin Li } 82*67e74705SXin Li 83*67e74705SXin Li // This shouldn't crash codegen, but we don't have to optimize out the switch 84*67e74705SXin Li // in this case. test5()85*67e74705SXin Livoid test5() { 86*67e74705SXin Li switch (1) { 87*67e74705SXin Li int x; // eliding var decl? 88*67e74705SXin Li case 1: 89*67e74705SXin Li x = 4; 90*67e74705SXin Li i = x; 91*67e74705SXin Li break; 92*67e74705SXin Li } 93*67e74705SXin Li } 94*67e74705SXin Li 95*67e74705SXin Li // CHECK: @test6 96*67e74705SXin Li // CHECK-NOT: switch 97*67e74705SXin Li // CHECK-NOT: @dead 98*67e74705SXin Li // CHECK: ret void test6()99*67e74705SXin Livoid test6() { 100*67e74705SXin Li // Neither case is reachable. 101*67e74705SXin Li switch (40) { 102*67e74705SXin Li case 1: 103*67e74705SXin Li dead(); 104*67e74705SXin Li break; 105*67e74705SXin Li case 4: { 106*67e74705SXin Li dead(); 107*67e74705SXin Li break; 108*67e74705SXin Li } 109*67e74705SXin Li } 110*67e74705SXin Li } 111*67e74705SXin Li 112*67e74705SXin Li // CHECK: @test7 113*67e74705SXin Li // CHECK-NOT: switch 114*67e74705SXin Li // CHECK-NOT: @dead 115*67e74705SXin Li // CHECK: add nsw i32 116*67e74705SXin Li // CHECK-NOT: switch 117*67e74705SXin Li // CHECK-NOT: @dead 118*67e74705SXin Li // CHECK: ret void test7()119*67e74705SXin Livoid test7() { 120*67e74705SXin Li switch (4) { 121*67e74705SXin Li case 1: 122*67e74705SXin Li dead(); 123*67e74705SXin Li break; 124*67e74705SXin Li { 125*67e74705SXin Li case 4: // crazy brace scenario 126*67e74705SXin Li ++i; 127*67e74705SXin Li } 128*67e74705SXin Li break; 129*67e74705SXin Li } 130*67e74705SXin Li } 131*67e74705SXin Li 132*67e74705SXin Li // CHECK: @test8 133*67e74705SXin Li // CHECK-NOT: switch 134*67e74705SXin Li // CHECK-NOT: @dead 135*67e74705SXin Li // CHECK: add nsw i32 136*67e74705SXin Li // CHECK-NOT: switch 137*67e74705SXin Li // CHECK-NOT: @dead 138*67e74705SXin Li // CHECK: ret void test8()139*67e74705SXin Livoid test8() { 140*67e74705SXin Li switch (4) { 141*67e74705SXin Li case 1: 142*67e74705SXin Li dead(); 143*67e74705SXin Li break; 144*67e74705SXin Li case 4: 145*67e74705SXin Li ++i; 146*67e74705SXin Li // Fall off the end of the switch. 147*67e74705SXin Li } 148*67e74705SXin Li } 149*67e74705SXin Li 150*67e74705SXin Li // CHECK: @test9 151*67e74705SXin Li // CHECK-NOT: switch 152*67e74705SXin Li // CHECK-NOT: @dead 153*67e74705SXin Li // CHECK: add nsw i32 154*67e74705SXin Li // CHECK: add nsw i32 155*67e74705SXin Li // CHECK-NOT: switch 156*67e74705SXin Li // CHECK-NOT: @dead 157*67e74705SXin Li // CHECK: ret void test9(int i)158*67e74705SXin Livoid test9(int i) { 159*67e74705SXin Li switch (1) { 160*67e74705SXin Li case 5: 161*67e74705SXin Li dead(); 162*67e74705SXin Li case 1: 163*67e74705SXin Li ++i; 164*67e74705SXin Li // Fall through is fine. 165*67e74705SXin Li case 4: 166*67e74705SXin Li ++i; 167*67e74705SXin Li break; 168*67e74705SXin Li } 169*67e74705SXin Li } 170*67e74705SXin Li 171*67e74705SXin Li // CHECK: @test10 172*67e74705SXin Li // CHECK-NOT: switch 173*67e74705SXin Li // CHECK: ret i32 test10(void)174*67e74705SXin Liint test10(void) { 175*67e74705SXin Li switch(8) { 176*67e74705SXin Li case 8: 177*67e74705SXin Li break; 178*67e74705SXin Li case 4: 179*67e74705SXin Li break; 180*67e74705SXin Li default: 181*67e74705SXin Li dead(); 182*67e74705SXin Li } 183*67e74705SXin Li 184*67e74705SXin Li return 0; 185*67e74705SXin Li } 186*67e74705SXin Li 187*67e74705SXin Li // CHECK: @test11 188*67e74705SXin Li // CHECK-NOT: switch 189*67e74705SXin Li // CHECK: ret void test11()190*67e74705SXin Livoid test11() { 191*67e74705SXin Li switch (1) { 192*67e74705SXin Li case 1: 193*67e74705SXin Li break; 194*67e74705SXin Li case 42: ; 195*67e74705SXin Li int x; // eliding var decl? 196*67e74705SXin Li x = 4; 197*67e74705SXin Li break; 198*67e74705SXin Li } 199*67e74705SXin Li } 200*67e74705SXin Li 201*67e74705SXin Li // CHECK: @test12 202*67e74705SXin Li // CHECK-NOT: switch 203*67e74705SXin Li // CHECK: ret void test12()204*67e74705SXin Livoid test12() { 205*67e74705SXin Li switch (1) { 206*67e74705SXin Li case 2: { 207*67e74705SXin Li int a; // Ok to skip this vardecl. 208*67e74705SXin Li a = 42; 209*67e74705SXin Li } 210*67e74705SXin Li case 1: 211*67e74705SXin Li break; 212*67e74705SXin Li case 42: ; 213*67e74705SXin Li int x; // eliding var decl? 214*67e74705SXin Li x = 4; 215*67e74705SXin Li break; 216*67e74705SXin Li } 217*67e74705SXin Li } 218*67e74705SXin Li 219*67e74705SXin Li // Verify that case 42 only calls test14 once. 220*67e74705SXin Li // CHECK: @test13 221*67e74705SXin Li // CHECK: call void @test13(i32 97) 222*67e74705SXin Li // CHECK-NEXT: br label %[[EPILOG2:[0-9.a-z]+]] 223*67e74705SXin Li // CHECK: [[EPILOG2]] 224*67e74705SXin Li // CHECK-NEXT: br label [[EPILOG:%[0-9.a-z]+]] 225*67e74705SXin Li // CHECK: call void @test13(i32 42) 226*67e74705SXin Li // CHECK-NEXT: br label [[EPILOG]] test13(int x)227*67e74705SXin Livoid test13(int x) { 228*67e74705SXin Li switch (x) { 229*67e74705SXin Li case 42: test13(97); // fallthrough 230*67e74705SXin Li case 11: break; 231*67e74705SXin Li default: test13(42); break; 232*67e74705SXin Li } 233*67e74705SXin Li } 234*67e74705SXin Li 235