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 "llvm/IR/Value.h" 15 #include "isl/aff.h" 16 #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" 21 #include "isl/val.h" 22 23 using namespace llvm; 24 25 __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 46 APInt 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 52 Data = (uint64_t *)malloc(NumChunks * sizeof(uint64_t)); 53 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 69 template <typename ISLTy, typename ISL_CTX_GETTER, typename ISL_PRINTER> 70 static inline std::string stringFromIslObjInternal(__isl_keep ISLTy *isl_obj, 71 ISL_CTX_GETTER ctx_getter_fn, 72 ISL_PRINTER printer_fn) { 73 if (!isl_obj) 74 return "null"; 75 isl_ctx *ctx = ctx_getter_fn(isl_obj); 76 isl_printer *p = isl_printer_to_str(ctx); 77 printer_fn(p, isl_obj); 78 char *char_str = isl_printer_get_str(p); 79 std::string string; 80 if (char_str) 81 string = char_str; 82 else 83 string = "null"; 84 free(char_str); 85 isl_printer_free(p); 86 return string; 87 } 88 89 std::string polly::stringFromIslObj(__isl_keep isl_map *map) { 90 return stringFromIslObjInternal(map, isl_map_get_ctx, isl_printer_print_map); 91 } 92 93 std::string polly::stringFromIslObj(__isl_keep isl_set *set) { 94 return stringFromIslObjInternal(set, isl_set_get_ctx, isl_printer_print_set); 95 } 96 97 std::string polly::stringFromIslObj(__isl_keep isl_union_map *umap) { 98 return stringFromIslObjInternal(umap, isl_union_map_get_ctx, 99 isl_printer_print_union_map); 100 } 101 102 std::string polly::stringFromIslObj(__isl_keep isl_union_set *uset) { 103 return stringFromIslObjInternal(uset, isl_union_set_get_ctx, 104 isl_printer_print_union_set); 105 } 106 107 std::string polly::stringFromIslObj(__isl_keep isl_schedule *schedule) { 108 return stringFromIslObjInternal(schedule, isl_schedule_get_ctx, 109 isl_printer_print_schedule); 110 } 111 112 std::string polly::stringFromIslObj(__isl_keep isl_multi_aff *maff) { 113 return stringFromIslObjInternal(maff, isl_multi_aff_get_ctx, 114 isl_printer_print_multi_aff); 115 } 116 117 std::string polly::stringFromIslObj(__isl_keep isl_pw_multi_aff *pma) { 118 return stringFromIslObjInternal(pma, isl_pw_multi_aff_get_ctx, 119 isl_printer_print_pw_multi_aff); 120 } 121 122 std::string polly::stringFromIslObj(__isl_keep isl_aff *aff) { 123 return stringFromIslObjInternal(aff, isl_aff_get_ctx, isl_printer_print_aff); 124 } 125 126 std::string polly::stringFromIslObj(__isl_keep isl_pw_aff *pwaff) { 127 return stringFromIslObjInternal(pwaff, isl_pw_aff_get_ctx, 128 isl_printer_print_pw_aff); 129 } 130 131 static void replace(std::string &str, const std::string &find, 132 const std::string &replace) { 133 size_t pos = 0; 134 while ((pos = str.find(find, pos)) != std::string::npos) { 135 str.replace(pos, find.length(), replace); 136 pos += replace.length(); 137 } 138 } 139 140 static void makeIslCompatible(std::string &str) { 141 replace(str, ".", "_"); 142 replace(str, "\"", "_"); 143 replace(str, " ", "__"); 144 replace(str, "=>", "TO"); 145 } 146 147 std::string polly::getIslCompatibleName(const std::string &Prefix, 148 const std::string &Middle, 149 const std::string &Suffix) { 150 std::string S = Prefix + Middle + Suffix; 151 makeIslCompatible(S); 152 return S; 153 } 154 155 std::string polly::getIslCompatibleName(const std::string &Prefix, 156 const Value *Val, 157 const std::string &Suffix) { 158 std::string ValStr; 159 raw_string_ostream OS(ValStr); 160 Val->printAsOperand(OS, false); 161 ValStr = OS.str(); 162 // Remove the leading % 163 ValStr.erase(0, 1); 164 return getIslCompatibleName(Prefix, ValStr, Suffix); 165 } 166