nir/spirv: Add a helper for pushing SSA values
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 28 Jun 2017 09:50:33 +0000 (02:50 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 18 Jul 2017 16:43:12 +0000 (09:43 -0700)
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
src/compiler/spirv/spirv_to_nir.c
src/compiler/spirv/vtn_cfg.c
src/compiler/spirv/vtn_private.h
src/compiler/spirv/vtn_variables.c

index 7038bd97ced715b683f43750eca8735990374437..6e35f83a421379bcecb2b99e4fe76c3952dbadc4 100644 (file)
@@ -1379,6 +1379,7 @@ static void
 vtn_handle_function_call(struct vtn_builder *b, SpvOp opcode,
                          const uint32_t *w, unsigned count)
 {
+   struct vtn_type *res_type = vtn_value(b, w[1], vtn_value_type_type)->type;
    struct nir_function *callee =
       vtn_value(b, w[3], vtn_value_type_function)->func->impl->function;
 
@@ -1402,6 +1403,7 @@ vtn_handle_function_call(struct vtn_builder *b, SpvOp opcode,
    }
 
    nir_variable *out_tmp = NULL;
+   assert(res_type->type == callee->return_type);
    if (!glsl_type_is_void(callee->return_type)) {
       out_tmp = nir_local_variable_create(b->impl, callee->return_type,
                                           "out_tmp");
@@ -1413,8 +1415,7 @@ vtn_handle_function_call(struct vtn_builder *b, SpvOp opcode,
    if (glsl_type_is_void(callee->return_type)) {
       vtn_push_value(b, w[2], vtn_value_type_undef);
    } else {
-      struct vtn_value *retval = vtn_push_value(b, w[2], vtn_value_type_ssa);
-      retval->ssa = vtn_local_load(b, call->return_deref);
+      vtn_push_ssa(b, w[2], res_type, vtn_local_load(b, call->return_deref));
    }
 }
 
index df54b3c48517cb325a10ae84f0d75e02661be7d8..c81a62d7a8ecf0a53d24b727bb37fe90547e4e20 100644 (file)
@@ -112,12 +112,12 @@ vtn_cfg_handle_prepass_instruction(struct vtn_builder *b, SpvOp opcode,
          val->pointer = vtn_pointer_for_variable(b, vtn_var, type);
       } else {
          /* We're a regular SSA value. */
-         struct vtn_value *val = vtn_push_value(b, w[2], vtn_value_type_ssa);
+         struct vtn_ssa_value *param_ssa =
+            vtn_local_load(b, nir_deref_var_create(b, param));
+         struct vtn_value *val = vtn_push_ssa(b, w[2], type, param_ssa);
 
          /* Name the parameter so it shows up nicely in NIR */
          param->name = ralloc_strdup(param, val->name);
-
-         val->ssa = vtn_local_load(b, nir_deref_var_create(b, param));
       }
       break;
    }
@@ -504,14 +504,13 @@ vtn_handle_phis_first_pass(struct vtn_builder *b, SpvOp opcode,
     * algorithm all over again.  It's easier if we just let
     * lower_vars_to_ssa do that for us instead of repeating it here.
     */
-   struct vtn_value *val = vtn_push_value(b, w[2], vtn_value_type_ssa);
-
    struct vtn_type *type = vtn_value(b, w[1], vtn_value_type_type)->type;
    nir_variable *phi_var =
       nir_local_variable_create(b->nb.impl, type->type, "phi");
    _mesa_hash_table_insert(b->phi_table, w, phi_var);
 
-   val->ssa = vtn_local_load(b, nir_deref_var_create(b, phi_var));
+   vtn_push_ssa(b, w[2], type,
+                vtn_local_load(b, nir_deref_var_create(b, phi_var)));
 
    return true;
 }
index 2f96c0904ac45c53ac1d6103a52b9cc347800097..8d745bb4a03303b6a26cbff6aeca6a7614b3926f 100644 (file)
@@ -513,6 +513,15 @@ vtn_push_value(struct vtn_builder *b, uint32_t value_id,
    return &b->values[value_id];
 }
 
+static inline struct vtn_value *
+vtn_push_ssa(struct vtn_builder *b, uint32_t value_id,
+             struct vtn_type *type, struct vtn_ssa_value *ssa)
+{
+   struct vtn_value *val = vtn_push_value(b, value_id, vtn_value_type_ssa);
+   val->ssa = ssa;
+   return val;
+}
+
 static inline struct vtn_value *
 vtn_untyped_value(struct vtn_builder *b, uint32_t value_id)
 {
index a9ba39247c854713235c1639d9431c65273ffbe5..a9e2dbfaa04e81459872a66b8ef0c37b38be4887 100644 (file)
@@ -1774,6 +1774,8 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
    }
 
    case SpvOpLoad: {
+      struct vtn_type *res_type =
+         vtn_value(b, w[1], vtn_value_type_type)->type;
       struct vtn_pointer *src =
          vtn_value(b, w[3], vtn_value_type_pointer)->pointer;
 
@@ -1783,8 +1785,7 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
          return;
       }
 
-      struct vtn_value *val = vtn_push_value(b, w[2], vtn_value_type_ssa);
-      val->ssa = vtn_variable_load(b, src);
+      vtn_push_ssa(b, w[2], res_type, vtn_variable_load(b, src));
       break;
    }