From 889c2b97bd8c24fec231d239e85eeca7fcee3dd9 Mon Sep 17 00:00:00 2001 From: Harald van Dijk Date: Wed, 3 Nov 2021 16:43:44 +0000 Subject: [PATCH] [X86] Fix X32 indirect call generation The check for whether a zero extension was needed was subtly wrong and saw a value that was already 64 bits, so did not extend. Fixes PR52357. Reviewed By: RKSimon Differential Revision: https://reviews.llvm.org/D112860 --- llvm/lib/Target/X86/X86ISelLowering.cpp | 2 +- llvm/test/CodeGen/X86/call-structfp.ll | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 llvm/test/CodeGen/X86/call-structfp.ll diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 0627e6c..f54a2ae 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -4537,7 +4537,7 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI, // address into a register. Callee = LowerGlobalOrExternal(Callee, DAG, /*ForCall=*/true); } else if (Subtarget.isTarget64BitILP32() && - Callee->getValueType(0) == MVT::i32) { + Callee.getValueType() == MVT::i32) { // Zero-extend the 32-bit Callee address into a 64-bit according to x32 ABI Callee = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i64, Callee); } diff --git a/llvm/test/CodeGen/X86/call-structfp.ll b/llvm/test/CodeGen/X86/call-structfp.ll new file mode 100644 index 0000000..7e6c2bb --- /dev/null +++ b/llvm/test/CodeGen/X86/call-structfp.ll @@ -0,0 +1,19 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnux32 | FileCheck %s +declare { i64, void ()* } @f() +define void @pr52357() { +; CHECK-LABEL: pr52357: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: pushq %rax +; CHECK-NEXT: .cfi_def_cfa_offset 16 +; CHECK-NEXT: callq f@PLT +; CHECK-NEXT: movl %edx, %eax +; CHECK-NEXT: popq %rcx +; CHECK-NEXT: .cfi_def_cfa_offset 8 +; CHECK-NEXT: jmpq *%rax # TAILCALL +entry: + %0 = tail call { i64, void ()* } @f() + %1 = extractvalue { i64, void ()* } %0, 1 + tail call void %1() + ret void +} -- 2.7.4