Skip to content

Commit

Permalink
MachineFunction: Copy call site info when duplicating insts
Browse files Browse the repository at this point in the history
Summary:
Preserve call site info for duplicated instructions. We copy over the
call site info in CloneMachineInstrBundle to avoid repeated calls to
copyCallSiteInfo in CloneMachineInstr.

(Alternatively, we could copy call site info higher up the stack, e.g.
into TargetInstrInfo::duplicate, or even into individual backend passes.
However, I don't see how that would be safer or more general than the
current approach.)

Reviewers: aprantl, djtodoro, dstenb

Subscribers: hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D77685
  • Loading branch information
vedantk committed Apr 13, 2020
1 parent 05493e9 commit b94ebc7
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 0 deletions.
5 changes: 5 additions & 0 deletions llvm/lib/CodeGen/MachineFunction.cpp
Expand Up @@ -369,6 +369,11 @@ MachineInstr &MachineFunction::CloneMachineInstrBundle(MachineBasicBlock &MBB,
break;
++I;
}
// Copy over call site info to the cloned instruction if needed. If Orig is in
// a bundle, copyCallSiteInfo takes care of finding the call instruction in
// the bundle.
if (Orig.shouldUpdateCallSiteInfo())
copyCallSiteInfo(&Orig, FirstClone);
return *FirstClone;
}

Expand Down
75 changes: 75 additions & 0 deletions llvm/test/CodeGen/X86/taildup-callsiteinfo.mir
@@ -0,0 +1,75 @@
# RUN: llc %s -run-pass=block-placement -tail-dup-placement-threshold=4 -o - | FileCheck %s
#
# Test case adapted from test/CodeGen/X86/taildup-heapallocsite.ll.

# CHECK-LABEL: callSites:
# CHECK-NEXT: - { bb: 1, offset: 1, fwdArgRegs:
# CHECK-NEXT: - { arg: 0, reg: '$rcx' } }
# CHECK-NEXT: - { bb: 2, offset: 1, fwdArgRegs:
# CHECK-NEXT: - { arg: 0, reg: '$rcx' } }

--- |
target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc19.22.27905"

define dso_local void @taildupit(i32* readonly %size_ptr) {
entry:
%tobool = icmp eq i32* %size_ptr, null
br i1 %tobool, label %cond.end, label %cond.true

cond.true: ; preds = %entry
%0 = load i32, i32* %size_ptr, align 4
br label %cond.end

cond.end: ; preds = %cond.true, %entry
%cond = phi i32 [ %0, %cond.true ], [ 1, %entry ]
%call = tail call i8* @alloc(i32 %cond)
tail call void @f2()
ret void
}

declare dso_local i8* @alloc(i32)

declare dso_local void @f2()

...
---
name: taildupit
tracksRegLiveness: true
liveins:
- { reg: '$rcx', virtual-reg: '' }
callSites:
- { bb: 3, offset: 0, fwdArgRegs:
- { arg: 0, reg: '$rcx' } }
body: |
bb.0.entry:
successors: %bb.1(0x30000000), %bb.2(0x50000000)
liveins: $rcx
$rsp = frame-setup SUB64ri8 $rsp, 40, implicit-def dead $eflags
frame-setup SEH_StackAlloc 40
frame-setup SEH_EndPrologue
TEST64rr renamable $rcx, renamable $rcx, implicit-def $eflags
JCC_1 %bb.2, 5, implicit killed $eflags
bb.1:
successors: %bb.3(0x80000000)
renamable $ecx = MOV32ri 1
JMP_1 %bb.3
bb.2.cond.true:
successors: %bb.3(0x80000000)
liveins: $rcx
renamable $ecx = MOV32rm killed renamable $rcx, 1, $noreg, 0, $noreg :: (load 4 from %ir.size_ptr)
bb.3.cond.end:
liveins: $ecx
CALL64pcrel32 @alloc, csr_win64, implicit $rsp, implicit $ssp, implicit $ecx, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax
SEH_Epilogue
$rsp = frame-destroy ADD64ri8 $rsp, 40, implicit-def dead $eflags
TAILJMPd64 @f2, csr_win64, implicit $rsp, implicit $ssp, implicit $rsp, implicit $ssp
...

0 comments on commit b94ebc7

Please sign in to comment.