blob: f5be37391320769ee22caee91027c0b995cdd511 [file] [log] [blame]
//===------ polly/CodeGeneration.h - The Polly code generator *- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
//===----------------------------------------------------------------------===//
#ifndef POLLY_CODEGENERATION_H
#define POLLY_CODEGENERATION_H
#include "polly/Config/config.h"
#include "isl/set.h"
#include "isl/map.h"
namespace polly {
enum VectorizerChoice {
VECTORIZER_NONE,
VECTORIZER_POLLY,
VECTORIZER_UNROLL_ONLY,
VECTORIZER_FIRST_NEED_GROUPED_UNROLL = VECTORIZER_UNROLL_ONLY,
VECTORIZER_BB
};
extern VectorizerChoice PollyVectorizerChoice;
static inline int getNumberOfIterations(__isl_take isl_set *Domain) {
int Dim = isl_set_dim(Domain, isl_dim_set);
// Calculate a map similar to the identity map, but with the last input
// and output dimension not related.
// [i0, i1, i2, i3] -> [i0, i1, i2, o0]
isl_space *Space = isl_set_get_space(Domain);
Space = isl_space_drop_dims(Space, isl_dim_out, Dim - 1, 1);
Space = isl_space_map_from_set(Space);
isl_map *Identity = isl_map_identity(Space);
Identity = isl_map_add_dims(Identity, isl_dim_in, 1);
Identity = isl_map_add_dims(Identity, isl_dim_out, 1);
isl_map *Map =
isl_map_from_domain_and_range(isl_set_copy(Domain), isl_set_copy(Domain));
isl_set_free(Domain);
Map = isl_map_intersect(Map, Identity);
isl_map *LexMax = isl_map_lexmax(isl_map_copy(Map));
isl_map *LexMin = isl_map_lexmin(Map);
isl_map *Sub = isl_map_sum(LexMax, isl_map_neg(LexMin));
isl_set *Elements = isl_map_range(Sub);
if (!isl_set_is_singleton(Elements)) {
isl_set_free(Elements);
return -1;
}
isl_point *P = isl_set_sample_point(Elements);
isl_val *V;
V = isl_point_get_coordinate_val(P, isl_dim_set, Dim - 1);
int NumberIterations = isl_val_get_num_si(V);
isl_val_free(V);
isl_point_free(P);
return NumberIterations;
}
}
#endif // POLLY_CODEGENERATION_H