[llvm] 18d181c - [SPIR-V] Fix swapped type sets in G_LROUND/G_LLROUND legalization (#218998)

via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 9 07:18:09 PDT 2026


Author: Arseniy Obolenskiy
Date: 2026-09-09T16:18:03+02:00
New Revision: 18d181c5ea1f4a8bf12c92f6df2d8d8e5c820c0b

URL: https://github.com/llvm/llvm-project/commit/18d181c5ea1f4a8bf12c92f6df2d8d8e5c820c0b
DIFF: https://github.com/llvm/llvm-project/commit/18d181c5ea1f4a8bf12c92f6df2d8d8e5c820c0b.diff

LOG: [SPIR-V] Fix swapped type sets in G_LROUND/G_LLROUND legalization (#218998)

Result and source types were reversed, only working by luck at widths
where LLT cannot tell int from float, fixes i8 results

Added: 
    

Modified: 
    llvm/lib/Target/SPIRV/SPIRVLegalizerInfo.cpp
    llvm/test/CodeGen/SPIRV/llvm-intrinsics/llround.ll
    llvm/test/CodeGen/SPIRV/llvm-intrinsics/lround.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/SPIRV/SPIRVLegalizerInfo.cpp b/llvm/lib/Target/SPIRV/SPIRVLegalizerInfo.cpp
index 96397a5b506c1..b5d43a6074bc5 100644
--- a/llvm/lib/Target/SPIRV/SPIRVLegalizerInfo.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVLegalizerInfo.cpp
@@ -545,8 +545,8 @@ SPIRVLegalizerInfo::SPIRVLegalizerInfo(const SPIRVSubtarget &ST) {
   MulFix.lower();
 
   getActionDefinitionsBuilder({G_LROUND, G_LLROUND})
-      .legalForCartesianProduct(allFloatScalarsAndVectors,
-                                allIntScalarsAndVectors);
+      .legalForCartesianProduct(allIntScalarsAndVectors,
+                                allFloatScalarsAndVectors);
 
   // FP conversions.
   getActionDefinitionsBuilder({G_FPTRUNC, G_FPEXT})

diff  --git a/llvm/test/CodeGen/SPIRV/llvm-intrinsics/llround.ll b/llvm/test/CodeGen/SPIRV/llvm-intrinsics/llround.ll
index 2695237508af0..f8189e42e9ce6 100644
--- a/llvm/test/CodeGen/SPIRV/llvm-intrinsics/llround.ll
+++ b/llvm/test/CodeGen/SPIRV/llvm-intrinsics/llround.ll
@@ -6,11 +6,14 @@
 ; CHECK-DAG:      [[i32:%[0-9]+]] = OpTypeInt 32 0
 ; CHECK-DAG:      [[f64:%[0-9]+]] = OpTypeFloat 64
 ; CHECK-DAG:      [[i64:%[0-9]+]] = OpTypeInt 64 0
+; CHECK-DAG:      [[i8:%[0-9]+]] = OpTypeInt 8 0
 ; CHECK-DAG:      [[vecf32:%[0-9]+]] = OpTypeVector [[f32]]
 ; CHECK-DAG:      [[veci32:%[0-9]+]] = OpTypeVector [[i32]]
 ; CHECK-DAG:      [[vecf64:%[0-9]+]] = OpTypeVector [[f64]]
 ; CHECK-DAG:      [[veci64:%[0-9]+]] = OpTypeVector [[i64]]
 
+; CHECK:      [[rounded_i8_f32:%[0-9]+]] = OpExtInst [[f32]] [[opencl]] round %[[#]]
+; CHECK-NEXT:      %[[#]] = OpConvertFToS [[i8]] [[rounded_i8_f32]]
 ; CHECK:      [[rounded_i32_f32:%[0-9]+]] = OpExtInst [[f32]] [[opencl]] round %[[#]]
 ; CHECK-NEXT:      %[[#]] = OpConvertFToS [[i32]] [[rounded_i32_f32]]
 ; CHECK:      [[rounded_i32_f64:%[0-9]+]] = OpExtInst [[f64]] [[opencl]] round %[[#]]
@@ -28,6 +31,12 @@
 ; CHECK:      [[rounded_v4i64_f64:%[0-9]+]] = OpExtInst [[vecf64]] [[opencl]] round %[[#]]
 ; CHECK-NEXT:      %[[#]] = OpConvertFToS [[veci64]] [[rounded_v4i64_f64]]
 
+define spir_func i8 @test_llround_i8_f32(float %arg0) {
+entry:
+  %0 = call i8 @llvm.llround.i8.f32(float %arg0)
+  ret i8 %0
+}
+
 define spir_func i32 @test_llround_i32_f32(float %arg0) {
 entry:
   %0 = call i32 @llvm.llround.i32.f32(float %arg0)
@@ -76,6 +85,7 @@ entry:
   ret <4 x i64> %0
 }
  
+declare i8 @llvm.llround.i8.f32(float)
 declare i32 @llvm.llround.i32.f32(float)
 declare i32 @llvm.llround.i32.f64(double)
 declare i64 @llvm.llround.i64.f32(float)

diff  --git a/llvm/test/CodeGen/SPIRV/llvm-intrinsics/lround.ll b/llvm/test/CodeGen/SPIRV/llvm-intrinsics/lround.ll
index 891f1ceb5b238..86f6573a2577a 100644
--- a/llvm/test/CodeGen/SPIRV/llvm-intrinsics/lround.ll
+++ b/llvm/test/CodeGen/SPIRV/llvm-intrinsics/lround.ll
@@ -6,11 +6,14 @@
 ; CHECK-DAG:      [[i32:%[0-9]+]] = OpTypeInt 32 0
 ; CHECK-DAG:      [[f64:%[0-9]+]] = OpTypeFloat 64
 ; CHECK-DAG:      [[i64:%[0-9]+]] = OpTypeInt 64 0
+; CHECK-DAG:      [[i8:%[0-9]+]] = OpTypeInt 8 0
 ; CHECK-DAG:      [[vecf32:%[0-9]+]] = OpTypeVector [[f32]]
 ; CHECK-DAG:      [[veci32:%[0-9]+]] = OpTypeVector [[i32]]
 ; CHECK-DAG:      [[vecf64:%[0-9]+]] = OpTypeVector [[f64]]
 ; CHECK-DAG:      [[veci64:%[0-9]+]] = OpTypeVector [[i64]]
 
+; CHECK:      [[rounded_i8_f32:%[0-9]+]] = OpExtInst [[f32]] [[opencl]] round %[[#]]
+; CHECK-NEXT:      %[[#]] = OpConvertFToS [[i8]] [[rounded_i8_f32]]
 ; CHECK:      [[rounded_i32_f32:%[0-9]+]] = OpExtInst [[f32]] [[opencl]] round %[[#]]
 ; CHECK-NEXT:      %[[#]] = OpConvertFToS [[i32]] [[rounded_i32_f32]]
 ; CHECK:      [[rounded_i32_f64:%[0-9]+]] = OpExtInst [[f64]] [[opencl]] round %[[#]]
@@ -28,6 +31,12 @@
 ; CHECK:      [[rounded_v4i64_f64:%[0-9]+]] = OpExtInst [[vecf64]] [[opencl]] round %[[#]]
 ; CHECK-NEXT:      %[[#]] = OpConvertFToS [[veci64]] [[rounded_v4i64_f64]]
 
+define spir_func i8 @test_lround_i8_f32(float %arg0) {
+entry:
+  %0 = call i8 @llvm.lround.i8.f32(float %arg0)
+  ret i8 %0
+}
+
 define spir_func i32 @test_lround_i32_f32(float %arg0) {
 entry:
   %0 = call i32 @llvm.lround.i32.f32(float %arg0)
@@ -76,6 +85,7 @@ entry:
   ret <4 x i64> %0
 }
  
+declare i8 @llvm.lround.i8.f32(float)
 declare i32 @llvm.lround.i32.f32(float)
 declare i32 @llvm.lround.i32.f64(double)
 declare i64 @llvm.lround.i64.f32(float)


        


More information about the llvm-commits mailing list