mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-26 14:25:18 +00:00
[Hexagon] Fix lowering of formal arguments of type i1
On Hexagon, values of type i1 are passed in registers of type i32, even though i1 is not a legal value for these registers. This is a special case and needs special handling to maintain consistency of the lowering information. This fixes PR32089. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@296645 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ece82f9d23
commit
0d19bb2cca
@ -256,7 +256,9 @@ static bool CC_Hexagon (unsigned ValNo, MVT ValVT, MVT LocVT,
|
||||
return false;
|
||||
}
|
||||
|
||||
if (LocVT == MVT::i1 || LocVT == MVT::i8 || LocVT == MVT::i16) {
|
||||
if (LocVT == MVT::i1) {
|
||||
LocVT = MVT::i32;
|
||||
} else if (LocVT == MVT::i8 || LocVT == MVT::i16) {
|
||||
LocVT = MVT::i32;
|
||||
ValVT = MVT::i32;
|
||||
if (ArgFlags.isSExt())
|
||||
@ -1160,10 +1162,25 @@ SDValue HexagonTargetLowering::LowerFormalArguments(
|
||||
EVT RegVT = VA.getLocVT();
|
||||
if (RegVT == MVT::i8 || RegVT == MVT::i16 ||
|
||||
RegVT == MVT::i32 || RegVT == MVT::f32) {
|
||||
unsigned VReg =
|
||||
unsigned VReg =
|
||||
RegInfo.createVirtualRegister(&Hexagon::IntRegsRegClass);
|
||||
RegInfo.addLiveIn(VA.getLocReg(), VReg);
|
||||
InVals.push_back(DAG.getCopyFromReg(Chain, dl, VReg, RegVT));
|
||||
SDValue Copy = DAG.getCopyFromReg(Chain, dl, VReg, RegVT);
|
||||
// Treat values of type MVT::i1 specially: they are passed in
|
||||
// registers of type i32, but they need to remain as values of
|
||||
// type i1 for consistency of the argument lowering.
|
||||
if (VA.getValVT() == MVT::i1) {
|
||||
// Generate a copy into a predicate register and use the value
|
||||
// of the register as the "InVal".
|
||||
unsigned PReg =
|
||||
RegInfo.createVirtualRegister(&Hexagon::PredRegsRegClass);
|
||||
SDNode *T = DAG.getMachineNode(Hexagon::C2_tfrrp, dl, MVT::i1,
|
||||
Copy.getValue(0));
|
||||
Copy = DAG.getCopyToReg(Copy.getValue(1), dl, PReg, SDValue(T, 0));
|
||||
Copy = DAG.getCopyFromReg(Copy, dl, PReg, MVT::i1);
|
||||
}
|
||||
InVals.push_back(Copy);
|
||||
Chain = Copy.getValue(1);
|
||||
} else if (RegVT == MVT::i64 || RegVT == MVT::f64) {
|
||||
unsigned VReg =
|
||||
RegInfo.createVirtualRegister(&Hexagon::DoubleRegsRegClass);
|
||||
|
6
test/CodeGen/Hexagon/isel-i1arg-crash.ll
Normal file
6
test/CodeGen/Hexagon/isel-i1arg-crash.ll
Normal file
@ -0,0 +1,6 @@
|
||||
; RUN: llc -march=hexagon -debug-only=isel < %s
|
||||
; REQUIRES: asserts
|
||||
|
||||
define void @g(i1 %cond) {
|
||||
ret void
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user