[WebAssembly] Use IRBuilder in FixFunctionBitcasts (NFC) (#164268)
Simplifies the code a bit.
This commit is contained in:
parent
1458d313a1
commit
4b367e0b85
2 changed files with 16 additions and 23 deletions
|
|
@ -24,6 +24,7 @@
|
|||
|
||||
#include "WebAssembly.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/IRBuilder.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/Module.h"
|
||||
#include "llvm/IR/Operator.h"
|
||||
|
|
@ -114,6 +115,7 @@ static Function *createWrapper(Function *F, FunctionType *Ty) {
|
|||
Wrapper->setAttributes(F->getAttributes());
|
||||
BasicBlock *BB = BasicBlock::Create(M->getContext(), "body", Wrapper);
|
||||
const DataLayout &DL = BB->getDataLayout();
|
||||
IRBuilder<> Builder(BB);
|
||||
|
||||
// Determine what arguments to pass.
|
||||
SmallVector<Value *, 4> Args;
|
||||
|
|
@ -140,10 +142,7 @@ static Function *createWrapper(Function *F, FunctionType *Ty) {
|
|||
Args.push_back(&*AI);
|
||||
} else {
|
||||
if (CastInst::isBitOrNoopPointerCastable(ArgType, ParamType, DL)) {
|
||||
Instruction *PtrCast =
|
||||
CastInst::CreateBitOrPointerCast(AI, ParamType, "cast");
|
||||
PtrCast->insertInto(BB, BB->end());
|
||||
Args.push_back(PtrCast);
|
||||
Args.push_back(Builder.CreateBitOrPointerCast(AI, ParamType, "cast"));
|
||||
} else if (ArgType->isStructTy() || ParamType->isStructTy()) {
|
||||
LLVM_DEBUG(dbgs() << "createWrapper: struct param type in bitcast: "
|
||||
<< F->getName() << "\n");
|
||||
|
|
@ -166,24 +165,19 @@ static Function *createWrapper(Function *F, FunctionType *Ty) {
|
|||
for (; AI != AE; ++AI)
|
||||
Args.push_back(&*AI);
|
||||
|
||||
CallInst *Call = CallInst::Create(F, Args, "", BB);
|
||||
CallInst *Call = Builder.CreateCall(F, Args);
|
||||
|
||||
Type *ExpectedRtnType = F->getFunctionType()->getReturnType();
|
||||
Type *RtnType = Ty->getReturnType();
|
||||
// Determine what value to return.
|
||||
if (RtnType->isVoidTy()) {
|
||||
ReturnInst::Create(M->getContext(), BB);
|
||||
Builder.CreateRetVoid();
|
||||
} else if (ExpectedRtnType->isVoidTy()) {
|
||||
LLVM_DEBUG(dbgs() << "Creating dummy return: " << *RtnType << "\n");
|
||||
ReturnInst::Create(M->getContext(), PoisonValue::get(RtnType), BB);
|
||||
Builder.CreateRet(PoisonValue::get(RtnType));
|
||||
} else if (RtnType == ExpectedRtnType) {
|
||||
ReturnInst::Create(M->getContext(), Call, BB);
|
||||
Builder.CreateRet(Call);
|
||||
} else if (CastInst::isBitOrNoopPointerCastable(ExpectedRtnType, RtnType,
|
||||
DL)) {
|
||||
Instruction *Cast =
|
||||
CastInst::CreateBitOrPointerCast(Call, RtnType, "cast");
|
||||
Cast->insertInto(BB, BB->end());
|
||||
ReturnInst::Create(M->getContext(), Cast, BB);
|
||||
Builder.CreateRet(Builder.CreateBitOrPointerCast(Call, RtnType, "cast"));
|
||||
} else if (RtnType->isStructTy() || ExpectedRtnType->isStructTy()) {
|
||||
LLVM_DEBUG(dbgs() << "createWrapper: struct return type in bitcast: "
|
||||
<< F->getName() << "\n");
|
||||
|
|
@ -203,9 +197,8 @@ static Function *createWrapper(Function *F, FunctionType *Ty) {
|
|||
Wrapper = Function::Create(Ty, Function::PrivateLinkage,
|
||||
F->getName() + "_bitcast_invalid", M);
|
||||
Wrapper->setAttributes(F->getAttributes());
|
||||
BasicBlock *BB = BasicBlock::Create(M->getContext(), "body", Wrapper);
|
||||
new UnreachableInst(M->getContext(), BB);
|
||||
Wrapper->setName(F->getName() + "_bitcast_invalid");
|
||||
IRBuilder<> Builder(BasicBlock::Create(M->getContext(), "body", Wrapper));
|
||||
Builder.CreateUnreachable();
|
||||
} else if (!WrapperNeeded) {
|
||||
LLVM_DEBUG(dbgs() << "createWrapper: no wrapper needed: " << F->getName()
|
||||
<< "\n");
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ declare i32 @has_ptr_arg(ptr)
|
|||
|
||||
; CHECK-LABEL: test_invalid_rtn:
|
||||
; CHECK: i32.const $push[[L0:[0-9]+]]=, 0{{$}}
|
||||
; CHECK-NEXT: call $push[[L1:[0-9]+]]=, .Lhas_i64_arg_bitcast_invalid.2, $pop[[L0]]{{$}}
|
||||
; CHECK-NEXT: call $push[[L1:[0-9]+]]=, .Lhas_i64_arg_bitcast_invalid.1, $pop[[L0]]{{$}}
|
||||
; CHECK-NEXT: drop $pop[[L1]]{{$}}
|
||||
; CHECK-NEXT: i64.const $push[[L0:[0-9]+]]=, 0{{$}}
|
||||
; CHECK-NEXT: call $push[[L1:[0-9]+]]=, .Lhas_i64_arg_bitcast_invalid, $pop[[L0]]{{$}}
|
||||
|
|
@ -32,7 +32,7 @@ define void @test_struct_rtn() {
|
|||
|
||||
; CHECK-LABEL: test_invalid_arg:
|
||||
; CHECK: i32.const $push[[L0:[0-9]+]]=, 2{{$}}
|
||||
; CHECK-NEXT: call $push[[L1:[0-9]+]]=, .Lhas_ptr_arg_bitcast_invalid.4, $pop[[L0]]{{$}}
|
||||
; CHECK-NEXT: call $push[[L1:[0-9]+]]=, .Lhas_ptr_arg_bitcast_invalid.2, $pop[[L0]]{{$}}
|
||||
; CHECK-NEXT: drop $pop[[L1]]{{$}}
|
||||
; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 2{{$}}
|
||||
; CHECK-NEXT: call $push[[L1:[0-9]+]]=, has_ptr_arg, $pop[[L0]]{{$}}
|
||||
|
|
@ -54,8 +54,8 @@ entry:
|
|||
; CHECK-NEXT: unreachable
|
||||
; CHECK-NEXT: end_function
|
||||
|
||||
; CHECK-LABEL: .Lhas_i64_arg_bitcast_invalid.2:
|
||||
; CHECK-NEXT: .functype .Lhas_i64_arg_bitcast_invalid.2 (i32) -> (i32)
|
||||
; CHECK-LABEL: .Lhas_i64_arg_bitcast_invalid.1:
|
||||
; CHECK-NEXT: .functype .Lhas_i64_arg_bitcast_invalid.1 (i32) -> (i32)
|
||||
; CHECK-NEXT: unreachable
|
||||
; CHECK-NEXT: end_function
|
||||
|
||||
|
|
@ -64,7 +64,7 @@ entry:
|
|||
; CHECK-NEXT: unreachable
|
||||
; CHECK-NEXT: end_function
|
||||
|
||||
; CHECK-LABEL: .Lhas_ptr_arg_bitcast_invalid.4:
|
||||
; CHECK-NEXT: .functype .Lhas_ptr_arg_bitcast_invalid.4 (i32) -> (i32)
|
||||
; CHECK-LABEL: .Lhas_ptr_arg_bitcast_invalid.2:
|
||||
; CHECK-NEXT: .functype .Lhas_ptr_arg_bitcast_invalid.2 (i32) -> (i32)
|
||||
; CHECK-NEXT: unreachable
|
||||
; CHECK-NEXT: end_function
|
||||
|
|
|
|||
Loading…
Reference in a new issue