39a5a55
From 9d1f05a7b8537deb5f626cd1b7b26ef2678f4c8e Mon Sep 17 00:00:00 2001
39a5a55
From: Arthur Eubanks <aeubanks@google.com>
39a5a55
Date: Thu, 27 Jul 2023 13:27:58 -0700
39a5a55
Subject: [PATCH] [PEI] Don't zero out noreg operands
39a5a55
39a5a55
A tail call may have $noreg operands.
39a5a55
39a5a55
Fixes a crash.
39a5a55
39a5a55
Reviewed By: xgupta
39a5a55
39a5a55
Differential Revision: https://reviews.llvm.org/D156485
39a5a55
39a5a55
(cherry picked from commit f800c1f3b207e7bcdc8b4c7192928d9a078242a0)
39a5a55
---
39a5a55
 llvm/lib/CodeGen/PrologEpilogInserter.cpp    |  9 +++++++--
39a5a55
 llvm/test/CodeGen/X86/zero-call-used-regs.ll | 14 ++++++++++++++
39a5a55
 2 files changed, 21 insertions(+), 2 deletions(-)
39a5a55
39a5a55
diff --git a/llvm/lib/CodeGen/PrologEpilogInserter.cpp b/llvm/lib/CodeGen/PrologEpilogInserter.cpp
39a5a55
index e323aaaeefaf..49047719fdaa 100644
39a5a55
--- a/llvm/lib/CodeGen/PrologEpilogInserter.cpp
39a5a55
+++ b/llvm/lib/CodeGen/PrologEpilogInserter.cpp
39a5a55
@@ -1285,6 +1285,8 @@ void PEI::insertZeroCallUsedRegs(MachineFunction &MF) {
39a5a55
           continue;
39a5a55
 
39a5a55
         MCRegister Reg = MO.getReg();
39a5a55
+        if (!Reg)
39a5a55
+          continue;
39a5a55
 
39a5a55
         // This picks up sibling registers (e.q. %al -> %ah).
39a5a55
         for (MCRegUnit Unit : TRI.regunits(Reg))
39a5a55
@@ -1308,8 +1310,11 @@ void PEI::insertZeroCallUsedRegs(MachineFunction &MF) {
39a5a55
         if (!MO.isReg())
39a5a55
           continue;
39a5a55
 
39a5a55
-        for (const MCPhysReg &Reg :
39a5a55
-             TRI.sub_and_superregs_inclusive(MO.getReg()))
39a5a55
+        MCRegister Reg = MO.getReg();
39a5a55
+        if (!Reg)
39a5a55
+          continue;
39a5a55
+
39a5a55
+        for (const MCPhysReg Reg : TRI.sub_and_superregs_inclusive(Reg))
39a5a55
           RegsToZero.reset(Reg);
39a5a55
       }
39a5a55
     }
39a5a55
diff --git a/llvm/test/CodeGen/X86/zero-call-used-regs.ll b/llvm/test/CodeGen/X86/zero-call-used-regs.ll
39a5a55
index 63d51c916bb9..97ad5ce9c8cb 100644
39a5a55
--- a/llvm/test/CodeGen/X86/zero-call-used-regs.ll
39a5a55
+++ b/llvm/test/CodeGen/X86/zero-call-used-regs.ll
39a5a55
@@ -241,6 +241,20 @@ entry:
39a5a55
   ret i32 %x
39a5a55
 }
39a5a55
 
39a5a55
+define dso_local void @tailcall(ptr %p) local_unnamed_addr #0 "zero-call-used-regs"="used-gpr" {
39a5a55
+; I386-LABEL: tailcall:
39a5a55
+; I386:       # %bb.0:
39a5a55
+; I386-NEXT:    movl {{[0-9]+}}(%esp), %eax
39a5a55
+; I386-NEXT:    jmpl *(%eax) # TAILCALL
39a5a55
+;
39a5a55
+; X86-64-LABEL: tailcall:
39a5a55
+; X86-64:       # %bb.0:
39a5a55
+; X86-64-NEXT:    jmpq *(%rdi) # TAILCALL
39a5a55
+  %c = load ptr, ptr %p
39a5a55
+  tail call void %c()
39a5a55
+  ret void
39a5a55
+}
39a5a55
+
39a5a55
 ; Don't emit zeroing registers in "main" function.
39a5a55
 define dso_local i32 @main() local_unnamed_addr #1 {
39a5a55
 ; I386-LABEL: main:
39a5a55
-- 
39a5a55
2.43.0
39a5a55