switch.c revision fae7bf269034202adf43840379340a60a9992292
1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -triple i386-unknown-unknown -O3 %s -emit-llvm -o - | FileCheck %s 251b09f2c528c8460b5465c676173324e44176d62Devang Patel 351b09f2c528c8460b5465c676173324e44176d62Devang Patelint foo(int i) { 451b09f2c528c8460b5465c676173324e44176d62Devang Patel int j = 0; 551b09f2c528c8460b5465c676173324e44176d62Devang Patel switch (i) { 6c69a5810f4a39f4af204e4843b497033ec6f12bfChris Lattner case -1: 7c69a5810f4a39f4af204e4843b497033ec6f12bfChris Lattner j = 1; break; 8600d47e8d5edc93a08ada8086db23d1d434ce583Daniel Dunbar case 1 : 951b09f2c528c8460b5465c676173324e44176d62Devang Patel j = 2; break; 1051b09f2c528c8460b5465c676173324e44176d62Devang Patel case 2: 1151b09f2c528c8460b5465c676173324e44176d62Devang Patel j = 3; break; 1251b09f2c528c8460b5465c676173324e44176d62Devang Patel default: 1351b09f2c528c8460b5465c676173324e44176d62Devang Patel j = 42; break; 1451b09f2c528c8460b5465c676173324e44176d62Devang Patel } 1551b09f2c528c8460b5465c676173324e44176d62Devang Patel j = j + 1; 1651b09f2c528c8460b5465c676173324e44176d62Devang Patel return j; 1751b09f2c528c8460b5465c676173324e44176d62Devang Patel} 1851b09f2c528c8460b5465c676173324e44176d62Devang Patel 192d79d0f3ac0ea77b7bdfc3dd11de8cc3ccd91b8cDevang Patelint foo2(int i) { 202d79d0f3ac0ea77b7bdfc3dd11de8cc3ccd91b8cDevang Patel int j = 0; 212d79d0f3ac0ea77b7bdfc3dd11de8cc3ccd91b8cDevang Patel switch (i) { 22600d47e8d5edc93a08ada8086db23d1d434ce583Daniel Dunbar case 1 : 232d79d0f3ac0ea77b7bdfc3dd11de8cc3ccd91b8cDevang Patel j = 2; break; 242d79d0f3ac0ea77b7bdfc3dd11de8cc3ccd91b8cDevang Patel case 2 ... 10: 252d79d0f3ac0ea77b7bdfc3dd11de8cc3ccd91b8cDevang Patel j = 3; break; 262d79d0f3ac0ea77b7bdfc3dd11de8cc3ccd91b8cDevang Patel default: 272d79d0f3ac0ea77b7bdfc3dd11de8cc3ccd91b8cDevang Patel j = 42; break; 282d79d0f3ac0ea77b7bdfc3dd11de8cc3ccd91b8cDevang Patel } 292d79d0f3ac0ea77b7bdfc3dd11de8cc3ccd91b8cDevang Patel j = j + 1; 302d79d0f3ac0ea77b7bdfc3dd11de8cc3ccd91b8cDevang Patel return j; 312d79d0f3ac0ea77b7bdfc3dd11de8cc3ccd91b8cDevang Patel} 322d79d0f3ac0ea77b7bdfc3dd11de8cc3ccd91b8cDevang Patel 33c049e4f406a7f7179eba98659044a32508e53289Devang Patelint foo3(int i) { 34c049e4f406a7f7179eba98659044a32508e53289Devang Patel int j = 0; 35c049e4f406a7f7179eba98659044a32508e53289Devang Patel switch (i) { 36c049e4f406a7f7179eba98659044a32508e53289Devang Patel default: 37c049e4f406a7f7179eba98659044a32508e53289Devang Patel j = 42; break; 38c049e4f406a7f7179eba98659044a32508e53289Devang Patel case 111: 39c049e4f406a7f7179eba98659044a32508e53289Devang Patel j = 111; break; 40c049e4f406a7f7179eba98659044a32508e53289Devang Patel case 0 ... 100: 41c049e4f406a7f7179eba98659044a32508e53289Devang Patel j = 1; break; 42c049e4f406a7f7179eba98659044a32508e53289Devang Patel case 222: 43c049e4f406a7f7179eba98659044a32508e53289Devang Patel j = 222; break; 44c049e4f406a7f7179eba98659044a32508e53289Devang Patel } 45c049e4f406a7f7179eba98659044a32508e53289Devang Patel return j; 46c049e4f406a7f7179eba98659044a32508e53289Devang Patel} 47c049e4f406a7f7179eba98659044a32508e53289Devang Patel 48c049e4f406a7f7179eba98659044a32508e53289Devang Patel 49600d47e8d5edc93a08ada8086db23d1d434ce583Daniel Dunbarstatic int foo4(int i) { 50c049e4f406a7f7179eba98659044a32508e53289Devang Patel int j = 0; 51c049e4f406a7f7179eba98659044a32508e53289Devang Patel switch (i) { 52c049e4f406a7f7179eba98659044a32508e53289Devang Patel case 111: 53c049e4f406a7f7179eba98659044a32508e53289Devang Patel j = 111; break; 54c049e4f406a7f7179eba98659044a32508e53289Devang Patel case 0 ... 100: 55c049e4f406a7f7179eba98659044a32508e53289Devang Patel j = 1; break; 56c049e4f406a7f7179eba98659044a32508e53289Devang Patel case 222: 57c049e4f406a7f7179eba98659044a32508e53289Devang Patel j = 222; break; 58c049e4f406a7f7179eba98659044a32508e53289Devang Patel default: 59c049e4f406a7f7179eba98659044a32508e53289Devang Patel j = 42; break; 60c049e4f406a7f7179eba98659044a32508e53289Devang Patel case 501 ... 600: 61c049e4f406a7f7179eba98659044a32508e53289Devang Patel j = 5; break; 62c049e4f406a7f7179eba98659044a32508e53289Devang Patel } 63c049e4f406a7f7179eba98659044a32508e53289Devang Patel return j; 64c049e4f406a7f7179eba98659044a32508e53289Devang Patel} 651438b4918a1658ef6467488109ca434e775e58e5Chris Lattner 66600d47e8d5edc93a08ada8086db23d1d434ce583Daniel Dunbar// CHECK: define i32 @foo4t() 67600d47e8d5edc93a08ada8086db23d1d434ce583Daniel Dunbar// CHECK: ret i32 376 68600d47e8d5edc93a08ada8086db23d1d434ce583Daniel Dunbar// CHECK: } 69600d47e8d5edc93a08ada8086db23d1d434ce583Daniel Dunbarint foo4t() { 70600d47e8d5edc93a08ada8086db23d1d434ce583Daniel Dunbar // 111 + 1 + 222 + 42 = 376 71600d47e8d5edc93a08ada8086db23d1d434ce583Daniel Dunbar return foo4(111) + foo4(99) + foo4(222) + foo4(601); 72600d47e8d5edc93a08ada8086db23d1d434ce583Daniel Dunbar} 73600d47e8d5edc93a08ada8086db23d1d434ce583Daniel Dunbar 74600d47e8d5edc93a08ada8086db23d1d434ce583Daniel Dunbar// CHECK: define void @foo5() 75600d47e8d5edc93a08ada8086db23d1d434ce583Daniel Dunbar// CHECK-NOT: switch 76600d47e8d5edc93a08ada8086db23d1d434ce583Daniel Dunbar// CHECK: } 771438b4918a1658ef6467488109ca434e775e58e5Chris Lattnervoid foo5(){ 781438b4918a1658ef6467488109ca434e775e58e5Chris Lattner switch(0){ 791438b4918a1658ef6467488109ca434e775e58e5Chris Lattner default: 801438b4918a1658ef6467488109ca434e775e58e5Chris Lattner if (0) { 811438b4918a1658ef6467488109ca434e775e58e5Chris Lattner 821438b4918a1658ef6467488109ca434e775e58e5Chris Lattner } 831438b4918a1658ef6467488109ca434e775e58e5Chris Lattner } 841438b4918a1658ef6467488109ca434e775e58e5Chris Lattner} 851438b4918a1658ef6467488109ca434e775e58e5Chris Lattner 86600d47e8d5edc93a08ada8086db23d1d434ce583Daniel Dunbar// CHECK: define void @foo6() 87600d47e8d5edc93a08ada8086db23d1d434ce583Daniel Dunbar// CHECK-NOT: switch 88600d47e8d5edc93a08ada8086db23d1d434ce583Daniel Dunbar// CHECK: } 89d28a80d64616b66c91d28bb4c08ca2d8c594de4eEli Friedmanvoid foo6(){ 90d28a80d64616b66c91d28bb4c08ca2d8c594de4eEli Friedman switch(0){ 91d28a80d64616b66c91d28bb4c08ca2d8c594de4eEli Friedman } 92d28a80d64616b66c91d28bb4c08ca2d8c594de4eEli Friedman} 93d28a80d64616b66c91d28bb4c08ca2d8c594de4eEli Friedman 94600d47e8d5edc93a08ada8086db23d1d434ce583Daniel Dunbar// CHECK: define void @foo7() 95600d47e8d5edc93a08ada8086db23d1d434ce583Daniel Dunbar// CHECK-NOT: switch 96600d47e8d5edc93a08ada8086db23d1d434ce583Daniel Dunbar// CHECK: } 97d28a80d64616b66c91d28bb4c08ca2d8c594de4eEli Friedmanvoid foo7(){ 98d28a80d64616b66c91d28bb4c08ca2d8c594de4eEli Friedman switch(0){ 99d28a80d64616b66c91d28bb4c08ca2d8c594de4eEli Friedman foo7(); 100d28a80d64616b66c91d28bb4c08ca2d8c594de4eEli Friedman } 101d28a80d64616b66c91d28bb4c08ca2d8c594de4eEli Friedman} 102d28a80d64616b66c91d28bb4c08ca2d8c594de4eEli Friedman 103fae7bf269034202adf43840379340a60a9992292Daniel Dunbar 104fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// CHECK: define i32 @f8( 105fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// CHECK: ret i32 3 106fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// CHECK: } 107fae7bf269034202adf43840379340a60a9992292Daniel Dunbarint f8(unsigned x) { 108fae7bf269034202adf43840379340a60a9992292Daniel Dunbar switch(x) { 109fae7bf269034202adf43840379340a60a9992292Daniel Dunbar default: 110fae7bf269034202adf43840379340a60a9992292Daniel Dunbar return 3; 111fae7bf269034202adf43840379340a60a9992292Daniel Dunbar case 0xFFFFFFFF ... 1: // This range should be empty because x is unsigned. 112fae7bf269034202adf43840379340a60a9992292Daniel Dunbar return 0; 113fae7bf269034202adf43840379340a60a9992292Daniel Dunbar } 114fae7bf269034202adf43840379340a60a9992292Daniel Dunbar} 115fae7bf269034202adf43840379340a60a9992292Daniel Dunbar 116fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// Ensure that default after a case range is not ignored. 117fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// 118fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// CHECK: define i32 @f9() 119fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// CHECK: ret i32 10 120fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// CHECK: } 121fae7bf269034202adf43840379340a60a9992292Daniel Dunbarstatic int f9_0(unsigned x) { 122fae7bf269034202adf43840379340a60a9992292Daniel Dunbar switch(x) { 123fae7bf269034202adf43840379340a60a9992292Daniel Dunbar case 10 ... 0xFFFFFFFF: 124fae7bf269034202adf43840379340a60a9992292Daniel Dunbar return 0; 125fae7bf269034202adf43840379340a60a9992292Daniel Dunbar default: 126fae7bf269034202adf43840379340a60a9992292Daniel Dunbar return 10; 127fae7bf269034202adf43840379340a60a9992292Daniel Dunbar } 128fae7bf269034202adf43840379340a60a9992292Daniel Dunbar} 129fae7bf269034202adf43840379340a60a9992292Daniel Dunbarint f9() { 130fae7bf269034202adf43840379340a60a9992292Daniel Dunbar return f9_0(2); 131fae7bf269034202adf43840379340a60a9992292Daniel Dunbar} 132fae7bf269034202adf43840379340a60a9992292Daniel Dunbar 133fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// Ensure that this doesn't compile to infinite loop in g() due to 134fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// miscompilation of fallthrough from default to a (tested) case 135fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// range. 136fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// 137fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// CHECK: define i32 @f10() 138fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// CHECK: ret i32 10 139fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// CHECK: } 140fae7bf269034202adf43840379340a60a9992292Daniel Dunbarstatic int f10_0(unsigned x) { 141fae7bf269034202adf43840379340a60a9992292Daniel Dunbar switch(x) { 142fae7bf269034202adf43840379340a60a9992292Daniel Dunbar default: 143fae7bf269034202adf43840379340a60a9992292Daniel Dunbar x += 1; 144fae7bf269034202adf43840379340a60a9992292Daniel Dunbar case 10 ... 0xFFFFFFFF: 145fae7bf269034202adf43840379340a60a9992292Daniel Dunbar return 0; 146fae7bf269034202adf43840379340a60a9992292Daniel Dunbar } 147fae7bf269034202adf43840379340a60a9992292Daniel Dunbar} 148fae7bf269034202adf43840379340a60a9992292Daniel Dunbar 149fae7bf269034202adf43840379340a60a9992292Daniel Dunbarint f10() { 150fae7bf269034202adf43840379340a60a9992292Daniel Dunbar f10_0(1); 151fae7bf269034202adf43840379340a60a9992292Daniel Dunbar return 10; 152fae7bf269034202adf43840379340a60a9992292Daniel Dunbar} 153fae7bf269034202adf43840379340a60a9992292Daniel Dunbar 154fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// This generated incorrect code because of poor switch chaining. 155fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// 156fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// CHECK: define i32 @f11( 157fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// CHECK: ret i32 3 158fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// CHECK: } 159fae7bf269034202adf43840379340a60a9992292Daniel Dunbarint f11(int x) { 160fae7bf269034202adf43840379340a60a9992292Daniel Dunbar switch(x) { 161fae7bf269034202adf43840379340a60a9992292Daniel Dunbar default: 162fae7bf269034202adf43840379340a60a9992292Daniel Dunbar return 3; 163fae7bf269034202adf43840379340a60a9992292Daniel Dunbar case 10 ... 0xFFFFFFFF: 164fae7bf269034202adf43840379340a60a9992292Daniel Dunbar return 0; 165fae7bf269034202adf43840379340a60a9992292Daniel Dunbar } 166fae7bf269034202adf43840379340a60a9992292Daniel Dunbar} 167fae7bf269034202adf43840379340a60a9992292Daniel Dunbar 168fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// This just asserted because of the way case ranges were calculated. 169fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// 170fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// CHECK: define i32 @f12( 171fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// CHECK: ret i32 3 172fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// CHECK: } 173fae7bf269034202adf43840379340a60a9992292Daniel Dunbarint f12(int x) { 174fae7bf269034202adf43840379340a60a9992292Daniel Dunbar switch (x) { 175fae7bf269034202adf43840379340a60a9992292Daniel Dunbar default: 176fae7bf269034202adf43840379340a60a9992292Daniel Dunbar return 3; 177fae7bf269034202adf43840379340a60a9992292Daniel Dunbar case 10 ... -1: 178fae7bf269034202adf43840379340a60a9992292Daniel Dunbar return 0; 179fae7bf269034202adf43840379340a60a9992292Daniel Dunbar } 180fae7bf269034202adf43840379340a60a9992292Daniel Dunbar} 181fae7bf269034202adf43840379340a60a9992292Daniel Dunbar 182fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// Make sure return is not constant (if empty range is skipped or miscompiled) 183fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// 184fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// CHECK: define i32 @f13( 185fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// CHECK: ret i32 % 186fae7bf269034202adf43840379340a60a9992292Daniel Dunbar// CHECK: } 187fae7bf269034202adf43840379340a60a9992292Daniel Dunbarint f13(unsigned x) { 188fae7bf269034202adf43840379340a60a9992292Daniel Dunbar switch(x) { 189fae7bf269034202adf43840379340a60a9992292Daniel Dunbar case 2: 190fae7bf269034202adf43840379340a60a9992292Daniel Dunbar // fallthrough empty range 191fae7bf269034202adf43840379340a60a9992292Daniel Dunbar case 10 ... 9: 192fae7bf269034202adf43840379340a60a9992292Daniel Dunbar return 10; 193fae7bf269034202adf43840379340a60a9992292Daniel Dunbar default: 194fae7bf269034202adf43840379340a60a9992292Daniel Dunbar return 0; 195fae7bf269034202adf43840379340a60a9992292Daniel Dunbar } 196fae7bf269034202adf43840379340a60a9992292Daniel Dunbar} 197