[1/7] OpenMP: Bug fixes for comparing context selectors

Message ID 20250210180725.2076678-2-sloosemore@baylibre.com
State Committed
Commit 84854ce5b84c86aed23016de5ca05372bc7fa7cf
Headers
Series OpenMP: Implement "begin declare variant" |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_simplebootstrap_build--master-arm-bootstrap fail Patch failed to apply
linaro-tcwg-bot/tcwg_gcc_build--master-arm fail Patch failed to apply

Commit Message

Sandra Loosemore Feb. 10, 2025, 6:07 p.m. UTC
  gcc/ChangeLog
	* omp-general.cc (omp_context_selector_props_compare): Handle
	arbitrary expressions in the "user" and "device_num" selectors.
	(omp_context_selector_set_compare): Detect mismatch when one
	selector specifies a score and the other doesn't.
---
 gcc/omp-general.cc | 26 +++++++++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)
  

Comments

Tobias Burnus Feb. 10, 2025, 6:25 p.m. UTC | #1
Sandra Loosemore wrote:
> gcc/ChangeLog
> 	* omp-general.cc (omp_context_selector_props_compare): Handle
> 	arbitrary expressions in the "user" and "device_num" selectors.
> 	(omp_context_selector_set_compare): Detect mismatch when one
> 	selector specifies a score and the other doesn't.

LGTM.

Thanks for the bug fix!

Tobias
  

Patch

diff --git a/gcc/omp-general.cc b/gcc/omp-general.cc
index 2ce79bfc9d8..0d6f02ece31 100644
--- a/gcc/omp-general.cc
+++ b/gcc/omp-general.cc
@@ -2350,8 +2350,26 @@  omp_context_selector_props_compare (enum omp_tss_code set,
 		  if (set == OMP_TRAIT_SET_USER
 		      && sel == OMP_TRAIT_USER_CONDITION)
 		    {
-		      if (integer_zerop (OMP_TP_VALUE (p1))
-			  != integer_zerop (OMP_TP_VALUE (p2)))
+		      /* Recognize constants that have equal truth values,
+			 otherwise assume all expressions are unique.  */
+		      tree v1 = OMP_TP_VALUE (p1);
+		      tree v2 = OMP_TP_VALUE (p2);
+		      if (TREE_CODE (v1) != INTEGER_CST
+			  || TREE_CODE (v2) != INTEGER_CST
+			  || integer_zerop (v1) != integer_zerop (v2))
+			return 2;
+		      break;
+		    }
+		  if (set == OMP_TRAIT_SET_TARGET_DEVICE
+		      && sel == OMP_TRAIT_DEVICE_NUM)
+		    {
+		      /* Recognize constants that have equal values,
+			 otherwise assume all expressions are unique.  */
+		      tree v1 = OMP_TP_VALUE (p1);
+		      tree v2 = OMP_TP_VALUE (p2);
+		      if (TREE_CODE (v1) != INTEGER_CST
+			  || TREE_CODE (v2) != INTEGER_CST
+			  || tree_int_cst_compare (v1, v2) != 0)
 			return 2;
 		      break;
 		    }
@@ -2469,7 +2487,9 @@  omp_context_selector_set_compare (enum omp_tss_code set, tree ctx1, tree ctx2)
 	  {
 	    tree score1 = OMP_TS_SCORE (ts1);
 	    tree score2 = OMP_TS_SCORE (ts2);
-	    if (score1 && score2 && !simple_cst_equal (score1, score2))
+	    if ((score1 && score2 && !simple_cst_equal (score1, score2))
+		|| (score1 && !score2)
+		|| (!score1 && score2))
 	      return 2;
 
 	    int r = omp_context_selector_props_compare (set, OMP_TS_CODE (ts1),