Skip to content

Commit 3de89ab

Browse files
nemanjaitstellar
authored andcommitted
[PowerPC] Do not attempt to reuse load for 64-bit FP_TO_UINT without FPCVT
We call the function that attempts to reuse the conversion without checking whether the target matches the constraints that the callee expects. This patch adds the check prior to the call. Fixes: https://bugs.llvm.org/show_bug.cgi?id=43976 Differential revision: https://reviews.llvm.org/D77564 (cherry picked from commit 64b31d9)
1 parent 17d0ddd commit 3de89ab

File tree

2 files changed

+62
-2
lines changed

2 files changed

+62
-2
lines changed

llvm/lib/Target/PowerPC/PPCISelLowering.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7851,9 +7851,10 @@ bool PPCTargetLowering::canReuseLoadAddress(SDValue Op, EVT MemVT,
78517851
SelectionDAG &DAG,
78527852
ISD::LoadExtType ET) const {
78537853
SDLoc dl(Op);
7854+
bool ValidFPToUint = Op.getOpcode() == ISD::FP_TO_UINT &&
7855+
(Subtarget.hasFPCVT() || Op.getValueType() == MVT::i32);
78547856
if (ET == ISD::NON_EXTLOAD &&
7855-
(Op.getOpcode() == ISD::FP_TO_UINT ||
7856-
Op.getOpcode() == ISD::FP_TO_SINT) &&
7857+
(ValidFPToUint || Op.getOpcode() == ISD::FP_TO_SINT) &&
78577858
isOperationLegalOrCustom(Op.getOpcode(),
78587859
Op.getOperand(0).getValueType())) {
78597860

llvm/test/CodeGen/PowerPC/pr43976.ll

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=powerpc64-unknown-unknown -verify-machineinstrs \
3+
; RUN: -ppc-asm-full-reg-names < %s | FileCheck %s
4+
@a = dso_local local_unnamed_addr global double 0.000000e+00, align 8
5+
6+
define dso_local signext i32 @b() local_unnamed_addr #0 {
7+
; CHECK-LABEL: b:
8+
; CHECK: # %bb.0: # %entry
9+
; CHECK-NEXT: mflr r0
10+
; CHECK-NEXT: std r0, 16(r1)
11+
; CHECK-NEXT: stdu r1, -144(r1)
12+
; CHECK-NEXT: addis r3, r2, a@toc@ha
13+
; CHECK-NEXT: addis r4, r2, .LCPI0_0@toc@ha
14+
; CHECK-NEXT: lfd f0, a@toc@l(r3)
15+
; CHECK-NEXT: lfs f1, .LCPI0_0@toc@l(r4)
16+
; CHECK-NEXT: li r4, 1
17+
; CHECK-NEXT: sldi r4, r4, 63
18+
; CHECK-NEXT: fsub f2, f0, f1
19+
; CHECK-NEXT: fctidz f2, f2
20+
; CHECK-NEXT: stfd f2, 128(r1)
21+
; CHECK-NEXT: fctidz f2, f0
22+
; CHECK-NEXT: stfd f2, 120(r1)
23+
; CHECK-NEXT: ld r3, 128(r1)
24+
; CHECK-NEXT: ld r5, 120(r1)
25+
; CHECK-NEXT: fcmpu cr0, f0, f1
26+
; CHECK-NEXT: xor r3, r3, r4
27+
; CHECK-NEXT: bc 12, lt, .LBB0_1
28+
; CHECK-NEXT: b .LBB0_2
29+
; CHECK-NEXT: .LBB0_1: # %entry
30+
; CHECK-NEXT: addi r3, r5, 0
31+
; CHECK-NEXT: .LBB0_2: # %entry
32+
; CHECK-NEXT: std r3, 112(r1)
33+
; CHECK-NEXT: addis r3, r2, .LCPI0_1@toc@ha
34+
; CHECK-NEXT: lfd f0, 112(r1)
35+
; CHECK-NEXT: lfs f1, .LCPI0_1@toc@l(r3)
36+
; CHECK-NEXT: fcfid f0, f0
37+
; CHECK-NEXT: fmul f0, f0, f1
38+
; CHECK-NEXT: fctiwz f0, f0
39+
; CHECK-NEXT: stfd f0, 136(r1)
40+
; CHECK-NEXT: lwa r3, 140(r1)
41+
; CHECK-NEXT: bl g
42+
; CHECK-NEXT: nop
43+
; CHECK-NEXT: addi r1, r1, 144
44+
; CHECK-NEXT: ld r0, 16(r1)
45+
; CHECK-NEXT: mtlr r0
46+
; CHECK-NEXT: blr
47+
entry:
48+
%0 = load double, double* @a, align 8
49+
%conv = fptoui double %0 to i64
50+
%conv1 = sitofp i64 %conv to double
51+
%mul = fmul double %conv1, 1.000000e+06
52+
%conv2 = fptosi double %mul to i32
53+
%call = tail call signext i32 @g(i32 signext %conv2) #0
54+
ret i32 %call
55+
}
56+
57+
declare signext i32 @g(i32 signext) local_unnamed_addr
58+
59+
attributes #0 = { nounwind }

0 commit comments

Comments
 (0)