[llvm] [AMDGPU] Carry the log expansion flags through its f32 round trip (PR #219724)

via llvm-commits llvm-commits at lists.llvm.org
Sat Aug 29 13:33:58 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-globalisel

Author: Dmitry Sidorov (MrSidims)

<details>
<summary>Changes</summary>

The f16 log and log10 expansion promotes to f32 and rounds back. GlobalISel built that G_FPEXT and G_FPTRUNC pair with no flags at all, where the SelectionDAG FP_EXTEND and FP_ROUND have always carried them, so hand them the expansion's flags too.

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


3 Files Affected:

- (modified) llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp (+2-2) 
- (modified) llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-flog.mir (+28) 
- (modified) llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-flog10.mir (+28) 


``````````diff
diff --git a/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp b/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp
index 7c1a26f761c96..5e3e7ca8e4e0d 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp
@@ -3748,9 +3748,9 @@ bool AMDGPULegalizerInfo::legalizeFlogCommon(MachineInstr &MI,
         Ty == F16 && (!MI.getFlag(MachineInstr::FmAfn) || !ST.has16BitInsts());
     if (PromoteToF32) {
       Register LogVal = MRI.createGenericVirtualRegister(F32);
-      auto PromoteSrc = B.buildFPExt(F32, X);
+      auto PromoteSrc = B.buildFPExt(F32, X, Flags);
       legalizeFlogUnsafe(B, LogVal, PromoteSrc.getReg(0), IsLog10, Flags);
-      B.buildFPTrunc(Dst, LogVal);
+      B.buildFPTrunc(Dst, LogVal, Flags);
     } else {
       legalizeFlogUnsafe(B, Dst, X, IsLog10, Flags);
     }
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-flog.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-flog.mir
index 9c5c243a76138..668892f26e64d 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-flog.mir
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-flog.mir
@@ -227,6 +227,34 @@ body: |
 
 ...
 
+---
+name: test_flog_f16_contract
+body: |
+  bb.0:
+    liveins: $vgpr0
+
+    ; CHECK-LABEL: name: test_flog_f16_contract
+    ; CHECK: liveins: $vgpr0
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(i32) = COPY $vgpr0
+    ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(f16) = G_TRUNC [[COPY]](i32)
+    ; CHECK-NEXT: [[FPEXT:%[0-9]+]]:_(f32) = contract G_FPEXT [[TRUNC]](f16)
+    ; CHECK-NEXT: [[INT:%[0-9]+]]:_(f32) = contract G_INTRINSIC intrinsic(@llvm.amdgcn.log), [[FPEXT]](f32)
+    ; CHECK-NEXT: [[C:%[0-9]+]]:_(f32) = G_FCONSTANT float f0x3F317218
+    ; CHECK-NEXT: [[FMUL:%[0-9]+]]:_(f32) = contract G_FMUL [[INT]], [[C]]
+    ; CHECK-NEXT: [[FPTRUNC:%[0-9]+]]:_(f16) = contract G_FPTRUNC [[FMUL]](f32)
+    ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(i32) = G_ANYEXT [[FPTRUNC]](f16)
+    ; CHECK-NEXT: $vgpr0 = COPY [[ANYEXT]](i32)
+    %0:_(i32) = COPY $vgpr0
+    %1:_(i16) = G_TRUNC %0
+    %2:_(f16) = G_BITCAST %1
+    %3:_(f16) = contract G_FLOG %2
+    %4:_(i16) = G_BITCAST %3
+    %5:_(i32) = G_ANYEXT %4
+    $vgpr0 = COPY %5
+
+...
+
 ---
 name: test_flog_v2f16
 body: |
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-flog10.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-flog10.mir
index bd5a8fea2b6c2..f2951ef0e35fe 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-flog10.mir
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-flog10.mir
@@ -227,6 +227,34 @@ body: |
 
 ...
 
+---
+name: test_flog10_f16_contract
+body: |
+  bb.0:
+    liveins: $vgpr0
+
+    ; CHECK-LABEL: name: test_flog10_f16_contract
+    ; CHECK: liveins: $vgpr0
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(i32) = COPY $vgpr0
+    ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(f16) = G_TRUNC [[COPY]](i32)
+    ; CHECK-NEXT: [[FPEXT:%[0-9]+]]:_(f32) = contract G_FPEXT [[TRUNC]](f16)
+    ; CHECK-NEXT: [[INT:%[0-9]+]]:_(f32) = contract G_INTRINSIC intrinsic(@llvm.amdgcn.log), [[FPEXT]](f32)
+    ; CHECK-NEXT: [[C:%[0-9]+]]:_(f32) = G_FCONSTANT float 3.010300e-01
+    ; CHECK-NEXT: [[FMUL:%[0-9]+]]:_(f32) = contract G_FMUL [[INT]], [[C]]
+    ; CHECK-NEXT: [[FPTRUNC:%[0-9]+]]:_(f16) = contract G_FPTRUNC [[FMUL]](f32)
+    ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(i32) = G_ANYEXT [[FPTRUNC]](f16)
+    ; CHECK-NEXT: $vgpr0 = COPY [[ANYEXT]](i32)
+    %0:_(i32) = COPY $vgpr0
+    %1:_(i16) = G_TRUNC %0
+    %2:_(f16) = G_BITCAST %1
+    %3:_(f16) = contract G_FLOG10 %2
+    %4:_(i16) = G_BITCAST %3
+    %5:_(i32) = G_ANYEXT %4
+    $vgpr0 = COPY %5
+
+...
+
 ---
 name: test_flog10_v2f16
 body: |

``````````

</details>


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


More information about the llvm-commits mailing list