brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.4 KiB · 7d1d1bd Raw
213 lines · c
1// RUN: %clang_cc1 -triple i386-unknown-unknown -O3 %s -emit-llvm -o - | FileCheck %s2 3int foo(int i) {4  int j = 0;5  switch (i) {6  case -1:7    j = 1; break;8  case 1 :9    j = 2; break;10  case 2:11    j = 3; break;12  default:13    j = 42; break;14  }15  j = j + 1;16  return j;17}18 19int foo2(int i) {20  int j = 0;21  switch (i) {22  case 1 :23    j = 2; break;24  case 2 ... 10:25    j = 3; break;26  default:27    j = 42; break;28  }29  j = j + 1;30  return j;31}32 33int foo3(int i) {34  int j = 0;35  switch (i) {36  default:37    j = 42; break;38  case 111:39    j = 111; break;40  case 0 ... 100:41    j = 1; break;42  case 222:43    j = 222; break;44  }45  return j;46}47 48 49static int foo4(int i) {50  int j = 0;51  switch (i) {52  case 111:53    j = 111; break;54  case 0 ... 100:55    j = 1; break;56  case 222:57    j = 222; break;58  default:59    j = 42; break;60  case 501 ... 600:61    j = 5; break;62  }63  return j;64}65 66// CHECK-LABEL: define{{.*}} i32 @foo4t()67// CHECK: ret i32 37668// CHECK: }69int foo4t(void) {70  // 111 + 1 + 222 + 42 = 37671  return foo4(111) + foo4(99) + foo4(222) + foo4(601);72}73 74// CHECK-LABEL: define{{.*}} void @foo5()75// CHECK-NOT: switch76// CHECK: }77void foo5(void){78    switch(0){79    default:80        if (0) {81 82        }83    }84}85 86// CHECK-LABEL: define{{.*}} void @foo6()87// CHECK-NOT: switch88// CHECK: }89void foo6(void){90    switch(0){91    }92}93 94// CHECK-LABEL: define{{.*}} void @foo7()95// CHECK-NOT: switch96// CHECK: }97void foo7(void){98    switch(0){99      foo7();100    }101}102 103 104// CHECK-LABEL: define{{.*}} i32 @f8(105// CHECK: ret i32 3106// CHECK: }107int f8(unsigned x) {108  switch(x) {109  default:110    return 3;111  case 0xFFFFFFFF ... 1: // This range should be empty because x is unsigned.112    return 0;113  }114}115 116// Ensure that default after a case range is not ignored.117//118// CHECK-LABEL: define{{.*}} i32 @f9()119// CHECK: ret i32 10120// CHECK: }121static int f9_0(unsigned x) {122  switch(x) {123  case 10 ... 0xFFFFFFFF:124    return 0;125  default:126    return 10;127  }128}129int f9(void) {130  return f9_0(2);131}132 133// Ensure that this doesn't compile to infinite loop in g() due to134// miscompilation of fallthrough from default to a (tested) case135// range.136//137// CHECK-LABEL: define{{.*}} i32 @f10()138// CHECK: ret i32 10139// CHECK: }140static int f10_0(unsigned x) {141  switch(x) {142  default:143    x += 1;144  case 10 ... 0xFFFFFFFF:145    return 0;146  }147}148 149int f10(void) {150  f10_0(1);151  return 10;152}153 154// This generated incorrect code because of poor switch chaining.155//156// CHECK-LABEL: define{{.*}} i32 @f11(157// CHECK: ret i32 3158// CHECK: }159int f11(int x) {160  switch(x) {161  default:162    return 3;163  case 10 ... 0xFFFFFFFF:164    return 0;165  }166}167 168// This just asserted because of the way case ranges were calculated.169//170// CHECK-LABEL: define{{.*}} i32 @f12(171// CHECK: ret i32 3172// CHECK: }173int f12(int x) {174  switch (x) {175  default:176    return 3;177  case 10 ... -1: 178    return 0;179  }180}181 182// Make sure return is not constant (if empty range is skipped or miscompiled)183//184// CHECK-LABEL: define{{.*}} i32 @f13(185// CHECK: ret i32 %186// CHECK: }187int f13(unsigned x) {188  switch(x) {189  case 2:190    // fallthrough empty range191  case 10 ... 9:192    return 10;193  default:194    return 0;195  }196}197 198// Don't delete a basic block that we want to introduce later references to.199// This isn't really specific to switches, but it's easy to show with them.200int f14(int x) {201  switch (x) {202 203  // case range so that the case block has no predecessors204  case 0 ... 15:205    // any expression which doesn't introduce a new block206    (void) 0;207    // kaboom208 209  default:210    return x;211  }212}213