@@ -140,44 +140,6 @@ static bool ignoreOp(const Instruction *I, unsigned OpIdx) {
140140 return true ;
141141}
142142
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-
181143void GlobalMergeFunc::analyze (Module &M) {
182144 ++NumAnalyzedModues;
183145 for (Function &Func : M) {
@@ -268,7 +230,7 @@ static Function *createMergedFunction(FuncMergeInfo &FI,
268230 if (OrigC->getType () != NewArg->getType ()) {
269231 IRBuilder<> Builder (Inst->getParent (), Inst->getIterator ());
270232 Inst->setOperand (OpndIndex,
271- createCast ( Builder, NewArg, OrigC->getType ()));
233+ Builder. CreateAggregateCast ( NewArg, OrigC->getType ()));
272234 } else {
273235 Inst->setOperand (OpndIndex, NewArg);
274236 }
@@ -297,15 +259,16 @@ static void createThunk(FuncMergeInfo &FI, ArrayRef<Constant *> Params,
297259
298260 // Add arguments which are passed through Thunk.
299261 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)));
301264 ++ParamIdx;
302265 }
303266
304267 // Add new arguments defined by Params.
305268 for (auto *Param : Params) {
306269 assert (ParamIdx < ToFuncTy->getNumParams ());
307270 Args.push_back (
308- createCast ( Builder, Param, ToFuncTy->getParamType (ParamIdx)));
271+ Builder. CreateAggregateCast ( Param, ToFuncTy->getParamType (ParamIdx)));
309272 ++ParamIdx;
310273 }
311274
@@ -319,7 +282,7 @@ static void createThunk(FuncMergeInfo &FI, ArrayRef<Constant *> Params,
319282 if (Thunk->getReturnType ()->isVoidTy ())
320283 Builder.CreateRetVoid ();
321284 else
322- Builder.CreateRet (createCast ( Builder, CI, Thunk->getReturnType ()));
285+ Builder.CreateRet (Builder. CreateAggregateCast ( CI, Thunk->getReturnType ()));
323286}
324287
325288// Check if the old merged/optimized IndexOperandHashMap is compatible with
0 commit comments