diff --git a/llvm/test/VISC/parboil/benchmarks/sgemm/src/visc_sh/main.cc b/llvm/test/VISC/parboil/benchmarks/sgemm/src/visc_sh/main.cc
index 863cde3b35ccc064e4c150460e36c65f9acd7fd1..3ef592e0aac9f035f605a443bc15292653774225 100644
--- a/llvm/test/VISC/parboil/benchmarks/sgemm/src/visc_sh/main.cc
+++ b/llvm/test/VISC/parboil/benchmarks/sgemm/src/visc_sh/main.cc
@@ -47,8 +47,8 @@ typedef struct __attribute__((__packed__)) {
   float *C; size_t bytesC;
   int ldc;
   int k;
-  int alpha;
-  int beta;
+  float alpha;
+  float beta;
   int block_x;
   int block_y;
   int grid_x;
@@ -63,8 +63,8 @@ void packData(RootIn* args,
               float *C, size_t bytesC,
               int ldc,
               int k,
-              int alpha,
-              int beta,
+              float alpha,
+              float beta,
               int block_x,
               int block_y,
               int grid_x,
@@ -87,18 +87,13 @@ void packData(RootIn* args,
   args->grid_y = grid_y;
 }
 
-typedef struct __attribute__((packed)) {
-  void* shB; size_t bytes_shB;
-} AllocationOut;
-
 // TODO: decide between dynamic vs static allocation. Merely a convension - will
 // be translated.
-AllocationOut Allocation(block_x, block_y) {
+void Allocation(int block_x, int block_y) {
   // Memory shared between threadblocks
-  float shB[block_y][block_x];
-  void* ret_shB = (void*) shB;
+  void* shB = __visc__malloc(block_x*block_y*sizeof(float));
   
-  return {ret_shB, block_x*block_y*sizeof(float)}; 
+  __visc__return(shB, block_x*block_y*sizeof(float)); 
 }
 
 
@@ -129,15 +124,16 @@ void SgemmLeaf( float* A, size_t bytesA, int lda, float* B, size_t bytesB, int l
 
     for (int i = 0; i < k; i+=TILE_TB_HEIGHT) {
       float a; 
-      shB[ly][lx] = B[n+(i+ly)*ldb];
+      //shB[ly][lx] = B[n+(i+ly)*ldb];
+      shB[ly*dimx+lx] = B[n+(i+ly)*ldb];
 
       __visc__barrier();
-        b_base = get_group_id(1) * TILE_N + i * ldb;
-
       for (int j = 0; j < TILE_TB_HEIGHT; j++) {
 	      a = A[m + (i+j)*lda];
-	      for (int kk = 0; kk < TILE_N; kk++)
-		      c[kk] += a * shB[j][kk];
+	      for (int kk = 0; kk < TILE_N; kk++) {
+		      //c[kk] += a * shB[j][kk];
+		      c[kk] += a * shB[j*dimx+kk];
+              }
 
       }
       __visc__barrier();
@@ -157,8 +153,8 @@ void SgemmTB(float *A, size_t bytesA,
              float *C, size_t bytesC,
              int ldc,
              int k,
-             int alpha,
-             int beta,
+             float alpha,
+             float beta,
              int block_x,
              int block_y) {
   __visc__hint(visc::CPU_TARGET);
@@ -199,8 +195,8 @@ void SgemmRoot(float *A, size_t bytesA,
                float *C, size_t bytesC,
                int ldc,
                int k,
-               int alpha,
-               int beta,
+               float alpha,
+               float beta,
                int block_x,
                int block_y,
                int grid_x,