summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/GPUVerify/BinaryBarrierInvariantDescriptor.cs4
-rw-r--r--Source/GPUVerify/GPUVerifier.cs33
-rw-r--r--Source/GPUVerify/KernelDualiser.cs22
-rw-r--r--Source/GPUVerify/RaceInstrumenter.cs7
-rw-r--r--Source/VCGeneration/UniformityAnalyser.cs10
5 files changed, 50 insertions, 26 deletions
diff --git a/Source/GPUVerify/BinaryBarrierInvariantDescriptor.cs b/Source/GPUVerify/BinaryBarrierInvariantDescriptor.cs
index 8d8f75ec..8be05ecb 100644
--- a/Source/GPUVerify/BinaryBarrierInvariantDescriptor.cs
+++ b/Source/GPUVerify/BinaryBarrierInvariantDescriptor.cs
@@ -21,7 +21,7 @@ namespace GPUVerify {
}
internal override AssertCmd GetAssertCmd() {
- var vd = new VariableDualiser(1, null, null);
+ var vd = new VariableDualiser(1, Dualiser.verifier.uniformityAnalyser, ProcName);
return new AssertCmd(
Token.NoToken,
Expr.Imp(GPUVerifier.ThreadsInSameGroup(),
@@ -34,7 +34,7 @@ namespace GPUVerify {
foreach (var Instantiation in InstantiationExprPairs) {
foreach (var Thread in new int[] { 1, 2 }) {
- var vd = new VariableDualiser(Thread, null, null);
+ var vd = new VariableDualiser(Thread, Dualiser.verifier.uniformityAnalyser, ProcName);
var ThreadInstantiationExpr = vd.VisitExpr(Instantiation.Item1);
var OtherThreadInstantiationExpr = vd.VisitExpr(Instantiation.Item2);
diff --git a/Source/GPUVerify/GPUVerifier.cs b/Source/GPUVerify/GPUVerifier.cs
index f94cf5ef..216954c5 100644
--- a/Source/GPUVerify/GPUVerifier.cs
+++ b/Source/GPUVerify/GPUVerifier.cs
@@ -1023,17 +1023,17 @@ namespace GPUVerify
Expr.Or(
Expr.Or(
Expr.Neq(
- new IdentifierExpr(tok, MakeThreadId(tok, "X", 1)),
- new IdentifierExpr(tok, MakeThreadId(tok, "X", 2))
+ new IdentifierExpr(tok, MakeThreadId("X", 1)),
+ new IdentifierExpr(tok, MakeThreadId("X", 2))
),
Expr.Neq(
- new IdentifierExpr(tok, MakeThreadId(tok, "Y", 1)),
- new IdentifierExpr(tok, MakeThreadId(tok, "Y", 2))
+ new IdentifierExpr(tok, MakeThreadId("Y", 1)),
+ new IdentifierExpr(tok, MakeThreadId("Y", 2))
)
),
Expr.Neq(
- new IdentifierExpr(tok, MakeThreadId(tok, "Z", 1)),
- new IdentifierExpr(tok, MakeThreadId(tok, "Z", 2))
+ new IdentifierExpr(tok, MakeThreadId("Z", 1)),
+ new IdentifierExpr(tok, MakeThreadId("Z", 2))
)
);
@@ -1196,14 +1196,14 @@ namespace GPUVerify
Expr ThreadIdNonNegative =
GetTypeOfId(dimension).Equals(Microsoft.Boogie.Type.GetBvType(32)) ?
- MakeBVSge(new IdentifierExpr(tok, MakeThreadId(tok, dimension)), ZeroBV())
+ MakeBVSge(new IdentifierExpr(tok, MakeThreadId(dimension)), ZeroBV())
:
- Expr.Ge(new IdentifierExpr(tok, MakeThreadId(tok, dimension)), Zero());
+ Expr.Ge(new IdentifierExpr(tok, MakeThreadId(dimension)), Zero());
Expr ThreadIdLessThanGroupSize =
GetTypeOfId(dimension).Equals(Microsoft.Boogie.Type.GetBvType(32)) ?
- MakeBVSlt(new IdentifierExpr(tok, MakeThreadId(tok, dimension)), new IdentifierExpr(tok, GetGroupSize(dimension)))
+ MakeBVSlt(new IdentifierExpr(tok, MakeThreadId(dimension)), new IdentifierExpr(tok, GetGroupSize(dimension)))
:
- Expr.Lt(new IdentifierExpr(tok, MakeThreadId(tok, dimension)), new IdentifierExpr(tok, GetGroupSize(dimension)));
+ Expr.Lt(new IdentifierExpr(tok, MakeThreadId(dimension)), new IdentifierExpr(tok, GetGroupSize(dimension)));
Proc.Requires.Add(new Requires(false, new VariableDualiser(1, null, null).VisitExpr(ThreadIdNonNegative)));
Proc.Requires.Add(new Requires(false, new VariableDualiser(2, null, null).VisitExpr(ThreadIdNonNegative)));
@@ -1329,7 +1329,7 @@ namespace GPUVerify
return null;
}
- internal Constant MakeThreadId(IToken tok, string dimension)
+ internal static Constant MakeThreadId(string dimension)
{
Contract.Requires(dimension.Equals("X") || dimension.Equals("Y") || dimension.Equals("Z"));
string name = null;
@@ -1337,13 +1337,14 @@ namespace GPUVerify
if (dimension.Equals("Y")) name = _Y.Name;
if (dimension.Equals("Z")) name = _Z.Name;
Debug.Assert(name != null);
- return new Constant(tok, new TypedIdent(tok, name, GetTypeOfId(dimension)));
+ return new Constant(Token.NoToken, new TypedIdent(Token.NoToken, name, GetTypeOfId(dimension)));
}
- internal Constant MakeThreadId(IToken tok, string dimension, int number)
+ internal static Constant MakeThreadId(string dimension, int number)
{
- Constant resultWithoutThreadId = MakeThreadId(tok, dimension);
- return new Constant(tok, new TypedIdent(tok, resultWithoutThreadId.Name + "$" + number, GetTypeOfId(dimension)));
+ Constant resultWithoutThreadId = MakeThreadId(dimension);
+ return new Constant(Token.NoToken, new TypedIdent(
+ Token.NoToken, resultWithoutThreadId.Name + "$" + number, GetTypeOfId(dimension)));
}
internal static Constant GetGroupId(string dimension)
@@ -2142,7 +2143,7 @@ namespace GPUVerify
{
return MakeBVAdd(MakeBVMul(
new IdentifierExpr(Token.NoToken, GetGroupId(dimension)), new IdentifierExpr(Token.NoToken, GetGroupSize(dimension))),
- new IdentifierExpr(Token.NoToken, MakeThreadId(Token.NoToken, dimension)));
+ new IdentifierExpr(Token.NoToken, MakeThreadId(dimension)));
}
internal IRegion RootRegion(Implementation Impl)
diff --git a/Source/GPUVerify/KernelDualiser.cs b/Source/GPUVerify/KernelDualiser.cs
index d2b921f2..3a2a1776 100644
--- a/Source/GPUVerify/KernelDualiser.cs
+++ b/Source/GPUVerify/KernelDualiser.cs
@@ -445,12 +445,24 @@ namespace GPUVerify {
return InstantiationExpr.Clone() as Expr;
}
- Debug.Assert(node.Decl is Constant ||
- QKeyValue.FindBoolAttribute(node.Decl.Attributes, "global") ||
- QKeyValue.FindBoolAttribute(node.Decl.Attributes, "group_shared") ||
- (Uni != null && Uni.IsUniform(ProcName, node.Decl.Name)));
+ if(node.Decl is Constant ||
+ QKeyValue.FindBoolAttribute(node.Decl.Attributes, "global") ||
+ QKeyValue.FindBoolAttribute(node.Decl.Attributes, "group_shared") ||
+ (Uni != null && Uni.IsUniform(ProcName, node.Decl.Name))) {
+ return base.VisitIdentifierExpr(node);
+ }
- return base.VisitIdentifierExpr(node);
+ if (InstantiationExprIsThreadId()) {
+ return new VariableDualiser(Thread, Uni, ProcName).VisitIdentifierExpr(node);
+ }
+
+ Debug.Assert(false);
+ return null;
+ }
+
+ private bool InstantiationExprIsThreadId() {
+ return (InstantiationExpr is IdentifierExpr) &&
+ ((IdentifierExpr)InstantiationExpr).Decl.Name.Equals(GPUVerifier.MakeThreadId("X", Thread).Name);
}
public override Expr VisitNAryExpr(NAryExpr node) {
diff --git a/Source/GPUVerify/RaceInstrumenter.cs b/Source/GPUVerify/RaceInstrumenter.cs
index 71214cb3..f3b9194b 100644
--- a/Source/GPUVerify/RaceInstrumenter.cs
+++ b/Source/GPUVerify/RaceInstrumenter.cs
@@ -1028,7 +1028,8 @@ namespace GPUVerify {
private Expr AccessedOffsetIsThreadLocalIdExpr(Variable v, string ReadOrWrite, int Thread) {
return Expr.Imp(
new IdentifierExpr(v.tok, new VariableDualiser(Thread, null, null).VisitVariable(GPUVerifier.MakeAccessHasOccurredVariable(v.Name, ReadOrWrite))),
- Expr.Eq(new IdentifierExpr(v.tok, new VariableDualiser(Thread, null, null).VisitVariable(GPUVerifier.MakeOffsetVariable(v.Name, ReadOrWrite))), new IdentifierExpr(v.tok, verifier.MakeThreadId(v.tok, "X", Thread))));
+ Expr.Eq(new IdentifierExpr(v.tok, new VariableDualiser(Thread, null, null).VisitVariable(GPUVerifier.MakeOffsetVariable(v.Name, ReadOrWrite))),
+ new IdentifierExpr(v.tok, GPUVerifier.MakeThreadId("X", Thread))));
}
private Expr GlobalIdExpr(string dimension, int Thread) {
@@ -1043,10 +1044,10 @@ namespace GPUVerify {
private Expr MakeCTimesLocalIdRangeExpression(Variable v, Expr constant, string ReadOrWrite, int Thread) {
Expr CTimesLocalId = verifier.MakeBVMul(constant.Clone() as Expr,
- new IdentifierExpr(Token.NoToken, verifier.MakeThreadId(Token.NoToken, "X", Thread)));
+ new IdentifierExpr(Token.NoToken, GPUVerifier.MakeThreadId("X", Thread)));
Expr CTimesLocalIdPlusC = verifier.MakeBVAdd(verifier.MakeBVMul(constant.Clone() as Expr,
- new IdentifierExpr(Token.NoToken, verifier.MakeThreadId(Token.NoToken, "X", Thread))), constant.Clone() as Expr);
+ new IdentifierExpr(Token.NoToken, GPUVerifier.MakeThreadId("X", Thread))), constant.Clone() as Expr);
Expr CTimesLocalIdLeqAccessedOffset = GPUVerifier.MakeBitVectorBinaryBoolean("BV32_LEQ", CTimesLocalId, OffsetXExpr(v, ReadOrWrite, Thread));
diff --git a/Source/VCGeneration/UniformityAnalyser.cs b/Source/VCGeneration/UniformityAnalyser.cs
index 849333b3..802ee2d2 100644
--- a/Source/VCGeneration/UniformityAnalyser.cs
+++ b/Source/VCGeneration/UniformityAnalyser.cs
@@ -309,6 +309,16 @@ namespace Microsoft.Boogie
}
}
}
+ else if (c is HavocCmd)
+ {
+ HavocCmd havocCmd = c as HavocCmd;
+ foreach(IdentifierExpr ie in havocCmd.Vars)
+ {
+ if(IsUniform(impl.Name, ie.Decl.Name)) {
+ SetNonUniform(impl.Name, ie.Decl.Name);
+ }
+ }
+ }
else if (c is CallCmd)
{
CallCmd callCmd = c as CallCmd;