Skip to content

Commit d591aa1

Browse files
krystian-andrzejewskiigcbot
authored andcommitted
Introduction of new entry in IGC constant folder for bfi.
1 parent c4253c7 commit d591aa1

File tree

3 files changed

+38
-0
lines changed

3 files changed

+38
-0
lines changed

IGC/Compiler/CustomSafeOptPass.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,8 +440,10 @@ void CustomSafeOptPass::visitCallInst(CallInst& C)
440440
}
441441

442442
case GenISAIntrinsic::GenISA_bfi:
443+
{
443444
visitBfi(inst);
444445
break;
446+
}
445447

446448
case GenISAIntrinsic::GenISA_f32tof16_rtz:
447449
{
@@ -3077,6 +3079,21 @@ Constant* IGCConstProp::ConstantFoldCallInstruction(CallInst* inst)
30773079
}
30783080
}
30793081
break;
3082+
case llvm_bfi:
3083+
{
3084+
Constant* C1 = dyn_cast<Constant>(inst->getOperand(1));
3085+
Constant* C2 = dyn_cast<Constant>(inst->getOperand(2));
3086+
Constant* C3 = dyn_cast<Constant>(inst->getOperand(3));
3087+
if (C0 && C0->isZeroValue() && C3)
3088+
{
3089+
C = C3;
3090+
}
3091+
else if (C0 && C1 && C2 && C3)
3092+
{
3093+
C = constantFolder.CreateBfi(C0, C1, C2, C3);
3094+
}
3095+
}
3096+
break;
30803097
default:
30813098
break;
30823099
}

IGC/common/IGCConstantFolder.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,4 +315,24 @@ llvm::Constant* IGCConstantFolder::CreateFirstBitLo(llvm::Constant* C0) const
315315
return llvm::ConstantInt::get(C0->getType(), fbl);
316316
}
317317

318+
llvm::Constant* IGCConstantFolder::CreateBfi(llvm::Constant* C0, llvm::Constant* C1, llvm::Constant* C2, llvm::Constant* C3) const
319+
{
320+
if (llvm::isa<llvm::UndefValue>(C0) || llvm::isa<llvm::UndefValue>(C1) || llvm::isa<llvm::UndefValue>(C2))
321+
{
322+
return nullptr;
323+
}
324+
llvm::ConstantInt* CI0 = llvm::cast<llvm::ConstantInt>(C0); // width
325+
llvm::ConstantInt* CI1 = llvm::cast<llvm::ConstantInt>(C1); // offset
326+
llvm::ConstantInt* CI2 = llvm::cast<llvm::ConstantInt>(C2); // the number the bits are taken from.
327+
llvm::ConstantInt* CI3 = llvm::cast<llvm::ConstantInt>(C3); // the number with bits to be replaced.
328+
uint32_t width = int_cast<uint32_t>(CI0->getZExtValue());
329+
uint32_t offset = int_cast<uint32_t>(CI1->getZExtValue());
330+
uint32_t bitwidth = CI2->getType()->getBitWidth();
331+
llvm::APInt bitmask = llvm::APInt::getBitsSet(bitwidth, offset, offset + width);
332+
llvm::APInt result = CI2->getValue();
333+
result = result.shl(offset);
334+
result = (result & bitmask) | (CI3->getValue() & ~bitmask);
335+
return llvm::ConstantInt::get(C0->getContext(), result);
336+
}
337+
318338
} // namespace IGC

IGC/common/IGCConstantFolder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ class IGCConstantFolder
5959
llvm::Constant* CreateFirstBitHi(llvm::Constant* C0) const;
6060
llvm::Constant* CreateFirstBitShi(llvm::Constant* C0) const;
6161
llvm::Constant* CreateFirstBitLo(llvm::Constant* C0) const;
62+
llvm::Constant* CreateBfi(llvm::Constant* C0, llvm::Constant* C1, llvm::Constant* C2, llvm::Constant* C3) const;
6263

6364

6465
//===-------------

0 commit comments

Comments
 (0)