Skip to content

Commit 970fee4

Browse files
author
Volkan Keles
committedMar 10, 2017
GlobalISel: Translate ConstantAggregateZero vectors
Reviewers: qcolombet, aditya_nandakumar, dsanders, ab, t.p.northover, javed.absar Reviewed By: qcolombet Subscribers: dberris, rovka, llvm-commits, kristof.beyls Differential Revision: https://reviews.llvm.org/D30259 llvm-svn: 297509
1 parent 62d5474 commit 970fee4

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed
 

‎llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp

+10-1
Original file line numberDiff line numberDiff line change
@@ -1067,7 +1067,16 @@ bool IRTranslator::translate(const Constant &C, unsigned Reg) {
10671067
EntryBuilder.buildConstant(Reg, 0);
10681068
else if (auto GV = dyn_cast<GlobalValue>(&C))
10691069
EntryBuilder.buildGlobalValue(Reg, GV);
1070-
else if (auto CE = dyn_cast<ConstantExpr>(&C)) {
1070+
else if (auto CAZ = dyn_cast<ConstantAggregateZero>(&C)) {
1071+
if (!CAZ->getType()->isVectorTy())
1072+
return false;
1073+
std::vector<unsigned> Ops;
1074+
for (unsigned i = 0; i < CAZ->getNumElements(); ++i) {
1075+
Constant &Elt = *CAZ->getElementValue(i);
1076+
Ops.push_back(getOrCreateVReg(Elt));
1077+
}
1078+
EntryBuilder.buildMerge(Reg, Ops);
1079+
} else if (auto CE = dyn_cast<ConstantExpr>(&C)) {
10711080
switch(CE->getOpcode()) {
10721081
#define HANDLE_INST(NUM, OPCODE, CLASS) \
10731082
case Instruction::OPCODE: return translate##OPCODE(*CE, EntryBuilder);

‎llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll

+25
Original file line numberDiff line numberDiff line change
@@ -1303,3 +1303,28 @@ define i32 @test_singleelementvector(i32 %elt){
13031303
%res = extractelement <1 x i32> %vec, i32 0
13041304
ret i32 %res
13051305
}
1306+
1307+
define <2 x i32> @test_constantaggzerovector_v2i32() {
1308+
; CHECK-LABEL: name: test_constantaggzerovector_v2i32
1309+
; CHECK: [[ZERO:%[0-9]+]](s32) = G_CONSTANT i32 0
1310+
; CHECK: [[VEC:%[0-9]+]](<2 x s32>) = G_MERGE_VALUES [[ZERO]](s32), [[ZERO]](s32)
1311+
; CHECK: %d0 = COPY [[VEC]](<2 x s32>)
1312+
ret <2 x i32> zeroinitializer
1313+
}
1314+
1315+
define <2 x float> @test_constantaggzerovector_v2f32() {
1316+
; CHECK-LABEL: name: test_constantaggzerovector_v2f32
1317+
; CHECK: [[ZERO:%[0-9]+]](s32) = G_FCONSTANT float 0.000000e+00
1318+
; CHECK: [[VEC:%[0-9]+]](<2 x s32>) = G_MERGE_VALUES [[ZERO]](s32), [[ZERO]](s32)
1319+
; CHECK: %d0 = COPY [[VEC]](<2 x s32>)
1320+
ret <2 x float> zeroinitializer
1321+
}
1322+
1323+
define i32 @test_constantaggzerovector_v3i32() {
1324+
; CHECK-LABEL: name: test_constantaggzerovector_v3i32
1325+
; CHECK: [[ZERO:%[0-9]+]](s32) = G_CONSTANT i32 0
1326+
; CHECK: [[VEC:%[0-9]+]](<3 x s32>) = G_MERGE_VALUES [[ZERO]](s32), [[ZERO]](s32), [[ZERO]](s32)
1327+
; CHECK: G_EXTRACT_VECTOR_ELT [[VEC]](<3 x s32>)
1328+
%elt = extractelement <3 x i32> zeroinitializer, i32 1
1329+
ret i32 %elt
1330+
}

0 commit comments

Comments
 (0)
Please sign in to comment.