summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmara Emerson <aemerson@apple.com>2019-03-08 22:17:00 +0000
committerAmara Emerson <aemerson@apple.com>2019-03-08 22:17:00 +0000
commit7a05d1c1f116db31b2507bf5a51c5f927fb83a88 (patch)
treeb55278af9800458cb28a6f2162e49bcf63c8acd9
parent680e865c313a80b6ec329abde61e1f0c66bdc103 (diff)
downloadbcm5719-llvm-7a05d1c1f116db31b2507bf5a51c5f927fb83a88.tar.gz
bcm5719-llvm-7a05d1c1f116db31b2507bf5a51c5f927fb83a88.zip
[AArch64][GlobalISel] Fix i1 arguments not being zero-extended as required by ABI.
Fixes PR41001. llvm-svn: 355745
-rw-r--r--llvm/lib/Target/AArch64/AArch64CallLowering.cpp3
-rw-r--r--llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll9
2 files changed, 12 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64CallLowering.cpp b/llvm/lib/Target/AArch64/AArch64CallLowering.cpp
index 7f8cb7f5e6f..8a00a3fe94c 100644
--- a/llvm/lib/Target/AArch64/AArch64CallLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64CallLowering.cpp
@@ -363,6 +363,9 @@ bool AArch64CallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
[&](unsigned Reg, uint64_t Offset) {
MIRBuilder.buildExtract(Reg, OrigArg.Reg, Offset);
});
+ // AAPCS requires that we zero-extend i1 to 8 bits by the caller.
+ if (OrigArg.Ty->isIntegerTy(1))
+ SplitArgs.back().Flags.setZExt();
}
// Find out which ABI gets to decide where things go.
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll
index 81505b88390..57575ed1c49 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll
@@ -2350,3 +2350,12 @@ define void @test_llvm.aarch64.neon.ld3.v4i32.p0i32(i32* %ptr) {
}
declare { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3.v4i32.p0i32(i32*) #3
+
+define void @test_i1_arg_zext(void (i1)* %f) {
+; CHECK-LABEL: name: test_i1_arg_zext
+; CHECK: [[I1:%[0-9]+]]:_(s1) = G_CONSTANT i1 true
+; CHECK: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[I1]](s1)
+; CHECK: $w0 = COPY [[ZEXT]](s32)
+ call void %f(i1 true)
+ ret void
+}
OpenPOWER on IntegriCloud