Skip to content

Commit f5b6a7c

Browse files
author
Thorsten Schütt
committed
[GlobalISel] Import extract/insert subvector
Tests are limited to fixed-length vectors. Test: AArch64/GlobalISel/irtranslator-subvector.ll Reference: https://llvm.org/docs/LangRef.html#llvm-vector-extract-intrinsic https://llvm.org/docs/LangRef.html#llvm-vector-insert-intrinsic
1 parent 29d0a84 commit f5b6a7c

File tree

2 files changed

+92
-0
lines changed

2 files changed

+92
-0
lines changed

llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2588,6 +2588,20 @@ bool IRTranslator::translateKnownIntrinsic(const CallInst &CI, Intrinsic::ID ID,
25882588
getOrCreateVReg(*CI.getOperand(0)),
25892589
getOrCreateVReg(*CI.getOperand(1)));
25902590
return true;
2591+
case Intrinsic::vector_extract: {
2592+
ConstantInt *Index = cast<ConstantInt>(CI.getOperand(1));
2593+
MIRBuilder.buildExtractSubvector(getOrCreateVReg(CI),
2594+
getOrCreateVReg(*CI.getOperand(0)),
2595+
Index->getZExtValue());
2596+
return true;
2597+
}
2598+
case Intrinsic::vector_insert: {
2599+
ConstantInt *Index = cast<ConstantInt>(CI.getOperand(2));
2600+
MIRBuilder.buildInsertSubvector(
2601+
getOrCreateVReg(CI), getOrCreateVReg(*CI.getOperand(0)),
2602+
getOrCreateVReg(*CI.getOperand(1)), Index->getZExtValue());
2603+
return true;
2604+
}
25912605
case Intrinsic::prefetch: {
25922606
Value *Addr = CI.getOperand(0);
25932607
unsigned RW = cast<ConstantInt>(CI.getOperand(1))->getZExtValue();
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2+
; RUN: llc -O0 -mtriple=aarch64-linux-gnu -global-isel -stop-after=irtranslator %s -o - | FileCheck %s
3+
4+
define i32 @extract_v4i32_vector_insert_const(<4 x i32> %a, <2 x i32> %b, i32 %c) {
5+
; CHECK-LABEL: name: extract_v4i32_vector_insert_const
6+
; CHECK: bb.1.entry:
7+
; CHECK-NEXT: liveins: $d1, $q0, $w0
8+
; CHECK-NEXT: {{ $}}
9+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0
10+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $d1
11+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $w0
12+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
13+
; CHECK-NEXT: [[INSERT_SUBVECTOR:%[0-9]+]]:_(<4 x s32>) = G_INSERT_SUBVECTOR [[COPY]], [[COPY1]](<2 x s32>), 0
14+
; CHECK-NEXT: [[EVEC:%[0-9]+]]:_(s32) = G_EXTRACT_VECTOR_ELT [[INSERT_SUBVECTOR]](<4 x s32>), [[C]](s64)
15+
; CHECK-NEXT: $w0 = COPY [[EVEC]](s32)
16+
; CHECK-NEXT: RET_ReallyLR implicit $w0
17+
entry:
18+
%vector = call <4 x i32> @llvm.vector.insert.v4i32.v2i32(<4 x i32> %a, <2 x i32> %b, i64 0)
19+
%d = extractelement <4 x i32> %vector, i32 1
20+
ret i32 %d
21+
}
22+
23+
define i32 @extract_v4i32_vector_insert(<4 x i32> %a, <2 x i32> %b, i32 %c) {
24+
; CHECK-LABEL: name: extract_v4i32_vector_insert
25+
; CHECK: bb.1.entry:
26+
; CHECK-NEXT: liveins: $d1, $q0, $w0
27+
; CHECK-NEXT: {{ $}}
28+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0
29+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $d1
30+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $w0
31+
; CHECK-NEXT: [[INSERT_SUBVECTOR:%[0-9]+]]:_(<4 x s32>) = G_INSERT_SUBVECTOR [[COPY]], [[COPY1]](<2 x s32>), 0
32+
; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[COPY2]](s32)
33+
; CHECK-NEXT: [[EVEC:%[0-9]+]]:_(s32) = G_EXTRACT_VECTOR_ELT [[INSERT_SUBVECTOR]](<4 x s32>), [[ZEXT]](s64)
34+
; CHECK-NEXT: $w0 = COPY [[EVEC]](s32)
35+
; CHECK-NEXT: RET_ReallyLR implicit $w0
36+
entry:
37+
%vector = call <4 x i32> @llvm.vector.insert.v4i32.v2i32(<4 x i32> %a, <2 x i32> %b, i64 0)
38+
%d = extractelement <4 x i32> %vector, i32 %c
39+
ret i32 %d
40+
}
41+
42+
define i32 @extract_v4i32_vector_extract(<4 x i32> %a, <2 x i32> %b, i32 %c) {
43+
; CHECK-LABEL: name: extract_v4i32_vector_extract
44+
; CHECK: bb.1.entry:
45+
; CHECK-NEXT: liveins: $d1, $q0, $w0
46+
; CHECK-NEXT: {{ $}}
47+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0
48+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $d1
49+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $w0
50+
; CHECK-NEXT: [[EXTRACT_SUBVECTOR:%[0-9]+]]:_(<4 x s32>) = G_EXTRACT_SUBVECTOR [[COPY]](<4 x s32>), 0
51+
; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[COPY2]](s32)
52+
; CHECK-NEXT: [[EVEC:%[0-9]+]]:_(s32) = G_EXTRACT_VECTOR_ELT [[EXTRACT_SUBVECTOR]](<4 x s32>), [[ZEXT]](s64)
53+
; CHECK-NEXT: $w0 = COPY [[EVEC]](s32)
54+
; CHECK-NEXT: RET_ReallyLR implicit $w0
55+
entry:
56+
%vector = call <4 x i32> @llvm.vector.extract.v2i32.v4i32(<4 x i32> %a, i64 0)
57+
%d = extractelement <4 x i32> %vector, i32 %c
58+
ret i32 %d
59+
}
60+
61+
define i32 @extract_v4i32_vector_extract_const(<4 x i32> %a, <2 x i32> %b, i32 %c) {
62+
; CHECK-LABEL: name: extract_v4i32_vector_extract_const
63+
; CHECK: bb.1.entry:
64+
; CHECK-NEXT: liveins: $d1, $q0, $w0
65+
; CHECK-NEXT: {{ $}}
66+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0
67+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $d1
68+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $w0
69+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
70+
; CHECK-NEXT: [[EXTRACT_SUBVECTOR:%[0-9]+]]:_(<4 x s32>) = G_EXTRACT_SUBVECTOR [[COPY]](<4 x s32>), 0
71+
; CHECK-NEXT: [[EVEC:%[0-9]+]]:_(s32) = G_EXTRACT_VECTOR_ELT [[EXTRACT_SUBVECTOR]](<4 x s32>), [[C]](s64)
72+
; CHECK-NEXT: $w0 = COPY [[EVEC]](s32)
73+
; CHECK-NEXT: RET_ReallyLR implicit $w0
74+
entry:
75+
%vector = call <4 x i32> @llvm.vector.extract.v2i32.v4i32(<4 x i32> %a, i64 0)
76+
%d = extractelement <4 x i32> %vector, i32 0
77+
ret i32 %d
78+
}

0 commit comments

Comments
 (0)