WordPress pre_get_posts with combined results of two queries (OR)

See WP_Query as reference for the post query filters. You can filter posts by their authors with the 'author' query var as you filter posts by their taxonomy with 'tax_query' query var.

Then, conditionally set the 'tax_query' query var depending on the user’s company meta field. If it’s empty, set the 'author' query var instead.

add_action( 'pre_get_posts', 'alter_query', 99, 1 );

function alter_query( $query ) {
    global $typenow;

    if ( 'machine' === $typenow && current_user_can( 'owner' ) ) {
        $user    = wp_get_current_user();
        $company = get_user_meta( $user->ID, 'company', true );

        if ( '' !== $company ) {
            $query->set( 'tax_query', array(
                array(
                    'taxonomy' => 'company',
                    'field'    => 'slug',
                    'terms'    => sanitize_key( $company ),
                ),
            ) );

        } else {
            $query->set( 'author', $user->ID );
        }
    }
}

Note: sanitize_key() might be necessary depending on how you store company user’s meta value. It lowercases the string and replaces in it the blank spaces by hyphens. This is used by WP for example to define post’s slug from the post’s title – In other words, it “slugify” a string…