| Index: test/Transforms/NaCl/simplify-allocas.ll
|
| diff --git a/test/Transforms/NaCl/simplify-allocas.ll b/test/Transforms/NaCl/simplify-allocas.ll
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..27b7df4991a4536793be899484a68632c30674e8
|
| --- /dev/null
|
| +++ b/test/Transforms/NaCl/simplify-allocas.ll
|
| @@ -0,0 +1,136 @@
|
| +; RUN: opt < %s -simplify-allocas -S | FileCheck %s
|
| +
|
| +target datalayout = "p:32:32:32"
|
| +
|
| +%struct = type { i32, i32 }
|
| +
|
| +declare void @receive_alloca(%struct* %ptr)
|
| +declare void @receive_vector_alloca(<4 x i32>* %ptr)
|
| +
|
| +define void @alloca_fixed() {
|
| + %buf = alloca %struct, align 128
|
| + call void @receive_alloca(%struct* %buf)
|
| + ret void
|
| +}
|
| +; CHECK-LABEL: define void @alloca_fixed() {
|
| +; CHECK-NEXT: %buf = alloca i8, i32 8, align 128
|
| +; CHECK-NEXT: %buf.bc = bitcast i8* %buf to %struct*
|
| +; CHECK-NEXT: call void @receive_alloca(%struct* %buf.bc)
|
| +
|
| +; When the size passed to alloca is a constant, it should be a
|
| +; constant in the output too.
|
| +define void @alloca_fixed_array() {
|
| + %buf = alloca %struct, i32 100
|
| + call void @receive_alloca(%struct* %buf)
|
| + ret void
|
| +}
|
| +; CHECK-LABEL: define void @alloca_fixed_array() {
|
| +; CHECK-NEXT: %buf = alloca i8, i32 800, align 8
|
| +; CHECK-NEXT: %buf.bc = bitcast i8* %buf to %struct*
|
| +; CHECK-NEXT: call void @receive_alloca(%struct* %buf.bc)
|
| +
|
| +define void @alloca_fixed_vector() {
|
| + %buf = alloca <4 x i32>, align 128
|
| + call void @receive_vector_alloca(<4 x i32>* %buf)
|
| + ret void
|
| +}
|
| +; CHECK-LABEL: define void @alloca_fixed_vector() {
|
| +; CHECK-NEXT: %buf = alloca i8, i32 16, align 128
|
| +; CHECK-NEXT: %buf.bc = bitcast i8* %buf to <4 x i32>*
|
| +; CHECK-NEXT: call void @receive_vector_alloca(<4 x i32>* %buf.bc)
|
| +
|
| +define void @alloca_variable(i32 %size) {
|
| + %buf = alloca %struct, i32 %size
|
| + call void @receive_alloca(%struct* %buf)
|
| + ret void
|
| +}
|
| +; CHECK-LABEL: define void @alloca_variable(i32 %size) {
|
| +; CHECK-NEXT: %buf.alloca_mul = mul i32 8, %size
|
| +; CHECK-NEXT: %buf = alloca i8, i32 %buf.alloca_mul
|
| +; CHECK-NEXT: %buf.bc = bitcast i8* %buf to %struct*
|
| +; CHECK-NEXT: call void @receive_alloca(%struct* %buf.bc)
|
| +
|
| +define void @alloca_alignment_i32() {
|
| + %buf = alloca i32
|
| + ret void
|
| +}
|
| +; CHECK-LABEL: void @alloca_alignment_i32() {
|
| +; CHECK-NEXT: alloca i8, i32 4, align 4
|
| +
|
| +define void @alloca_alignment_double() {
|
| + %buf = alloca double
|
| + ret void
|
| +}
|
| +; CHECK-LABEL: void @alloca_alignment_double() {
|
| +; CHECK-NEXT: alloca i8, i32 8, align 8
|
| +
|
| +define void @alloca_lower_alignment() {
|
| + %buf = alloca i32, align 1
|
| + ret void
|
| +}
|
| +; CHECK-LABEL: void @alloca_lower_alignment() {
|
| +; CHECK-NEXT: alloca i8, i32 4, align 1
|
| +
|
| +define void @alloca_array_trunc() {
|
| + %a = alloca i32, i64 1024
|
| + unreachable
|
| +}
|
| +; CHECK-LABEL: define void @alloca_array_trunc()
|
| +; CHECK-NEXT: %a = alloca i8, i32 4096
|
| +
|
| +define void @alloca_array_zext() {
|
| + %a = alloca i32, i8 128
|
| + unreachable
|
| +}
|
| +; CHECK-LABEL: define void @alloca_array_zext()
|
| +; CHECK-NEXT: %a = alloca i8, i32 512
|
| +
|
| +define void @dyn_alloca_array_trunc(i64 %a) {
|
| + %b = alloca i32, i64 %a
|
| + unreachable
|
| +}
|
| +; CHECK-LABEL: define void @dyn_alloca_array_trunc(i64 %a)
|
| +; CHECK-NEXT: trunc i64 %a to i32
|
| +; CHECK-NEXT: mul i32 4,
|
| +; CHECK-NEXT: alloca i8, i32
|
| +
|
| +define void @dyn_alloca_array_zext(i8 %a) {
|
| + %b = alloca i32, i8 %a
|
| + unreachable
|
| +}
|
| +; CHECK-LABEL: define void @dyn_alloca_array_zext(i8 %a)
|
| +; CHECK-NEXT: zext i8 %a to i32
|
| +; CHECK-NEXT: mul i32 4,
|
| +; CHECK-NEXT: alloca i8, i32
|
| +
|
| +define void @dyn_inst_alloca_array(i32 %a) {
|
| + %b = add i32 1, %a
|
| + %c = alloca i32, i32 %b
|
| + unreachable
|
| +}
|
| +; CHECK-LABEL: define void @dyn_inst_alloca_array(i32 %a)
|
| +; CHECK-NEXT: %b = add i32 1, %a
|
| +; CHECK-NEXT: mul i32 4, %b
|
| +; CHECK-NEXT: %c = alloca i8, i32
|
| +
|
| +define void @dyn_inst_alloca_array_trunc(i64 %a) {
|
| + %b = add i64 1, %a
|
| + %c = alloca i32, i64 %b
|
| + unreachable
|
| +}
|
| +; CHECK-LABEL: define void @dyn_inst_alloca_array_trunc(i64 %a)
|
| +; CHECK-NEXT: %b = add i64 1, %a
|
| +; CHECK-NEXT: trunc i64 %b to i32
|
| +; CHECK-NEXT: mul i32 4,
|
| +; CHECK-NEXT: %c = alloca i8, i32
|
| +
|
| +define void @dyn_inst_alloca_array_zext(i8 %a) {
|
| + %b = add i8 1, %a
|
| + %c = alloca i32, i8 %b
|
| + unreachable
|
| +}
|
| +; CHECK-LABEL: define void @dyn_inst_alloca_array_zext(i8 %a)
|
| +; CHECK-NEXT: %b = add i8 1, %a
|
| +; CHECK-NEXT: zext i8 %b to i32
|
| +; CHECK-NEXT: mul i32 4,
|
| +; CHECK-NEXT: %c = alloca i8, i32
|
|
|