diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -15754,7 +15754,7 @@ if (DAG.getTarget().Options.UnsafeFPMath || N0IsTrunc) { SDLoc DL(N); return DAG.getNode(ISD::FP_ROUND, DL, VT, N0.getOperand(0), - DAG.getIntPtrConstant(NIsTrunc && N0IsTrunc, DL)); + DAG.getTargetConstant(NIsTrunc && N0IsTrunc, DL, TLI.getPointerTy(DAG.getDataLayout()))); } } @@ -15815,7 +15815,7 @@ CombineTo(N0.getNode(), DAG.getNode(ISD::FP_ROUND, SDLoc(N0), N0.getValueType(), ExtLoad, - DAG.getIntPtrConstant(1, SDLoc(N0))), + DAG.getTargetConstant(1, SDLoc(N0), TLI.getPointerTy(DAG.getDataLayout()))), ExtLoad.getValue(1)); return SDValue(N, 0); // Return N so it doesn't get rechecked! } diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -3252,7 +3252,7 @@ // Under fastmath, we can expand this node into a fround followed by // a float-half conversion. SDValue FloatVal = DAG.getNode(ISD::FP_ROUND, dl, MVT::f32, Op, - DAG.getIntPtrConstant(0, dl)); + DAG.getTargetConstant(0, dl, TLI.getPointerTy(DAG.getDataLayout()))); Results.push_back( DAG.getNode(ISD::FP_TO_FP16, dl, Node->getValueType(0), FloatVal)); } @@ -4696,7 +4696,7 @@ Tmp1 = DAG.getNode(ISD::TRUNCATE, dl, OVT, Tmp1); else Tmp1 = DAG.getNode(ISD::FP_ROUND, dl, OVT, Tmp1, - DAG.getIntPtrConstant(0, dl)); + DAG.getTargetConstant(0, dl, TLI.getPointerTy(DAG.getDataLayout()))); Results.push_back(Tmp1); break; @@ -4757,7 +4757,7 @@ Tmp3 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2, Node->getFlags()); Results.push_back(DAG.getNode(ISD::FP_ROUND, dl, OVT, - Tmp3, DAG.getIntPtrConstant(0, dl))); + Tmp3, DAG.getTargetConstant(0, dl, TLI.getPointerTy(DAG.getDataLayout())))); break; case ISD::STRICT_FADD: case ISD::STRICT_FSUB: @@ -4787,7 +4787,7 @@ Results.push_back( DAG.getNode(ISD::FP_ROUND, dl, OVT, DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2, Tmp3), - DAG.getIntPtrConstant(0, dl))); + DAG.getTargetConstant(0, dl, TLI.getPointerTy(DAG.getDataLayout())))); break; case ISD::STRICT_FMA: Tmp1 = DAG.getNode(ISD::STRICT_FP_EXTEND, dl, {NVT, MVT::Other}, @@ -4818,7 +4818,7 @@ // which is a no-op. Mark it as a TRUNCating FP_ROUND. const bool isTrunc = (Node->getOpcode() == ISD::FCOPYSIGN); Results.push_back(DAG.getNode(ISD::FP_ROUND, dl, OVT, - Tmp3, DAG.getIntPtrConstant(isTrunc, dl))); + Tmp3, DAG.getTargetConstant(isTrunc, dl, TLI.getPointerTy(DAG.getDataLayout())))); break; } case ISD::STRICT_FPOWI: @@ -4851,7 +4851,7 @@ Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(0)); Tmp2 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1); Results.push_back(DAG.getNode(ISD::FP_ROUND, dl, OVT, - Tmp2, DAG.getIntPtrConstant(0, dl))); + Tmp2, DAG.getTargetConstant(0, dl, TLI.getPointerTy(DAG.getDataLayout())))); break; case ISD::STRICT_FFLOOR: case ISD::STRICT_FCEIL: diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp @@ -1072,7 +1072,7 @@ if (ST->isTruncatingStore()) // Do an FP_ROUND followed by a non-truncating store. Val = BitConvertToInteger(DAG.getNode(ISD::FP_ROUND, dl, ST->getMemoryVT(), - Val, DAG.getIntPtrConstant(0, dl))); + Val, DAG.getTargetConstant(0, dl, TLI.getPointerTy(DAG.getDataLayout())))); else Val = GetSoftenedFloat(Val); @@ -2532,7 +2532,7 @@ // Round the value to the desired precision (that of the source type). return DAG.getNode( ISD::FP_EXTEND, DL, NVT, - DAG.getNode(ISD::FP_ROUND, DL, VT, NV, DAG.getIntPtrConstant(0, DL))); + DAG.getNode(ISD::FP_ROUND, DL, VT, NV, DAG.getTargetConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout())))); } SDValue DAGTypeLegalizer::PromoteFloatRes_UNDEF(SDNode *N) { diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp @@ -594,7 +594,7 @@ if ((VT.isFloatingPoint() && NVT.isFloatingPoint()) || (VT.isVector() && VT.getVectorElementType().isFloatingPoint() && NVT.isVector() && NVT.getVectorElementType().isFloatingPoint())) - Res = DAG.getNode(ISD::FP_ROUND, dl, VT, Res, DAG.getIntPtrConstant(0, dl)); + Res = DAG.getNode(ISD::FP_ROUND, dl, VT, Res, DAG.getTargetConstant(0, dl, TLI.getPointerTy(DAG.getDataLayout()))); else Res = DAG.getNode(ISD::BITCAST, dl, VT, Res); diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -1341,7 +1341,7 @@ SDValue SelectionDAG::getFPExtendOrRound(SDValue Op, const SDLoc &DL, EVT VT) { return VT.bitsGT(Op.getValueType()) ? getNode(ISD::FP_EXTEND, DL, VT, Op) - : getNode(ISD::FP_ROUND, DL, VT, Op, getIntPtrConstant(0, DL)); + : getNode(ISD::FP_ROUND, DL, VT, Op, getTargetConstant(0, DL, TLI->getPointerTy(getDataLayout()))); } std::pair diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -3993,7 +3993,7 @@ {In.getValue(1), In.getValue(0), DAG.getIntPtrConstant(0, dl)}); } In = DAG.getNode(Opc, dl, CastVT, In); - return DAG.getNode(ISD::FP_ROUND, dl, VT, In, DAG.getIntPtrConstant(0, dl)); + return DAG.getNode(ISD::FP_ROUND, dl, VT, In, DAG.getTargetConstant(0, dl, getPointerTy(DAG.getDataLayout()))); } if (VTSize > InVTSize) { @@ -7721,7 +7721,7 @@ if (SrcVT.bitsLT(VT)) In2 = DAG.getNode(ISD::FP_EXTEND, DL, VT, In2); else if (SrcVT.bitsGT(VT)) - In2 = DAG.getNode(ISD::FP_ROUND, DL, VT, In2, DAG.getIntPtrConstant(0, DL)); + In2 = DAG.getNode(ISD::FP_ROUND, DL, VT, In2, DAG.getTargetConstant(0, DL, getPointerTy(DAG.getDataLayout()))); if (VT.isScalableVector()) IntVT = @@ -8642,7 +8642,7 @@ DAG.getLoad(MVT::f64, DL, APStore, VAList, MachinePointerInfo()); // Round the value down to an f32. SDValue NarrowFP = DAG.getNode(ISD::FP_ROUND, DL, VT, WideFP.getValue(0), - DAG.getIntPtrConstant(1, DL)); + DAG.getTargetConstant(1, DL, getPointerTy(DAG.getDataLayout()))); SDValue Ops[] = { NarrowFP, WideFP.getValue(1) }; // Merge the rounded value with the chain output of the load. return DAG.getMergeValues(Ops, DL); @@ -19347,7 +19347,7 @@ DCI.CombineTo(N, ExtLoad); DCI.CombineTo(N0.getNode(), DAG.getNode(ISD::FP_ROUND, SDLoc(N0), N0.getValueType(), - ExtLoad, DAG.getIntPtrConstant(1, SDLoc(N0))), + ExtLoad, DAG.getTargetConstant(1, SDLoc(N0), DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout()))), ExtLoad.getValue(1)); return SDValue(N, 0); // Return N so it doesn't get rechecked! } diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp --- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -8661,7 +8661,7 @@ {Chain, FP, DAG.getIntPtrConstant(0, dl)}, Flags); else FP = DAG.getNode(ISD::FP_ROUND, dl, MVT::f32, FP, - DAG.getIntPtrConstant(0, dl)); + DAG.getTargetConstant(0, dl, getPointerTy(DAG.getDataLayout()))); } return FP; } @@ -8742,7 +8742,7 @@ {Chain, FP, DAG.getIntPtrConstant(0, dl)}, Flags); else FP = DAG.getNode(ISD::FP_ROUND, dl, MVT::f32, FP, - DAG.getIntPtrConstant(0, dl)); + DAG.getTargetConstant(0, dl, getPointerTy(DAG.getDataLayout()))); } return FP; } @@ -14065,7 +14065,7 @@ else { SDValue Trunc = DAG.getNode(ISD::FP_ROUND, dl, MVT::f32, In.getOperand(0), - DAG.getIntPtrConstant(1, dl)); + DAG.getTargetConstant(1, dl, getPointerTy(DAG.getDataLayout()))); Ops.push_back(Trunc); } } else @@ -14542,7 +14542,7 @@ if (Op.getValueType() == MVT::f32 && !Subtarget.hasFPCVT()) { FP = DAG.getNode(ISD::FP_ROUND, dl, - MVT::f32, FP, DAG.getIntPtrConstant(0, dl)); + MVT::f32, FP, DAG.getTargetConstant(0, dl, getPointerTy(DAG.getDataLayout()))); DCI.AddToWorklist(FP.getNode()); } diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -3300,7 +3300,7 @@ SDValue Powi = DAG.getNode(ISD::FPOWI, DL, MVT::f32, Op0, Op.getOperand(1)); return DAG.getNode(ISD::FP_ROUND, DL, MVT::f16, Powi, - DAG.getIntPtrConstant(0, DL)); + DAG.getTargetConstant(0, DL, getPointerTy(DAG.getDataLayout()))); } return SDValue(); } diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -3461,7 +3461,7 @@ if (RoundAfterCopy) Val = DAG.getNode(ISD::FP_ROUND, dl, VA.getValVT(), Val, // This truncation won't change the value. - DAG.getIntPtrConstant(1, dl)); + DAG.getTargetConstant(1, dl, getPointerTy(DAG.getDataLayout()))); if (VA.isExtInLoc()) { if (VA.getValVT().isVector() && @@ -20947,7 +20947,7 @@ MVT NVT = VT.isVector() ? VT.changeVectorElementType(MVT::f32) : MVT::f32; SDLoc dl(Op); - SDValue Rnd = DAG.getIntPtrConstant(0, dl); + SDValue Rnd = DAG.getTargetConstant(0, dl, DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout())); if (IsStrict) return DAG.getNode( ISD::STRICT_FP_ROUND, dl, {VT, MVT::Other}, @@ -21619,7 +21619,7 @@ } SDValue Add = DAG.getNode(ISD::FADD, dl, MVT::f80, Fild, Fudge); return DAG.getNode(ISD::FP_ROUND, dl, DstVT, Add, - DAG.getIntPtrConstant(0, dl)); + DAG.getTargetConstant(0, dl, getPointerTy(DAG.getDataLayout()))); } // If the given FP_TO_SINT (IsSigned) or FP_TO_UINT (!IsSigned) operation @@ -23238,7 +23238,7 @@ // And if it is bigger, shrink it first. if (Sign.getSimpleValueType().bitsGT(VT)) Sign = - DAG.getNode(ISD::FP_ROUND, dl, VT, Sign, DAG.getIntPtrConstant(0, dl)); + DAG.getNode(ISD::FP_ROUND, dl, VT, Sign, DAG.getTargetConstant(0, dl, DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout()))); // At this point the operands and the result should have the same // type, and that won't be f80 since that is not custom lowered. diff --git a/llvm/test/CodeGen/AArch64/sve-fcopysign.ll b/llvm/test/CodeGen/AArch64/sve-fcopysign.ll --- a/llvm/test/CodeGen/AArch64/sve-fcopysign.ll +++ b/llvm/test/CodeGen/AArch64/sve-fcopysign.ll @@ -207,6 +207,39 @@ ret %r } + +;========== FCOPYSIGN_EXTEND_ROUND + +define @test_copysign_nxv4f32_nxv4f16( %a, %b) #0 { +; CHECK-LABEL: test_copysign_nxv4f32_nxv4f16: +; CHECK: // %bb.0: +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: fcvt z0.h, p0/m, z0.s +; CHECK-NEXT: fcvt z1.h, p0/m, z1.s +; CHECK-NEXT: and z1.h, z1.h, #0x8000 +; CHECK-NEXT: and z0.h, z0.h, #0x7fff +; CHECK-NEXT: orr z0.d, z0.d, z1.d +; CHECK-NEXT: ret + %t1 = call @llvm.copysign.v4f32( %a, %b) + %t2 = fptrunc %t1 to + ret %t2 +} + +define @test_copysign_nxv2f64_nxv2f32( %a, %b) #0 { +; CHECK-LABEL: test_copysign_nxv2f64_nxv2f32: +; CHECK: // %bb.0: +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: fcvt z0.s, p0/m, z0.d +; CHECK-NEXT: fcvt z1.s, p0/m, z1.d +; CHECK-NEXT: and z1.s, z1.s, #0x80000000 +; CHECK-NEXT: and z0.s, z0.s, #0x7fffffff +; CHECK-NEXT: orr z0.d, z0.d, z1.d +; CHECK-NEXT: ret + %t1 = call @llvm.copysign.v2f64( %a, %b) + %t2 = fptrunc %t1 to + ret %t2 +} + declare @llvm.copysign.v8f16( %a, %b) #0 attributes #0 = { nounwind }