static int filter_set_pred(struct event_filter *filter,
                           int idx,
                           struct pred_stack *stack,
-                          struct filter_pred *src,
-                          filter_pred_fn_t fn)
+                          struct filter_pred *src)
 {
        struct filter_pred *dest = &filter->preds[idx];
        struct filter_pred *left;
                if (!dest->field_name)
                        return -ENOMEM;
        }
-       dest->fn = fn;
        dest->index = idx;
 
        if (dest->op == OP_OR || dest->op == OP_AND) {
        }
 }
 
-static int filter_add_pred_fn(struct filter_parse_state *ps,
-                             struct ftrace_event_call *call,
-                             struct event_filter *filter,
-                             struct filter_pred *pred,
-                             struct pred_stack *stack,
-                             filter_pred_fn_t fn)
+static int filter_add_pred(struct filter_parse_state *ps,
+                          struct event_filter *filter,
+                          struct filter_pred *pred,
+                          struct pred_stack *stack)
 {
        int idx, err;
 
 
        idx = filter->n_preds;
        filter_clear_pred(&filter->preds[idx]);
-       err = filter_set_pred(filter, idx, stack, pred, fn);
+       err = filter_set_pred(filter, idx, stack, pred);
        if (err)
                return err;
 
        return fn;
 }
 
-static int filter_add_pred(struct filter_parse_state *ps,
-                          struct ftrace_event_call *call,
-                          struct event_filter *filter,
-                          struct filter_pred *pred,
-                          struct pred_stack *stack,
-                          bool dry_run)
+static int init_pred(struct filter_parse_state *ps,
+                    struct ftrace_event_call *call,
+                    struct filter_pred *pred)
+
 {
        struct ftrace_event_field *field;
-       filter_pred_fn_t fn;
+       filter_pred_fn_t fn = filter_pred_none;
        unsigned long long val;
        int ret;
 
-       fn = pred->fn = filter_pred_none;
-
-       if (pred->op == OP_AND)
-               goto add_pred_fn;
-       else if (pred->op == OP_OR)
-               goto add_pred_fn;
-
        field = find_event_field(call, pred->field_name);
        if (!field) {
                parse_error(ps, FILT_ERR_FIELD_NOT_FOUND, 0);
        if (pred->op == OP_NE)
                pred->not = 1;
 
-add_pred_fn:
-       if (!dry_run)
-               return filter_add_pred_fn(ps, call, filter, pred, stack, fn);
+       pred->fn = fn;
        return 0;
 }
 
 }
 
 static struct filter_pred *create_pred(struct filter_parse_state *ps,
+                                      struct ftrace_event_call *call,
                                       int op, char *operand1, char *operand2)
 {
        static struct filter_pred pred;
        strcpy(pred.regex.pattern, operand2);
        pred.regex.len = strlen(pred.regex.pattern);
 
-       return &pred;
+       return init_pred(ps, call, &pred) ? NULL : &pred;
 }
 
 static int check_preds(struct filter_parse_state *ps)
                        goto fail;
                }
 
-               pred = create_pred(ps, elt->op, operand1, operand2);
+               pred = create_pred(ps, call, elt->op, operand1, operand2);
                if (!pred) {
                        err = -ENOMEM;
                        goto fail;
                }
-               err = filter_add_pred(ps, call, filter, pred, &stack, dry_run);
-               filter_free_pred(pred);
-               if (err)
-                       goto fail;
+               if (!dry_run) {
+                       err = filter_add_pred(ps, filter, pred, &stack);
+                       if (err) {
+                               filter_free_pred(pred);
+                               goto fail;
+                       }
+               }
 
+               filter_free_pred(pred);
                operand1 = operand2 = NULL;
        }