@@ -1824,7 +1824,7 @@ bool InstExpander::visitPHI(PHINode& PN) {
1824
1824
bool InstExpander::visitCall (CallInst& Call) {
1825
1825
1826
1826
// lambdas for splitting and combining i64 to <2 x i32>
1827
- auto Combine2xi32Toi64 = [this ](Value* val)->Value *
1827
+ auto Combine2xi32Toi64 = [this ](Value* val)->Value *
1828
1828
{
1829
1829
IGC_ASSERT (nullptr != Emu);
1830
1830
IGC_ASSERT (Emu->isInt64 (val));
@@ -1881,156 +1881,36 @@ bool InstExpander::visitCall(CallInst& Call) {
1881
1881
}
1882
1882
1883
1883
// 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 ())
1885
1892
{
1886
- switch (GI-> getIntrinsicID ( ))
1893
+ if (Emu-> isInt64 (Op. get () ))
1887
1894
{
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);
1990
1897
}
1898
+ argNo++;
1991
1899
}
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
- }
2016
1900
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);
2027
1908
}
2028
-
2029
- // TODO: Add i64 emulation support.
2030
- llvm_unreachable (" TODO: NOT IMPLEMENTED YET!" );
2031
- return false ;
1909
+ Call.replaceAllUsesWith (CallCopy);
1910
+ return true ;
2032
1911
}
2033
1912
1913
+
2034
1914
bool InstExpander::visitSelect (SelectInst& SI) {
2035
1915
IGC_ASSERT (nullptr != Emu);
2036
1916
if (!Emu->isInt64 (&SI))
0 commit comments