diff --git a/tools/iree-benchmark-executable-main.c b/tools/iree-benchmark-executable-main.c
index ff76ade..8c09896 100644
--- a/tools/iree-benchmark-executable-main.c
+++ b/tools/iree-benchmark-executable-main.c
@@ -43,41 +43,29 @@
 // dynamically growable.
 #define IREE_HAL_MAX_EXECUTABLE_CONSTANT_COUNT 512
 // Total number of push constants we (currently) allow any executable to have.
-#define IREE_HAL_MAX_PUSH_CONSTANT_COUNT 64
-// Maximum number of descriptor sets in an pipeline layout.
-#define IREE_HAL_MAX_DESCRIPTOR_SET_COUNT 2
+#define IREE_HAL_MAX_CONSTANT_COUNT 64
 // Total number of bindings we (currently) allow any executable to have.
-#define IREE_HAL_MAX_TOTAL_BINDING_COUNT \
-  (IREE_HAL_MAX_DESCRIPTOR_SET_COUNT * 32)
+#define IREE_HAL_MAX_BINDING_COUNT 64
 
 // Parsed dispatch parameters from flags.
 // Used to construct the dispatch parameters for the benchmark invocation.
 struct {
-  int32_t set_count;
-  struct {
-    // For now we only track the binding counts and assume they are all storage
-    // buffers. When we support more types we'll need an encoding.
-    int32_t binding_count;
-  } sets[IREE_HAL_MAX_DESCRIPTOR_SET_COUNT];
-
   int32_t executable_constant_count;
   union {
     uint32_t ui32;
   } executable_constants[IREE_HAL_MAX_EXECUTABLE_CONSTANT_COUNT];
 
-  int32_t push_constant_count;
+  int32_t constant_count;
   union {
     uint32_t ui32;
-  } push_constants[IREE_HAL_MAX_PUSH_CONSTANT_COUNT];
+  } constants[IREE_HAL_MAX_CONSTANT_COUNT];
 
   int32_t binding_count;
-  iree_string_view_t binding_specs[IREE_HAL_MAX_TOTAL_BINDING_COUNT];
-  char binding_cconv[IREE_HAL_MAX_TOTAL_BINDING_COUNT];
-  iree_hal_descriptor_set_layout_binding_t
-      binding_layouts[IREE_HAL_MAX_TOTAL_BINDING_COUNT];
+  iree_string_view_t binding_specs[IREE_HAL_MAX_BINDING_COUNT];
+  char binding_cconv[IREE_HAL_MAX_BINDING_COUNT];
 } parsed_params = {
     .executable_constant_count = 0,
-    .push_constant_count = 0,
+    .constant_count = 0,
     .binding_count = 0,
 };
 
@@ -117,11 +105,10 @@
                    &parsed_params, executable_constant,
                    "Appends a uint32_t executable constant value.\n");
 
-static iree_status_t parse_push_constant(iree_string_view_t flag_name,
-                                         void* storage,
-                                         iree_string_view_t value) {
-  IREE_ASSERT_LE(parsed_params.push_constant_count + 1,
-                 IREE_ARRAYSIZE(parsed_params.push_constants),
+static iree_status_t parse_constant(iree_string_view_t flag_name, void* storage,
+                                    iree_string_view_t value) {
+  IREE_ASSERT_LE(parsed_params.constant_count + 1,
+                 IREE_ARRAYSIZE(parsed_params.constants),
                  "too many push constants");
   uint32_t value_ui32 = 0;
   if (!iree_string_view_atoi_uint32(value, &value_ui32)) {
@@ -130,27 +117,26 @@
         "invalid push constant value `%.*s`; expects uint32_t", (int)value.size,
         value.data);
   }
-  parsed_params.push_constants[parsed_params.push_constant_count++].ui32 =
-      value_ui32;
+  parsed_params.constants[parsed_params.constant_count++].ui32 = value_ui32;
   return iree_ok_status();
 }
-static void print_push_constant(iree_string_view_t flag_name, void* storage,
-                                FILE* file) {
-  if (parsed_params.push_constant_count == 0) {
+static void print_constant(iree_string_view_t flag_name, void* storage,
+                           FILE* file) {
+  if (parsed_params.constant_count == 0) {
     fprintf(file, "# --%.*s=[integer value]\n", (int)flag_name.size,
             flag_name.data);
     return;
   }
-  for (int32_t i = 0; i < parsed_params.push_constant_count; ++i) {
+  for (int32_t i = 0; i < parsed_params.constant_count; ++i) {
     fprintf(file, "--%.*s=%u", (int)flag_name.size, flag_name.data,
-            parsed_params.push_constants[i].ui32);
-    if (i < parsed_params.push_constant_count - 1) {
+            parsed_params.constants[i].ui32);
+    if (i < parsed_params.constant_count - 1) {
       fprintf(file, "\n");
     }
   }
 }
-IREE_FLAG_CALLBACK(parse_push_constant, print_push_constant, &parsed_params,
-                   push_constant, "Appends a uint32_t push constant value.\n");
+IREE_FLAG_CALLBACK(parse_constant, print_constant, &parsed_params, constant,
+                   "Appends a uint32_t constant value.\n");
 
 static iree_status_t parse_binding(iree_string_view_t flag_name, void* storage,
                                    iree_string_view_t value) {
@@ -160,12 +146,6 @@
   int32_t i = parsed_params.binding_count++;
   parsed_params.binding_specs[i] = value;
   parsed_params.binding_cconv[i] = 'r';
-  // TODO(benvanik): allow for a specification of type/immutability.
-  parsed_params.binding_layouts[i] = (iree_hal_descriptor_set_layout_binding_t){
-      .binding = (uint32_t)i,
-      .type = IREE_HAL_DESCRIPTOR_TYPE_STORAGE_BUFFER,
-      .flags = IREE_HAL_DESCRIPTOR_FLAG_NONE,
-  };
   return iree_ok_status();
 }
 static void print_binding(iree_string_view_t flag_name, void* storage,
@@ -239,10 +219,9 @@
       IREE_HAL_COMMAND_CATEGORY_DISPATCH, IREE_HAL_QUEUE_AFFINITY_ANY,
       /*binding_capacity=*/0, &command_buffer));
   IREE_RETURN_IF_ERROR(iree_hal_command_buffer_begin(command_buffer));
-  iree_const_byte_span_t constants =
-      iree_make_const_byte_span(&parsed_params.push_constants[0].ui32,
-                                parsed_params.push_constant_count *
-                                    sizeof(parsed_params.push_constants[0]));
+  iree_const_byte_span_t constants = iree_make_const_byte_span(
+      &parsed_params.constants[0].ui32,
+      parsed_params.constant_count * sizeof(parsed_params.constants[0]));
   iree_hal_buffer_ref_list_t bindings = {
       .count = parsed_params.binding_count,
       .values = args->bindings,
@@ -372,7 +351,7 @@
       (iree_string_view_list_t){parsed_params.binding_count,
                                 parsed_params.binding_specs},
       device, device_allocator, host_allocator, &binding_list));
-  iree_hal_buffer_ref_t bindings[IREE_HAL_MAX_TOTAL_BINDING_COUNT];
+  iree_hal_buffer_ref_t bindings[IREE_HAL_MAX_BINDING_COUNT];
   for (iree_host_size_t i = 0; i < parsed_params.binding_count; ++i) {
     iree_vm_ref_t value = iree_vm_ref_null();
     IREE_RETURN_IF_ERROR(iree_vm_list_get_ref_assign(binding_list, i, &value));
@@ -389,7 +368,6 @@
           i);
     }
     bindings[i] = iree_hal_make_buffer_ref(buffer, 0, IREE_WHOLE_BUFFER);
-    bindings[i].ordinal = i;
   }
 
   // Setup the specification used to perform the executable load.
