mirror of https://github.com/icsharpcode/ILSpy.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
30 lines
1.1 KiB
30 lines
1.1 KiB
using System; |
|
|
|
namespace ICSharpCode.Decompiler.IL |
|
{ |
|
internal class SemanticHelper |
|
{ |
|
/// <summary> |
|
/// Gets whether the instruction sequence 'inst1; inst2;' may be ordered to 'inst2; inst1;' |
|
/// </summary> |
|
internal static bool MayReorder(InstructionFlags inst1, InstructionFlags inst2) |
|
{ |
|
// If both instructions perform a non-read-only action, we cannot reorder them |
|
if ((inst1 & inst2 & ~(InstructionFlags.MayPeek | InstructionFlags.MayReadLocals)) != 0) |
|
return false; |
|
// We cannot reorder if inst2 might pop what inst1 peeks at |
|
if (ConflictingPair(inst1, inst2, InstructionFlags.MayPeek, InstructionFlags.MayPop)) |
|
return false; |
|
if (ConflictingPair(inst1, inst2, InstructionFlags.MayReadLocals, InstructionFlags.MayWriteLocals)) |
|
return false; |
|
return true; |
|
} |
|
|
|
private static bool ConflictingPair(InstructionFlags inst1, InstructionFlags inst2, InstructionFlags readFlag, InstructionFlags writeFlag) |
|
{ |
|
// if one instruction has the read flag and the other the write flag, that's a conflict |
|
return (inst1 & readFlag) != 0 && (inst2 & writeFlag) != 0 |
|
|| (inst2 & readFlag) != 0 && (inst1 & writeFlag) != 0; |
|
} |
|
} |
|
} |