annotate lib/CodeGen/PreISelIntrinsicLowering.cpp @ 134:3a76565eade5 LLVM5.0.1

update 5.0.1
author mir3636
date Sat, 17 Feb 2018 09:57:20 +0900
parents 803732b1fca8
children c2174574ed3a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1 //===- PreISelIntrinsicLowering.cpp - Pre-ISel intrinsic lowering pass ----===//
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
2 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
4 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
7 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
9 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
10 // This pass implements IR lowering for the llvm.load.relative intrinsic.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
11 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
12 //===----------------------------------------------------------------------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
13
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
14 #include "llvm/CodeGen/PreISelIntrinsicLowering.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
15 #include "llvm/CodeGen/Passes.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
16 #include "llvm/IR/Function.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
17 #include "llvm/IR/IRBuilder.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
18 #include "llvm/IR/Instructions.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
19 #include "llvm/IR/Module.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
20 #include "llvm/IR/Type.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
21 #include "llvm/IR/User.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
22 #include "llvm/Pass.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
23 #include "llvm/Support/Casting.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
24
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
25 using namespace llvm;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
26
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
27 static bool lowerLoadRelative(Function &F) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
28 if (F.use_empty())
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
29 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
30
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
31 bool Changed = false;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
32 Type *Int32Ty = Type::getInt32Ty(F.getContext());
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
33 Type *Int32PtrTy = Int32Ty->getPointerTo();
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
34 Type *Int8Ty = Type::getInt8Ty(F.getContext());
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
35
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
36 for (auto I = F.use_begin(), E = F.use_end(); I != E;) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
37 auto CI = dyn_cast<CallInst>(I->getUser());
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
38 ++I;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
39 if (!CI || CI->getCalledValue() != &F)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
40 continue;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
41
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
42 IRBuilder<> B(CI);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
43 Value *OffsetPtr =
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
44 B.CreateGEP(Int8Ty, CI->getArgOperand(0), CI->getArgOperand(1));
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
45 Value *OffsetPtrI32 = B.CreateBitCast(OffsetPtr, Int32PtrTy);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
46 Value *OffsetI32 = B.CreateAlignedLoad(OffsetPtrI32, 4);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
47
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
48 Value *ResultPtr = B.CreateGEP(Int8Ty, CI->getArgOperand(0), OffsetI32);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
49
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
50 CI->replaceAllUsesWith(ResultPtr);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
51 CI->eraseFromParent();
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
52 Changed = true;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
53 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
54
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
55 return Changed;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
56 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
57
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
58 static bool lowerIntrinsics(Module &M) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
59 bool Changed = false;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
60 for (Function &F : M) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
61 if (F.getName().startswith("llvm.load.relative."))
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
62 Changed |= lowerLoadRelative(F);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
63 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
64 return Changed;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
65 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
66
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
67 namespace {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
68
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
69 class PreISelIntrinsicLoweringLegacyPass : public ModulePass {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
70 public:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
71 static char ID;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
72
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
73 PreISelIntrinsicLoweringLegacyPass() : ModulePass(ID) {}
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
74
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
75 bool runOnModule(Module &M) override { return lowerIntrinsics(M); }
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
76 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
77
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
78 } // end anonymous namespace
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
79
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
80 char PreISelIntrinsicLoweringLegacyPass::ID;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
81
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
82 INITIALIZE_PASS(PreISelIntrinsicLoweringLegacyPass,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
83 "pre-isel-intrinsic-lowering", "Pre-ISel Intrinsic Lowering",
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
84 false, false)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
85
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
86 ModulePass *llvm::createPreISelIntrinsicLoweringPass() {
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
87 return new PreISelIntrinsicLoweringLegacyPass;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
88 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
89
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
90 PreservedAnalyses PreISelIntrinsicLoweringPass::run(Module &M,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
91 ModuleAnalysisManager &AM) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
92 if (!lowerIntrinsics(M))
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
93 return PreservedAnalyses::all();
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
94 else
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
95 return PreservedAnalyses::none();
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
96 }