Skip to content

Commit 5abb954

Browse files
krystian-andrzejewskisys_zuul
authored and
sys_zuul
committed
[Autobackout][Manual]Revert of change: 3ef192c
Introduction of new entries in IGC constant folder. New types of intrinsics are folded to a constant. They were missing in the previous version of the constant folder. Change-Id: I89a55e21125710b9c52bba293bb4561c78063621
1 parent 0a3eb73 commit 5abb954

File tree

3 files changed

+1
-206
lines changed

3 files changed

+1
-206
lines changed

IGC/Compiler/CustomSafeOptPass.cpp

+1-76
Original file line numberDiff line numberDiff line change
@@ -2841,7 +2841,7 @@ Constant* IGCConstProp::ConstantFoldCallInstruction(CallInst* inst)
28412841
Constant* C = nullptr;
28422842
if (inst)
28432843
{
2844-
Constant* C0 = dyn_cast<Constant>(inst->getOperand(0));
2844+
ConstantFP* C0 = dyn_cast<ConstantFP>(inst->getOperand(0));
28452845
EOPCODE igcop = GetOpCode(inst);
28462846

28472847
switch (igcop)
@@ -2974,81 +2974,6 @@ Constant* IGCConstProp::ConstantFoldCallInstruction(CallInst* inst)
29742974
}
29752975
}
29762976
break;
2977-
case llvm_fbh:
2978-
{
2979-
if (C0)
2980-
{
2981-
C = constantFolder.CreateFirstBitHi(C0);
2982-
}
2983-
}
2984-
break;
2985-
case llvm_fbh_shi:
2986-
{
2987-
if (C0)
2988-
{
2989-
C = constantFolder.CreateFirstBitShi(C0);
2990-
}
2991-
}
2992-
break;
2993-
case llvm_fbl:
2994-
{
2995-
if (C0)
2996-
{
2997-
C = constantFolder.CreateFirstBitLo(C0);
2998-
}
2999-
}
3000-
break;
3001-
case llvm_ubfe:
3002-
{
3003-
Constant* C1 = dyn_cast<Constant>(inst->getOperand(1));
3004-
Constant* C2 = dyn_cast<Constant>(inst->getOperand(2));
3005-
if (C0 && C1 && C2)
3006-
{
3007-
C = constantFolder.CreateUbfe(C0, C1, C2);
3008-
}
3009-
else if (C1 && C1->isZeroValue())
3010-
{
3011-
C = llvm::ConstantInt::get(C2->getType(), 0);
3012-
}
3013-
}
3014-
break;
3015-
case llvm_ibfe:
3016-
{
3017-
Constant* C1 = dyn_cast<Constant>(inst->getOperand(1));
3018-
Constant* C2 = dyn_cast<Constant>(inst->getOperand(2));
3019-
if (C0 && C1 && C2)
3020-
{
3021-
C = constantFolder.CreateIbfe(C0, C1, C2);
3022-
}
3023-
else if (C1 && C1->isZeroValue())
3024-
{
3025-
C = llvm::ConstantInt::get(C2->getType(), 0);
3026-
}
3027-
}
3028-
break;
3029-
case llvm_bfi:
3030-
{
3031-
Constant* C1 = dyn_cast<Constant>(inst->getOperand(1));
3032-
Constant* C2 = dyn_cast<Constant>(inst->getOperand(2));
3033-
Constant* C3 = dyn_cast<Constant>(inst->getOperand(3));
3034-
if (C0 && C1 && C2 && C3)
3035-
{
3036-
C = constantFolder.CreateBfi(C0, C1, C2, C3);
3037-
}
3038-
else if (C1 && C1->isZeroValue() && C3)
3039-
{
3040-
C = C3;
3041-
}
3042-
}
3043-
break;
3044-
case llvm_bfrev:
3045-
{
3046-
if (C0)
3047-
{
3048-
C = constantFolder.CreateBfrev(C0);
3049-
}
3050-
}
3051-
break;
30522977
default:
30532978
break;
30542979
}

IGC/common/IGCConstantFolder.cpp

-123
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2626
#include "common/IGCConstantFolder.h"
2727
#include <cfenv>
2828
#include "Probe/Assertion.h"
29-
#include "Types.hpp"
3029

3130
namespace IGC
3231
{
@@ -185,128 +184,6 @@ llvm::Constant* IGCConstantFolder::CreateCanonicalize(llvm::Constant* C0, bool f
185184
return llvm::ConstantFP::get(C0->getContext(), APF);
186185
}
187186

188-
llvm::Constant* IGCConstantFolder::CreateFirstBitLo(llvm::Constant* C0) const
189-
{
190-
if (llvm::isa<llvm::UndefValue>(C0) || C0->getType()->getIntegerBitWidth() > 32)
191-
{
192-
return nullptr;
193-
}
194-
llvm::ConstantInt* CI0 = llvm::cast<llvm::ConstantInt>(C0);
195-
uint32_t result = CI0->getValue().countTrailingZeros();
196-
return llvm::ConstantInt::get(C0->getType(), result);
197-
}
198-
199-
llvm::Constant* IGCConstantFolder::CreateFirstBitHi(llvm::Constant* C0) const
200-
{
201-
if (llvm::isa<llvm::UndefValue>(C0) || C0->getType()->getIntegerBitWidth() > 32)
202-
{
203-
return nullptr;
204-
}
205-
llvm::ConstantInt* CI0 = llvm::cast<llvm::ConstantInt>(C0);
206-
uint32_t result = CI0->getValue().getActiveBits();
207-
return llvm::ConstantInt::get(C0->getType(), result);
208-
}
209-
210-
llvm::Constant* IGCConstantFolder::CreateFirstBitShi(llvm::Constant* C0) const
211-
{
212-
return CreateFirstBitHi(C0);
213-
}
214-
215-
llvm::Constant* IGCConstantFolder::CreateBfrev(llvm::Constant* C0) const
216-
{
217-
if (llvm::isa<llvm::UndefValue>(C0) || C0->getType()->getIntegerBitWidth() != 32)
218-
{
219-
return nullptr;
220-
}
221-
llvm::ConstantInt* CI0 = llvm::cast<llvm::ConstantInt>(C0);
222-
llvm::APInt result = CI0->getValue();
223-
result.flipAllBits();
224-
return llvm::ConstantInt::get(C0->getContext(), result);
225-
}
226-
227-
llvm::Constant* IGCConstantFolder::CreateUbfe(llvm::Constant* C0, llvm::Constant* C1, llvm::Constant* C2) const
228-
{
229-
if (llvm::isa<llvm::UndefValue>(C0) || llvm::isa<llvm::UndefValue>(C1) || llvm::isa<llvm::UndefValue>(C2) || C2->getType()->getIntegerBitWidth() != 32)
230-
{
231-
return nullptr;
232-
}
233-
llvm::ConstantInt* CI0 = llvm::cast<llvm::ConstantInt>(C0); // width
234-
llvm::ConstantInt* CI1 = llvm::cast<llvm::ConstantInt>(C1); // offset
235-
llvm::ConstantInt* CI2 = llvm::cast<llvm::ConstantInt>(C2); // the number to shift
236-
uint32_t width = int_cast<uint32_t>(CI0->getZExtValue()) & 0x1F;
237-
uint32_t offset = int_cast<uint32_t>(CI1->getZExtValue()) & 0x1F;
238-
uint32_t bitwidth = CI2->getType()->getBitWidth();
239-
if (CI0->isZero())
240-
{
241-
return llvm::ConstantInt::get(C0->getType(), 0);
242-
}
243-
else if((width + offset) < bitwidth)
244-
{
245-
llvm::APInt result = CI2->getValue();
246-
result = result.shl(bitwidth - (width + offset));
247-
result = result.lshr(bitwidth - width);
248-
return llvm::ConstantInt::get(C0->getContext(), result);
249-
}
250-
else
251-
{
252-
llvm::APInt result = CI2->getValue();
253-
result = result.lshr(bitwidth - offset);
254-
return llvm::ConstantInt::get(C0->getContext(), result);
255-
}
256-
}
257-
258-
llvm::Constant* IGCConstantFolder::CreateIbfe(llvm::Constant* C0, llvm::Constant* C1, llvm::Constant* C2) const
259-
{
260-
if (llvm::isa<llvm::UndefValue>(C0) || llvm::isa<llvm::UndefValue>(C1) || llvm::isa<llvm::UndefValue>(C2) || C2->getType()->getIntegerBitWidth() != 32)
261-
{
262-
return nullptr;
263-
}
264-
llvm::ConstantInt* CI0 = llvm::cast<llvm::ConstantInt>(C0); // width
265-
llvm::ConstantInt* CI1 = llvm::cast<llvm::ConstantInt>(C1); // offset
266-
llvm::ConstantInt* CI2 = llvm::cast<llvm::ConstantInt>(C2); // the number to shift
267-
uint32_t width = int_cast<uint32_t>(CI0->getZExtValue()) & 0x1F;
268-
uint32_t offset = int_cast<uint32_t>(CI1->getZExtValue()) & 0x1F;
269-
uint32_t bitwidth = CI2->getType()->getBitWidth();
270-
if (CI0->isZero())
271-
{
272-
return llvm::ConstantInt::get(C0->getType(), 0);
273-
}
274-
else if ((width + offset) < bitwidth)
275-
{
276-
llvm::APInt result = CI2->getValue();
277-
result = result.shl(bitwidth - (width + offset));
278-
result = result.ashr(bitwidth - width);
279-
return llvm::ConstantInt::get(C0->getContext(), result);
280-
}
281-
else
282-
{
283-
llvm::APInt result = CI2->getValue();
284-
result = result.ashr(bitwidth - offset);
285-
return llvm::ConstantInt::get(C0->getContext(), result);
286-
}
287-
}
288-
289-
llvm::Constant* IGCConstantFolder::CreateBfi(llvm::Constant* C0, llvm::Constant* C1, llvm::Constant* C2, llvm::Constant* C3) const
290-
{
291-
if (llvm::isa<llvm::UndefValue>(C0) || llvm::isa<llvm::UndefValue>(C1) || llvm::isa<llvm::UndefValue>(C2) ||
292-
llvm::isa<llvm::UndefValue>(C3) || C2->getType()->getIntegerBitWidth() != 32 || C3->getType()->getIntegerBitWidth() != 32)
293-
{
294-
return nullptr;
295-
}
296-
llvm::ConstantInt* CI0 = llvm::cast<llvm::ConstantInt>(C0); // width
297-
llvm::ConstantInt* CI1 = llvm::cast<llvm::ConstantInt>(C1); // offset
298-
llvm::ConstantInt* CI2 = llvm::cast<llvm::ConstantInt>(C2); // the number the bits are taken from.
299-
llvm::ConstantInt* CI3 = llvm::cast<llvm::ConstantInt>(C3); // the number with bits to be replaced.
300-
uint32_t width = int_cast<uint32_t>(CI0->getZExtValue());
301-
uint32_t offset = int_cast<uint32_t>(CI1->getZExtValue());
302-
uint32_t bitwidth = CI2->getType()->getBitWidth();
303-
llvm::APInt bitmask = llvm::APInt::getBitsSet(bitwidth, offset, offset + width);
304-
llvm::APInt result = CI2->getValue();
305-
result = result.shl(offset);
306-
result = (result & bitmask) | (CI3->getValue() & !bitmask);
307-
return llvm::ConstantInt::get(C0->getContext(), result);
308-
}
309-
310187
llvm::Constant* IGCConstantFolder::CreateGradient(llvm::Constant* C0) const
311188
{
312189
IGC_ASSERT(nullptr != C0);

IGC/common/IGCConstantFolder.h

-7
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,6 @@ class IGCConstantFolder
5454
llvm::Constant* CreateFMul(llvm::Constant* C0, llvm::Constant* C1, llvm::APFloatBase::roundingMode roundingMode) const;
5555
llvm::Constant* CreateFPTrunc(llvm::Constant* C0, llvm::Type* dstType, llvm::APFloatBase::roundingMode roundingMode) const;
5656
llvm::Constant* CreateCanonicalize(llvm::Constant* C0, bool flushDenorms = true) const;
57-
llvm::Constant* CreateFirstBitLo(llvm::Constant* C0) const;
58-
llvm::Constant* CreateFirstBitHi(llvm::Constant* C0) const;
59-
llvm::Constant* CreateFirstBitShi(llvm::Constant* C0) const;
60-
llvm::Constant* CreateBfrev(llvm::Constant* C0) const;
61-
llvm::Constant* CreateUbfe(llvm::Constant* C0, llvm::Constant* C1, llvm::Constant* C2) const;
62-
llvm::Constant* CreateIbfe(llvm::Constant* C0, llvm::Constant* C1, llvm::Constant* C2) const;
63-
llvm::Constant* CreateBfi(llvm::Constant* C0, llvm::Constant* C1, llvm::Constant* C2, llvm::Constant* C3) const;
6457

6558

6659
//===-------------

0 commit comments

Comments
 (0)