summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Unknown <afd@afd-THINK>2012-09-24 16:11:32 +0100
committerGravatar Unknown <afd@afd-THINK>2012-09-24 16:11:32 +0100
commit75c3147f8dc77eb25d77090956645c55943e2052 (patch)
tree4472fa9af20025cf5b58e7b3bbbd54a46a7ad1df
parent07bfca4b8bb403152385b6713be34e2e210f5962 (diff)
Fixed issue with uniformity analysis and block merging. Uniformity analysis
now enabled by default.
-rw-r--r--Source/GPUVerify/CommandLineOptions.cs8
-rw-r--r--Source/GPUVerify/GPUVerifier.cs4
-rw-r--r--Source/VCGeneration/SmartBlockPredicator.cs9
-rw-r--r--Source/VCGeneration/UniformityAnalyser.cs7
-rw-r--r--Source/VCGeneration/VC.cs11
5 files changed, 28 insertions, 11 deletions
diff --git a/Source/GPUVerify/CommandLineOptions.cs b/Source/GPUVerify/CommandLineOptions.cs
index 5f6f0066..2f9ed792 100644
--- a/Source/GPUVerify/CommandLineOptions.cs
+++ b/Source/GPUVerify/CommandLineOptions.cs
@@ -25,7 +25,7 @@ namespace GPUVerify
public static bool ShowStages = false;
public static bool ShowUniformityAnalysis = false;
- public static bool DoUniformityAnalysis = false;
+ public static bool DoUniformityAnalysis = true;
public static bool ShowMayBePowerOfTwoAnalysis = false;
public static bool ShowArrayControlFlowAnalysis = false;
@@ -116,9 +116,9 @@ namespace GPUVerify
ShowUniformityAnalysis = true;
break;
- case "-uniformityAnalysis":
- case "/uniformityAnalysis":
- DoUniformityAnalysis = true;
+ case "-noUniformityAnalysis":
+ case "/noUniformityAnalysis":
+ DoUniformityAnalysis = false;
break;
case "-showMayBePowerOfTwoAnalysis":
diff --git a/Source/GPUVerify/GPUVerifier.cs b/Source/GPUVerify/GPUVerifier.cs
index 94c460fe..f94cf5ef 100644
--- a/Source/GPUVerify/GPUVerifier.cs
+++ b/Source/GPUVerify/GPUVerifier.cs
@@ -383,8 +383,8 @@ namespace GPUVerify
private void MergeBlocksIntoPredecessors()
{
foreach (var impl in Program.TopLevelDeclarations.OfType<Implementation>())
- VC.VCGen.MergeBlocksIntoPredecessors(Program, impl);
- }
+ VC.VCGen.MergeBlocksIntoPredecessors(Program, impl, uniformityAnalyser);
+ }
internal void doit()
{
diff --git a/Source/VCGeneration/SmartBlockPredicator.cs b/Source/VCGeneration/SmartBlockPredicator.cs
index 9dada1a5..b4f5a3df 100644
--- a/Source/VCGeneration/SmartBlockPredicator.cs
+++ b/Source/VCGeneration/SmartBlockPredicator.cs
@@ -371,7 +371,7 @@ public class SmartBlockPredicator {
if (n.Item2) {
var backedgeBlock = new Block();
- newBlocks.Add(backedgeBlock);
+ newBlocks.Add(backedgeBlock);
backedgeBlock.Label = n.Item1.Label + ".backedge";
backedgeBlock.Cmds = new CmdSeq(new AssumeCmd(Token.NoToken, pExpr,
@@ -384,7 +384,12 @@ public class SmartBlockPredicator {
tailBlock.Label = n.Item1.Label + ".tail";
tailBlock.Cmds = new CmdSeq(new AssumeCmd(Token.NoToken,
- Expr.Not(pExpr)));
+ Expr.Not(pExpr)));
+
+ if (uni != null && !uni.IsUniform(impl.Name, n.Item1)) {
+ uni.AddNonUniform(impl.Name, backedgeBlock);
+ uni.AddNonUniform(impl.Name, tailBlock);
+ }
if (prevBlock != null)
prevBlock.TransferCmd = new GotoCmd(Token.NoToken,
diff --git a/Source/VCGeneration/UniformityAnalyser.cs b/Source/VCGeneration/UniformityAnalyser.cs
index e5647a21..849333b3 100644
--- a/Source/VCGeneration/UniformityAnalyser.cs
+++ b/Source/VCGeneration/UniformityAnalyser.cs
@@ -520,6 +520,13 @@ namespace Microsoft.Boogie
Debug.Assert(!uniformityInfo[proc].Value.ContainsKey(v));
uniformityInfo[proc].Value[v] = false;
}
+ }
+
+ public void AddNonUniform(string proc, Block b) {
+ if (nonUniformBlocks.ContainsKey(proc)) {
+ Debug.Assert(!nonUniformBlocks[proc].Contains(b));
+ nonUniformBlocks[proc].Add(b);
+ }
}
public bool IsUniform(string proc, WhileCmd wc)
diff --git a/Source/VCGeneration/VC.cs b/Source/VCGeneration/VC.cs
index 2ac8dc83..e7f5999a 100644
--- a/Source/VCGeneration/VC.cs
+++ b/Source/VCGeneration/VC.cs
@@ -3042,15 +3042,20 @@ namespace VC {
/// <summary>
/// Simplifies the CFG of the given implementation impl by merging each
/// basic block with a single predecessor into that predecessor if the
- /// predecessor has a single successor.
+ /// predecessor has a single successor. If a uniformity analyser is
+ /// being used then block will only be merged if they are both uniform
+ /// or both non-uniform
/// </summary>
- public static void MergeBlocksIntoPredecessors(Program prog, Implementation impl) {
+ public static void MergeBlocksIntoPredecessors(Program prog, Implementation impl, UniformityAnalyser uni) {
var blockGraph = prog.ProcessLoops(impl);
var predMap = new Dictionary<Block, Block>();
foreach (var block in blockGraph.Nodes) {
try {
var pred = blockGraph.Predecessors(block).Single();
- if (blockGraph.Successors(pred).Single() == block) {
+ if (blockGraph.Successors(pred).Single() == block &&
+ (uni == null ||
+ (uni.IsUniform(impl.Name, pred) && uni.IsUniform(impl.Name, block)) ||
+ (!uni.IsUniform(impl.Name, pred) && !uni.IsUniform(impl.Name, block)))) {
Block predMapping;
while (predMap.TryGetValue(pred, out predMapping))
pred = predMapping;