diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2012-05-31 16:13:25 +0100 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2012-05-31 16:13:25 +0100 |
commit | dd9fbd910a0241d8d4234d802f9e94ae2b971f2b (patch) | |
tree | eae118f4f4d85e114a0d5cacb1b140e9009caf1a /Source/GPUVerify/KernelDualiser.cs | |
parent | 127ee73c43ab3ba092d799a1ff628af2b171a2bb (diff) |
GPUVerify: teach analyses, dualiser and race instrumenter about assigns with multiple LHSs
Diffstat (limited to 'Source/GPUVerify/KernelDualiser.cs')
-rw-r--r-- | Source/GPUVerify/KernelDualiser.cs | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/Source/GPUVerify/KernelDualiser.cs b/Source/GPUVerify/KernelDualiser.cs index 8d51e74e..49b04251 100644 --- a/Source/GPUVerify/KernelDualiser.cs +++ b/Source/GPUVerify/KernelDualiser.cs @@ -147,23 +147,22 @@ namespace GPUVerify {
AssignCmd assign = c as AssignCmd;
- Debug.Assert(assign.Lhss.Count == 1 && assign.Rhss.Count == 1);
-
- if (assign.Lhss[0] is SimpleAssignLhs &&
- verifier.uniformityAnalyser.IsUniform(procName, (assign.Lhss[0] as SimpleAssignLhs).AssignedVariable.Name))
+ if (assign.Lhss.All(lhs =>
+ lhs is SimpleAssignLhs &&
+ verifier.uniformityAnalyser.IsUniform(procName, (lhs as SimpleAssignLhs).AssignedVariable.Name)))
{
cs.Add(assign);
}
else
{
- List<AssignLhs> newLhss = new List<AssignLhs>();
- List<Expr> newRhss = new List<Expr>();
-
- newLhss.Add(new VariableDualiser(1, verifier.uniformityAnalyser, procName).Visit(assign.Lhss.ElementAt(0).Clone() as AssignLhs) as AssignLhs);
- newLhss.Add(new VariableDualiser(2, verifier.uniformityAnalyser, procName).Visit(assign.Lhss.ElementAt(0).Clone() as AssignLhs) as AssignLhs);
-
- newRhss.Add(new VariableDualiser(1, verifier.uniformityAnalyser, procName).VisitExpr(assign.Rhss.ElementAt(0).Clone() as Expr));
- newRhss.Add(new VariableDualiser(2, verifier.uniformityAnalyser, procName).VisitExpr(assign.Rhss.ElementAt(0).Clone() as Expr));
+ List<AssignLhs> newLhss = assign.Lhss.SelectMany(lhs => new AssignLhs[] {
+ new VariableDualiser(1, verifier.uniformityAnalyser, procName).Visit(lhs.Clone() as AssignLhs) as AssignLhs,
+ new VariableDualiser(2, verifier.uniformityAnalyser, procName).Visit(lhs.Clone() as AssignLhs) as AssignLhs
+ }).ToList();
+ List<Expr> newRhss = assign.Rhss.SelectMany(rhs => new Expr[] {
+ new VariableDualiser(1, verifier.uniformityAnalyser, procName).VisitExpr(rhs.Clone() as Expr),
+ new VariableDualiser(2, verifier.uniformityAnalyser, procName).VisitExpr(rhs.Clone() as Expr)
+ }).ToList();
AssignCmd newAssign = new AssignCmd(assign.tok, newLhss, newRhss);
|