diff options
author | Tim Northover <tnorthover@apple.com> | 2016-08-19 18:09:41 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2016-08-19 18:09:41 +0000 |
commit | 2fa5fa391fc6aea8215f7ccf72e75eca05a6e79f (patch) | |
tree | 375a2dd01e404454a569d537025a778e217644fe | |
parent | 3d9946eb239dc27d6c784418e404dc8ab82789d2 (diff) | |
download | bcm5719-llvm-2fa5fa391fc6aea8215f7ccf72e75eca05a6e79f.tar.gz bcm5719-llvm-2fa5fa391fc6aea8215f7ccf72e75eca05a6e79f.zip |
GlobalISel: allow extractvalue to extract an aggregate.
llvm-svn: 279287
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 2 | ||||
-rw-r--r-- | llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll | 11 |
2 files changed, 12 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index ed0ce8d848b..8703915f919 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -197,7 +197,7 @@ bool IRTranslator::translateExtractValue(const User &U) { uint64_t Offset = 8 * DL->getIndexedOffsetInType(Src->getType(), Indices); unsigned Res = getOrCreateVReg(EVI); - MIRBuilder.buildExtract(LLT{*EVI.getType()}, Res, getOrCreateVReg(*Src), + MIRBuilder.buildExtract(LLT{*EVI.getType(), DL}, Res, getOrCreateVReg(*Src), Offset); return true; diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll index ea0178271e3..a336df92af3 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll +++ b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll @@ -693,3 +693,14 @@ define i32 @test_extractvalue(%struct.nested* %addr) { %res = extractvalue %struct.nested %struct, 1, 1 ret i32 %res } + +; CHECK-LABEL: name: test_extractvalue_agg +; CHECK: [[STRUCT:%[0-9]+]](128) = G_LOAD { s128, p0 } +; CHECK: [[RES:%[0-9]+]](64) = G_EXTRACT s64 [[STRUCT]], 32 +; CHECK: G_STORE { s64, p0 } [[RES]] +define void @test_extractvalue_agg(%struct.nested* %addr, {i8, i32}* %addr2) { + %struct = load %struct.nested, %struct.nested* %addr + %res = extractvalue %struct.nested %struct, 1 + store {i8, i32} %res, {i8, i32}* %addr2 + ret void +} |