blob: c26076761af5e73fc3d26b1b8d64973acf754bbd [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"
Johannes Doerfert79fc23f2014-07-24 23:48:02 +000014#include "llvm/IR/Value.h"
Hongbin Zheng454e8f92012-07-05 08:55:31 +000015#include "isl/aff.h"
Tobias Grosser83628182013-05-07 08:11:54 +000016#include "isl/map.h"
17#include "isl/schedule.h"
18#include "isl/set.h"
19#include "isl/union_map.h"
20#include "isl/union_set.h"
Tobias Grosseredab1352013-06-21 06:41:31 +000021#include "isl/val.h"
22
Tobias Grosser75805372011-04-29 06:27:02 +000023using namespace llvm;
24
Tobias Grosseredab1352013-06-21 06:41:31 +000025__isl_give isl_val *polly::isl_valFromAPInt(isl_ctx *Ctx, const APInt Int,
26 bool IsSigned) {
27 APInt Abs;
28 isl_val *v;
29
30 if (IsSigned)
31 Abs = Int.abs();
32 else
33 Abs = Int;
34
35 const uint64_t *Data = Abs.getRawData();
36 unsigned Words = Abs.getNumWords();
37
38 v = isl_val_int_from_chunks(Ctx, Words, sizeof(uint64_t), Data);
39
40 if (IsSigned && Int.isNegative())
41 v = isl_val_neg(v);
42
43 return v;
44}
45
Tobias Grosseredab1352013-06-21 06:41:31 +000046APInt polly::APIntFromVal(__isl_take isl_val *Val) {
47 uint64_t *Data;
48 int NumChunks;
49
50 NumChunks = isl_val_n_abs_num_chunks(Val, sizeof(uint64_t));
51
Tobias Grosser58032cb2013-06-23 01:29:29 +000052 Data = (uint64_t *)malloc(NumChunks * sizeof(uint64_t));
Tobias Grosseredab1352013-06-21 06:41:31 +000053 isl_val_get_abs_num_chunks(Val, sizeof(uint64_t), Data);
54 APInt A(8 * sizeof(uint64_t) * NumChunks, NumChunks, Data);
55
56 if (isl_val_is_neg(Val)) {
57 A = A.zext(A.getBitWidth() + 1);
58 A = -A;
59 }
60
61 if (A.getMinSignedBits() < A.getBitWidth())
62 A = A.trunc(A.getMinSignedBits());
63
64 free(Data);
65 isl_val_free(Val);
66 return A;
67}
68
Tobias Grosserde49b8f2013-02-22 08:21:52 +000069template <typename ISLTy, typename ISL_CTX_GETTER, typename ISL_PRINTER>
Tobias Grossere602a072013-05-07 07:30:56 +000070static inline std::string stringFromIslObjInternal(__isl_keep ISLTy *isl_obj,
71 ISL_CTX_GETTER ctx_getter_fn,
72 ISL_PRINTER printer_fn) {
Hongbin Zheng5205e0c2012-07-05 08:42:39 +000073 isl_ctx *ctx = ctx_getter_fn(isl_obj);
74 isl_printer *p = isl_printer_to_str(ctx);
75 printer_fn(p, isl_obj);
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
Tobias Grosserde49b8f2013-02-22 08:21:52 +000083std::string polly::stringFromIslObj(__isl_keep isl_map *map) {
84 return stringFromIslObjInternal(map, isl_map_get_ctx, isl_printer_print_map);
Hongbin Zheng5205e0c2012-07-05 08:42:39 +000085}
86
Tobias Grosserde49b8f2013-02-22 08:21:52 +000087std::string polly::stringFromIslObj(__isl_keep isl_set *set) {
88 return stringFromIslObjInternal(set, isl_set_get_ctx, isl_printer_print_set);
Tobias Grosser75805372011-04-29 06:27:02 +000089}
90
Tobias Grosserde49b8f2013-02-22 08:21:52 +000091std::string polly::stringFromIslObj(__isl_keep isl_union_map *umap) {
Hongbin Zheng5205e0c2012-07-05 08:42:39 +000092 return stringFromIslObjInternal(umap, isl_union_map_get_ctx,
93 isl_printer_print_union_map);
Tobias Grosser75805372011-04-29 06:27:02 +000094}
95
Tobias Grosserde49b8f2013-02-22 08:21:52 +000096std::string polly::stringFromIslObj(__isl_keep isl_union_set *uset) {
Hongbin Zheng5205e0c2012-07-05 08:42:39 +000097 return stringFromIslObjInternal(uset, isl_union_set_get_ctx,
98 isl_printer_print_union_set);
Tobias Grosser75805372011-04-29 06:27:02 +000099}
Tobias Grosserde68cc92011-06-30 20:01:02 +0000100
Tobias Grosserde49b8f2013-02-22 08:21:52 +0000101std::string polly::stringFromIslObj(__isl_keep isl_schedule *schedule) {
Tobias Grosser6a629c52014-11-21 19:39:42 +0000102 return stringFromIslObjInternal(schedule, isl_schedule_get_ctx,
Hongbin Zheng5205e0c2012-07-05 08:42:39 +0000103 isl_printer_print_schedule);
Tobias Grosserde68cc92011-06-30 20:01:02 +0000104}
Hongbin Zheng454e8f92012-07-05 08:55:31 +0000105
Tobias Grosserde49b8f2013-02-22 08:21:52 +0000106std::string polly::stringFromIslObj(__isl_keep isl_multi_aff *maff) {
Hongbin Zheng454e8f92012-07-05 08:55:31 +0000107 return stringFromIslObjInternal(maff, isl_multi_aff_get_ctx,
108 isl_printer_print_multi_aff);
109}
110
Tobias Grosserde49b8f2013-02-22 08:21:52 +0000111std::string polly::stringFromIslObj(__isl_keep isl_pw_multi_aff *pma) {
Hongbin Zheng454e8f92012-07-05 08:55:31 +0000112 return stringFromIslObjInternal(pma, isl_pw_multi_aff_get_ctx,
113 isl_printer_print_pw_multi_aff);
114}
115
Tobias Grosserde49b8f2013-02-22 08:21:52 +0000116std::string polly::stringFromIslObj(__isl_keep isl_aff *aff) {
Hongbin Zheng454e8f92012-07-05 08:55:31 +0000117 return stringFromIslObjInternal(aff, isl_aff_get_ctx, isl_printer_print_aff);
118}
119
Tobias Grosserde49b8f2013-02-22 08:21:52 +0000120std::string polly::stringFromIslObj(__isl_keep isl_pw_aff *pwaff) {
Hongbin Zheng454e8f92012-07-05 08:55:31 +0000121 return stringFromIslObjInternal(pwaff, isl_pw_aff_get_ctx,
122 isl_printer_print_pw_aff);
123}
Johannes Doerfert79fc23f2014-07-24 23:48:02 +0000124
125static void replace(std::string &str, const std::string &find,
126 const std::string &replace) {
127 size_t pos = 0;
128 while ((pos = str.find(find, pos)) != std::string::npos) {
129 str.replace(pos, find.length(), replace);
130 pos += replace.length();
131 }
132}
133
134static void makeIslCompatible(std::string &str) {
135 replace(str, ".", "_");
136 replace(str, "\"", "_");
Tobias Grosser16c44032015-07-09 07:31:45 +0000137 replace(str, " ", "__");
138 replace(str, "=>", "TO");
Johannes Doerfert79fc23f2014-07-24 23:48:02 +0000139}
140
Johannes Doerfert3a7e8122015-02-19 18:09:39 +0000141std::string polly::getIslCompatibleName(const std::string &Prefix,
142 const std::string &Middle,
143 const std::string &Suffix) {
144 std::string S = Prefix + Middle + Suffix;
145 makeIslCompatible(S);
146 return S;
147}
148
Tobias Grosserf567e1a2015-02-19 22:16:12 +0000149std::string polly::getIslCompatibleName(const std::string &Prefix,
150 const Value *Val,
Johannes Doerfert3a7e8122015-02-19 18:09:39 +0000151 const std::string &Suffix) {
Johannes Doerfert79fc23f2014-07-24 23:48:02 +0000152 std::string ValStr;
153 raw_string_ostream OS(ValStr);
154 Val->printAsOperand(OS, false);
155 ValStr = OS.str();
156 // Remove the leading %
157 ValStr.erase(0, 1);
Johannes Doerfert3a7e8122015-02-19 18:09:39 +0000158 return getIslCompatibleName(Prefix, ValStr, Suffix);
Johannes Doerfert79fc23f2014-07-24 23:48:02 +0000159}