blob: a1c5615e0e80e42384c26226a5a888dbc3f12966 [file] [log] [blame]
David Neto22f144c2017-06-12 14:26:21 -04001// Copyright 2017 The Clspv Authors. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
David Neto118188e2018-08-24 11:27:54 -040015#include "llvm/IR/DataLayout.h"
16#include "llvm/IR/IRBuilder.h"
17#include "llvm/IR/Instructions.h"
18#include "llvm/IR/Module.h"
19#include "llvm/Pass.h"
20#include "llvm/Support/raw_ostream.h"
David Neto22f144c2017-06-12 14:26:21 -040021
Diego Novilloa4c44fa2019-04-11 10:56:15 -040022#include "Passes.h"
23
David Neto22f144c2017-06-12 14:26:21 -040024using namespace llvm;
25
26#define DEBUG_TYPE "replacepointerbitcast"
27
28namespace {
29struct ReplacePointerBitcastPass : public ModulePass {
30 static char ID;
31 ReplacePointerBitcastPass() : ModulePass(ID) {}
32
David Neto30ae05e2017-09-06 19:58:36 -040033 // Returns the number of chunks of source data required to exactly
34 // cover the destination data, if the source and destination types are
35 // different sizes. Otherwise returns 0.
David Neto22f144c2017-06-12 14:26:21 -040036 unsigned CalculateNumIter(unsigned SrcTyBitWidth, unsigned DstTyBitWidth);
37 Value *CalculateNewGEPIdx(unsigned SrcTyBitWidth, unsigned DstTyBitWidth,
Diego Novillo3cc8d7a2019-04-10 13:30:34 -040038 GetElementPtrInst *GEP);
David Neto22f144c2017-06-12 14:26:21 -040039
40 bool runOnModule(Module &M) override;
41};
Diego Novillo3cc8d7a2019-04-10 13:30:34 -040042} // namespace
David Neto22f144c2017-06-12 14:26:21 -040043
44char ReplacePointerBitcastPass::ID = 0;
Diego Novilloa4c44fa2019-04-11 10:56:15 -040045INITIALIZE_PASS(ReplacePointerBitcastPass, "ReplacePointerBitcast",
46 "Replace Pointer Bitcast Pass", false, false)
David Neto22f144c2017-06-12 14:26:21 -040047
48namespace clspv {
49ModulePass *createReplacePointerBitcastPass() {
50 return new ReplacePointerBitcastPass();
51}
Diego Novillo3cc8d7a2019-04-10 13:30:34 -040052} // namespace clspv
David Neto22f144c2017-06-12 14:26:21 -040053
alan-baker32014272019-05-22 08:07:18 -040054namespace {
55
56// Gathers the scalar values of |v| into |elements|. Generates new instructions
57// to extract the values.
58void GatherBaseElements(Value *v, SmallVectorImpl<Value *> *elements,
59 IRBuilder<> &builder) {
60 auto *module = builder.GetInsertBlock()->getParent()->getParent();
61 auto &DL = module->getDataLayout();
62 auto *type = v->getType();
63 if (auto *vec_type = dyn_cast<VectorType>(type)) {
64 for (uint64_t i = 0; i != vec_type->getNumElements(); ++i) {
65 elements->push_back(builder.CreateExtractElement(v, i));
66 }
67 } else if (auto *array_type = dyn_cast<ArrayType>(type)) {
68 for (uint64_t i = 0; i != array_type->getNumElements(); ++i) {
69 auto *extract = builder.CreateExtractValue(v, {static_cast<unsigned>(i)});
70 GatherBaseElements(extract, elements, builder);
71 }
72 } else if (auto *struct_type = dyn_cast<StructType>(type)) {
73 const auto *struct_layout = DL.getStructLayout(struct_type);
74 if (struct_layout->hasPadding()) {
75 llvm_unreachable("Unhandled conversion of padded struct");
76 }
77 for (unsigned i = 0; i != struct_type->getNumElements(); ++i) {
78 auto *extract = builder.CreateExtractValue(v, {i});
79 GatherBaseElements(extract, elements, builder);
80 }
81 } else {
82 elements->push_back(v);
83 }
84}
85
86// Returns a value of |dst_type| using the elemental members of |src_elements|.
87Value *BuildFromElements(Type *dst_type, const ArrayRef<Value *> &src_elements,
88 unsigned *used_bits, unsigned *index,
89 IRBuilder<> &builder) {
90 auto *module = builder.GetInsertBlock()->getParent()->getParent();
91 auto &DL = module->getDataLayout();
92 auto &context = dst_type->getContext();
93 Value *dst = nullptr;
94 // Arrays, vectors and structs are annoyingly just different enough to each
95 // require their own cases.
96 if (auto *dst_array_ty = dyn_cast<ArrayType>(dst_type)) {
97 auto *ele_ty = dst_array_ty->getElementType();
98 for (uint64_t i = 0; i != dst_array_ty->getNumElements(); ++i) {
99 auto *tmp_value =
100 BuildFromElements(ele_ty, src_elements, used_bits, index, builder);
101 auto *prev = dst ? dst : UndefValue::get(dst_type);
102 dst = builder.CreateInsertValue(prev, tmp_value,
103 {static_cast<unsigned>(i)});
104 }
105 } else if (auto *dst_struct_ty = dyn_cast<StructType>(dst_type)) {
106 const auto *struct_layout = DL.getStructLayout(dst_struct_ty);
107 if (struct_layout->hasPadding()) {
108 llvm_unreachable("Unhandled padded struct conversion");
109 return nullptr;
110 }
111 for (unsigned i = 0; i != dst_struct_ty->getNumElements(); ++i) {
112 auto *ele_ty = dst_struct_ty->getElementType(i);
113 auto *tmp_value =
114 BuildFromElements(ele_ty, src_elements, used_bits, index, builder);
115 auto *prev = dst ? dst : UndefValue::get(dst_type);
116 dst = builder.CreateInsertValue(prev, tmp_value, {i});
117 }
118 } else if (auto *dst_vec_ty = dyn_cast<VectorType>(dst_type)) {
119 auto *ele_ty = dst_vec_ty->getElementType();
120 for (uint64_t i = 0; i != dst_vec_ty->getNumElements(); ++i) {
121 auto *tmp_value =
122 BuildFromElements(ele_ty, src_elements, used_bits, index, builder);
123 auto *prev = dst ? dst : UndefValue::get(dst_type);
124 dst = builder.CreateInsertElement(prev, tmp_value, i);
125 }
126 } else {
127 // Scalar conversion eats up elements in src_elements.
128 auto dst_width = DL.getTypeStoreSizeInBits(dst_type);
129 uint64_t bits = 0;
130 Value *tmp_value = nullptr;
131 auto prev_bits = 0;
132 Value *ele_int_cast = nullptr;
133 while (bits < dst_width) {
134 prev_bits = bits;
135 auto *ele = src_elements[*index];
136 auto *ele_ty = ele->getType();
137 auto ele_width = DL.getTypeStoreSizeInBits(ele_ty);
138 auto remaining_bits = ele_width - *used_bits;
139 auto needed_bits = dst_width - bits;
140 // Create a reusable cast to an integer type for this element.
141 if (!ele_int_cast || cast<User>(ele_int_cast)->getOperand(0) != ele) {
142 ele_int_cast =
143 builder.CreateBitCast(ele, IntegerType::get(context, ele_width));
144 }
145 tmp_value = ele_int_cast;
146 // Some of the bits of this element were previously used, so shift the
147 // value that many bits.
148 if (*used_bits != 0) {
149 tmp_value = builder.CreateLShr(tmp_value, *used_bits);
150 }
151 if (needed_bits < remaining_bits) {
152 // Ensure only the needed bits are used.
153 uint64_t mask = (1ull << needed_bits) - 1;
154 tmp_value =
155 builder.CreateAnd(tmp_value, builder.getIntN(dst_width, mask));
156 }
157 // Cast to tbe destination bit width, but stay as a integer type.
158 if (ele_width != dst_width) {
159 tmp_value = builder.CreateIntCast(
160 tmp_value, IntegerType::get(context, dst_width), false);
161 }
162
163 if (remaining_bits <= needed_bits) {
164 // Used the rest of the element.
165 *used_bits = 0;
166 ++(*index);
167 bits += remaining_bits;
168 } else {
169 // Only need part of this element.
170 *used_bits += needed_bits;
171 bits += needed_bits;
172 }
173
174 if (dst) {
175 // Previous iteration generated an integer of the right size. That needs
176 // to be combined with the value generated this iteration.
177 tmp_value = builder.CreateShl(tmp_value, prev_bits);
178 dst = builder.CreateOr(dst, tmp_value);
179 } else {
180 dst = tmp_value;
181 }
182 }
183
184 assert(bits <= dst_width);
185 if (bits == dst_width && dst_type != dst->getType()) {
186 // Finally, cast away from the working integer type if necessary.
187 dst = builder.CreateBitCast(dst, dst_type);
188 }
189 }
190
191 return dst;
192}
193
194// Returns an equivalent value of |src| as |dst_type|.
195//
196// This function requires |src|'s and |dst_type|'s bit widths match. Does not
197// introduce new integer sizes, but generates multiple instructions to mimic a
198// generic bitcast (unless a bitcast is sufficient).
199Value *ConvertValue(Value *src, Type *dst_type, IRBuilder<> &builder) {
200 auto *src_type = src->getType();
201 auto *module = builder.GetInsertBlock()->getParent()->getParent();
202 auto &DL = module->getDataLayout();
203 if (!src_type->isFirstClassType() || !dst_type->isFirstClassType() ||
204 src_type->isAggregateType() || dst_type->isAggregateType()) {
205 SmallVector<Value *, 8> src_elements;
206 if (src_type->isAggregateType()) {
207 GatherBaseElements(src, &src_elements, builder);
208 } else {
209 src_elements.push_back(src);
210 }
211
212 // Check that overall sizes make sense.
213 uint64_t element_sum = 0;
214 // Can only successfully convert unpadded structs.
215 for (auto element : src_elements) {
216 element_sum += DL.getTypeStoreSizeInBits(element->getType());
217 }
218 if (DL.getTypeStoreSizeInBits(dst_type) != element_sum) {
219 llvm_unreachable("Elements do not sum to overall size");
220 return nullptr;
221 }
222
223 unsigned used_bits = 0;
224 unsigned index = 0;
225 return BuildFromElements(dst_type, src_elements, &used_bits, &index,
226 builder);
227 } else {
228 return builder.CreateBitCast(src, dst_type);
229 }
230
231 return nullptr;
232}
233
234} // namespace
235
David Neto22f144c2017-06-12 14:26:21 -0400236unsigned ReplacePointerBitcastPass::CalculateNumIter(unsigned SrcTyBitWidth,
237 unsigned DstTyBitWidth) {
238 unsigned NumIter = 0;
239 if (SrcTyBitWidth > DstTyBitWidth) {
240 if (SrcTyBitWidth % DstTyBitWidth) {
241 llvm_unreachable(
242 "Src type bitwidth should be multiple of Dest type bitwidth");
243 }
244 NumIter = 1;
245 } else if (SrcTyBitWidth < DstTyBitWidth) {
246 if (DstTyBitWidth % SrcTyBitWidth) {
247 llvm_unreachable(
248 "Dest type bitwidth should be multiple of Src type bitwidth");
249 }
250 NumIter = DstTyBitWidth / SrcTyBitWidth;
251 } else {
252 NumIter = 0;
253 }
254
255 return NumIter;
256}
257
Diego Novillo3cc8d7a2019-04-10 13:30:34 -0400258Value *ReplacePointerBitcastPass::CalculateNewGEPIdx(unsigned SrcTyBitWidth,
259 unsigned DstTyBitWidth,
260 GetElementPtrInst *GEP) {
David Neto22f144c2017-06-12 14:26:21 -0400261 Value *NewGEPIdx = GEP->getOperand(1);
262 IRBuilder<> Builder(GEP);
263
264 if (SrcTyBitWidth > DstTyBitWidth) {
265 if (GEP->getNumOperands() > 2) {
266 GEP->print(errs());
267 llvm_unreachable("Support above GEP on PointerBitcastPass");
268 }
269
270 NewGEPIdx = Builder.CreateLShr(
Diego Novillo3cc8d7a2019-04-10 13:30:34 -0400271 NewGEPIdx, Builder.getInt32(std::log2(SrcTyBitWidth / DstTyBitWidth)));
David Neto22f144c2017-06-12 14:26:21 -0400272 } else if (DstTyBitWidth > SrcTyBitWidth) {
273 if (GEP->getNumOperands() > 2) {
274 GEP->print(errs());
275 llvm_unreachable("Support above GEP on PointerBitcastPass");
276 }
277
278 NewGEPIdx = Builder.CreateShl(
Diego Novillo3cc8d7a2019-04-10 13:30:34 -0400279 NewGEPIdx, Builder.getInt32(std::log2(DstTyBitWidth / SrcTyBitWidth)));
David Neto22f144c2017-06-12 14:26:21 -0400280 }
281
282 return NewGEPIdx;
283}
284
285bool ReplacePointerBitcastPass::runOnModule(Module &M) {
286 bool Changed = false;
287
Diego Novillo3cc8d7a2019-04-10 13:30:34 -0400288 const DataLayout &DL = M.getDataLayout();
David Neto8e138142018-05-29 10:19:21 -0400289
David Neto22f144c2017-06-12 14:26:21 -0400290 SmallVector<Instruction *, 16> VectorWorkList;
291 SmallVector<Instruction *, 16> ScalarWorkList;
292 for (Function &F : M) {
293 for (BasicBlock &BB : F) {
294 for (Instruction &I : BB) {
295 // Find pointer bitcast instruction.
296 if (isa<BitCastInst>(&I) && isa<PointerType>(I.getType())) {
297 Value *Src = I.getOperand(0);
298 if (isa<PointerType>(Src->getType())) {
299 Type *SrcEleTy =
300 I.getOperand(0)->getType()->getPointerElementType();
301 Type *DstEleTy = I.getType()->getPointerElementType();
302 if (SrcEleTy->isVectorTy() || DstEleTy->isVectorTy()) {
303 // Handle case either operand is vector type like char4* -> int4*.
304 VectorWorkList.push_back(&I);
305 } else {
306 // Handle case all operands are scalar type like char* -> int*.
307 ScalarWorkList.push_back(&I);
308 }
309
310 Changed = true;
311 } else {
312 llvm_unreachable("Unsupported bitcast");
313 }
314 }
315 }
316 }
317 }
318
319 SmallVector<Instruction *, 16> ToBeDeleted;
320 for (Instruction *Inst : VectorWorkList) {
321 Value *Src = Inst->getOperand(0);
322 Type *SrcTy = Src->getType()->getPointerElementType();
323 Type *DstTy = Inst->getType()->getPointerElementType();
324 Type *SrcEleTy =
325 SrcTy->isVectorTy() ? SrcTy->getSequentialElementType() : SrcTy;
326 Type *DstEleTy =
327 DstTy->isVectorTy() ? DstTy->getSequentialElementType() : DstTy;
David Neto30ae05e2017-09-06 19:58:36 -0400328 // These are bit widths of the source and destination types, even
329 // if they are vector types. E.g. bit width of float4 is 64.
David Neto8e138142018-05-29 10:19:21 -0400330 unsigned SrcTyBitWidth = DL.getTypeStoreSizeInBits(SrcTy);
331 unsigned DstTyBitWidth = DL.getTypeStoreSizeInBits(DstTy);
332 unsigned SrcEleTyBitWidth = DL.getTypeStoreSizeInBits(SrcEleTy);
333 unsigned DstEleTyBitWidth = DL.getTypeStoreSizeInBits(DstEleTy);
David Neto22f144c2017-06-12 14:26:21 -0400334 unsigned NumIter = CalculateNumIter(SrcTyBitWidth, DstTyBitWidth);
335
336 // Investigate pointer bitcast's users.
337 for (User *BitCastUser : Inst->users()) {
338 Value *BitCastSrc = Inst->getOperand(0);
339 Value *NewAddrIdx = ConstantInt::get(Type::getInt32Ty(M.getContext()), 0);
340
341 // It consist of User* and bool whether user is gep or not.
342 SmallVector<std::pair<User *, bool>, 32> Users;
343
344 GetElementPtrInst *GEP = nullptr;
345 Value *OrgGEPIdx = nullptr;
Jason Gavrise44af072018-08-14 20:44:50 -0400346 if ((GEP = dyn_cast<GetElementPtrInst>(BitCastUser))) {
David Neto22f144c2017-06-12 14:26:21 -0400347 OrgGEPIdx = GEP->getOperand(1);
348
349 // Build new src/dst address index.
350 NewAddrIdx = CalculateNewGEPIdx(SrcTyBitWidth, DstTyBitWidth, GEP);
351
352 // Record gep's users.
353 for (User *GEPUser : GEP->users()) {
354 Users.push_back(std::make_pair(GEPUser, true));
355 }
356 } else {
357 // Record bitcast's users.
358 Users.push_back(std::make_pair(BitCastUser, false));
359 }
360
361 // Handle users.
362 bool IsGEPUser = false;
363 for (auto UserIter : Users) {
364 User *U = UserIter.first;
365 IsGEPUser = UserIter.second;
366
367 IRBuilder<> Builder(cast<Instruction>(U));
368
369 if (StoreInst *ST = dyn_cast<StoreInst>(U)) {
370 if (SrcTyBitWidth < DstTyBitWidth) {
371 //
372 // Consider below case.
373 //
374 // Original IR (float2* --> float4*)
375 // 1. val = load (float4*) src_addr
376 // 2. dst_addr = bitcast float2*, float4*
377 // 3. dst_addr = gep (float4*) dst_addr, idx
378 // 4. store (float4*) dst_addr
379 //
380 // Transformed IR
381 // 1. val(float4) = load (float4*) src_addr
382 // 2. val1(float2) = shufflevector (float4)val, (float4)undef,
383 // (float2)<0, 1>
384 // 3. val2(float2) = shufflevector (float4)val, (float4)undef,
385 // (float2)<2, 3>
386 // 4. dst_addr1(float2*) = gep (float2*)dst_addr, idx * 2
387 // 5. dst_addr2(float2*) = gep (float2*)dst_addr, idx * 2 + 1
388 // 6. store (float2)val1, (float2*)dst_addr1
389 // 7. store (float2)val2, (float2*)dst_addr2
390 //
391
392 unsigned NumElement = DstTyBitWidth / SrcTyBitWidth;
393 unsigned NumVector = 1;
394 // Vulkan SPIR-V does not support over 4 components for
395 // TypeVector.
396 if (NumElement > 4) {
397 NumVector = NumElement >> 2;
398 NumElement = 4;
399 }
400
401 // Create store values.
402 Type *TmpValTy = SrcTy;
403 if (DstTy->isVectorTy()) {
404 if (SrcEleTyBitWidth == DstEleTyBitWidth) {
405 TmpValTy =
406 VectorType::get(SrcEleTy, DstTy->getVectorNumElements());
407 } else {
408 TmpValTy = VectorType::get(SrcEleTy, NumElement);
409 }
410 }
411
412 Value *STVal = ST->getValueOperand();
413 for (unsigned VIdx = 0; VIdx < NumVector; VIdx++) {
414 Value *TmpSTVal = nullptr;
415 if (NumVector == 1) {
416 TmpSTVal = Builder.CreateBitCast(STVal, TmpValTy);
417 } else {
418 unsigned DstVecTyNumElement =
419 DstTy->getVectorNumElements() / NumVector;
420 SmallVector<uint32_t, 4> Idxs;
421 for (unsigned i = 0; i < DstVecTyNumElement; i++) {
422 Idxs.push_back(i + (DstVecTyNumElement * VIdx));
423 }
424 Value *UndefVal = UndefValue::get(DstTy);
425 TmpSTVal = Builder.CreateShuffleVector(STVal, UndefVal, Idxs);
426 TmpSTVal = Builder.CreateBitCast(TmpSTVal, TmpValTy);
427 }
428
429 SmallVector<Value *, 8> STValues;
430 if (!SrcTy->isVectorTy()) {
431 // Handle scalar type.
432 for (unsigned i = 0; i < NumElement; i++) {
433 Value *TmpVal = Builder.CreateExtractElement(
434 TmpSTVal, Builder.getInt32(i));
435 STValues.push_back(TmpVal);
436 }
437 } else {
438 // Handle vector type.
439 unsigned SrcNumElement = SrcTy->getVectorNumElements();
440 unsigned DstNumElement = DstTy->getVectorNumElements();
441 for (unsigned i = 0; i < NumElement; i++) {
442 SmallVector<uint32_t, 4> Idxs;
443 for (unsigned j = 0; j < SrcNumElement; j++) {
444 Idxs.push_back(i * SrcNumElement + j);
445 }
446
447 VectorType *TmpVecTy =
448 VectorType::get(SrcEleTy, DstNumElement);
449 Value *UndefVal = UndefValue::get(TmpVecTy);
450 Value *TmpVal =
451 Builder.CreateShuffleVector(TmpSTVal, UndefVal, Idxs);
452 STValues.push_back(TmpVal);
453 }
454 }
455
456 // Generate stores.
457 Value *SrcAddrIdx = NewAddrIdx;
458 Value *BaseAddr = BitCastSrc;
459 for (unsigned i = 0; i < NumElement; i++) {
460 // Calculate store address.
461 Value *DstAddr = Builder.CreateGEP(BaseAddr, SrcAddrIdx);
462 Builder.CreateStore(STValues[i], DstAddr);
463
464 if (i + 1 < NumElement) {
465 // Calculate next store address
466 SrcAddrIdx =
467 Builder.CreateAdd(SrcAddrIdx, Builder.getInt32(1));
468 }
469 }
470 }
471 } else if (SrcTyBitWidth > DstTyBitWidth) {
472 //
473 // Consider below case.
474 //
475 // Original IR (float4* --> float2*)
476 // 1. val = load (float2*) src_addr
477 // 2. dst_addr = bitcast float4*, float2*
478 // 3. dst_addr = gep (float2*) dst_addr, idx
479 // 4. store (float2) val, (float2*) dst_addr
480 //
Diego Novillo3cc8d7a2019-04-10 13:30:34 -0400481 // Transformed IR: Decompose the source vector into elements, then
482 // write them one at a time.
David Neto22f144c2017-06-12 14:26:21 -0400483 // 1. val = load (float2*) src_addr
484 // 2. val1 = (float)extract_element val, 0
485 // 3. val2 = (float)extract_element val, 1
David Neto30ae05e2017-09-06 19:58:36 -0400486 // // Source component k maps to destination component k * idxscale
487 // 3a. idxscale = sizeof(float4)/sizeof(float2)
488 // 3b. idxbase = idx / idxscale
489 // 3c. newarrayidx = idxbase * idxscale
490 // 4. dst_addr1 = gep (float4*) dst, newarrayidx
491 // 5. dst_addr2 = gep (float4*) dst, newarrayidx + 1
David Neto22f144c2017-06-12 14:26:21 -0400492 // 6. store (float)val1, (float*) dst_addr1
493 // 7. store (float)val2, (float*) dst_addr2
494 //
495
496 if (SrcTyBitWidth <= DstEleTyBitWidth) {
497 SrcTy->print(errs());
498 DstTy->print(errs());
499 llvm_unreachable("Handle above src/dst type.");
500 }
501
502 // Create store values.
503 Value *STVal = ST->getValueOperand();
504
505 if (DstTy->isVectorTy() && (SrcEleTyBitWidth != DstTyBitWidth)) {
506 VectorType *TmpVecTy =
507 VectorType::get(SrcEleTy, DstTyBitWidth / SrcEleTyBitWidth);
508 STVal = Builder.CreateBitCast(STVal, TmpVecTy);
509 }
510
511 SmallVector<Value *, 8> STValues;
David Neto30ae05e2017-09-06 19:58:36 -0400512 // How many destination writes are required?
David Neto22f144c2017-06-12 14:26:21 -0400513 unsigned DstNumElement = 1;
514 if (!DstTy->isVectorTy() || SrcEleTyBitWidth == DstTyBitWidth) {
515 // Handle scalar type.
516 STValues.push_back(STVal);
517 } else {
518 // Handle vector type.
519 DstNumElement = DstTy->getVectorNumElements();
520 for (unsigned i = 0; i < DstNumElement; i++) {
521 Value *Idx = Builder.getInt32(i);
522 Value *TmpVal = Builder.CreateExtractElement(STVal, Idx);
523 STValues.push_back(TmpVal);
524 }
525 }
526
527 // Generate stores.
528 Value *BaseAddr = BitCastSrc;
529 Value *SubEleIdx = Builder.getInt32(0);
530 if (IsGEPUser) {
David Neto30ae05e2017-09-06 19:58:36 -0400531 // Compute SubNumElement = idxscale
David Neto22f144c2017-06-12 14:26:21 -0400532 unsigned SubNumElement = SrcTy->getVectorNumElements();
533 if (DstTy->isVectorTy() && (SrcEleTyBitWidth != DstTyBitWidth)) {
David Neto30ae05e2017-09-06 19:58:36 -0400534 // Same condition under which DstNumElements > 1
David Neto22f144c2017-06-12 14:26:21 -0400535 SubNumElement = SrcTy->getVectorNumElements() /
536 DstTy->getVectorNumElements();
537 }
538
David Neto30ae05e2017-09-06 19:58:36 -0400539 // Compute SubEleIdx = idxbase * idxscale
David Neto22f144c2017-06-12 14:26:21 -0400540 SubEleIdx = Builder.CreateAnd(
541 OrgGEPIdx, Builder.getInt32(SubNumElement - 1));
David Neto30ae05e2017-09-06 19:58:36 -0400542 if (DstTy->isVectorTy() && (SrcEleTyBitWidth != DstTyBitWidth)) {
543 SubEleIdx = Builder.CreateShl(
544 SubEleIdx, Builder.getInt32(std::log2(SubNumElement)));
545 }
David Neto22f144c2017-06-12 14:26:21 -0400546 }
547
548 for (unsigned i = 0; i < DstNumElement; i++) {
549 // Calculate address.
550 if (i > 0) {
551 SubEleIdx = Builder.CreateAdd(SubEleIdx, Builder.getInt32(i));
552 }
553
554 Value *Idxs[] = {NewAddrIdx, SubEleIdx};
555 Value *DstAddr = Builder.CreateGEP(BaseAddr, Idxs);
556 Type *TmpSrcTy = SrcEleTy;
557 if (TmpSrcTy->isVectorTy()) {
558 TmpSrcTy = TmpSrcTy->getVectorElementType();
559 }
560 Value *TmpVal = Builder.CreateBitCast(STValues[i], TmpSrcTy);
561
562 Builder.CreateStore(TmpVal, DstAddr);
563 }
564 } else {
565 // if SrcTyBitWidth == DstTyBitWidth
566 Type *TmpSrcTy = SrcTy;
567 Value *DstAddr = Src;
568
569 if (IsGEPUser) {
570 SmallVector<Value *, 4> Idxs;
571 for (unsigned i = 1; i < GEP->getNumOperands(); i++) {
572 Idxs.push_back(GEP->getOperand(i));
573 }
574 DstAddr = Builder.CreateGEP(BitCastSrc, Idxs);
575
576 if (GEP->getNumOperands() > 2) {
577 TmpSrcTy = SrcEleTy;
578 }
579 }
580
581 Value *TmpVal =
582 Builder.CreateBitCast(ST->getValueOperand(), TmpSrcTy);
583 Builder.CreateStore(TmpVal, DstAddr);
584 }
585 } else if (LoadInst *LD = dyn_cast<LoadInst>(U)) {
586 Value *SrcAddrIdx = Builder.getInt32(0);
587 if (IsGEPUser) {
588 SrcAddrIdx = NewAddrIdx;
589 }
590
591 // Load value from src.
592 SmallVector<Value *, 8> LDValues;
593
594 for (unsigned i = 1; i <= NumIter; i++) {
595 Value *SrcAddr = Builder.CreateGEP(Src, SrcAddrIdx);
596 LoadInst *SrcVal = Builder.CreateLoad(SrcAddr, "src_val");
597 LDValues.push_back(SrcVal);
598
599 if (i + 1 <= NumIter) {
600 // Calculate next SrcAddrIdx.
601 SrcAddrIdx = Builder.CreateAdd(SrcAddrIdx, Builder.getInt32(1));
602 }
603 }
604
605 Value *DstVal = nullptr;
606 if (SrcTyBitWidth > DstTyBitWidth) {
607 unsigned NumElement = SrcTyBitWidth / DstTyBitWidth;
608
609 if (SrcEleTyBitWidth == DstTyBitWidth) {
610 //
611 // Consider below case.
612 //
613 // Original IR (int4* --> char4*)
614 // 1. src_addr = bitcast int4*, char4*
615 // 2. element_addr = gep (char4*) src_addr, idx
616 // 3. load (char4*) element_addr
617 //
618 // Transformed IR
619 // 1. src_addr = gep (int4*) src, idx / 4
620 // 2. src_val(int4) = load (int4*) src_addr
621 // 3. tmp_val(int4) = extractelement src_val, idx % 4
622 // 4. dst_val(char4) = bitcast tmp_val, (char4)
623 //
624 Value *EleIdx = Builder.getInt32(0);
625 if (IsGEPUser) {
626 EleIdx = Builder.CreateAnd(OrgGEPIdx,
627 Builder.getInt32(NumElement - 1));
628 }
629 Value *TmpVal =
630 Builder.CreateExtractElement(LDValues[0], EleIdx, "tmp_val");
631 DstVal = Builder.CreateBitCast(TmpVal, DstTy);
632 } else if (SrcEleTyBitWidth < DstTyBitWidth) {
633 if (IsGEPUser) {
634 //
635 // Consider below case.
636 //
637 // Original IR (float4* --> float2*)
638 // 1. src_addr = bitcast float4*, float2*
639 // 2. element_addr = gep (float2*) src_addr, idx
640 // 3. load (float2*) element_addr
641 //
642 // Transformed IR
643 // 1. src_addr = gep (float4*) src, idx / 2
644 // 2. src_val(float4) = load (float4*) src_addr
645 // 3. tmp_val1(float) = extractelement (idx % 2) * 2
646 // 4. tmp_val2(float) = extractelement (idx % 2) * 2 + 1
647 // 5. dst_val(float2) = insertelement undef(float2), tmp_val1, 0
648 // 6. dst_val(float2) = insertelement undef(float2), tmp_val2, 1
649 // 7. dst_val(float2) = bitcast dst_val, (float2)
650 // ==> if types are same between src and dst, it will be
651 // igonored
652 //
653 VectorType *TmpVecTy =
654 VectorType::get(SrcEleTy, DstTyBitWidth / SrcEleTyBitWidth);
655 DstVal = UndefValue::get(TmpVecTy);
656 Value *EleIdx = Builder.CreateAnd(
657 OrgGEPIdx, Builder.getInt32(NumElement - 1));
658 EleIdx = Builder.CreateShl(
659 EleIdx, Builder.getInt32(
660 std::log2(DstTyBitWidth / SrcEleTyBitWidth)));
661 Value *TmpOrgGEPIdx = EleIdx;
662 for (unsigned i = 0; i < NumElement; i++) {
663 Value *TmpVal = Builder.CreateExtractElement(
664 LDValues[0], TmpOrgGEPIdx, "tmp_val");
665 DstVal = Builder.CreateInsertElement(DstVal, TmpVal,
666 Builder.getInt32(i));
667
668 if (i + 1 < NumElement) {
669 TmpOrgGEPIdx =
670 Builder.CreateAdd(TmpOrgGEPIdx, Builder.getInt32(1));
671 }
672 }
673 } else {
674 //
675 // Consider below case.
676 //
677 // Original IR (float4* --> int2*)
678 // 1. src_addr = bitcast float4*, int2*
679 // 2. load (int2*) src_addr
680 //
681 // Transformed IR
682 // 1. src_val(float4) = load (float4*) src_addr
683 // 2. tmp_val(float2) = shufflevector (float4)src_val,
684 // (float4)undef,
685 // (float2)<0, 1>
686 // 3. dst_val(int2) = bitcast (float2)tmp_val, (int2)
687 //
688 unsigned NumElement = DstTyBitWidth / SrcEleTyBitWidth;
689 Value *Undef = UndefValue::get(SrcTy);
690
691 SmallVector<uint32_t, 4> Idxs;
692 for (unsigned i = 0; i < NumElement; i++) {
693 Idxs.push_back(i);
694 }
695 DstVal = Builder.CreateShuffleVector(LDValues[0], Undef, Idxs);
696
697 DstVal = Builder.CreateBitCast(DstVal, DstTy);
698 }
699
700 DstVal = Builder.CreateBitCast(DstVal, DstTy);
701 } else {
702 if (IsGEPUser) {
703 //
704 // Consider below case.
705 //
706 // Original IR (int4* --> char2*)
707 // 1. src_addr = bitcast int4*, char2*
708 // 2. element_addr = gep (char2*) src_addr, idx
709 // 3. load (char2*) element_addr
710 //
711 // Transformed IR
712 // 1. src_addr = gep (int4*) src, idx / 8
713 // 2. src_val(int4) = load (int4*) src_addr
714 // 3. tmp_val(int) = extractelement idx / 2
715 // 4. tmp_val(<i16 x 2>) = bitcast tmp_val(int), (<i16 x 2>)
716 // 5. tmp_val(i16) = extractelement idx % 2
717 // 6. dst_val(char2) = bitcast tmp_val, (char2)
718 // ==> if types are same between src and dst, it will be
719 // igonored
720 //
721 unsigned NumElement = SrcTyBitWidth / DstTyBitWidth;
722 unsigned SubNumElement = SrcEleTyBitWidth / DstTyBitWidth;
723 if (SubNumElement != 2 && SubNumElement != 4) {
724 llvm_unreachable("Unsupported SubNumElement");
725 }
726
727 Value *TmpOrgGEPIdx = Builder.CreateLShr(
728 OrgGEPIdx, Builder.getInt32(std::log2(SubNumElement)));
729 Value *TmpVal = Builder.CreateExtractElement(
730 LDValues[0], TmpOrgGEPIdx, "tmp_val");
731 TmpVal = Builder.CreateBitCast(
732 TmpVal,
733 VectorType::get(
734 IntegerType::get(DstTy->getContext(), DstTyBitWidth),
735 SubNumElement));
736 TmpOrgGEPIdx = Builder.CreateAnd(
737 OrgGEPIdx, Builder.getInt32(SubNumElement - 1));
738 TmpVal = Builder.CreateExtractElement(TmpVal, TmpOrgGEPIdx,
739 "tmp_val");
740 DstVal = Builder.CreateBitCast(TmpVal, DstTy);
741 } else {
742 Inst->print(errs());
743 llvm_unreachable("Handle this bitcast");
744 }
745 }
746 } else if (SrcTyBitWidth < DstTyBitWidth) {
747 //
748 // Consider below case.
749 //
750 // Original IR (float2* --> float4*)
751 // 1. src_addr = bitcast float2*, float4*
752 // 2. element_addr = gep (float4*) src_addr, idx
753 // 3. load (float4*) element_addr
754 //
755 // Transformed IR
756 // 1. src_addr = gep (float2*) src, idx * 2
757 // 2. src_val1(float2) = load (float2*) src_addr
758 // 3. src_addr2 = gep (float2*) src_addr, 1
759 // 4. src_val2(float2) = load (float2*) src_addr2
760 // 5. dst_val(float4) = shufflevector src_val1, src_val2, <0, 1>
761 // 6. dst_val(float4) = bitcast dst_val, (float4)
762 // ==> if types are same between src and dst, it will be igonored
763 //
764 unsigned NumElement = 1;
765 if (SrcTy->isVectorTy()) {
766 NumElement = SrcTy->getVectorNumElements() * 2;
767 }
768
769 // Handle scalar type.
770 if (NumElement == 1) {
771 if (SrcTyBitWidth * 4 <= DstTyBitWidth) {
772 unsigned NumVecElement = DstTyBitWidth / SrcTyBitWidth;
773 unsigned NumVector = 1;
774 if (NumVecElement > 4) {
775 NumVector = NumVecElement >> 2;
776 NumVecElement = 4;
777 }
778
779 SmallVector<Value *, 4> Values;
780 for (unsigned VIdx = 0; VIdx < NumVector; VIdx++) {
781 // In this case, generate only insert element. It generates
782 // less instructions than using shuffle vector.
783 VectorType *TmpVecTy = VectorType::get(SrcTy, NumVecElement);
784 Value *TmpVal = UndefValue::get(TmpVecTy);
785 for (unsigned i = 0; i < NumVecElement; i++) {
786 TmpVal = Builder.CreateInsertElement(
787 TmpVal, LDValues[i + (VIdx * 4)], Builder.getInt32(i));
788 }
789 Values.push_back(TmpVal);
790 }
791
792 if (Values.size() > 2) {
793 Inst->print(errs());
794 llvm_unreachable("Support above bitcast");
795 }
796
797 if (Values.size() > 1) {
798 Type *TmpEleTy =
799 Type::getIntNTy(M.getContext(), SrcEleTyBitWidth * 2);
800 VectorType *TmpVecTy = VectorType::get(TmpEleTy, NumVector);
801 for (unsigned i = 0; i < Values.size(); i++) {
802 Values[i] = Builder.CreateBitCast(Values[i], TmpVecTy);
803 }
804 SmallVector<uint32_t, 4> Idxs;
805 for (unsigned i = 0; i < (NumVector * 2); i++) {
806 Idxs.push_back(i);
807 }
808 for (unsigned i = 0; i < Values.size(); i = i + 2) {
809 Values[i] = Builder.CreateShuffleVector(
810 Values[i], Values[i + 1], Idxs);
811 }
812 }
813
814 LDValues.clear();
815 LDValues.push_back(Values[0]);
816 } else {
817 SmallVector<Value *, 4> TmpLDValues;
818 for (unsigned i = 0; i < LDValues.size(); i = i + 2) {
819 VectorType *TmpVecTy = VectorType::get(SrcTy, 2);
820 Value *TmpVal = UndefValue::get(TmpVecTy);
821 TmpVal = Builder.CreateInsertElement(TmpVal, LDValues[i],
822 Builder.getInt32(0));
823 TmpVal = Builder.CreateInsertElement(TmpVal, LDValues[i + 1],
824 Builder.getInt32(1));
825 TmpLDValues.push_back(TmpVal);
826 }
827 LDValues.clear();
828 LDValues = std::move(TmpLDValues);
829 NumElement = 4;
830 }
831 }
832
833 // Handle vector type.
834 while (LDValues.size() != 1) {
835 SmallVector<Value *, 4> TmpLDValues;
836 for (unsigned i = 0; i < LDValues.size(); i = i + 2) {
837 SmallVector<uint32_t, 4> Idxs;
838 for (unsigned j = 0; j < NumElement; j++) {
839 Idxs.push_back(j);
840 }
841 Value *TmpVal = Builder.CreateShuffleVector(
842 LDValues[i], LDValues[i + 1], Idxs);
843 TmpLDValues.push_back(TmpVal);
844 }
845 LDValues.clear();
846 LDValues = std::move(TmpLDValues);
847 NumElement *= 2;
848 }
849
850 DstVal = Builder.CreateBitCast(LDValues[0], DstTy);
851 } else {
852 //
853 // Consider below case.
854 //
855 // Original IR (float4* --> int4*)
856 // 1. src_addr = bitcast float4*, int4*
857 // 2. element_addr = gep (int4*) src_addr, idx, 0
858 // 3. load (int) element_addr
859 //
860 // Transformed IR
861 // 1. element_addr = gep (float4*) src_addr, idx, 0
862 // 2. src_val = load (float*) element_addr
863 // 3. val = bitcast (float) src_val to (int)
864 //
865 Value *SrcAddr = Src;
866 if (IsGEPUser) {
867 SmallVector<Value *, 4> Idxs;
868 for (unsigned i = 1; i < GEP->getNumOperands(); i++) {
869 Idxs.push_back(GEP->getOperand(i));
870 }
871 SrcAddr = Builder.CreateGEP(Src, Idxs);
872 }
873 LoadInst *SrcVal = Builder.CreateLoad(SrcAddr, "src_val");
874
875 Type *TmpDstTy = DstTy;
876 if (IsGEPUser) {
877 if (GEP->getNumOperands() > 2) {
878 TmpDstTy = DstEleTy;
879 }
880 }
881 DstVal = Builder.CreateBitCast(SrcVal, TmpDstTy);
882 }
883
884 // Update LD's users with DstVal.
885 LD->replaceAllUsesWith(DstVal);
886 } else {
887 U->print(errs());
888 llvm_unreachable(
889 "Handle above user of gep on ReplacePointerBitcastPass");
890 }
891
892 ToBeDeleted.push_back(cast<Instruction>(U));
893 }
894
895 if (IsGEPUser) {
896 ToBeDeleted.push_back(GEP);
897 }
898 }
899
900 ToBeDeleted.push_back(Inst);
901 }
902
903 for (Instruction *Inst : ScalarWorkList) {
David Neto8e138142018-05-29 10:19:21 -0400904 // Some tests have a stray bitcast from pointer-to-array to
905 // pointer to i8*, but the bitcast has no uses. Exit early
906 // but be sure to delete it later.
907 //
908 // Example:
909 // %1 = bitcast [25 x float]* %dst to i8*
910
911 // errs () << " Scalar bitcast is " << *Inst << "\n";
912
913 if (!Inst->hasNUsesOrMore(1)) {
914 ToBeDeleted.push_back(Inst);
915 continue;
916 }
917
David Neto22f144c2017-06-12 14:26:21 -0400918 Value *Src = Inst->getOperand(0);
David Neto8e138142018-05-29 10:19:21 -0400919 Type *SrcTy; // Original type
920 Type *DstTy; // Type that SrcTy is cast to.
921 unsigned SrcTyBitWidth;
922 unsigned DstTyBitWidth;
923
924 SrcTy = Src->getType()->getPointerElementType();
925 DstTy = Inst->getType()->getPointerElementType();
926 int iter_count = 0;
927 while (++iter_count) {
928 SrcTyBitWidth = unsigned(DL.getTypeStoreSizeInBits(SrcTy));
929 DstTyBitWidth = unsigned(DL.getTypeStoreSizeInBits(DstTy));
930#if 0
931 errs() << " Try Src " << *Src << "\n";
932 errs() << " SrcTy elem " << *SrcTy << " bit width " << SrcTyBitWidth
933 << "\n";
934 errs() << " DstTy elem " << *DstTy << " bit width " << DstTyBitWidth
935 << "\n";
936#endif
937
938 // The normal case that we can handle is source type is smaller than
939 // the dest type.
940 if (SrcTyBitWidth <= DstTyBitWidth)
941 break;
942
943 // The Source type is bigger than the destination type.
944 // Walk into the source type to break it down.
945 if (SrcTy->isArrayTy()) {
946 // If it's an array, consider only the first element.
947 Value *Zero = ConstantInt::get(Type::getInt32Ty(M.getContext()), 0);
Diego Novillo3cc8d7a2019-04-10 13:30:34 -0400948 Instruction *NewSrc =
949 GetElementPtrInst::CreateInBounds(Src, {Zero, Zero});
David Neto8e138142018-05-29 10:19:21 -0400950 // errs() << "NewSrc is " << *NewSrc << "\n";
951 if (auto *SrcInst = dyn_cast<Instruction>(Src)) {
952 // errs() << " instruction case\n";
953 NewSrc->insertAfter(SrcInst);
954 } else {
955 // Could be a parameter.
956 auto where = Inst->getParent()
957 ->getParent()
958 ->getEntryBlock()
959 .getFirstInsertionPt();
Diego Novillo3cc8d7a2019-04-10 13:30:34 -0400960 Instruction &whereInst = *where;
David Neto8e138142018-05-29 10:19:21 -0400961 // errs() << "insert " << *NewSrc << " before " << whereInst << "\n";
962 NewSrc->insertBefore(&whereInst);
963 }
964 Src = NewSrc;
965 SrcTy = Src->getType()->getPointerElementType();
966 } else {
967 errs() << "Replace pointer bitcasts: unhandled case: non-array "
968 "non-vector source type "
969 << *SrcTy << " is wider than dest type " << *DstTy << "\n";
970 llvm_unreachable("ReplacePointerBitcastPass: non-array non-vector "
971 "source type is wider than dest type");
972 }
973 if (iter_count > 1000) {
974 llvm_unreachable("ReplacePointerBitcastPass: Too many iterations!");
975 }
976 };
977#if 0
978 errs() << " Src is " << *Src << "\n";
979 errs() << " Dst is " << *Inst << "\n";
980 errs() << " SrcTy elem " << *SrcTy << " bit width " << SrcTyBitWidth
981 << "\n";
982 errs() << " DstTy elem " << *DstTy << " bit width " << DstTyBitWidth
983 << "\n";
984#endif
David Neto22f144c2017-06-12 14:26:21 -0400985
986 for (User *BitCastUser : Inst->users()) {
987 Value *NewAddrIdx = ConstantInt::get(Type::getInt32Ty(M.getContext()), 0);
988 // It consist of User* and bool whether user is gep or not.
989 SmallVector<std::pair<User *, bool>, 32> Users;
990
991 GetElementPtrInst *GEP = nullptr;
992 Value *OrgGEPIdx = nullptr;
Jason Gavrise44af072018-08-14 20:44:50 -0400993 if ((GEP = dyn_cast<GetElementPtrInst>(BitCastUser))) {
David Neto22f144c2017-06-12 14:26:21 -0400994 IRBuilder<> Builder(GEP);
995
996 // Build new src/dst address.
997 OrgGEPIdx = GEP->getOperand(1);
998 NewAddrIdx = CalculateNewGEPIdx(SrcTyBitWidth, DstTyBitWidth, GEP);
999
1000 // If bitcast's user is gep, investigate gep's users too.
1001 for (User *GEPUser : GEP->users()) {
1002 Users.push_back(std::make_pair(GEPUser, true));
1003 }
1004 } else {
1005 Users.push_back(std::make_pair(BitCastUser, false));
1006 }
1007
1008 // Handle users.
1009 bool IsGEPUser = false;
1010 for (auto UserIter : Users) {
1011 User *U = UserIter.first;
1012 IsGEPUser = UserIter.second;
1013
1014 IRBuilder<> Builder(cast<Instruction>(U));
1015
1016 // Handle store instruction with gep.
1017 if (StoreInst *ST = dyn_cast<StoreInst>(U)) {
Diego Novillo3cc8d7a2019-04-10 13:30:34 -04001018 // errs() << " store is " << *ST << "\n";
David Neto22f144c2017-06-12 14:26:21 -04001019 if (SrcTyBitWidth == DstTyBitWidth) {
alan-baker32014272019-05-22 08:07:18 -04001020 auto STVal = ConvertValue(ST->getValueOperand(), SrcTy, Builder);
David Neto22f144c2017-06-12 14:26:21 -04001021 Value *DstAddr = Builder.CreateGEP(Src, NewAddrIdx);
1022 Builder.CreateStore(STVal, DstAddr);
1023 } else if (SrcTyBitWidth < DstTyBitWidth) {
1024 unsigned NumElement = DstTyBitWidth / SrcTyBitWidth;
1025
1026 // Create Mask.
1027 Constant *Mask = nullptr;
1028 if (NumElement == 1) {
1029 Mask = Builder.getInt32(0xFF);
1030 } else if (NumElement == 2) {
1031 Mask = Builder.getInt32(0xFFFF);
alan-baker4130faa2019-04-10 17:26:17 -04001032 } else if (NumElement == 4) {
1033 Mask = Builder.getInt32(0xFFFFFFFF);
David Neto22f144c2017-06-12 14:26:21 -04001034 } else {
1035 llvm_unreachable("strange type on bitcast");
1036 }
1037
1038 // Create store values.
1039 Value *STVal = ST->getValueOperand();
1040 SmallVector<Value *, 8> STValues;
1041 for (unsigned i = 0; i < NumElement; i++) {
1042 Type *TmpTy = Type::getIntNTy(M.getContext(), DstTyBitWidth);
1043 Value *TmpVal = Builder.CreateBitCast(STVal, TmpTy);
alan-baker4130faa2019-04-10 17:26:17 -04001044 TmpVal = Builder.CreateLShr(TmpVal,
1045 Builder.getInt32(i * SrcTyBitWidth));
David Neto22f144c2017-06-12 14:26:21 -04001046 TmpVal = Builder.CreateAnd(TmpVal, Mask);
1047 TmpVal = Builder.CreateTrunc(TmpVal, SrcTy);
1048 STValues.push_back(TmpVal);
1049 }
1050
1051 // Generate stores.
1052 Value *SrcAddrIdx = NewAddrIdx;
1053 Value *BaseAddr = Src;
1054 for (unsigned i = 0; i < NumElement; i++) {
1055 // Calculate store address.
1056 Value *DstAddr = Builder.CreateGEP(BaseAddr, SrcAddrIdx);
1057 Builder.CreateStore(STValues[i], DstAddr);
1058
1059 if (i + 1 < NumElement) {
1060 // Calculate next store address
1061 SrcAddrIdx = Builder.CreateAdd(SrcAddrIdx, Builder.getInt32(1));
1062 }
1063 }
1064
1065 } else {
1066 Inst->print(errs());
1067 llvm_unreachable("Handle different size store with scalar "
1068 "bitcast on ReplacePointerBitcastPass");
1069 }
1070 } else if (LoadInst *LD = dyn_cast<LoadInst>(U)) {
1071 if (SrcTyBitWidth == DstTyBitWidth) {
1072 Value *SrcAddr = Builder.CreateGEP(Src, NewAddrIdx);
1073 LoadInst *SrcVal = Builder.CreateLoad(SrcAddr, "src_val");
alan-baker32014272019-05-22 08:07:18 -04001074 LD->replaceAllUsesWith(ConvertValue(SrcVal, DstTy, Builder));
David Neto22f144c2017-06-12 14:26:21 -04001075 } else if (SrcTyBitWidth < DstTyBitWidth) {
1076 Value *SrcAddrIdx = NewAddrIdx;
1077
1078 // Load value from src.
1079 unsigned NumIter = CalculateNumIter(SrcTyBitWidth, DstTyBitWidth);
1080 SmallVector<Value *, 8> LDValues;
1081 for (unsigned i = 1; i <= NumIter; i++) {
1082 Value *SrcAddr = Builder.CreateGEP(Src, SrcAddrIdx);
1083 LoadInst *SrcVal = Builder.CreateLoad(SrcAddr, "src_val");
1084 LDValues.push_back(SrcVal);
1085
1086 if (i + 1 <= NumIter) {
1087 // Calculate next SrcAddrIdx.
1088 SrcAddrIdx = Builder.CreateAdd(SrcAddrIdx, Builder.getInt32(1));
1089 }
1090 }
1091
1092 // Merge Load.
1093 Type *TmpSrcTy = Type::getIntNTy(M.getContext(), SrcTyBitWidth);
1094 Value *DstVal = Builder.CreateBitCast(LDValues[0], TmpSrcTy);
1095 Type *TmpDstTy = Type::getIntNTy(M.getContext(), DstTyBitWidth);
1096 DstVal = Builder.CreateZExt(DstVal, TmpDstTy);
1097 for (unsigned i = 1; i < LDValues.size(); i++) {
1098 Value *TmpVal = Builder.CreateBitCast(LDValues[i], TmpSrcTy);
1099 TmpVal = Builder.CreateZExt(TmpVal, TmpDstTy);
1100 TmpVal = Builder.CreateShl(TmpVal,
1101 Builder.getInt32(i * SrcTyBitWidth));
1102 DstVal = Builder.CreateOr(DstVal, TmpVal);
1103 }
1104
1105 DstVal = Builder.CreateBitCast(DstVal, DstTy);
1106 LD->replaceAllUsesWith(DstVal);
1107
1108 } else {
1109 Inst->print(errs());
1110 llvm_unreachable("Handle different size load with scalar "
1111 "bitcast on ReplacePointerBitcastPass");
1112 }
1113 } else {
David Neto22f144c2017-06-12 14:26:21 -04001114 Inst->print(errs());
1115 llvm_unreachable("Handle above user of scalar bitcast with gep on "
1116 "ReplacePointerBitcastPass");
1117 }
1118
1119 ToBeDeleted.push_back(cast<Instruction>(U));
1120 }
1121
1122 if (IsGEPUser) {
1123 ToBeDeleted.push_back(GEP);
1124 }
1125 }
1126
1127 ToBeDeleted.push_back(Inst);
1128 }
1129
1130 for (Instruction *Inst : ToBeDeleted) {
1131 Inst->eraseFromParent();
1132 }
1133
1134 return Changed;
1135}