blob: 46184f33f4be026e22033bce2a7d9929a6d9f903 [file] [log] [blame]
Tobias Grosser75805372011-04-29 06:27:02 +00001//===- GmpConv.cpp - Recreate LLVM IR from the Scop. ---------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Functions for converting between gmp objects and apint.
11//
12//===----------------------------------------------------------------------===//
13#include "polly/Support/GICHelper.h"
14
15#include "isl/set.h"
16#include "isl/union_set.h"
17#include "isl/map.h"
18#include "isl/union_map.h"
Tobias Grosserde68cc92011-06-30 20:01:02 +000019#include "isl/schedule.h"
Tobias Grosser75805372011-04-29 06:27:02 +000020
21using namespace llvm;
22
23void polly::MPZ_from_APInt (mpz_t v, const APInt apint, bool is_signed) {
24 // There is no sign taken from the data, rop will simply be a positive
25 // integer. An application can handle any sign itself, and apply it for
26 // instance with mpz_neg.
27 APInt abs;
28 if (is_signed)
29 abs = apint.abs();
30 else
31 abs = apint;
32
33 const uint64_t *rawdata = abs.getRawData();
34 unsigned numWords = abs.getNumWords();
35
36 // TODO: Check if this is true for all platforms.
37 mpz_import(v, numWords, 1, sizeof (uint64_t), 0, 0, rawdata);
38
39 if (is_signed && apint.isNegative()) mpz_neg(v, v);
40}
41
42APInt polly::APInt_from_MPZ (const mpz_t mpz) {
43 uint64_t *p = NULL;
44 size_t sz;
45
46 p = (uint64_t*) mpz_export(p, &sz, 1, sizeof(uint64_t), 0, 0, mpz);
47
48 if (p) {
49 APInt A((unsigned)mpz_sizeinbase(mpz, 2), (unsigned)sz , p);
50 A = A.zext(A.getBitWidth() + 1);
Tobias Grosserb76f38532011-08-20 11:11:25 +000051 free(p);
Tobias Grosser75805372011-04-29 06:27:02 +000052
53 if (mpz_sgn(mpz) == -1)
54 return -A;
55 else
56 return A;
57 } else {
58 uint64_t val = 0;
59 return APInt(1, 1, &val);
60 }
61}
62
63std::string polly::stringFromIslObj(/*__isl_keep*/ isl_map *map) {
64 isl_printer *p = isl_printer_to_str(isl_map_get_ctx(map));
65 isl_printer_print_map(p, map);
Tobias Grosser15f5eff2011-08-20 11:11:18 +000066 char *char_str = isl_printer_get_str(p);
67 std::string string(char_str);
68 free(char_str);
Tobias Grosser75805372011-04-29 06:27:02 +000069 isl_printer_free(p);
70 return string;
71}
72
73std::string polly::stringFromIslObj(/*__isl_keep*/ isl_set *set) {
74 isl_printer *p = isl_printer_to_str(isl_set_get_ctx(set));
75 isl_printer_print_set(p, set);
Tobias Grosser15f5eff2011-08-20 11:11:18 +000076 char *char_str = isl_printer_get_str(p);
77 std::string string(char_str);
78 free(char_str);
Tobias Grosser75805372011-04-29 06:27:02 +000079 isl_printer_free(p);
80 return string;
81}
82
83std::string polly::stringFromIslObj(/*__isl_keep*/ isl_union_map *umap) {
84 isl_printer *p = isl_printer_to_str(isl_union_map_get_ctx(umap));
85 isl_printer_print_union_map(p, umap);
Tobias Grosser15f5eff2011-08-20 11:11:18 +000086 char *char_str = isl_printer_get_str(p);
87 std::string string(char_str);
88 free(char_str);
Tobias Grosser75805372011-04-29 06:27:02 +000089 isl_printer_free(p);
90 return string;
91}
92
93std::string polly::stringFromIslObj(/*__isl_keep*/ isl_union_set *uset) {
94 isl_printer *p = isl_printer_to_str(isl_union_set_get_ctx(uset));
95 isl_printer_print_union_set(p, uset);
Tobias Grosser15f5eff2011-08-20 11:11:18 +000096 char *char_str = isl_printer_get_str(p);
97 std::string string(char_str);
98 free(char_str);
Tobias Grosser75805372011-04-29 06:27:02 +000099 isl_printer_free(p);
100 return string;
101}
Tobias Grosserde68cc92011-06-30 20:01:02 +0000102
103std::string polly::stringFromIslObj(/*__isl_keep*/ isl_schedule *schedule) {
104 isl_ctx *ctx = isl_union_map_get_ctx(isl_schedule_get_map(schedule));
105 isl_printer *p = isl_printer_to_str(ctx);
106 isl_printer_print_schedule(p, schedule);
Tobias Grosser15f5eff2011-08-20 11:11:18 +0000107 char *char_str = isl_printer_get_str(p);
108 std::string string(char_str);
109 free(char_str);
Tobias Grosserde68cc92011-06-30 20:01:02 +0000110 isl_printer_free(p);
111 return string;
112}