[GlobalISel][IRTranslator] Fix a bug in handling repeating struct types during argument lowering.
Differential Revision: https://reviews.llvm.org/D49442 llvm-svn: 339674
This commit is contained in:
parent
0ef813fa83
commit
30e61404a8
|
@ -232,6 +232,7 @@ private:
|
||||||
|
|
||||||
/// Returns true if the value should be split into multiple LLTs.
|
/// Returns true if the value should be split into multiple LLTs.
|
||||||
/// If \p Offsets is given then the split type's offsets will be stored in it.
|
/// If \p Offsets is given then the split type's offsets will be stored in it.
|
||||||
|
/// If \p Offsets is not empty it will be cleared first.
|
||||||
bool valueIsSplit(const Value &V,
|
bool valueIsSplit(const Value &V,
|
||||||
SmallVectorImpl<uint64_t> *Offsets = nullptr);
|
SmallVectorImpl<uint64_t> *Offsets = nullptr);
|
||||||
|
|
||||||
|
|
|
@ -1457,6 +1457,8 @@ void IRTranslator::finishPendingPhis() {
|
||||||
bool IRTranslator::valueIsSplit(const Value &V,
|
bool IRTranslator::valueIsSplit(const Value &V,
|
||||||
SmallVectorImpl<uint64_t> *Offsets) {
|
SmallVectorImpl<uint64_t> *Offsets) {
|
||||||
SmallVector<LLT, 4> SplitTys;
|
SmallVector<LLT, 4> SplitTys;
|
||||||
|
if (Offsets && !Offsets->empty())
|
||||||
|
Offsets->clear();
|
||||||
computeValueLLTs(*DL, *V.getType(), SplitTys, Offsets);
|
computeValueLLTs(*DL, *V.getType(), SplitTys, Offsets);
|
||||||
return SplitTys.size() > 1;
|
return SplitTys.size() > 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
; RUN: llc -O0 -o - -verify-machineinstrs %s | FileCheck %s
|
||||||
|
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
|
||||||
|
target triple = "aarch64-unknown-linux-gnu"
|
||||||
|
|
||||||
|
; Check we don't crash due to encountering the same struct param type twice.
|
||||||
|
; CHECK-LABEL: param_two_struct
|
||||||
|
; CHECK: add
|
||||||
|
; CHECK: ret
|
||||||
|
define i64 @param_two_struct([2 x i64] %t.coerce, [2 x i64] %s.coerce) {
|
||||||
|
entry:
|
||||||
|
%t.coerce.fca.0.extract = extractvalue [2 x i64] %t.coerce, 0
|
||||||
|
%s.coerce.fca.1.extract = extractvalue [2 x i64] %s.coerce, 1
|
||||||
|
%add = add nsw i64 %s.coerce.fca.1.extract, %t.coerce.fca.0.extract
|
||||||
|
ret i64 %add
|
||||||
|
}
|
Loading…
Reference in New Issue