[committed] d: vector float comparison doesn't result in 0 or -1 [PR108945]
Checks
Commit Message
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
@@ -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)
new file mode 100644
@@ -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" } }