diff mbox series

[committed] d: vector float comparison doesn't result in 0 or -1 [PR108945]

Message ID 20230303002411.4153820-1-ibuclaw@gdcproject.org
State New
Headers show
Series [committed] d: vector float comparison doesn't result in 0 or -1 [PR108945] | expand

Commit Message

Iain Buclaw March 3, 2023, 12:24 a.m. UTC
Hi,

When comparing two vectors, the type of vector was used as the result of
the condition result.  This meant that for floating point comparisons,
each value would either be `0.0' or `-1.0' reinterpreted as an integer,
not the expected integral bitmask values `0' and `-1'.

Instead, use the comparison type determined by truth_type_for as the
result of the comparison.  If a reinterpret is later required by the
final conversion for generating CmpExp, it is still only going to
reinterpret one integer kind as another.

Bootstrapped and regression tested on x86_64-linux-gnu/-m32, and
committed to mainline.

Regards,
Iain.

---
	PR d/108945

gcc/d/ChangeLog:

	* d-codegen.cc (build_boolop): Evaluate vector comparison as
	the truth_type_for vector type.

gcc/testsuite/ChangeLog:

	* gdc.dg/pr108945.d: New test.
---
 gcc/d/d-codegen.cc              |  9 ++++-----
 gcc/testsuite/gdc.dg/pr108945.d | 12 ++++++++++++
 2 files changed, 16 insertions(+), 5 deletions(-)
 create mode 100644 gcc/testsuite/gdc.dg/pr108945.d
diff mbox series

Patch

diff --git a/gcc/d/d-codegen.cc b/gcc/d/d-codegen.cc
index 0e8e07366ee..5a041927ec9 100644
--- a/gcc/d/d-codegen.cc
+++ b/gcc/d/d-codegen.cc
@@ -1453,13 +1453,12 @@  build_boolop (tree_code code, tree arg0, tree arg1)
     {
       /* Build a vector comparison.
 	 VEC_COND_EXPR <e1 op e2, { -1, -1, -1, -1 }, { 0, 0, 0, 0 }>; */
-      tree type = TREE_TYPE (arg0);
-      tree cmptype = truth_type_for (type);
+      tree cmptype = truth_type_for (TREE_TYPE (arg0));
       tree cmp = fold_build2_loc (input_location, code, cmptype, arg0, arg1);
 
-      return fold_build3_loc (input_location, VEC_COND_EXPR, type, cmp,
-			      build_minus_one_cst (type),
-			      build_zero_cst (type));
+      return fold_build3_loc (input_location, VEC_COND_EXPR, cmptype, cmp,
+			      build_minus_one_cst (cmptype),
+			      build_zero_cst (cmptype));
     }
 
   if (code == EQ_EXPR || code == NE_EXPR)
diff --git a/gcc/testsuite/gdc.dg/pr108945.d b/gcc/testsuite/gdc.dg/pr108945.d
new file mode 100644
index 00000000000..03b9de8e758
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/pr108945.d
@@ -0,0 +1,12 @@ 
+// { dg-options "-fdump-tree-gimple" }
+// { dg-additional-options "-mavx" { target avx_runtime } }
+// { dg-do compile { target { avx_runtime || vect_sizes_16B_8B } } }
+
+alias f4 = __vector(float[4]);
+
+auto pr108945(f4 a, f4 b)
+{
+    return a < b;
+}
+
+// { dg-final { scan-tree-dump-not "VEC_COND_EXPR" "gimple" } }