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}
197cd5b22e12b6513163dd131589746c194090f14e6John McCall
198cd5b22e12b6513163dd131589746c194090f14e6John McCall// Don't delete a basic block that we want to introduce later references to.
199cd5b22e12b6513163dd131589746c194090f14e6John McCall// This isn't really specific to switches, but it's easy to show with them.
200cd5b22e12b6513163dd131589746c194090f14e6John McCall// rdar://problem/8837067
201cd5b22e12b6513163dd131589746c194090f14e6John McCallint f14(int x) {
202cd5b22e12b6513163dd131589746c194090f14e6John McCall  switch (x) {
203cd5b22e12b6513163dd131589746c194090f14e6John McCall
204cd5b22e12b6513163dd131589746c194090f14e6John McCall  // case range so that the case block has no predecessors
205cd5b22e12b6513163dd131589746c194090f14e6John McCall  case 0 ... 15:
206cd5b22e12b6513163dd131589746c194090f14e6John McCall    // any expression which doesn't introduce a new block
207cd5b22e12b6513163dd131589746c194090f14e6John McCall    (void) 0;
208cd5b22e12b6513163dd131589746c194090f14e6John McCall    // kaboom
209cd5b22e12b6513163dd131589746c194090f14e6John McCall
210cd5b22e12b6513163dd131589746c194090f14e6John McCall  default:
211cd5b22e12b6513163dd131589746c194090f14e6John McCall    return x;
212cd5b22e12b6513163dd131589746c194090f14e6John McCall  }
213cd5b22e12b6513163dd131589746c194090f14e6John McCall}
214