Skip to content

Commit debc325

Browse files
authored
[MIPS] Fix failing to legalize load+call with vector of non-p2 integer (llvm#109625)
Add a condition to check whether the vector element type is a power of 2. Fixes llvm#102870.
1 parent d814006 commit debc325

File tree

2 files changed

+116
-1
lines changed

2 files changed

+116
-1
lines changed

llvm/lib/Target/Mips/MipsISelLowering.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ unsigned MipsTargetLowering::getNumRegistersForCallingConv(LLVMContext &Context,
124124
unsigned MipsTargetLowering::getVectorTypeBreakdownForCallingConv(
125125
LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT,
126126
unsigned &NumIntermediates, MVT &RegisterVT) const {
127-
if (VT.isPow2VectorType()) {
127+
if (VT.isPow2VectorType() && VT.getVectorElementType().isRound()) {
128128
IntermediateVT = getRegisterTypeForCallingConv(Context, CC, VT);
129129
RegisterVT = IntermediateVT.getSimpleVT();
130130
NumIntermediates = getNumRegistersForCallingConv(Context, CC, VT);

llvm/test/CodeGen/Mips/cconv/illegal-vectors.ll

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,121 @@ define void @call_v1i32(ptr %p) nounwind {
7373
ret void
7474
}
7575

76+
define void @arg_v1i80(<1 x i80> %vec, ptr %p) {
77+
; MIPS64-LABEL: arg_v1i80:
78+
; MIPS64: # %bb.0:
79+
; MIPS64-NEXT: sh $5, 8($6)
80+
; MIPS64-NEXT: dsrl $1, $5, 16
81+
; MIPS64-NEXT: dsll $2, $4, 48
82+
; MIPS64-NEXT: or $1, $2, $1
83+
; MIPS64-NEXT: jr $ra
84+
; MIPS64-NEXT: sd $1, 0($6)
85+
;
86+
; MIPS32-LABEL: arg_v1i80:
87+
; MIPS32: # %bb.0:
88+
; MIPS32-NEXT: sll $1, $5, 16
89+
; MIPS32-NEXT: srl $2, $6, 16
90+
; MIPS32-NEXT: sh $6, 8($7)
91+
; MIPS32-NEXT: or $1, $2, $1
92+
; MIPS32-NEXT: sw $1, 4($7)
93+
; MIPS32-NEXT: srl $1, $5, 16
94+
; MIPS32-NEXT: sll $2, $4, 16
95+
; MIPS32-NEXT: or $1, $2, $1
96+
; MIPS32-NEXT: jr $ra
97+
; MIPS32-NEXT: sw $1, 0($7)
98+
store <1 x i80> %vec, ptr %p
99+
ret void
100+
}
101+
102+
define <1 x i80> @ret_v1i80(ptr %p) {
103+
; MIPS64-LABEL: ret_v1i80:
104+
; MIPS64: # %bb.0:
105+
; MIPS64-NEXT: lhu $1, 8($4)
106+
; MIPS64-NEXT: ld $2, 0($4)
107+
; MIPS64-NEXT: dsll $3, $2, 16
108+
; MIPS64-NEXT: or $3, $1, $3
109+
; MIPS64-NEXT: jr $ra
110+
; MIPS64-NEXT: dsrl $2, $2, 48
111+
;
112+
; MIPS32-LABEL: ret_v1i80:
113+
; MIPS32: # %bb.0:
114+
; MIPS32-NEXT: lw $1, 4($4)
115+
; MIPS32-NEXT: srl $2, $1, 16
116+
; MIPS32-NEXT: lw $5, 0($4)
117+
; MIPS32-NEXT: sll $3, $5, 16
118+
; MIPS32-NEXT: or $3, $3, $2
119+
; MIPS32-NEXT: lhu $2, 8($4)
120+
; MIPS32-NEXT: sll $1, $1, 16
121+
; MIPS32-NEXT: or $4, $2, $1
122+
; MIPS32-NEXT: jr $ra
123+
; MIPS32-NEXT: srl $2, $5, 16
124+
%v = load <1 x i80>, ptr %p
125+
ret <1 x i80> %v
126+
}
127+
128+
define void @call_v1i80(ptr %p) nounwind {
129+
; MIPS64-LABEL: call_v1i80:
130+
; MIPS64: # %bb.0:
131+
; MIPS64-NEXT: daddiu $sp, $sp, -16
132+
; MIPS64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill
133+
; MIPS64-NEXT: sd $16, 0($sp) # 8-byte Folded Spill
134+
; MIPS64-NEXT: move $16, $4
135+
; MIPS64-NEXT: lhu $1, 8($4)
136+
; MIPS64-NEXT: ld $2, 0($4)
137+
; MIPS64-NEXT: dsll $3, $2, 16
138+
; MIPS64-NEXT: or $5, $1, $3
139+
; MIPS64-NEXT: jal arg_v1i80
140+
; MIPS64-NEXT: dsrl $4, $2, 48
141+
; MIPS64-NEXT: jal ret_v1i80
142+
; MIPS64-NEXT: nop
143+
; MIPS64-NEXT: sh $3, 8($16)
144+
; MIPS64-NEXT: dsrl $1, $3, 16
145+
; MIPS64-NEXT: dsll $2, $2, 48
146+
; MIPS64-NEXT: or $1, $2, $1
147+
; MIPS64-NEXT: sd $1, 0($16)
148+
; MIPS64-NEXT: ld $16, 0($sp) # 8-byte Folded Reload
149+
; MIPS64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload
150+
; MIPS64-NEXT: jr $ra
151+
; MIPS64-NEXT: daddiu $sp, $sp, 16
152+
;
153+
; MIPS32-LABEL: call_v1i80:
154+
; MIPS32: # %bb.0:
155+
; MIPS32-NEXT: addiu $sp, $sp, -24
156+
; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
157+
; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
158+
; MIPS32-NEXT: move $16, $4
159+
; MIPS32-NEXT: lw $1, 4($4)
160+
; MIPS32-NEXT: srl $2, $1, 16
161+
; MIPS32-NEXT: lw $3, 0($4)
162+
; MIPS32-NEXT: sll $4, $3, 16
163+
; MIPS32-NEXT: or $5, $4, $2
164+
; MIPS32-NEXT: lhu $2, 8($16)
165+
; MIPS32-NEXT: sll $1, $1, 16
166+
; MIPS32-NEXT: or $6, $2, $1
167+
; MIPS32-NEXT: jal arg_v1i80
168+
; MIPS32-NEXT: srl $4, $3, 16
169+
; MIPS32-NEXT: jal ret_v1i80
170+
; MIPS32-NEXT: nop
171+
; MIPS32-NEXT: sh $4, 8($16)
172+
; MIPS32-NEXT: sll $1, $3, 16
173+
; MIPS32-NEXT: srl $4, $4, 16
174+
; MIPS32-NEXT: or $1, $4, $1
175+
; MIPS32-NEXT: sw $1, 4($16)
176+
; MIPS32-NEXT: srl $1, $3, 16
177+
; MIPS32-NEXT: sll $2, $2, 16
178+
; MIPS32-NEXT: or $1, $2, $1
179+
; MIPS32-NEXT: sw $1, 0($16)
180+
; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
181+
; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
182+
; MIPS32-NEXT: jr $ra
183+
; MIPS32-NEXT: addiu $sp, $sp, 24
184+
%v1 = load <1 x i80>, ptr %p
185+
call void @arg_v1i80(<1 x i80> %v1)
186+
%v2 = call <1 x i80> @ret_v1i80()
187+
store <1 x i80> %v2, ptr %p
188+
ret void
189+
}
190+
76191
define void @arg_v2i32(<2 x i32> %vec, ptr %p) {
77192
; MIPS64-LABEL: arg_v2i32:
78193
; MIPS64: # %bb.0:

0 commit comments

Comments
 (0)