summaryrefslogtreecommitdiff
path: root/Source/GPUVerify/Predicator.cs
diff options
context:
space:
mode:
authorGravatar Unknown <afd@afd-THINK.doc.ic.ac.uk>2012-04-10 16:05:49 +0100
committerGravatar Unknown <afd@afd-THINK.doc.ic.ac.uk>2012-04-10 16:05:49 +0100
commit4edf7a11a3664e37b86938918717f52325311453 (patch)
treede15b3f88bce5a6cd0414890e4197b77d5462e78 /Source/GPUVerify/Predicator.cs
parent8bd29197662d520cda00f44ac2824a29d30a85df (diff)
Added invariant to predicated loops.
Diffstat (limited to 'Source/GPUVerify/Predicator.cs')
-rw-r--r--Source/GPUVerify/Predicator.cs10
1 files changed, 10 insertions, 0 deletions
diff --git a/Source/GPUVerify/Predicator.cs b/Source/GPUVerify/Predicator.cs
index 7fc0fcd3..0950cd9a 100644
--- a/Source/GPUVerify/Predicator.cs
+++ b/Source/GPUVerify/Predicator.cs
@@ -212,6 +212,8 @@ namespace GPUVerify
string LoopPredicate = null;
List<AssignLhs> WhilePredicateLhss = new List<AssignLhs>();
+ PredicateCmd NewInvariant = null;
+
if (!enclosingLoopPredicate.Peek().Equals(Expr.True) ||
!verifier.uniformityAnalyser.IsUniform(impl.Name, whileCmd.Guard) ||
!verifier.uniformityAnalyser.IsUniform(impl.Name, whileCmd))
@@ -231,6 +233,8 @@ namespace GPUVerify
WhilePredicateRhss.Add(GetCurrentPredicate().Equals(Expr.True) ?
whileCmd.Guard : Expr.And(GetCurrentPredicate(), whileCmd.Guard));
+ NewInvariant = new AssertCmd(Token.NoToken, Expr.Imp(PredicateExpr, WhilePredicateRhss[0]));
+
firstBigBlock.simpleCmds.Add(new AssignCmd(whileCmd.tok, WhilePredicateLhss, WhilePredicateRhss));
NewGuard = PredicateExpr;
@@ -246,6 +250,12 @@ namespace GPUVerify
WhileCmd NewWhile = new WhileCmd(whileCmd.tok, NewGuard,
VisitWhileInvariants(whileCmd.Invariants, NewGuard),
VisitStmtList(whileCmd.Body));
+
+ if (NewInvariant != null)
+ {
+ NewWhile.Invariants.Add(NewInvariant);
+ }
+
enclosingLoopPredicate.Pop();
predicate.Pop();