Skip to content

Commit b5491c5

Browse files
jgu222igcbot
authored andcommitted
All calls can be emulated with the same code. No need to
check call type and do emulation based on each call type.
1 parent c92bdc8 commit b5491c5

File tree

1 file changed

+23
-143
lines changed

1 file changed

+23
-143
lines changed

IGC/Compiler/CISACodeGen/Emu64OpsPass.cpp

Lines changed: 23 additions & 143 deletions
Original file line numberDiff line numberDiff line change
@@ -1824,7 +1824,7 @@ bool InstExpander::visitPHI(PHINode& PN) {
18241824
bool InstExpander::visitCall(CallInst& Call) {
18251825

18261826
// lambdas for splitting and combining i64 to <2 x i32>
1827-
auto Combine2xi32Toi64 = [this](Value* val)->Value *
1827+
auto Combine2xi32Toi64 = [this](Value* val)->Value*
18281828
{
18291829
IGC_ASSERT(nullptr != Emu);
18301830
IGC_ASSERT(Emu->isInt64(val));
@@ -1881,156 +1881,36 @@ bool InstExpander::visitCall(CallInst& Call) {
18811881
}
18821882

18831883
// Recreate Call with its operands/result emulated
1884-
if (auto * GI = dyn_cast<GenIntrinsicInst>(&Call))
1884+
auto* CallCopy = Call.clone();
1885+
IGC_ASSERT(nullptr != CallCopy);
1886+
CallCopy->insertBefore(&Call);
1887+
1888+
// All int64 operands shall be recreated right before CallCopy
1889+
IRB->SetInsertPoint(CallCopy);
1890+
unsigned argNo = 0;
1891+
for (auto& Op : Call.operands())
18851892
{
1886-
switch (GI->getIntrinsicID())
1893+
if (Emu->isInt64(Op.get()))
18871894
{
1888-
case GenISAIntrinsic::GenISA_getMessagePhaseV:
1889-
case GenISAIntrinsic::GenISA_simdGetMessagePhaseV:
1890-
case GenISAIntrinsic::GenISA_getMessagePhaseX:
1891-
case GenISAIntrinsic::GenISA_getMessagePhaseXV:
1892-
case GenISAIntrinsic::GenISA_getMessagePhase:
1893-
case GenISAIntrinsic::GenISA_broadcastMessagePhase:
1894-
case GenISAIntrinsic::GenISA_broadcastMessagePhaseV:
1895-
case GenISAIntrinsic::GenISA_simdGetMessagePhase:
1896-
case GenISAIntrinsic::GenISA_RuntimeValue:
1897-
case GenISAIntrinsic::GenISA_simdBlockRead:
1898-
case GenISAIntrinsic::GenISA_simdMediaBlockRead:
1899-
{
1900-
auto* GenCopy = Call.clone();
1901-
GenCopy->insertBefore(&Call);
1902-
IRB->SetInsertPoint(&Call);
1903-
Value* Lo = nullptr, * Hi = nullptr;
1904-
Spliti64To2xi32(GenCopy, Lo, Hi);
1905-
Call.replaceAllUsesWith(GenCopy);
1906-
Emu->setExpandedValues(GenCopy, Lo, Hi);
1907-
return true;
1908-
}
1909-
case GenISAIntrinsic::GenISA_intatomicraw:
1910-
case GenISAIntrinsic::GenISA_icmpxchgatomicraw:
1911-
case GenISAIntrinsic::GenISA_intatomicrawA64:
1912-
case GenISAIntrinsic::GenISA_icmpxchgatomicrawA64:
1913-
{
1914-
auto* GenCopy = Call.clone();
1915-
GenCopy->insertBefore(&Call);
1916-
IRB->SetInsertPoint(GenCopy);
1917-
1918-
uint opNum = 0;
1919-
for (auto& Op : Call.operands())
1920-
{
1921-
if (Emu->isInt64(Op.get()))
1922-
{
1923-
Value* NewVal = Combine2xi32Toi64(Op.get());
1924-
GenCopy->setOperand(opNum, NewVal);
1925-
}
1926-
opNum++;
1927-
}
1928-
IRB->SetInsertPoint(&Call);
1929-
Value* Lo = nullptr, * Hi = nullptr;
1930-
Spliti64To2xi32(GenCopy, Lo, Hi);
1931-
Call.replaceAllUsesWith(GenCopy);
1932-
Emu->setExpandedValues(GenCopy, Lo, Hi);
1933-
return true;
1934-
}
1935-
case GenISAIntrinsic::GenISA_simdSetMessagePhaseV:
1936-
case GenISAIntrinsic::GenISA_setMessagePhaseX:
1937-
case GenISAIntrinsic::GenISA_setMessagePhaseXV:
1938-
case GenISAIntrinsic::GenISA_setMessagePhase:
1939-
case GenISAIntrinsic::GenISA_setMessagePhaseV:
1940-
case GenISAIntrinsic::GenISA_simdSetMessagePhase:
1941-
case GenISAIntrinsic::GenISA_setMessagePhaseX_legacy:
1942-
case GenISAIntrinsic::GenISA_itof_rtn:
1943-
case GenISAIntrinsic::GenISA_itof_rtp:
1944-
case GenISAIntrinsic::GenISA_itof_rtz:
1945-
case GenISAIntrinsic::GenISA_uitof_rtn:
1946-
case GenISAIntrinsic::GenISA_uitof_rtp:
1947-
case GenISAIntrinsic::GenISA_uitof_rtz:
1948-
case GenISAIntrinsic::GenISA_simdBlockWrite:
1949-
case GenISAIntrinsic::GenISA_simdMediaBlockWrite:
1950-
{
1951-
auto* GenCopy = Call.clone();
1952-
IGC_ASSERT(nullptr != GenCopy);
1953-
GenCopy->insertBefore(&Call);
1954-
IRB->SetInsertPoint(GenCopy);
1955-
uint opNum = 0;
1956-
for (auto& Op : Call.operands())
1957-
{
1958-
if (Emu->isInt64(Op.get()))
1959-
{
1960-
Value* NewVal = Combine2xi32Toi64(Op.get());
1961-
GenCopy->setOperand(opNum, NewVal);
1962-
}
1963-
opNum++;
1964-
}
1965-
Call.replaceAllUsesWith(GenCopy);
1966-
return true;
1967-
}
1968-
case GenISAIntrinsic::GenISA_WaveAll:
1969-
case GenISAIntrinsic::GenISA_WavePrefix:
1970-
{
1971-
auto* GenCopy = Call.clone();
1972-
IGC_ASSERT(nullptr != GenCopy);
1973-
GenCopy->insertBefore(&Call);
1974-
IRB->SetInsertPoint(GenCopy);
1975-
1976-
// bitcast arg from 2xi32 to i64
1977-
Value* NewVal = Combine2xi32Toi64(Call.getArgOperand(0));
1978-
GenCopy->setOperand(0, NewVal);
1979-
1980-
// bitcast output from i64 to 2xi32
1981-
IRB->SetInsertPoint(&Call);
1982-
Value* OutputLo = nullptr, * OutputHi = nullptr;
1983-
Spliti64To2xi32(GenCopy, OutputLo, OutputHi);
1984-
Call.replaceAllUsesWith(GenCopy);
1985-
Emu->setExpandedValues(GenCopy, OutputLo, OutputHi);
1986-
return true;
1987-
}
1988-
default:
1989-
break;
1895+
Value* NewVal = Combine2xi32Toi64(Op.get());
1896+
CallCopy->setOperand(argNo, NewVal);
19901897
}
1898+
argNo++;
19911899
}
1992-
// Support for stack/indirect/subroutine calls
1993-
// Note: should use enableFunctionCall() without using attr checking.
1994-
// else if ( !F || F->hasFnAttribute("visaStackCall") || F->hasFnAttribute("UserSubroutine")
1995-
// || Emu->CGC->enableFunctionCall())
1996-
//
1997-
// 11/2020: No need to have condition check. It should work for all cases ("if branch" is redundant)
1998-
else
1999-
{
2000-
auto* CallCopy = Call.clone();
2001-
IGC_ASSERT(nullptr != CallCopy);
2002-
CallCopy->insertBefore(&Call);
2003-
2004-
// All int64 operands shall be recreated right before CallCopy
2005-
IRB->SetInsertPoint(CallCopy);
2006-
unsigned argNo = 0;
2007-
for (auto& Op : Call.operands())
2008-
{
2009-
if (Emu->isInt64(Op.get()))
2010-
{
2011-
Value* NewVal = Combine2xi32Toi64(Op.get());
2012-
CallCopy->setOperand(argNo, NewVal);
2013-
}
2014-
argNo++;
2015-
}
20161900

2017-
// For int64 return value, split it right after CallCopy
2018-
if (Emu->isInt64(&Call))
2019-
{
2020-
IRB->SetInsertPoint(&Call);
2021-
Value* OutputLo = nullptr, * OutputHi = nullptr;
2022-
Spliti64To2xi32(CallCopy, OutputLo, OutputHi);
2023-
Emu->setExpandedValues(CallCopy, OutputLo, OutputHi);
2024-
}
2025-
Call.replaceAllUsesWith(CallCopy);
2026-
return true;
1901+
// For int64 return value, split it right after CallCopy
1902+
if (Emu->isInt64(&Call))
1903+
{
1904+
IRB->SetInsertPoint(&Call);
1905+
Value* OutputLo = nullptr, * OutputHi = nullptr;
1906+
Spliti64To2xi32(CallCopy, OutputLo, OutputHi);
1907+
Emu->setExpandedValues(CallCopy, OutputLo, OutputHi);
20271908
}
2028-
2029-
// TODO: Add i64 emulation support.
2030-
llvm_unreachable("TODO: NOT IMPLEMENTED YET!");
2031-
return false;
1909+
Call.replaceAllUsesWith(CallCopy);
1910+
return true;
20321911
}
20331912

1913+
20341914
bool InstExpander::visitSelect(SelectInst& SI) {
20351915
IGC_ASSERT(nullptr != Emu);
20361916
if (!Emu->isInt64(&SI))

0 commit comments

Comments
 (0)