Skip to content

Commit

Permalink
d: vector float comparison doesn't result in 0 or -1 [PR108945]
Browse files Browse the repository at this point in the history
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.

	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.
  • Loading branch information
ibuclaw committed Mar 3, 2023
1 parent 14db9ed commit 51af8a6
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 5 deletions.
9 changes: 4 additions & 5 deletions gcc/d/d-codegen.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
12 changes: 12 additions & 0 deletions gcc/testsuite/gdc.dg/pr108945.d
Original file line number Diff line number Diff line change
@@ -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" } }

0 comments on commit 51af8a6

Please sign in to comment.