Skip to content

Commit

Permalink
[LibCallsShrinkWrap][NFC] Reuse createCond and createOrCond
Browse files Browse the repository at this point in the history
Add two new functions `createCond` and `createOrCond` that accept extra
arguments Arg and Arg/Arg2 respectively.

Reviewed By: efriedma

Differential Revision: https://reviews.llvm.org/D153253
  • Loading branch information
tclin914 committed Jun 27, 2023
1 parent 628b004 commit f6cb9b8
Showing 1 changed file with 22 additions and 21 deletions.
43 changes: 22 additions & 21 deletions llvm/lib/Transforms/Utils/LibCallsShrinkWrap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,14 +79,21 @@ class LibCallsShrinkWrap : public InstVisitor<LibCallsShrinkWrap> {
Value *generateTwoRangeCond(CallInst *CI, const LibFunc &Func);
Value *generateCondForPow(CallInst *CI, const LibFunc &Func);

// Create an OR of two conditions with given Arg and Arg2.
Value *createOrCond(CallInst *CI, Value *Arg, CmpInst::Predicate Cmp,
float Val, Value *Arg2, CmpInst::Predicate Cmp2,
float Val2) {
IRBuilder<> BBBuilder(CI);
auto Cond2 = createCond(BBBuilder, Arg2, Cmp2, Val2);
auto Cond1 = createCond(BBBuilder, Arg, Cmp, Val);
return BBBuilder.CreateOr(Cond1, Cond2);
}

// Create an OR of two conditions.
Value *createOrCond(CallInst *CI, CmpInst::Predicate Cmp, float Val,
CmpInst::Predicate Cmp2, float Val2) {
IRBuilder<> BBBuilder(CI);
Value *Arg = CI->getArgOperand(0);
auto Cond2 = createCond(BBBuilder, Arg, Cmp2, Val2);
auto Cond1 = createCond(BBBuilder, Arg, Cmp, Val);
return BBBuilder.CreateOr(Cond1, Cond2);
return createOrCond(CI, Arg, Cmp, Val, Arg, Cmp2, Val2);
}

// Create a single condition using IRBuilder.
Expand All @@ -98,11 +105,17 @@ class LibCallsShrinkWrap : public InstVisitor<LibCallsShrinkWrap> {
return BBBuilder.CreateFCmp(Cmp, Arg, V);
}

// Create a single condition with given Arg.
Value *createCond(CallInst *CI, Value *Arg, CmpInst::Predicate Cmp,
float Val) {
IRBuilder<> BBBuilder(CI);
return createCond(BBBuilder, Arg, Cmp, Val);
}

// Create a single condition.
Value *createCond(CallInst *CI, CmpInst::Predicate Cmp, float Val) {
IRBuilder<> BBBuilder(CI);
Value *Arg = CI->getArgOperand(0);
return createCond(BBBuilder, Arg, Cmp, Val);
return createCond(CI, Arg, Cmp, Val);
}

const TargetLibraryInfo &TLI;
Expand Down Expand Up @@ -406,7 +419,6 @@ Value *LibCallsShrinkWrap::generateCondForPow(CallInst *CI,

Value *Base = CI->getArgOperand(0);
Value *Exp = CI->getArgOperand(1);
IRBuilder<> BBBuilder(CI);

// Constant Base case.
if (ConstantFP *CF = dyn_cast<ConstantFP>(Base)) {
Expand All @@ -417,10 +429,7 @@ Value *LibCallsShrinkWrap::generateCondForPow(CallInst *CI,
}

++NumWrappedOneCond;
Constant *V = ConstantFP::get(CI->getContext(), APFloat(127.0f));
if (!Exp->getType()->isFloatTy())
V = ConstantExpr::getFPExtend(V, Exp->getType());
return BBBuilder.CreateFCmp(CmpInst::FCMP_OGT, Exp, V);
return createCond(CI, Exp, CmpInst::FCMP_OGT, 127.0f);
}

// If the Base value coming from an integer type.
Expand All @@ -445,16 +454,8 @@ Value *LibCallsShrinkWrap::generateCondForPow(CallInst *CI,
}

++NumWrappedTwoCond;
Constant *V = ConstantFP::get(CI->getContext(), APFloat(UpperV));
Constant *V0 = ConstantFP::get(CI->getContext(), APFloat(0.0f));
if (!Exp->getType()->isFloatTy())
V = ConstantExpr::getFPExtend(V, Exp->getType());
if (!Base->getType()->isFloatTy())
V0 = ConstantExpr::getFPExtend(V0, Exp->getType());

Value *Cond = BBBuilder.CreateFCmp(CmpInst::FCMP_OGT, Exp, V);
Value *Cond0 = BBBuilder.CreateFCmp(CmpInst::FCMP_OLE, Base, V0);
return BBBuilder.CreateOr(Cond0, Cond);
return createOrCond(CI, Base, CmpInst::FCMP_OLE, 0.0f, Exp,
CmpInst::FCMP_OGT, UpperV);
}
LLVM_DEBUG(dbgs() << "Not handled pow(): base not from integer convert\n");
return nullptr;
Expand Down

0 comments on commit f6cb9b8

Please sign in to comment.