private static bool IsDisjunctionOfPredicates(Expr guard) { if (!(guard is NAryExpr)) { return(false); } NAryExpr nary = (NAryExpr)guard; if (nary.Args.Count() != 2) { return(false); } if (!(nary.Fun is BinaryOperator)) { return(false); } BinaryOperator binOp = (BinaryOperator)nary.Fun; if (binOp.Op != BinaryOperator.Opcode.Or) { return(false); } if (!(nary.Args[0] is IdentifierExpr && nary.Args[1] is IdentifierExpr)) { return(false); } return(GPUVerifier.IsPredicate(GVUtil.StripThreadIdentifier( ((IdentifierExpr)nary.Args[0]).Name)) && GPUVerifier.IsPredicate(GVUtil.StripThreadIdentifier( ((IdentifierExpr)nary.Args[1]).Name))); }
private static bool IsDisjunctionOfPredicates(Expr guard) { NAryExpr nary = guard as NAryExpr; if (nary == null || nary.Args.Count() != 2) { return(false); } BinaryOperator binOp = nary.Fun as BinaryOperator; if (binOp == null || binOp.Op != BinaryOperator.Opcode.Or) { return(false); } if (!(nary.Args[0] is IdentifierExpr && nary.Args[1] is IdentifierExpr)) { return(false); } return(GPUVerifier.IsPredicate(Utilities.StripThreadIdentifier(((IdentifierExpr)nary.Args[0]).Name)) && GPUVerifier.IsPredicate(Utilities.StripThreadIdentifier(((IdentifierExpr)nary.Args[1]).Name))); }
private void AddBarrierDivergenceCandidates(HashSet <Variable> localVars, Implementation impl, IRegion region) { if (!verifier.ContainsBarrierCall(region) && !GPUVerifyVCGenCommandLineOptions.WarpSync) { return; } Expr guard = region.Guard(); if (guard != null && verifier.UniformityAnalyser.IsUniform(impl.Name, guard)) { return; } if (IsDisjunctionOfPredicates(guard)) { string loopPredicate = ((guard as NAryExpr).Args[0] as IdentifierExpr).Name; loopPredicate = loopPredicate.Substring(0, loopPredicate.IndexOf('$')); // Int type used here, but it doesn't matter as we will print and then re-parse the program var uniformEnabledPredicate = Expr.Eq( new IdentifierExpr(Token.NoToken, new LocalVariable(Token.NoToken, new TypedIdent(Token.NoToken, loopPredicate + "$1", Type.Int))), new IdentifierExpr(Token.NoToken, new LocalVariable(Token.NoToken, new TypedIdent(Token.NoToken, loopPredicate + "$2", Type.Int)))); verifier.AddCandidateInvariant(region, uniformEnabledPredicate, "loopPredicateEquality"); verifier.AddCandidateInvariant(region, Expr.Imp(verifier.ThreadsInSameGroup(), uniformEnabledPredicate), "loopPredicateEquality"); Dictionary <string, int> assignmentCounts = GetAssignmentCounts(impl); HashSet <string> alreadyConsidered = new HashSet <string>(); foreach (var v in localVars) { string lv = Utilities.StripThreadIdentifier(v.Name); if (alreadyConsidered.Contains(lv)) { continue; } alreadyConsidered.Add(lv); if (verifier.UniformityAnalyser.IsUniform(impl.Name, v.Name)) { continue; } if (GPUVerifier.IsPredicate(lv)) { continue; } if (!assignmentCounts.ContainsKey(lv) || assignmentCounts[lv] <= 1) { continue; } if (!verifier.ContainsNamedVariable(region.GetModifiedVariables(), lv)) { continue; } AddPredicatedEqualityCandidateInvariant(region, loopPredicate, new LocalVariable(Token.NoToken, new TypedIdent(Token.NoToken, lv, Type.Int))); } } }