brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.1 KiB · ba9830e Raw
71 lines · c
1/*2 * Copyright 2013      Ecole Normale Superieure3 *4 * Use of this software is governed by the MIT license5 *6 * Written by Sven Verdoolaege,7 * Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France8 */9 10#include <isl/space.h>11 12#include <isl_multi_macro.h>13 14/* Move the "n" dimensions of "src_type" starting at "src_pos" of "multi"15 * to dimensions of "dst_type" at "dst_pos".16 *17 * We only support moving input dimensions to parameters and vice versa.18 */19__isl_give MULTI(BASE) *FN(MULTI(BASE),move_dims)(__isl_take MULTI(BASE) *multi,20	enum isl_dim_type dst_type, unsigned dst_pos,21	enum isl_dim_type src_type, unsigned src_pos, unsigned n)22{23	isl_space *space;24	isl_size size;25	int i;26 27	size = FN(MULTI(BASE),size)(multi);28	if (size < 0)29		return FN(MULTI(BASE),free)(multi);30 31	if (n == 0 &&32	    !isl_space_is_named_or_nested(multi->space, src_type) &&33	    !isl_space_is_named_or_nested(multi->space, dst_type))34		return multi;35 36	if (dst_type == isl_dim_out || src_type == isl_dim_out)37		isl_die(FN(MULTI(BASE),get_ctx)(multi), isl_error_invalid,38			"cannot move output/set dimension",39			return FN(MULTI(BASE),free)(multi));40	if (dst_type == isl_dim_div || src_type == isl_dim_div)41		isl_die(FN(MULTI(BASE),get_ctx)(multi), isl_error_invalid,42			"cannot move divs",43			return FN(MULTI(BASE),free)(multi));44	if (FN(MULTI(BASE),check_range)(multi, src_type, src_pos, n) < 0)45		return FN(MULTI(BASE),free)(multi);46	if (dst_type == src_type)47		isl_die(FN(MULTI(BASE),get_ctx)(multi), isl_error_unsupported,48			"moving dims within the same type not supported",49			return FN(MULTI(BASE),free)(multi));50 51	space = FN(MULTI(BASE),take_space)(multi);52	space = isl_space_move_dims(space, dst_type, dst_pos,53						src_type, src_pos, n);54	multi = FN(MULTI(BASE),restore_space)(multi, space);55 56	if (FN(MULTI(BASE),has_explicit_domain)(multi))57		multi = FN(MULTI(BASE),move_explicit_domain_dims)(multi,58				dst_type, dst_pos, src_type, src_pos, n);59 60	for (i = 0; i < size; ++i) {61		EL *el;62 63		el = FN(MULTI(BASE),take_at)(multi, i);64		el = FN(EL,move_dims)(el, dst_type, dst_pos,65						src_type, src_pos, n);66		multi = FN(MULTI(BASE),restore_at)(multi, i, el);67	}68 69	return multi;70}71