Merge several tests into switch.c.

llvm-svn: 100235
This commit is contained in:
Daniel Dunbar 2010-04-02 22:29:35 +00:00
parent 7b999ea7b7
commit 87c1991bb4
6 changed files with 94 additions and 88 deletions

View File

@ -1,18 +0,0 @@
// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm-bc -o - %s | opt -std-compile-opts | llvm-dis > %t
// RUN: grep "ret i32" %t | count 1
// RUN: grep "ret i32 10" %t | count 1
// Ensure that default after a case range is not ignored.
static int f1(unsigned x) {
switch(x) {
case 10 ... 0xFFFFFFFF:
return 0;
default:
return 10;
}
}
int g() {
return f1(2);
}

View File

@ -1,20 +0,0 @@
// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm-bc -o - %s | opt -std-compile-opts | llvm-dis > %t
// RUN: grep "ret i32 10" %t
// Ensure that this doesn't compile to infinite loop in g() due to
// miscompilation of fallthrough from default to a (tested) case
// range.
static int f0(unsigned x) {
switch(x) {
default:
x += 1;
case 10 ... 0xFFFFFFFF:
return 0;
}
}
int g() {
f0(1);
return 10;
}

View File

@ -1,23 +0,0 @@
// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm-bc -o - %s | opt -std-compile-opts | llvm-dis > %t
// RUN: grep "ret i32" %t | count 2
// RUN: grep "ret i32 3" %t | count 2
// This generated incorrect code because of poor switch chaining.
int f1(int x) {
switch(x) {
default:
return 3;
case 10 ... 0xFFFFFFFF:
return 0;
}
}
// This just asserted because of the way case ranges were calculated.
int f2(int x) {
switch (x) {
default:
return 3;
case 10 ... -1:
return 0;
}
}

View File

@ -1,15 +0,0 @@
// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm-bc -o - %s | opt -std-compile-opts | llvm-dis > %t
// RUN: grep "ret i32 %" %t
// Make sure return is not constant (if empty range is skipped or miscompiled)
int f0(unsigned x) {
switch(x) {
case 2:
// fallthrough empty range
case 10 ... 9:
return 10;
default:
return 0;
}
}

View File

@ -1,12 +0,0 @@
// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm-bc -o - %s | opt -std-compile-opts | llvm-dis > %t
// RUN: grep "ret i32" %t | count 1
// RUN: grep "ret i32 3" %t | count 1
int f2(unsigned x) {
switch(x) {
default:
return 3;
case 0xFFFFFFFF ... 1: // This range should be empty because x is unsigned.
return 0;
}
}

View File

@ -100,3 +100,97 @@ void foo7(){
}
}
// CHECK: define i32 @f8(
// CHECK: ret i32 3
// CHECK: }
int f8(unsigned x) {
switch(x) {
default:
return 3;
case 0xFFFFFFFF ... 1: // This range should be empty because x is unsigned.
return 0;
}
}
// Ensure that default after a case range is not ignored.
//
// CHECK: define i32 @f9()
// CHECK: ret i32 10
// CHECK: }
static int f9_0(unsigned x) {
switch(x) {
case 10 ... 0xFFFFFFFF:
return 0;
default:
return 10;
}
}
int f9() {
return f9_0(2);
}
// Ensure that this doesn't compile to infinite loop in g() due to
// miscompilation of fallthrough from default to a (tested) case
// range.
//
// CHECK: define i32 @f10()
// CHECK: ret i32 10
// CHECK: }
static int f10_0(unsigned x) {
switch(x) {
default:
x += 1;
case 10 ... 0xFFFFFFFF:
return 0;
}
}
int f10() {
f10_0(1);
return 10;
}
// This generated incorrect code because of poor switch chaining.
//
// CHECK: define i32 @f11(
// CHECK: ret i32 3
// CHECK: }
int f11(int x) {
switch(x) {
default:
return 3;
case 10 ... 0xFFFFFFFF:
return 0;
}
}
// This just asserted because of the way case ranges were calculated.
//
// CHECK: define i32 @f12(
// CHECK: ret i32 3
// CHECK: }
int f12(int x) {
switch (x) {
default:
return 3;
case 10 ... -1:
return 0;
}
}
// Make sure return is not constant (if empty range is skipped or miscompiled)
//
// CHECK: define i32 @f13(
// CHECK: ret i32 %
// CHECK: }
int f13(unsigned x) {
switch(x) {
case 2:
// fallthrough empty range
case 10 ... 9:
return 10;
default:
return 0;
}
}