[PATCH] D98145: [FastISel] Don't trivially kill extractvalues (PR49467)
Nikita Popov via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sun Mar 7 08:35:45 PST 2021
nikic created this revision.
nikic added reviewers: probinson, craig.topper, spatel, RKSimon.
Herald added subscribers: pengfei, hiraditya.
nikic requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
All `extractvalue`s of the same value at the same index will map to the same register, so even if one specific extractvalue only has one use, we should not mark it as a trivial kill, as there may be more `extractvalue`s later.
Fixes https://bugs.llvm.org/show_bug.cgi?id=49467.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D98145
Files:
llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
llvm/test/CodeGen/X86/pr49467.ll
Index: llvm/test/CodeGen/X86/pr49467.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/X86/pr49467.ll
@@ -0,0 +1,27 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -O0 -verify-machineinstrs -mtriple=x86_64 < %s | FileCheck %s
+
+declare { i8*, i64 } @get()
+
+declare void @use(i8*, i64)
+
+define void @test(i64* %p) nounwind {
+; CHECK-LABEL: test:
+; CHECK: # %bb.0:
+; CHECK-NEXT: pushq %rax
+; CHECK-NEXT: movq %rdi, (%rsp) # 8-byte Spill
+; CHECK-NEXT: callq get at PLT
+; CHECK-NEXT: movq (%rsp), %rdi # 8-byte Reload
+; CHECK-NEXT: movq %rdx, %rsi
+; CHECK-NEXT: movq %rsi, (%rdi)
+; CHECK-NEXT: # implicit-def: $rdi
+; CHECK-NEXT: callq use at PLT
+; CHECK-NEXT: popq %rax
+; CHECK-NEXT: retq
+ %struct = call { i8*, i64 } @get()
+ %struct.1 = extractvalue { i8*, i64 } %struct, 1
+ store i64 %struct.1, i64* %p, align 8
+ %struct.2 = extractvalue { i8*, i64 } %struct, 1
+ call void @use(i8* undef, i64 %struct.2)
+ ret void
+}
Index: llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
===================================================================
--- llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
+++ llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
@@ -266,7 +266,8 @@
return I->hasOneUse() &&
!(I->getOpcode() == Instruction::BitCast ||
I->getOpcode() == Instruction::PtrToInt ||
- I->getOpcode() == Instruction::IntToPtr) &&
+ I->getOpcode() == Instruction::IntToPtr ||
+ I->getOpcode() == Instruction::ExtractValue) &&
cast<Instruction>(*I->user_begin())->getParent() == I->getParent();
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D98145.328870.patch
Type: text/x-patch
Size: 1700 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210307/12c789a8/attachment.bin>
More information about the llvm-commits
mailing list