1 //===- 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 #include "isl/aff.h"
15 #include "isl/map.h"
16 #include "isl/schedule.h"
17 #include "isl/set.h"
18 #include "isl/union_map.h"
19 #include "isl/union_set.h"
20 
21 using namespace llvm;
22 
23 void 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   mpz_import(v, numWords, -1, sizeof(uint64_t), 0, 0, rawdata);
37 
38   if (is_signed && apint.isNegative())
39     mpz_neg(v, v);
40 }
41 
42 APInt 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);
51     free(p);
52 
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 
63 template <typename ISLTy, typename ISL_CTX_GETTER, typename ISL_PRINTER>
64 static inline std::string stringFromIslObjInternal(__isl_keep ISLTy *isl_obj,
65                                                    ISL_CTX_GETTER ctx_getter_fn,
66                                                    ISL_PRINTER printer_fn) {
67   isl_ctx *ctx = ctx_getter_fn(isl_obj);
68   isl_printer *p = isl_printer_to_str(ctx);
69   printer_fn(p, isl_obj);
70   char *char_str = isl_printer_get_str(p);
71   std::string string(char_str);
72   free(char_str);
73   isl_printer_free(p);
74   return string;
75 }
76 
77 static inline isl_ctx *schedule_get_ctx(__isl_keep isl_schedule *schedule) {
78   return isl_union_map_get_ctx(isl_schedule_get_map(schedule));
79 }
80 
81 std::string polly::stringFromIslObj(__isl_keep isl_map *map) {
82   return stringFromIslObjInternal(map, isl_map_get_ctx, isl_printer_print_map);
83 }
84 
85 std::string polly::stringFromIslObj(__isl_keep isl_set *set) {
86   return stringFromIslObjInternal(set, isl_set_get_ctx, isl_printer_print_set);
87 }
88 
89 std::string polly::stringFromIslObj(__isl_keep isl_union_map *umap) {
90   return stringFromIslObjInternal(umap, isl_union_map_get_ctx,
91                                   isl_printer_print_union_map);
92 }
93 
94 std::string polly::stringFromIslObj(__isl_keep isl_union_set *uset) {
95   return stringFromIslObjInternal(uset, isl_union_set_get_ctx,
96                                   isl_printer_print_union_set);
97 }
98 
99 std::string polly::stringFromIslObj(__isl_keep isl_schedule *schedule) {
100   return stringFromIslObjInternal(schedule, schedule_get_ctx,
101                                   isl_printer_print_schedule);
102 }
103 
104 std::string polly::stringFromIslObj(__isl_keep isl_multi_aff *maff) {
105   return stringFromIslObjInternal(maff, isl_multi_aff_get_ctx,
106                                   isl_printer_print_multi_aff);
107 }
108 
109 std::string polly::stringFromIslObj(__isl_keep isl_pw_multi_aff *pma) {
110   return stringFromIslObjInternal(pma, isl_pw_multi_aff_get_ctx,
111                                   isl_printer_print_pw_multi_aff);
112 }
113 
114 std::string polly::stringFromIslObj(__isl_keep isl_aff *aff) {
115   return stringFromIslObjInternal(aff, isl_aff_get_ctx, isl_printer_print_aff);
116 }
117 
118 std::string polly::stringFromIslObj(__isl_keep isl_pw_aff *pwaff) {
119   return stringFromIslObjInternal(pwaff, isl_pw_aff_get_ctx,
120                                   isl_printer_print_pw_aff);
121 }
122