[llvm-branch-commits] [llvm] release/22.x: [PowerPC] Drop invalid range metadata when lowering i64 load to fp in INT_TO_FP (#198705) (PR #199985)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Wed May 27 06:58:45 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-powerpc

Author: llvmbot

<details>
<summary>Changes</summary>

Backport 78f5f7717a2e058c4d685feb3edb7d991efacbc2

Requested by: @<!-- -->amy-kwan

---
Full diff: https://github.com/llvm/llvm-project/pull/199985.diff


2 Files Affected:

- (modified) llvm/lib/Target/PowerPC/PPCISelLowering.cpp (+3-1) 
- (added) llvm/test/CodeGen/PowerPC/ppc-i64-to-fp.ll (+100) 


``````````diff
diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
index bdba040529d00..8ca207ec67c96 100644
--- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
+++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
@@ -8822,8 +8822,10 @@ SDValue PPCTargetLowering::LowerINT_TO_FP(SDValue Op,
 
     MachineFunction &MF = DAG.getMachineFunction();
     if (canReuseLoadAddress(SINT, MVT::i64, RLI, DAG)) {
+      // Drop range metadata, as this metadata becomes invalid for f64 bit
+      // reinterpretation of i64 values.
       Bits = DAG.getLoad(MVT::f64, dl, RLI.Chain, RLI.Ptr, RLI.MPI,
-                         RLI.Alignment, RLI.MMOFlags(), RLI.AAInfo, RLI.Ranges);
+                         RLI.Alignment, RLI.MMOFlags(), RLI.AAInfo, nullptr);
       if (RLI.ResChain)
         DAG.makeEquivalentMemoryOrdering(RLI.ResChain, Bits.getValue(1));
     } else if (Subtarget.hasLFIWAX() &&
diff --git a/llvm/test/CodeGen/PowerPC/ppc-i64-to-fp.ll b/llvm/test/CodeGen/PowerPC/ppc-i64-to-fp.ll
new file mode 100644
index 0000000000000..b6f58938d03bf
--- /dev/null
+++ b/llvm/test/CodeGen/PowerPC/ppc-i64-to-fp.ll
@@ -0,0 +1,100 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc -mcpu=pwr8 -ppc-asm-full-reg-names -mtriple=powerpc64le-unknown-linux-gnu < %s | \
+; RUN:   FileCheck %s --check-prefix=COMMON
+; RUN: llc -mcpu=pwr8 -ppc-asm-full-reg-names -mtriple=powerpc64-ibm-aix < %s | \
+; RUN:   FileCheck %s --check-prefix=COMMON
+; RUN: llc -mcpu=pwr8 -ppc-asm-full-reg-names -mtriple=powerpc-ibm-aix < %s | \
+; RUN:   FileCheck %s --check-prefix=CHECK-AIX32
+
+; Test that assertions related to the range metadata when converting from i64
+; to i32 does not occur.
+
+define float @case_i64_uitofp_f32(ptr %p) {
+; COMMON-LABEL: case_i64_uitofp_f32:
+; COMMON:       # %bb.0: # %entry
+; COMMON-NEXT:    lfd f0, 0(r3)
+; COMMON-NEXT:    xscvuxdsp f1, f0
+; COMMON-NEXT:    blr
+;
+; CHECK-AIX32-LABEL: case_i64_uitofp_f32:
+; CHECK-AIX32:       # %bb.0: # %entry
+; CHECK-AIX32-NEXT:    lwz r4, 4(r3)
+; CHECK-AIX32-NEXT:    stw r4, -4(r1)
+; CHECK-AIX32-NEXT:    lwz r3, 0(r3)
+; CHECK-AIX32-NEXT:    stw r3, -8(r1)
+; CHECK-AIX32-NEXT:    lfd f0, -8(r1)
+; CHECK-AIX32-NEXT:    xscvuxdsp f1, f0
+; CHECK-AIX32-NEXT:    blr
+entry:
+  %x = load i64, ptr %p, align 8, !range !0
+  %y = uitofp i64 %x to float
+  ret float %y
+}
+
+define double @case_i64_sitofp_f64(ptr %p) {
+; COMMON-LABEL: case_i64_sitofp_f64:
+; COMMON:       # %bb.0: # %entry
+; COMMON-NEXT:    lfd f0, 0(r3)
+; COMMON-NEXT:    xscvsxddp f1, f0
+; COMMON-NEXT:    blr
+;
+; CHECK-AIX32-LABEL: case_i64_sitofp_f64:
+; CHECK-AIX32:       # %bb.0: # %entry
+; CHECK-AIX32-NEXT:    lwz r4, 4(r3)
+; CHECK-AIX32-NEXT:    stw r4, -4(r1)
+; CHECK-AIX32-NEXT:    lwz r3, 0(r3)
+; CHECK-AIX32-NEXT:    stw r3, -8(r1)
+; CHECK-AIX32-NEXT:    lfd f0, -8(r1)
+; CHECK-AIX32-NEXT:    xscvsxddp f1, f0
+; CHECK-AIX32-NEXT:    blr
+entry:
+  %x = load i64, ptr %p, align 8, !range !0
+  %y = sitofp i64 %x to double
+  ret double %y
+}
+
+define double @case_i64_uitofp_f64(ptr %p) {
+; COMMON-LABEL: case_i64_uitofp_f64:
+; COMMON:       # %bb.0: # %entry
+; COMMON-NEXT:    lfd f0, 0(r3)
+; COMMON-NEXT:    xscvuxddp f1, f0
+; COMMON-NEXT:    blr
+;
+; CHECK-AIX32-LABEL: case_i64_uitofp_f64:
+; CHECK-AIX32:       # %bb.0: # %entry
+; CHECK-AIX32-NEXT:    lwz r4, 4(r3)
+; CHECK-AIX32-NEXT:    stw r4, -4(r1)
+; CHECK-AIX32-NEXT:    lwz r3, 0(r3)
+; CHECK-AIX32-NEXT:    stw r3, -8(r1)
+; CHECK-AIX32-NEXT:    lfd f0, -8(r1)
+; CHECK-AIX32-NEXT:    xscvuxddp f1, f0
+; CHECK-AIX32-NEXT:    blr
+entry:
+  %x = load i64, ptr %p, align 8, !range !0
+  %y = uitofp i64 %x to double
+  ret double %y
+}
+
+define float @case_i64_sitofp_f32(ptr %p) {
+; COMMON-LABEL: case_i64_sitofp_f32:
+; COMMON:       # %bb.0: # %entry
+; COMMON-NEXT:    lfd f0, 0(r3)
+; COMMON-NEXT:    xscvsxdsp f1, f0
+; COMMON-NEXT:    blr
+;
+; CHECK-AIX32-LABEL: case_i64_sitofp_f32:
+; CHECK-AIX32:       # %bb.0: # %entry
+; CHECK-AIX32-NEXT:    lwz r4, 4(r3)
+; CHECK-AIX32-NEXT:    stw r4, -4(r1)
+; CHECK-AIX32-NEXT:    lwz r3, 0(r3)
+; CHECK-AIX32-NEXT:    stw r3, -8(r1)
+; CHECK-AIX32-NEXT:    lfd f0, -8(r1)
+; CHECK-AIX32-NEXT:    xscvsxdsp f1, f0
+; CHECK-AIX32-NEXT:    blr
+entry:
+  %x = load i64, ptr %p, align 8, !range !0
+  %y = sitofp i64 %x to float
+  ret float %y
+}
+
+!0 = !{i64 1, i64 0}

``````````

</details>


https://github.com/llvm/llvm-project/pull/199985


More information about the llvm-branch-commits mailing list