When eliding an argument copy, we need to update the chain to ensure the argument reads are performed before later writes. However, the code doing this only handled this for the first part of the argument. If the argument had multiple parts, the chains of the later parts were dropped. Make sure we preserve all chains. Fixes https://github.com/llvm/llvm-project/issues/63430.
21 lines
732 B
LLVM
21 lines
732 B
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --no_x86_scrub_sp --version 2
|
|
; RUN: llc -mtriple=x86_64-unknown-linux < %s | FileCheck %s
|
|
|
|
; Make sure the argument is read before the stack slot is over-written.
|
|
define i1 @test(ptr %a0, ptr %a1, ptr %a2, ptr %a3, ptr %a4, ptr %a5, i128 %x) {
|
|
; CHECK-LABEL: test:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: movq 8(%rsp), %rax
|
|
; CHECK-NEXT: xorps %xmm0, %xmm0
|
|
; CHECK-NEXT: andq 16(%rsp), %rax
|
|
; CHECK-NEXT: movaps %xmm0, 8(%rsp)
|
|
; CHECK-NEXT: cmpq $-1, %rax
|
|
; CHECK-NEXT: sete %al
|
|
; CHECK-NEXT: retq
|
|
%alloca = alloca i128
|
|
store i128 %x, ptr %alloca
|
|
store i128 0, ptr %alloca
|
|
%cmp = icmp eq i128 %x, -1
|
|
ret i1 %cmp
|
|
}
|