@@ -1824,7 +1824,7 @@ bool InstExpander::visitPHI(PHINode& PN) {
18241824bool 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+
20341914bool InstExpander::visitSelect (SelectInst& SI) {
20351915 IGC_ASSERT (nullptr != Emu);
20361916 if (!Emu->isInt64 (&SI))
0 commit comments