@@ -140,44 +140,6 @@ static bool ignoreOp(const Instruction *I, unsigned OpIdx) {
140
140
return true ;
141
141
}
142
142
143
- static Value *createCast (IRBuilder<> &Builder, Value *V, Type *DestTy) {
144
- Type *SrcTy = V->getType ();
145
- if (SrcTy->isStructTy ()) {
146
- assert (DestTy->isStructTy ());
147
- assert (SrcTy->getStructNumElements () == DestTy->getStructNumElements ());
148
- Value *Result = PoisonValue::get (DestTy);
149
- for (unsigned int I = 0 , E = SrcTy->getStructNumElements (); I < E; ++I) {
150
- Value *Element =
151
- createCast (Builder, Builder.CreateExtractValue (V, ArrayRef (I)),
152
- DestTy->getStructElementType (I));
153
-
154
- Result = Builder.CreateInsertValue (Result, Element, ArrayRef (I));
155
- }
156
- return Result;
157
- }
158
- assert (!DestTy->isStructTy ());
159
- if (auto *SrcAT = dyn_cast<ArrayType>(SrcTy)) {
160
- auto *DestAT = dyn_cast<ArrayType>(DestTy);
161
- assert (DestAT);
162
- assert (SrcAT->getNumElements () == DestAT->getNumElements ());
163
- Value *Result = PoisonValue::get (DestTy);
164
- for (unsigned int I = 0 , E = SrcAT->getNumElements (); I < E; ++I) {
165
- Value *Element =
166
- createCast (Builder, Builder.CreateExtractValue (V, ArrayRef (I)),
167
- DestAT->getElementType ());
168
-
169
- Result = Builder.CreateInsertValue (Result, Element, ArrayRef (I));
170
- }
171
- return Result;
172
- }
173
- assert (!DestTy->isArrayTy ());
174
- if (SrcTy->isIntegerTy () && DestTy->isPointerTy ())
175
- return Builder.CreateIntToPtr (V, DestTy);
176
- if (SrcTy->isPointerTy () && DestTy->isIntegerTy ())
177
- return Builder.CreatePtrToInt (V, DestTy);
178
- return Builder.CreateBitCast (V, DestTy);
179
- }
180
-
181
143
void GlobalMergeFunc::analyze (Module &M) {
182
144
++NumAnalyzedModues;
183
145
for (Function &Func : M) {
@@ -268,7 +230,7 @@ static Function *createMergedFunction(FuncMergeInfo &FI,
268
230
if (OrigC->getType () != NewArg->getType ()) {
269
231
IRBuilder<> Builder (Inst->getParent (), Inst->getIterator ());
270
232
Inst->setOperand (OpndIndex,
271
- createCast ( Builder, NewArg, OrigC->getType ()));
233
+ Builder. CreateAggregateCast ( NewArg, OrigC->getType ()));
272
234
} else {
273
235
Inst->setOperand (OpndIndex, NewArg);
274
236
}
@@ -297,15 +259,16 @@ static void createThunk(FuncMergeInfo &FI, ArrayRef<Constant *> Params,
297
259
298
260
// Add arguments which are passed through Thunk.
299
261
for (Argument &AI : Thunk->args ()) {
300
- Args.push_back (createCast (Builder, &AI, ToFuncTy->getParamType (ParamIdx)));
262
+ Args.push_back (
263
+ Builder.CreateAggregateCast (&AI, ToFuncTy->getParamType (ParamIdx)));
301
264
++ParamIdx;
302
265
}
303
266
304
267
// Add new arguments defined by Params.
305
268
for (auto *Param : Params) {
306
269
assert (ParamIdx < ToFuncTy->getNumParams ());
307
270
Args.push_back (
308
- createCast ( Builder, Param, ToFuncTy->getParamType (ParamIdx)));
271
+ Builder. CreateAggregateCast ( Param, ToFuncTy->getParamType (ParamIdx)));
309
272
++ParamIdx;
310
273
}
311
274
@@ -319,7 +282,7 @@ static void createThunk(FuncMergeInfo &FI, ArrayRef<Constant *> Params,
319
282
if (Thunk->getReturnType ()->isVoidTy ())
320
283
Builder.CreateRetVoid ();
321
284
else
322
- Builder.CreateRet (createCast ( Builder, CI, Thunk->getReturnType ()));
285
+ Builder.CreateRet (Builder. CreateAggregateCast ( CI, Thunk->getReturnType ()));
323
286
}
324
287
325
288
// Check if the old merged/optimized IndexOperandHashMap is compatible with
0 commit comments