-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[SDAG] Add missing ppc_fp128 ExpandFloatRes for sincos[pi] #128514
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 2 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 | ||
; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-gnu-linux \ | ||
; RUN: -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names < %s | FileCheck %s | ||
|
||
define { ppc_fp128, ppc_fp128 } @test_sincos_ppcf128(ppc_fp128 %a) { | ||
; CHECK-LABEL: test_sincos_ppcf128: | ||
; CHECK: # %bb.0: | ||
; CHECK-NEXT: mflr r0 | ||
; CHECK-NEXT: stdu r1, -64(r1) | ||
; CHECK-NEXT: std r0, 80(r1) | ||
; CHECK-NEXT: .cfi_def_cfa_offset 64 | ||
; CHECK-NEXT: .cfi_offset lr, 16 | ||
; CHECK-NEXT: addi r5, r1, 48 | ||
; CHECK-NEXT: addi r6, r1, 32 | ||
; CHECK-NEXT: bl sincosl | ||
; CHECK-NEXT: nop | ||
; CHECK-NEXT: lfd f1, 48(r1) | ||
; CHECK-NEXT: lfd f2, 56(r1) | ||
; CHECK-NEXT: lfd f3, 32(r1) | ||
; CHECK-NEXT: lfd f4, 40(r1) | ||
; CHECK-NEXT: addi r1, r1, 64 | ||
; CHECK-NEXT: ld r0, 16(r1) | ||
; CHECK-NEXT: mtlr r0 | ||
; CHECK-NEXT: blr | ||
%result = call { ppc_fp128, ppc_fp128 } @llvm.sincos.ppcf128(ppc_fp128 %a) | ||
ret { ppc_fp128, ppc_fp128 } %result | ||
} | ||
|
||
define { ppc_fp128, ppc_fp128 } @test_sincospi_ppcf128(ppc_fp128 %a) { | ||
; CHECK-LABEL: test_sincospi_ppcf128: | ||
; CHECK: # %bb.0: | ||
; CHECK-NEXT: mflr r0 | ||
; CHECK-NEXT: stdu r1, -64(r1) | ||
; CHECK-NEXT: std r0, 80(r1) | ||
; CHECK-NEXT: .cfi_def_cfa_offset 64 | ||
; CHECK-NEXT: .cfi_offset lr, 16 | ||
; CHECK-NEXT: addi r5, r1, 48 | ||
; CHECK-NEXT: addi r6, r1, 32 | ||
; CHECK-NEXT: bl sincospil | ||
; CHECK-NEXT: nop | ||
; CHECK-NEXT: lfd f1, 48(r1) | ||
; CHECK-NEXT: lfd f2, 56(r1) | ||
; CHECK-NEXT: lfd f3, 32(r1) | ||
; CHECK-NEXT: lfd f4, 40(r1) | ||
; CHECK-NEXT: addi r1, r1, 64 | ||
; CHECK-NEXT: ld r0, 16(r1) | ||
; CHECK-NEXT: mtlr r0 | ||
; CHECK-NEXT: blr | ||
%result = call { ppc_fp128, ppc_fp128 } @llvm.sincospi.ppcf128(ppc_fp128 %a) | ||
ret { ppc_fp128, ppc_fp128 } %result | ||
} | ||
|
||
; FIXME: Recognise this as a tail call and omit the stack frame: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think this can be recognized as a tail call, the return needs to be the immediate next instruction after the call There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
That is what codegen emits, the stores and extractvalues fold away to nothing, though the tail call logic does not recognise this. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What do you mean by "what the codegen emits"? The issue is what is in the IR. This function should return the original { ppc_fp128, ppc_fp128 } with no extracts or stores There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Right, but returning a struct would never result in a tail call for the standard expansion.
This could simply be a jump to |
||
define void @test_sincos_ppcf128_tail_call(ppc_fp128 %a, ptr noalias %out_sin, ptr noalias %out_cos) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This should return the raw structure type There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That won't result in something that could be a tail call on any target that uses the (semi)-standard GNU |
||
; CHECK-LABEL: test_sincos_ppcf128_tail_call: | ||
; CHECK: # %bb.0: | ||
; CHECK-NEXT: mflr r0 | ||
; CHECK-NEXT: stdu r1, -32(r1) | ||
; CHECK-NEXT: std r0, 48(r1) | ||
; CHECK-NEXT: .cfi_def_cfa_offset 32 | ||
; CHECK-NEXT: .cfi_offset lr, 16 | ||
; CHECK-NEXT: bl sincosl | ||
; CHECK-NEXT: nop | ||
; CHECK-NEXT: addi r1, r1, 32 | ||
; CHECK-NEXT: ld r0, 16(r1) | ||
; CHECK-NEXT: mtlr r0 | ||
; CHECK-NEXT: blr | ||
%result = tail call { ppc_fp128, ppc_fp128 } @llvm.sincos.ppcf128(ppc_fp128 %a) | ||
%result.0 = extractvalue { ppc_fp128, ppc_fp128 } %result, 0 | ||
%result.1 = extractvalue { ppc_fp128, ppc_fp128 } %result, 1 | ||
store ppc_fp128 %result.0, ptr %out_sin, align 16 | ||
store ppc_fp128 %result.1, ptr %out_cos, align 16 | ||
ret void | ||
} | ||
|
||
; FIXME: Recognise this as a tail call and omit the stack frame: | ||
define void @test_sincospi_ppcf128_tail_call(ppc_fp128 %a, ptr noalias %out_sin, ptr noalias %out_cos) { | ||
; CHECK-LABEL: test_sincospi_ppcf128_tail_call: | ||
; CHECK: # %bb.0: | ||
; CHECK-NEXT: mflr r0 | ||
; CHECK-NEXT: stdu r1, -32(r1) | ||
; CHECK-NEXT: std r0, 48(r1) | ||
; CHECK-NEXT: .cfi_def_cfa_offset 32 | ||
; CHECK-NEXT: .cfi_offset lr, 16 | ||
; CHECK-NEXT: bl sincospil | ||
; CHECK-NEXT: nop | ||
; CHECK-NEXT: addi r1, r1, 32 | ||
; CHECK-NEXT: ld r0, 16(r1) | ||
; CHECK-NEXT: mtlr r0 | ||
; CHECK-NEXT: blr | ||
%result = tail call { ppc_fp128, ppc_fp128 } @llvm.sincospi.ppcf128(ppc_fp128 %a) | ||
%result.0 = extractvalue { ppc_fp128, ppc_fp128 } %result, 0 | ||
%result.1 = extractvalue { ppc_fp128, ppc_fp128 } %result, 1 | ||
store ppc_fp128 %result.0, ptr %out_sin, align 16 | ||
store ppc_fp128 %result.1, ptr %out_cos, align 16 | ||
ret void | ||
} |
Uh oh!
There was an error while loading. Please reload this page.