llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-backend-aarch64 Author: None (llvmbot) <details> <summary>Changes</summary> Backport 36b3c43524c8ca86a5050496b8773f07c5ccddff Requested by: @<!-- -->ostannard --- Full diff: https://github.com/llvm/llvm-project/pull/125230.diff 2 Files Affected: - (modified) llvm/lib/Target/AArch64/AArch64InstrInfo.td (+6-1) - (added) llvm/test/CodeGen/AArch64/pauthlr-prologue-duplication.mir (+88) ``````````diff diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td b/llvm/lib/Target/AArch64/AArch64InstrInfo.td index d112d4f10e47d9..b77246200db645 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td @@ -1773,7 +1773,12 @@ def : InstAlias<"xpaclri", (XPACLRI), 0>; let Uses = [LR, SP], Defs = [LR] in { // Insertion point of LR signing code. -def PAUTH_PROLOGUE : Pseudo<(outs), (ins), []>, Sched<[]>; +def PAUTH_PROLOGUE : Pseudo<(outs), (ins), []>, Sched<[]> { + // When using PAuthLR, the address of one of the instructions this expands + // into is used as an input to the signature calculation, so this must not be + // duplicated. + let isNotDuplicable = 1; +} // Insertion point of LR authentication code. // The RET terminator of the containing machine basic block may be replaced // with a combined RETA(A|B) instruction when rewriting this Pseudo. diff --git a/llvm/test/CodeGen/AArch64/pauthlr-prologue-duplication.mir b/llvm/test/CodeGen/AArch64/pauthlr-prologue-duplication.mir new file mode 100644 index 00000000000000..5e57604263793c --- /dev/null +++ b/llvm/test/CodeGen/AArch64/pauthlr-prologue-duplication.mir @@ -0,0 +1,88 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5 +# RUN: llc -mtriple aarch64-none-elf -run-pass=block-placement -O3 -o - %s | FileCheck %s + +## Check that block-placement does not perform tail duplication on the +## PAUTH_EPILOGUE instruction. If that happened, the two prologues would use +## different addresses while calculating the return address signature, so the +## epilogue could only be correct for (at most) one of them. + +--- | + define void @test() "frame-pointer"="non-leaf" { + entry: + ret void + } + + declare void @f() +... +--- +name: test +body: | + ; CHECK-LABEL: name: test + ; CHECK: bb.0.entry: + ; CHECK-NEXT: successors: %bb.1(0x30000000), %bb.2(0x50000000) + ; CHECK-NEXT: liveins: $w0, $w1, $lr + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: CBZW renamable $w0, %bb.1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: bb.2: + ; CHECK-NEXT: successors: %bb.3(0x80000000) + ; CHECK-NEXT: liveins: $w0, $w1, $lr + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: B %bb.3 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: bb.1: + ; CHECK-NEXT: successors: %bb.3(0x80000000) + ; CHECK-NEXT: liveins: $w1, $lr + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: renamable $w8 = MOVZWi 1, 0 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: bb.3: + ; CHECK-NEXT: successors: %bb.5(0x30000000), %bb.4(0x50000000) + ; CHECK-NEXT: liveins: $w1, $w8, $lr + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: frame-setup PAUTH_PROLOGUE implicit-def $lr, implicit killed $lr, implicit $sp + ; CHECK-NEXT: CBZW killed renamable $w1, %bb.5 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: bb.4: + ; CHECK-NEXT: successors: %bb.5(0x80000000) + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: BL @f, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: bb.5: + ; CHECK-NEXT: BL @f, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp + ; CHECK-NEXT: frame-destroy PAUTH_EPILOGUE implicit-def $lr, implicit killed $lr, implicit $sp + ; CHECK-NEXT: TCRETURNdi @f, 0, csr_aarch64_aapcs, implicit $sp + bb.0.entry: + successors: %bb.1(0x30000000), %bb.2(0x50000000) + liveins: $w0, $w1, $lr + + CBNZW renamable $w0, %bb.2 + + bb.1: + successors: %bb.3(0x80000000) + liveins: $w1, $lr + + renamable $w8 = MOVZWi 1, 0 + B %bb.3 + + bb.2: + successors: %bb.3(0x80000000) + liveins: $w0, $w1, $lr + + bb.3: + successors: %bb.5(0x30000000), %bb.4(0x50000000) + liveins: $w1, $w8, $lr + + frame-setup PAUTH_PROLOGUE implicit-def $lr, implicit killed $lr, implicit $sp + CBZW killed renamable $w1, %bb.5 + + bb.4: + successors: %bb.5(0x80000000) + + BL @f, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp + + bb.5: + BL @f, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp + frame-destroy PAUTH_EPILOGUE implicit-def $lr, implicit killed $lr, implicit $sp + TCRETURNdi @f, 0, csr_aarch64_aapcs, implicit $sp +... `````````` </details> https://github.com/llvm/llvm-project/pull/125230 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits