From 186d0223d218d36237327c23963109799e2eed74 Mon Sep 17 00:00:00 2001 From: Matt Pharr Date: Sat, 3 Dec 2011 22:37:53 -0800 Subject: [PATCH] Fix AoS/SoA stdlib functions to match documentation (i.e. actually remove the old offset parameter stuff now that we can actually pass pointers.) --- builtins.m4 | 33 +++++++++++----------------- stdlib.ispc | 44 +++++++++++++++++-------------------- tests/aossoa-1.ispc | 2 +- tests/aossoa-2.ispc | 2 +- tests/aossoa-3.ispc | 2 +- tests/aossoa-4.ispc | 2 +- tests/aossoa-5.ispc | 2 +- tests/aossoa-6.ispc | 2 +- tests/aossoa-7.ispc | 2 +- tests/aossoa-8.ispc | 2 +- tests_errors/redeclare.ispc | 6 +++++ tests_errors/shadow.ispc | 8 +++++++ 12 files changed, 55 insertions(+), 52 deletions(-) create mode 100644 tests_errors/redeclare.ispc create mode 100644 tests_errors/shadow.ispc diff --git a/builtins.m4 b/builtins.m4 index bcfcc840..250d7801 100644 --- a/builtins.m4 +++ b/builtins.m4 @@ -1660,11 +1660,10 @@ define void ;; versions to be called from stdlib define void -@__aos_to_soa4_float(float * noalias %pf, i32 %offset, +@__aos_to_soa4_float(float * noalias %p, <$1 x float> * noalias %out0, <$1 x float> * noalias %out1, <$1 x float> * noalias %out2, <$1 x float> * noalias %out3) nounwind alwaysinline { - %p = getelementptr float * %pf, i32 %offset %p0 = bitcast float * %p to <$1 x float> * %v0 = load <$1 x float> * %p0, align 4 %p1 = getelementptr <$1 x float> * %p0, i32 1 @@ -1681,16 +1680,16 @@ define void define void -@__aos_to_soa4_int32(i32 * noalias %base, i32 %offset, +@__aos_to_soa4_int32(i32 * noalias %ptr, <$1 x i32> * noalias %out0, <$1 x i32> * noalias %out1, <$1 x i32> * noalias %out2, <$1 x i32> * noalias %out3) nounwind alwaysinline { - %fbase = bitcast i32 * %base to float * + %fptr = bitcast i32 * %ptr to float * %fout0 = bitcast <$1 x i32> * %out0 to <$1 x float> * %fout1 = bitcast <$1 x i32> * %out1 to <$1 x float> * %fout2 = bitcast <$1 x i32> * %out2 to <$1 x float> * %fout3 = bitcast <$1 x i32> * %out3 to <$1 x float> * - call void @__aos_to_soa4_float(float * %fbase, i32 %offset, + call void @__aos_to_soa4_float(float * %fptr, <$1 x float> * %fout0, <$1 x float> * %fout1, <$1 x float> * %fout2, <$1 x float> * %fout3) ret void @@ -1699,9 +1698,7 @@ define void define void @__soa_to_aos4_float(<$1 x float> %v0, <$1 x float> %v1, <$1 x float> %v2, - <$1 x float> %v3, float * noalias %pf, - i32 %offset) nounwind alwaysinline { - %p = getelementptr float * %pf, i32 %offset + <$1 x float> %v3, float * noalias %p) nounwind alwaysinline { %out0 = bitcast float * %p to <$1 x float> * %out1 = getelementptr <$1 x float> * %out0, i32 1 %out2 = getelementptr <$1 x float> * %out0, i32 2 @@ -1715,25 +1712,22 @@ define void define void @__soa_to_aos4_int32(<$1 x i32> %v0, <$1 x i32> %v1, <$1 x i32> %v2, - <$1 x i32> %v3, i32 * noalias %base, - i32 %offset) nounwind alwaysinline { + <$1 x i32> %v3, i32 * noalias %base) nounwind alwaysinline { %fv0 = bitcast <$1 x i32> %v0 to <$1 x float> %fv1 = bitcast <$1 x i32> %v1 to <$1 x float> %fv2 = bitcast <$1 x i32> %v2 to <$1 x float> %fv3 = bitcast <$1 x i32> %v3 to <$1 x float> %fbase = bitcast i32 * %base to float * call void @__soa_to_aos4_float(<$1 x float> %fv0, <$1 x float> %fv1, - <$1 x float> %fv2, <$1 x float> %fv3, float * %fbase, - i32 %offset) + <$1 x float> %fv2, <$1 x float> %fv3, float * %fbase) ret void } define void -@__aos_to_soa3_float(float * noalias %pf, i32 %offset, +@__aos_to_soa3_float(float * noalias %p, <$1 x float> * %out0, <$1 x float> * %out1, <$1 x float> * %out2) nounwind alwaysinline { - %p = getelementptr float * %pf, i32 %offset %p0 = bitcast float * %p to <$1 x float> * %v0 = load <$1 x float> * %p0, align 4 %p1 = getelementptr <$1 x float> * %p0, i32 1 @@ -1748,14 +1742,14 @@ define void define void -@__aos_to_soa3_int32(i32 * noalias %base, i32 %offset, +@__aos_to_soa3_int32(i32 * noalias %base, <$1 x i32> * noalias %out0, <$1 x i32> * noalias %out1, <$1 x i32> * noalias %out2) nounwind alwaysinline { %fbase = bitcast i32 * %base to float * %fout0 = bitcast <$1 x i32> * %out0 to <$1 x float> * %fout1 = bitcast <$1 x i32> * %out1 to <$1 x float> * %fout2 = bitcast <$1 x i32> * %out2 to <$1 x float> * - call void @__aos_to_soa3_float(float * %fbase, i32 %offset, + call void @__aos_to_soa3_float(float * %fbase, <$1 x float> * %fout0, <$1 x float> * %fout1, <$1 x float> * %fout2) ret void } @@ -1763,8 +1757,7 @@ define void define void @__soa_to_aos3_float(<$1 x float> %v0, <$1 x float> %v1, <$1 x float> %v2, - float * noalias %pf, i32 %offset) nounwind alwaysinline { - %p = getelementptr float * %pf, i32 %offset + float * noalias %p) nounwind alwaysinline { %out0 = bitcast float * %p to <$1 x float> * %out1 = getelementptr <$1 x float> * %out0, i32 1 %out2 = getelementptr <$1 x float> * %out0, i32 2 @@ -1777,13 +1770,13 @@ define void define void @__soa_to_aos3_int32(<$1 x i32> %v0, <$1 x i32> %v1, <$1 x i32> %v2, - i32 * noalias %base, i32 %offset) nounwind alwaysinline { + i32 * noalias %base) nounwind alwaysinline { %fv0 = bitcast <$1 x i32> %v0 to <$1 x float> %fv1 = bitcast <$1 x i32> %v1 to <$1 x float> %fv2 = bitcast <$1 x i32> %v2 to <$1 x float> %fbase = bitcast i32 * %base to float * call void @__soa_to_aos3_float(<$1 x float> %fv0, <$1 x float> %fv1, - <$1 x float> %fv2, float * %fbase, i32 %offset) + <$1 x float> %fv2, float * %fbase) ret void } diff --git a/stdlib.ispc b/stdlib.ispc index 52326513..1a804733 100644 --- a/stdlib.ispc +++ b/stdlib.ispc @@ -426,51 +426,47 @@ count_trailing_zeros(int64 v) { // AOS/SOA conversion static inline void -aos_to_soa3(uniform float a[], uniform int offset, float * uniform v0, - float * uniform v1, float * uniform v2) { - __aos_to_soa3_float(&a[0], offset, v0, v1, v2); +aos_to_soa3(uniform float a[], float * uniform v0, float * uniform v1, + float * uniform v2) { + __aos_to_soa3_float(a, v0, v1, v2); } static inline void -soa_to_aos3(float v0, float v1, float v2, uniform float a[], - uniform int offset) { - __soa_to_aos3_float(v0, v1, v2, &a[0], offset); +soa_to_aos3(float v0, float v1, float v2, uniform float a[]) { + __soa_to_aos3_float(v0, v1, v2, a); } static inline void -aos_to_soa4(uniform float a[], uniform int offset, float * uniform v0, - float * uniform v1, float * uniform v2, float * uniform v3) { - __aos_to_soa4_float(&a[0], offset, v0, v1, v2, v3); +aos_to_soa4(uniform float a[], float * uniform v0, float * uniform v1, + float * uniform v2, float * uniform v3) { + __aos_to_soa4_float(a, v0, v1, v2, v3); } static inline void -soa_to_aos4(float v0, float v1, float v2, float v3, uniform float a[], - uniform int offset) { - __soa_to_aos4_float(v0, v1, v2, v3, &a[0], offset); +soa_to_aos4(float v0, float v1, float v2, float v3, uniform float a[]) { + __soa_to_aos4_float(v0, v1, v2, v3, a); } static inline void -aos_to_soa3(uniform int32 a[], uniform int offset, int32 * uniform v0, - int32 * uniform v1, int32 * uniform v2) { - __aos_to_soa3_int32(&a[0], offset, v0, v1, v2); +aos_to_soa3(uniform int32 a[], int32 * uniform v0, int32 * uniform v1, + int32 * uniform v2) { + __aos_to_soa3_int32(a, v0, v1, v2); } static inline void -soa_to_aos3(int32 v0, int32 v1, int32 v2, uniform int32 a[], - uniform int offset) { - __soa_to_aos3_int32(v0, v1, v2, &a[0], offset); +soa_to_aos3(int32 v0, int32 v1, int32 v2, uniform int32 a[]) { + __soa_to_aos3_int32(v0, v1, v2, a); } static inline void -aos_to_soa4(uniform int32 a[], uniform int offset, int32 * uniform v0, - int32 * uniform v1, int32 * uniform v2, int32 * uniform v3) { - __aos_to_soa4_int32(&a[0], offset, v0, v1, v2, v3); +aos_to_soa4(uniform int32 a[], int32 * uniform v0, int32 * uniform v1, + int32 * uniform v2, int32 * uniform v3) { + __aos_to_soa4_int32(a, v0, v1, v2, v3); } static inline void -soa_to_aos4(int32 v0, int32 v1, int32 v2, int32 v3, uniform int32 a[], - uniform int offset) { - __soa_to_aos4_int32(v0, v1, v2, v3, &a[0], offset); +soa_to_aos4(int32 v0, int32 v1, int32 v2, int32 v3, uniform int32 a[]) { + __soa_to_aos4_int32(v0, v1, v2, v3, a); } /////////////////////////////////////////////////////////////////////////// diff --git a/tests/aossoa-1.ispc b/tests/aossoa-1.ispc index f1db1fec..6323d80f 100644 --- a/tests/aossoa-1.ispc +++ b/tests/aossoa-1.ispc @@ -11,7 +11,7 @@ export void f_v(uniform float RET[]) { a[i] = i; float x=-1, y=-1, z=-1; - aos_to_soa3(a, 0, &x, &y, &z); + aos_to_soa3(a, &x, &y, &z); int errs = 0; if (x != width * programIndex) ++errs; diff --git a/tests/aossoa-2.ispc b/tests/aossoa-2.ispc index 6615bbcf..b23a25e4 100644 --- a/tests/aossoa-2.ispc +++ b/tests/aossoa-2.ispc @@ -11,7 +11,7 @@ export void f_v(uniform float RET[]) { a[i] = i; float x=-1, y=-1, z=-1, w=-1; - aos_to_soa4(a, 0, &x, &y, &z, &w); + aos_to_soa4(a, &x, &y, &z, &w); int errs = 0; if (x != width * programIndex) ++errs; diff --git a/tests/aossoa-3.ispc b/tests/aossoa-3.ispc index 416a5a8e..b4efe917 100644 --- a/tests/aossoa-3.ispc +++ b/tests/aossoa-3.ispc @@ -13,7 +13,7 @@ export void f_v(uniform float RET[]) { float z = 2 + width * programIndex; float w = 3 + width * programIndex; - soa_to_aos4(x, y, z, w, a, 0); + soa_to_aos4(x, y, z, w, a); uniform int errs = 0; for (uniform int i = 0; i < width * programCount; ++i) if (a[i] != i) ++errs; diff --git a/tests/aossoa-4.ispc b/tests/aossoa-4.ispc index 4646f1ca..3ec9db81 100644 --- a/tests/aossoa-4.ispc +++ b/tests/aossoa-4.ispc @@ -12,7 +12,7 @@ export void f_v(uniform float RET[]) { float y = 1 + width * programIndex; float z = 2 + width * programIndex; - soa_to_aos3(x, y, z, a, 0); + soa_to_aos3(x, y, z, a); uniform int errs = 0; for (uniform int i = 0; i < width * programCount; ++i) if (a[i] != i) ++errs; diff --git a/tests/aossoa-5.ispc b/tests/aossoa-5.ispc index 461b8e76..883786c0 100644 --- a/tests/aossoa-5.ispc +++ b/tests/aossoa-5.ispc @@ -11,7 +11,7 @@ export void f_v(uniform float RET[]) { a[i] = i; int x=-1, y=-1, z=-1; - aos_to_soa3(a, 0, &x, &y, &z); + aos_to_soa3(a, &x, &y, &z); int errs = 0; if (x != width * programIndex) ++errs; diff --git a/tests/aossoa-6.ispc b/tests/aossoa-6.ispc index fd71ed11..34d35348 100644 --- a/tests/aossoa-6.ispc +++ b/tests/aossoa-6.ispc @@ -11,7 +11,7 @@ export void f_v(uniform float RET[]) { a[i] = i; int x=-1, y=-1, z=-1, w=-1; - aos_to_soa4(a, 0, &x, &y, &z, &w); + aos_to_soa4(a, &x, &y, &z, &w); int errs = 0; if (x != width * programIndex) ++errs; diff --git a/tests/aossoa-7.ispc b/tests/aossoa-7.ispc index 1c682b7d..9859d060 100644 --- a/tests/aossoa-7.ispc +++ b/tests/aossoa-7.ispc @@ -13,7 +13,7 @@ export void f_v(uniform float RET[]) { int z = 2 + width * programIndex; int w = 3 + width * programIndex; - soa_to_aos4(x, y, z, w, a, 0); + soa_to_aos4(x, y, z, w, a); uniform int errs = 0; for (uniform int i = 0; i < width * programCount; ++i) if (a[i] != i) ++errs; diff --git a/tests/aossoa-8.ispc b/tests/aossoa-8.ispc index 4c0afea0..da348db0 100644 --- a/tests/aossoa-8.ispc +++ b/tests/aossoa-8.ispc @@ -12,7 +12,7 @@ export void f_v(uniform float RET[]) { int y = 1 + width * programIndex; int z = 2 + width * programIndex; - soa_to_aos3(x, y, z, a, 0); + soa_to_aos3(x, y, z, a); uniform int errs = 0; for (uniform int i = 0; i < width * programCount; ++i) if (a[i] != i) ++errs; diff --git a/tests_errors/redeclare.ispc b/tests_errors/redeclare.ispc new file mode 100644 index 00000000..e745f6af --- /dev/null +++ b/tests_errors/redeclare.ispc @@ -0,0 +1,6 @@ +// Ignoring redeclaration of symbol "a" + +void foo() { + int a; + int a; +} diff --git a/tests_errors/shadow.ispc b/tests_errors/shadow.ispc new file mode 100644 index 00000000..8322636e --- /dev/null +++ b/tests_errors/shadow.ispc @@ -0,0 +1,8 @@ +// Symbol "a" shadows symbol declared in outer scope + +void foo() { + int a; + { + int a; + } +}