Stabilize the output of spirv-diff (#4698)

* Reimplement LCS used by spirv-diff

Two improvements are made to the LCS algorithm:

- The LCS algorithm is reimplemented to use a std::stack instead of
  being recursive.  This prevents stack overflow in the LCSTest.Large
  test.
- The LCS algorithm uses an NxM table.  Previously, entries of this
  table were {size_t, bool, bool}, which is now packed in 32 bits.  The
  first entry can assume a maximum value of min(N, M), which
  realistically for SPIR-V diff will not be larger than 1 billion
  instructions.  This reduces memory usage of LCS by 75%.

This partially reverts 845f3efb8a and
enables LCS tests.

* Stabilize the output of spirv-diff

std::map is used instead of std::unordered_map to ensure the output of
spirv-diff is identical everywhere.

This partially reverts 845f3efb8a and
enables spirv-diff tests.
This commit is contained in:
Shahbaz Youssefi 2022-02-07 09:37:04 -05:00 коммит произвёл GitHub
Родитель 845f3efb8a
Коммит 9beb54513c
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
12 изменённых файлов: 944 добавлений и 915 удалений

Просмотреть файл

@ -36,7 +36,7 @@ using InstructionToInstructionMap =
// A flat list of instructions in a function for easier iteration.
using InstructionList = std::vector<const opt::Instruction*>;
// A map from a function to its list of instructions.
using FunctionInstMap = std::unordered_map<uint32_t, InstructionList>;
using FunctionInstMap = std::map<uint32_t, InstructionList>;
// A list of ids with some similar property, for example functions with the same
// name.
using IdGroup = std::vector<uint32_t>;
@ -1486,7 +1486,7 @@ float Differ::MatchFunctionBodies(const InstructionList& src_body,
LongestCommonSubsequence<std::vector<const opt::Instruction*>> lcs(src_body,
dst_body);
size_t best_match_length = lcs.Get<const opt::Instruction*>(
uint32_t best_match_length = lcs.Get<const opt::Instruction*>(
[this](const opt::Instruction* src_inst,
const opt::Instruction* dst_inst) {
return DoInstructionsMatchFuzzy(src_inst, dst_inst);

Просмотреть файл

@ -18,7 +18,9 @@
#include <algorithm>
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <functional>
#include <stack>
#include <vector>
namespace spvtools {
@ -43,44 +45,64 @@ class LongestCommonSubsequence {
//
// Returns the length of the longest common subsequence.
template <typename T>
size_t Get(std::function<bool(T src_elem, T dst_elem)> match,
DiffMatch* src_match_result, DiffMatch* dst_match_result);
uint32_t Get(std::function<bool(T src_elem, T dst_elem)> match,
DiffMatch* src_match_result, DiffMatch* dst_match_result);
private:
struct DiffMatchIndex {
uint32_t src_offset;
uint32_t dst_offset;
};
template <typename T>
size_t CalculateLCS(size_t src_start, size_t dst_start,
std::function<bool(T src_elem, T dst_elem)> match);
void CalculateLCS(std::function<bool(T src_elem, T dst_elem)> match);
void RetrieveMatch(DiffMatch* src_match_result, DiffMatch* dst_match_result);
bool IsInBound(size_t src_index, size_t dst_index) {
return src_index < src_.size() && dst_index < dst_.size();
bool IsInBound(DiffMatchIndex index) {
return index.src_offset < src_.size() && index.dst_offset < dst_.size();
}
bool IsCalculated(size_t src_index, size_t dst_index) {
assert(IsInBound(src_index, dst_index));
return table_[src_index][dst_index].valid;
bool IsCalculated(DiffMatchIndex index) {
assert(IsInBound(index));
return table_[index.src_offset][index.dst_offset].valid;
}
size_t GetMemoizedLength(size_t src_index, size_t dst_index) {
if (!IsInBound(src_index, dst_index)) {
bool IsCalculatedOrOutOfBound(DiffMatchIndex index) {
return !IsInBound(index) || IsCalculated(index);
}
uint32_t GetMemoizedLength(DiffMatchIndex index) {
if (!IsInBound(index)) {
return 0;
}
assert(IsCalculated(src_index, dst_index));
return table_[src_index][dst_index].best_match_length;
assert(IsCalculated(index));
return table_[index.src_offset][index.dst_offset].best_match_length;
}
bool IsMatched(size_t src_index, size_t dst_index) {
assert(IsCalculated(src_index, dst_index));
return table_[src_index][dst_index].matched;
bool IsMatched(DiffMatchIndex index) {
assert(IsCalculated(index));
return table_[index.src_offset][index.dst_offset].matched;
}
void MarkMatched(DiffMatchIndex index, uint32_t best_match_length,
bool matched) {
assert(IsInBound(index));
DiffMatchEntry& entry = table_[index.src_offset][index.dst_offset];
assert(!entry.valid);
entry.best_match_length = best_match_length & 0x3FFFFFFF;
assert(entry.best_match_length == best_match_length);
entry.matched = matched;
entry.valid = true;
}
const Sequence& src_;
const Sequence& dst_;
struct DiffMatchEntry {
size_t best_match_length = 0;
DiffMatchEntry() : best_match_length(0), matched(false), valid(false) {}
uint32_t best_match_length : 30;
// Whether src[i] and dst[j] matched. This is an optimization to avoid
// calling the `match` function again when walking the LCS table.
bool matched = false;
uint32_t matched : 1;
// Use for the recursive algorithm to know if the contents of this entry are
// valid.
bool valid = false;
uint32_t valid : 1;
};
std::vector<std::vector<DiffMatchEntry>> table_;
@ -88,18 +110,17 @@ class LongestCommonSubsequence {
template <typename Sequence>
template <typename T>
size_t LongestCommonSubsequence<Sequence>::Get(
uint32_t LongestCommonSubsequence<Sequence>::Get(
std::function<bool(T src_elem, T dst_elem)> match,
DiffMatch* src_match_result, DiffMatch* dst_match_result) {
size_t best_match_length = CalculateLCS(0, 0, match);
CalculateLCS(match);
RetrieveMatch(src_match_result, dst_match_result);
return best_match_length;
return GetMemoizedLength({0, 0});
}
template <typename Sequence>
template <typename T>
size_t LongestCommonSubsequence<Sequence>::CalculateLCS(
size_t src_start, size_t dst_start,
void LongestCommonSubsequence<Sequence>::CalculateLCS(
std::function<bool(T src_elem, T dst_elem)> match) {
// The LCS algorithm is simple. Given sequences s and d, with a:b depicting a
// range in python syntax:
@ -113,53 +134,62 @@ size_t LongestCommonSubsequence<Sequence>::CalculateLCS(
//
// This is a recursive function with memoization, which avoids filling table
// entries where unnecessary. This makes the best case O(N) instead of
// O(N^2).
// O(N^2). The implemention uses a std::stack to avoid stack overflow on long
// sequences.
// To avoid unnecessary recursion on long sequences, process a whole strip of
// matching elements in one go.
size_t src_cur = src_start;
size_t dst_cur = dst_start;
while (IsInBound(src_cur, dst_cur) && !IsCalculated(src_cur, dst_cur) &&
match(src_[src_cur], dst_[dst_cur])) {
++src_cur;
++dst_cur;
if (src_.empty() || dst_.empty()) {
return;
}
// We've reached a pair of elements that don't match. Recursively determine
// which one should be left unmatched.
size_t best_match_length = 0;
if (IsInBound(src_cur, dst_cur)) {
if (IsCalculated(src_cur, dst_cur)) {
best_match_length = GetMemoizedLength(src_cur, dst_cur);
} else {
best_match_length = std::max(CalculateLCS(src_cur + 1, dst_cur, match),
CalculateLCS(src_cur, dst_cur + 1, match));
std::stack<DiffMatchIndex> to_calculate;
to_calculate.push({0, 0});
// Fill the table with this information
DiffMatchEntry& entry = table_[src_cur][dst_cur];
assert(!entry.valid);
entry.best_match_length = best_match_length;
entry.valid = true;
while (!to_calculate.empty()) {
DiffMatchIndex current = to_calculate.top();
to_calculate.pop();
assert(IsInBound(current));
// If already calculated through another path, ignore it.
if (IsCalculated(current)) {
continue;
}
if (match(src_[current.src_offset], dst_[current.dst_offset])) {
// If the current elements match, advance both indices and calculate the
// LCS if not already. Visit `current` again afterwards, so its
// corresponding entry will be updated.
DiffMatchIndex next = {current.src_offset + 1, current.dst_offset + 1};
if (IsCalculatedOrOutOfBound(next)) {
MarkMatched(current, GetMemoizedLength(next) + 1, true);
} else {
to_calculate.push(current);
to_calculate.push(next);
}
continue;
}
// We've reached a pair of elements that don't match. Calculate the LCS for
// both cases of either being left unmatched and take the max. Visit
// `current` again afterwards, so its corresponding entry will be updated.
DiffMatchIndex next_src = {current.src_offset + 1, current.dst_offset};
DiffMatchIndex next_dst = {current.src_offset, current.dst_offset + 1};
if (IsCalculatedOrOutOfBound(next_src) &&
IsCalculatedOrOutOfBound(next_dst)) {
uint32_t best_match_length =
std::max(GetMemoizedLength(next_src), GetMemoizedLength(next_dst));
MarkMatched(current, best_match_length, false);
continue;
}
to_calculate.push(current);
if (!IsCalculatedOrOutOfBound(next_src)) {
to_calculate.push(next_src);
}
if (!IsCalculatedOrOutOfBound(next_dst)) {
to_calculate.push(next_dst);
}
}
// Go over the matched strip and update the table as well.
assert(src_cur - src_start == dst_cur - dst_start);
size_t contiguous_match_len = src_cur - src_start;
for (size_t i = 0; i < contiguous_match_len; ++i) {
--src_cur;
--dst_cur;
assert(IsInBound(src_cur, dst_cur));
DiffMatchEntry& entry = table_[src_cur][dst_cur];
assert(!entry.valid);
entry.best_match_length = ++best_match_length;
entry.matched = true;
entry.valid = true;
}
return best_match_length;
}
template <typename Sequence>
@ -171,20 +201,19 @@ void LongestCommonSubsequence<Sequence>::RetrieveMatch(
src_match_result->resize(src_.size(), false);
dst_match_result->resize(dst_.size(), false);
size_t src_cur = 0;
size_t dst_cur = 0;
while (IsInBound(src_cur, dst_cur)) {
if (IsMatched(src_cur, dst_cur)) {
(*src_match_result)[src_cur++] = true;
(*dst_match_result)[dst_cur++] = true;
DiffMatchIndex current = {0, 0};
while (IsInBound(current)) {
if (IsMatched(current)) {
(*src_match_result)[current.src_offset++] = true;
(*dst_match_result)[current.dst_offset++] = true;
continue;
}
if (GetMemoizedLength(src_cur + 1, dst_cur) >=
GetMemoizedLength(src_cur, dst_cur + 1)) {
++src_cur;
if (GetMemoizedLength({current.src_offset + 1, current.dst_offset}) >=
GetMemoizedLength({current.src_offset, current.dst_offset + 1})) {
++current.src_offset;
} else {
++dst_cur;
++current.dst_offset;
}
}
}

Просмотреть файл

@ -12,15 +12,15 @@
# See the License for the specific language governing permissions and
# limitations under the License.
# include(diff_files/diff_test_files_autogen.cmake)
#
# add_spvtools_unittest(TARGET lcs
# SRCS lcs_test.cpp
# LIBS SPIRV-Tools-diff
# )
#
# add_spvtools_unittest(TARGET diff
# SRCS diff_test.cpp diff_test_utils.h diff_test_utils.cpp
# ${DIFF_TEST_FILES} ${spirv-tools_SOURCE_DIR}/tools/util/cli_consumer.cpp
# LIBS SPIRV-Tools-diff
# )
include(diff_files/diff_test_files_autogen.cmake)
add_spvtools_unittest(TARGET lcs
SRCS lcs_test.cpp
LIBS SPIRV-Tools-diff
)
add_spvtools_unittest(TARGET diff
SRCS diff_test.cpp diff_test_utils.h diff_test_utils.cpp
${DIFF_TEST_FILES} ${spirv-tools_SOURCE_DIR}/tools/util/cli_consumer.cpp
LIBS SPIRV-Tools-diff
)

Просмотреть файл

@ -586,6 +586,36 @@ TEST(DiffTest, DifferentDecorationsFragment) {
%29 = OpVariable %28 Uniform
+%84 = OpConstant %23 0
+%85 = OpConstant %1 0.5
%32 = OpFunction %2 None %31
%33 = OpFunctionParameter %30
%34 = OpLabel
%36 = OpLoad %6 %8
%37 = OpLoad %2 %33
%38 = OpVectorShuffle %35 %37 %37 0 1
%39 = OpImageSampleImplicitLod %2 %36 %38
%41 = OpLoad %2 %33
%42 = OpVectorShuffle %35 %41 %41 2 3
%43 = OpConvertFToS %40 %42
%44 = OpLoad %9 %11
%45 = OpImageRead %2 %44 %43
%46 = OpFAdd %2 %39 %45
OpReturnValue %46
OpFunctionEnd
%48 = OpFunction %2 None %47
%49 = OpFunctionParameter %30
%50 = OpFunctionParameter %30
%51 = OpLabel
%52 = OpLoad %2 %49
%53 = OpVectorShuffle %35 %52 %52 0 1
%54 = OpLoad %2 %50
%55 = OpVectorShuffle %35 %54 %54 2 3
%56 = OpCompositeExtract %1 %53 0
%57 = OpCompositeExtract %1 %53 1
%58 = OpCompositeExtract %1 %55 0
%59 = OpCompositeExtract %1 %55 1
%60 = OpCompositeConstruct %2 %56 %57 %58 %59
OpReturnValue %60
OpFunctionEnd
%63 = OpFunction %61 None %62
%64 = OpLabel
%65 = OpVariable %30 Function
@ -608,36 +638,6 @@ TEST(DiffTest, DifferentDecorationsFragment) {
OpStore %22 %81
OpReturn
OpFunctionEnd
%48 = OpFunction %2 None %47
%49 = OpFunctionParameter %30
%50 = OpFunctionParameter %30
%51 = OpLabel
%52 = OpLoad %2 %49
%53 = OpVectorShuffle %35 %52 %52 0 1
%54 = OpLoad %2 %50
%55 = OpVectorShuffle %35 %54 %54 2 3
%56 = OpCompositeExtract %1 %53 0
%57 = OpCompositeExtract %1 %53 1
%58 = OpCompositeExtract %1 %55 0
%59 = OpCompositeExtract %1 %55 1
%60 = OpCompositeConstruct %2 %56 %57 %58 %59
OpReturnValue %60
OpFunctionEnd
%32 = OpFunction %2 None %31
%33 = OpFunctionParameter %30
%34 = OpLabel
%36 = OpLoad %6 %8
%37 = OpLoad %2 %33
%38 = OpVectorShuffle %35 %37 %37 0 1
%39 = OpImageSampleImplicitLod %2 %36 %38
%41 = OpLoad %2 %33
%42 = OpVectorShuffle %35 %41 %41 2 3
%43 = OpConvertFToS %40 %42
%44 = OpLoad %9 %11
%45 = OpImageRead %2 %44 %43
%46 = OpFAdd %2 %39 %45
OpReturnValue %46
OpFunctionEnd
)";
Options options;
DoStringDiffTest(kSrc, kDst, kDiff, options);
@ -1108,6 +1108,43 @@ OpFunctionEnd
+%83 = OpVariable %28 Uniform
+%90 = OpConstant %23 0
+%91 = OpConstant %1 0.5
%32 = OpFunction %2 None %31
-%33 = OpFunctionParameter %30
+%84 = OpFunctionParameter %30
%34 = OpLabel
%36 = OpLoad %6 %8
-%37 = OpLoad %2 %33
+%37 = OpLoad %2 %84
%38 = OpVectorShuffle %35 %37 %37 0 1
%39 = OpImageSampleImplicitLod %2 %36 %38
-%41 = OpLoad %2 %33
+%41 = OpLoad %2 %84
%42 = OpVectorShuffle %35 %41 %41 2 3
%43 = OpConvertFToS %40 %42
%44 = OpLoad %9 %11
%45 = OpImageRead %2 %44 %43
%46 = OpFAdd %2 %39 %45
OpReturnValue %46
OpFunctionEnd
%48 = OpFunction %2 None %47
-%49 = OpFunctionParameter %30
-%50 = OpFunctionParameter %30
+%85 = OpFunctionParameter %30
+%86 = OpFunctionParameter %30
%51 = OpLabel
-%52 = OpLoad %2 %49
+%52 = OpLoad %2 %85
%53 = OpVectorShuffle %35 %52 %52 0 1
-%54 = OpLoad %2 %50
+%54 = OpLoad %2 %86
%55 = OpVectorShuffle %35 %54 %54 2 3
%56 = OpCompositeExtract %1 %53 0
%57 = OpCompositeExtract %1 %53 1
%58 = OpCompositeExtract %1 %55 0
%59 = OpCompositeExtract %1 %55 1
%60 = OpCompositeConstruct %2 %56 %57 %58 %59
OpReturnValue %60
OpFunctionEnd
%63 = OpFunction %61 None %62
%64 = OpLabel
%65 = OpVariable %30 Function
@ -1134,43 +1171,6 @@ OpFunctionEnd
OpStore %22 %81
OpReturn
OpFunctionEnd
%48 = OpFunction %2 None %47
-%49 = OpFunctionParameter %30
-%50 = OpFunctionParameter %30
+%85 = OpFunctionParameter %30
+%86 = OpFunctionParameter %30
%51 = OpLabel
-%52 = OpLoad %2 %49
+%52 = OpLoad %2 %85
%53 = OpVectorShuffle %35 %52 %52 0 1
-%54 = OpLoad %2 %50
+%54 = OpLoad %2 %86
%55 = OpVectorShuffle %35 %54 %54 2 3
%56 = OpCompositeExtract %1 %53 0
%57 = OpCompositeExtract %1 %53 1
%58 = OpCompositeExtract %1 %55 0
%59 = OpCompositeExtract %1 %55 1
%60 = OpCompositeConstruct %2 %56 %57 %58 %59
OpReturnValue %60
OpFunctionEnd
%32 = OpFunction %2 None %31
-%33 = OpFunctionParameter %30
+%84 = OpFunctionParameter %30
%34 = OpLabel
%36 = OpLoad %6 %8
-%37 = OpLoad %2 %33
+%37 = OpLoad %2 %84
%38 = OpVectorShuffle %35 %37 %37 0 1
%39 = OpImageSampleImplicitLod %2 %36 %38
-%41 = OpLoad %2 %33
+%41 = OpLoad %2 %84
%42 = OpVectorShuffle %35 %41 %41 2 3
%43 = OpConvertFToS %40 %42
%44 = OpLoad %9 %11
%45 = OpImageRead %2 %44 %43
%46 = OpFAdd %2 %39 %45
OpReturnValue %46
OpFunctionEnd
)";
Options options;
DoStringDiffTest(kSrcNoDebug, kDstNoDebug, kDiff, options);
@ -1340,6 +1340,36 @@ TEST(DiffTest, DifferentDecorationsFragmentIgnoreLocation) {
%29 = OpVariable %28 Uniform
+%84 = OpConstant %23 0
+%85 = OpConstant %1 0.5
%32 = OpFunction %2 None %31
%33 = OpFunctionParameter %30
%34 = OpLabel
%36 = OpLoad %6 %8
%37 = OpLoad %2 %33
%38 = OpVectorShuffle %35 %37 %37 0 1
%39 = OpImageSampleImplicitLod %2 %36 %38
%41 = OpLoad %2 %33
%42 = OpVectorShuffle %35 %41 %41 2 3
%43 = OpConvertFToS %40 %42
%44 = OpLoad %9 %11
%45 = OpImageRead %2 %44 %43
%46 = OpFAdd %2 %39 %45
OpReturnValue %46
OpFunctionEnd
%48 = OpFunction %2 None %47
%49 = OpFunctionParameter %30
%50 = OpFunctionParameter %30
%51 = OpLabel
%52 = OpLoad %2 %49
%53 = OpVectorShuffle %35 %52 %52 0 1
%54 = OpLoad %2 %50
%55 = OpVectorShuffle %35 %54 %54 2 3
%56 = OpCompositeExtract %1 %53 0
%57 = OpCompositeExtract %1 %53 1
%58 = OpCompositeExtract %1 %55 0
%59 = OpCompositeExtract %1 %55 1
%60 = OpCompositeConstruct %2 %56 %57 %58 %59
OpReturnValue %60
OpFunctionEnd
%63 = OpFunction %61 None %62
%64 = OpLabel
%65 = OpVariable %30 Function
@ -1362,36 +1392,6 @@ TEST(DiffTest, DifferentDecorationsFragmentIgnoreLocation) {
OpStore %22 %81
OpReturn
OpFunctionEnd
%48 = OpFunction %2 None %47
%49 = OpFunctionParameter %30
%50 = OpFunctionParameter %30
%51 = OpLabel
%52 = OpLoad %2 %49
%53 = OpVectorShuffle %35 %52 %52 0 1
%54 = OpLoad %2 %50
%55 = OpVectorShuffle %35 %54 %54 2 3
%56 = OpCompositeExtract %1 %53 0
%57 = OpCompositeExtract %1 %53 1
%58 = OpCompositeExtract %1 %55 0
%59 = OpCompositeExtract %1 %55 1
%60 = OpCompositeConstruct %2 %56 %57 %58 %59
OpReturnValue %60
OpFunctionEnd
%32 = OpFunction %2 None %31
%33 = OpFunctionParameter %30
%34 = OpLabel
%36 = OpLoad %6 %8
%37 = OpLoad %2 %33
%38 = OpVectorShuffle %35 %37 %37 0 1
%39 = OpImageSampleImplicitLod %2 %36 %38
%41 = OpLoad %2 %33
%42 = OpVectorShuffle %35 %41 %41 2 3
%43 = OpConvertFToS %40 %42
%44 = OpLoad %9 %11
%45 = OpImageRead %2 %44 %43
%46 = OpFAdd %2 %39 %45
OpReturnValue %46
OpFunctionEnd
)";
Options options;
options.ignore_location = true;
@ -1562,6 +1562,36 @@ TEST(DiffTest, DifferentDecorationsFragmentIgnoreSetBindingLocation) {
%29 = OpVariable %28 Uniform
+%84 = OpConstant %23 0
+%85 = OpConstant %1 0.5
%32 = OpFunction %2 None %31
%33 = OpFunctionParameter %30
%34 = OpLabel
%36 = OpLoad %6 %8
%37 = OpLoad %2 %33
%38 = OpVectorShuffle %35 %37 %37 0 1
%39 = OpImageSampleImplicitLod %2 %36 %38
%41 = OpLoad %2 %33
%42 = OpVectorShuffle %35 %41 %41 2 3
%43 = OpConvertFToS %40 %42
%44 = OpLoad %9 %11
%45 = OpImageRead %2 %44 %43
%46 = OpFAdd %2 %39 %45
OpReturnValue %46
OpFunctionEnd
%48 = OpFunction %2 None %47
%49 = OpFunctionParameter %30
%50 = OpFunctionParameter %30
%51 = OpLabel
%52 = OpLoad %2 %49
%53 = OpVectorShuffle %35 %52 %52 0 1
%54 = OpLoad %2 %50
%55 = OpVectorShuffle %35 %54 %54 2 3
%56 = OpCompositeExtract %1 %53 0
%57 = OpCompositeExtract %1 %53 1
%58 = OpCompositeExtract %1 %55 0
%59 = OpCompositeExtract %1 %55 1
%60 = OpCompositeConstruct %2 %56 %57 %58 %59
OpReturnValue %60
OpFunctionEnd
%63 = OpFunction %61 None %62
%64 = OpLabel
%65 = OpVariable %30 Function
@ -1584,36 +1614,6 @@ TEST(DiffTest, DifferentDecorationsFragmentIgnoreSetBindingLocation) {
OpStore %22 %81
OpReturn
OpFunctionEnd
%48 = OpFunction %2 None %47
%49 = OpFunctionParameter %30
%50 = OpFunctionParameter %30
%51 = OpLabel
%52 = OpLoad %2 %49
%53 = OpVectorShuffle %35 %52 %52 0 1
%54 = OpLoad %2 %50
%55 = OpVectorShuffle %35 %54 %54 2 3
%56 = OpCompositeExtract %1 %53 0
%57 = OpCompositeExtract %1 %53 1
%58 = OpCompositeExtract %1 %55 0
%59 = OpCompositeExtract %1 %55 1
%60 = OpCompositeConstruct %2 %56 %57 %58 %59
OpReturnValue %60
OpFunctionEnd
%32 = OpFunction %2 None %31
%33 = OpFunctionParameter %30
%34 = OpLabel
%36 = OpLoad %6 %8
%37 = OpLoad %2 %33
%38 = OpVectorShuffle %35 %37 %37 0 1
%39 = OpImageSampleImplicitLod %2 %36 %38
%41 = OpLoad %2 %33
%42 = OpVectorShuffle %35 %41 %41 2 3
%43 = OpConvertFToS %40 %42
%44 = OpLoad %9 %11
%45 = OpImageRead %2 %44 %43
%46 = OpFAdd %2 %39 %45
OpReturnValue %46
OpFunctionEnd
)";
Options options;
options.ignore_set_binding = true;

Просмотреть файл

@ -475,6 +475,20 @@ TEST(DiffTest, DifferentDecorationsVertex) {
%25 = OpVariable %24 Output
+%61 = OpConstant %13 0
+%62 = OpConstant %1 0.5
%28 = OpFunction %2 None %27
%29 = OpFunctionParameter %26
%30 = OpLabel
%31 = OpLoad %2 %29
OpReturnValue %31
OpFunctionEnd
%32 = OpFunction %2 None %27
%33 = OpFunctionParameter %26
%34 = OpLabel
%35 = OpLoad %2 %33
%36 = OpLoad %2 %33
%37 = OpFAdd %2 %35 %36
OpReturnValue %37
OpFunctionEnd
%40 = OpFunction %38 None %39
%41 = OpLabel
%42 = OpVariable %26 Function
@ -509,20 +523,6 @@ TEST(DiffTest, DifferentDecorationsVertex) {
+OpStore %63 %69
OpReturn
OpFunctionEnd
%32 = OpFunction %2 None %27
%33 = OpFunctionParameter %26
%34 = OpLabel
%35 = OpLoad %2 %33
%36 = OpLoad %2 %33
%37 = OpFAdd %2 %35 %36
OpReturnValue %37
OpFunctionEnd
%28 = OpFunction %2 None %27
%29 = OpFunctionParameter %26
%30 = OpLabel
%31 = OpLoad %2 %29
OpReturnValue %31
OpFunctionEnd
)";
Options options;
DoStringDiffTest(kSrc, kDst, kDiff, options);
@ -869,6 +869,25 @@ OpFunctionEnd
%25 = OpVariable %24 Output
+%67 = OpConstant %13 0
+%68 = OpConstant %1 0.5
%28 = OpFunction %2 None %27
-%29 = OpFunctionParameter %26
+%59 = OpFunctionParameter %26
%30 = OpLabel
-%31 = OpLoad %2 %29
+%31 = OpLoad %2 %59
OpReturnValue %31
OpFunctionEnd
%32 = OpFunction %2 None %27
-%33 = OpFunctionParameter %26
+%60 = OpFunctionParameter %26
%34 = OpLabel
-%35 = OpLoad %2 %33
+%35 = OpLoad %2 %60
-%36 = OpLoad %2 %33
+%36 = OpLoad %2 %60
%37 = OpFAdd %2 %35 %36
OpReturnValue %37
OpFunctionEnd
%40 = OpFunction %38 None %39
%41 = OpLabel
%42 = OpVariable %26 Function
@ -912,25 +931,6 @@ OpFunctionEnd
+OpStore %69 %75
OpReturn
OpFunctionEnd
%32 = OpFunction %2 None %27
-%33 = OpFunctionParameter %26
+%60 = OpFunctionParameter %26
%34 = OpLabel
-%35 = OpLoad %2 %33
+%35 = OpLoad %2 %60
-%36 = OpLoad %2 %33
+%36 = OpLoad %2 %60
%37 = OpFAdd %2 %35 %36
OpReturnValue %37
OpFunctionEnd
%28 = OpFunction %2 None %27
-%29 = OpFunctionParameter %26
+%59 = OpFunctionParameter %26
%30 = OpLabel
-%31 = OpLoad %2 %29
+%31 = OpLoad %2 %59
OpReturnValue %31
OpFunctionEnd
)";
Options options;
DoStringDiffTest(kSrcNoDebug, kDstNoDebug, kDiff, options);
@ -1072,6 +1072,20 @@ TEST(DiffTest, DifferentDecorationsVertexIgnoreSetBinding) {
%25 = OpVariable %24 Output
+%61 = OpConstant %13 0
+%62 = OpConstant %1 0.5
%28 = OpFunction %2 None %27
%29 = OpFunctionParameter %26
%30 = OpLabel
%31 = OpLoad %2 %29
OpReturnValue %31
OpFunctionEnd
%32 = OpFunction %2 None %27
%33 = OpFunctionParameter %26
%34 = OpLabel
%35 = OpLoad %2 %33
%36 = OpLoad %2 %33
%37 = OpFAdd %2 %35 %36
OpReturnValue %37
OpFunctionEnd
%40 = OpFunction %38 None %39
%41 = OpLabel
%42 = OpVariable %26 Function
@ -1106,20 +1120,6 @@ TEST(DiffTest, DifferentDecorationsVertexIgnoreSetBinding) {
+OpStore %63 %69
OpReturn
OpFunctionEnd
%32 = OpFunction %2 None %27
%33 = OpFunctionParameter %26
%34 = OpLabel
%35 = OpLoad %2 %33
%36 = OpLoad %2 %33
%37 = OpFAdd %2 %35 %36
OpReturnValue %37
OpFunctionEnd
%28 = OpFunction %2 None %27
%29 = OpFunctionParameter %26
%30 = OpLabel
%31 = OpLoad %2 %29
OpReturnValue %31
OpFunctionEnd
)";
Options options;
options.ignore_set_binding = true;
@ -1262,6 +1262,20 @@ TEST(DiffTest, DifferentDecorationsVertexIgnoreSetBindingLocation) {
%25 = OpVariable %24 Output
+%61 = OpConstant %13 0
+%62 = OpConstant %1 0.5
%28 = OpFunction %2 None %27
%29 = OpFunctionParameter %26
%30 = OpLabel
%31 = OpLoad %2 %29
OpReturnValue %31
OpFunctionEnd
%32 = OpFunction %2 None %27
%33 = OpFunctionParameter %26
%34 = OpLabel
%35 = OpLoad %2 %33
%36 = OpLoad %2 %33
%37 = OpFAdd %2 %35 %36
OpReturnValue %37
OpFunctionEnd
%40 = OpFunction %38 None %39
%41 = OpLabel
%42 = OpVariable %26 Function
@ -1296,20 +1310,6 @@ TEST(DiffTest, DifferentDecorationsVertexIgnoreSetBindingLocation) {
+OpStore %63 %69
OpReturn
OpFunctionEnd
%32 = OpFunction %2 None %27
%33 = OpFunctionParameter %26
%34 = OpLabel
%35 = OpLoad %2 %33
%36 = OpLoad %2 %33
%37 = OpFAdd %2 %35 %36
OpReturnValue %37
OpFunctionEnd
%28 = OpFunction %2 None %27
%29 = OpFunctionParameter %26
%30 = OpLabel
%31 = OpLoad %2 %29
OpReturnValue %31
OpFunctionEnd
)";
Options options;
options.ignore_set_binding = true;

Просмотреть файл

@ -390,34 +390,13 @@ TEST(DiffTest, ExtraIfBlock) {
%63 = OpVariable %62 Output
%67 = OpTypePointer Input %6
%68 = OpVariable %67 Input
%10 = OpFunction %6 None %7
%11 = OpLabel
%45 = OpVariable %12 Function
%46 = OpAccessChain %21 %18 %20
%47 = OpLoad %15 %46
%48 = OpConvertUToF %6 %47
%50 = OpFDiv %6 %48 %49
OpStore %45 %50
%51 = OpLoad %6 %45
%54 = OpExtInst %6 %1 FClamp %51 %52 %53
%55 = OpLoad %6 %45
%56 = OpFMul %6 %55 %54
OpStore %45 %56
+%71 = OpAccessChain %21 %18 %32
+%72 = OpLoad %15 %71
+%73 = OpINotEqual %25 %72 %24
+OpSelectionMerge %75 None
+OpBranchConditional %73 %74 %75
+%74 = OpLabel
%57 = OpLoad %6 %45
+%77 = OpFSub %6 %57 %76
+OpStore %45 %77
+OpBranch %75
+%75 = OpLabel
+%78 = OpLoad %6 %45
-%58 = OpExtInst %6 %1 Exp %57
+%58 = OpExtInst %6 %1 Exp %78
OpReturnValue %58
%4 = OpFunction %2 None %3
%5 = OpLabel
%64 = OpFunctionCall %6 %8
%65 = OpFunctionCall %6 %10
%66 = OpCompositeConstruct %61 %64 %65 %14 %29
OpStore %63 %66
OpReturn
OpFunctionEnd
%8 = OpFunction %6 None %7
%9 = OpLabel
@ -447,13 +426,34 @@ TEST(DiffTest, ExtraIfBlock) {
%42 = OpFSub %6 %39 %41
OpReturnValue %42
OpFunctionEnd
%4 = OpFunction %2 None %3
%5 = OpLabel
%64 = OpFunctionCall %6 %8
%65 = OpFunctionCall %6 %10
%66 = OpCompositeConstruct %61 %64 %65 %14 %29
OpStore %63 %66
OpReturn
%10 = OpFunction %6 None %7
%11 = OpLabel
%45 = OpVariable %12 Function
%46 = OpAccessChain %21 %18 %20
%47 = OpLoad %15 %46
%48 = OpConvertUToF %6 %47
%50 = OpFDiv %6 %48 %49
OpStore %45 %50
%51 = OpLoad %6 %45
%54 = OpExtInst %6 %1 FClamp %51 %52 %53
%55 = OpLoad %6 %45
%56 = OpFMul %6 %55 %54
OpStore %45 %56
+%71 = OpAccessChain %21 %18 %32
+%72 = OpLoad %15 %71
+%73 = OpINotEqual %25 %72 %24
+OpSelectionMerge %75 None
+OpBranchConditional %73 %74 %75
+%74 = OpLabel
%57 = OpLoad %6 %45
+%77 = OpFSub %6 %57 %76
+OpStore %45 %77
+OpBranch %75
+%75 = OpLabel
+%78 = OpLoad %6 %45
-%58 = OpExtInst %6 %1 Exp %57
+%58 = OpExtInst %6 %1 Exp %78
OpReturnValue %58
OpFunctionEnd
)";
Options options;
@ -792,34 +792,13 @@ TEST(DiffTest, ExtraIfBlockNoDebug) {
%63 = OpVariable %62 Output
%67 = OpTypePointer Input %6
%68 = OpVariable %67 Input
%10 = OpFunction %6 None %7
%11 = OpLabel
%45 = OpVariable %12 Function
%46 = OpAccessChain %21 %18 %20
%47 = OpLoad %15 %46
%48 = OpConvertUToF %6 %47
%50 = OpFDiv %6 %48 %49
OpStore %45 %50
%51 = OpLoad %6 %45
%54 = OpExtInst %6 %1 FClamp %51 %52 %53
%55 = OpLoad %6 %45
%56 = OpFMul %6 %55 %54
OpStore %45 %56
+%71 = OpAccessChain %21 %18 %32
+%72 = OpLoad %15 %71
+%73 = OpINotEqual %25 %72 %24
+OpSelectionMerge %75 None
+OpBranchConditional %73 %74 %75
+%74 = OpLabel
%57 = OpLoad %6 %45
+%77 = OpFSub %6 %57 %76
+OpStore %45 %77
+OpBranch %75
+%75 = OpLabel
+%78 = OpLoad %6 %45
-%58 = OpExtInst %6 %1 Exp %57
+%58 = OpExtInst %6 %1 Exp %78
OpReturnValue %58
%4 = OpFunction %2 None %3
%5 = OpLabel
%64 = OpFunctionCall %6 %8
%65 = OpFunctionCall %6 %10
%66 = OpCompositeConstruct %61 %64 %65 %14 %29
OpStore %63 %66
OpReturn
OpFunctionEnd
%8 = OpFunction %6 None %7
%9 = OpLabel
@ -849,13 +828,34 @@ TEST(DiffTest, ExtraIfBlockNoDebug) {
%42 = OpFSub %6 %39 %41
OpReturnValue %42
OpFunctionEnd
%4 = OpFunction %2 None %3
%5 = OpLabel
%64 = OpFunctionCall %6 %8
%65 = OpFunctionCall %6 %10
%66 = OpCompositeConstruct %61 %64 %65 %14 %29
OpStore %63 %66
OpReturn
%10 = OpFunction %6 None %7
%11 = OpLabel
%45 = OpVariable %12 Function
%46 = OpAccessChain %21 %18 %20
%47 = OpLoad %15 %46
%48 = OpConvertUToF %6 %47
%50 = OpFDiv %6 %48 %49
OpStore %45 %50
%51 = OpLoad %6 %45
%54 = OpExtInst %6 %1 FClamp %51 %52 %53
%55 = OpLoad %6 %45
%56 = OpFMul %6 %55 %54
OpStore %45 %56
+%71 = OpAccessChain %21 %18 %32
+%72 = OpLoad %15 %71
+%73 = OpINotEqual %25 %72 %24
+OpSelectionMerge %75 None
+OpBranchConditional %73 %74 %75
+%74 = OpLabel
%57 = OpLoad %6 %45
+%77 = OpFSub %6 %57 %76
+OpStore %45 %77
+OpBranch %75
+%75 = OpLabel
+%78 = OpLoad %6 %45
-%58 = OpExtInst %6 %1 Exp %57
+%58 = OpExtInst %6 %1 Exp %78
OpReturnValue %58
OpFunctionEnd
)";
Options options;

Просмотреть файл

@ -574,89 +574,11 @@ TEST(DiffTest, LargeFunctionsLargeDiffs) {
%113 = OpTypePointer Uniform %78
%128 = OpVariable %26 UniformConstant
%130 = OpConstantComposite %32 %45 %45
%8 = OpFunction %2 None %3
%9 = OpLabel
%101 = OpVariable %43 Function
-%92 = OpAccessChain %91 %90 %73
-%93 = OpLoad %87 %92
-%95 = OpAccessChain %94 %82 %45
-%96 = OpLoad %77 %95
-%97 = OpConvertUToF %86 %96
-%98 = OpMatrixTimesVector %86 %93 %97
-%99 = OpConvertFToU %77 %98
-%100 = OpAccessChain %94 %82 %45
-OpStore %100 %99
+OpStore %101 %45
-OpStore %101 %45
OpBranch %102
%102 = OpLabel
-OpLoopMerge %104 %105 None
+OpLoopMerge %171 %172 None
OpBranch %106
%106 = OpLabel
%107 = OpLoad %24 %101
%109 = OpSLessThan %54 %107 %108
-OpBranchConditional %109 %103 %104
+OpBranchConditional %109 %103 %171
%103 = OpLabel
-%111 = OpAccessChain %110 %82 %73
-%112 = OpLoad %79 %111
-%114 = OpAccessChain %113 %90 %53
-%115 = OpLoad %78 %114
-%116 = OpVectorTimesScalar %79 %112 %115
-%117 = OpConvertFToU %13 %116
-%118 = OpCompositeExtract %10 %117 0
-%119 = OpCompositeExtract %10 %117 1
-%120 = OpCompositeExtract %10 %117 2
-%121 = OpCompositeConstruct %77 %118 %119 %120 %16
-%122 = OpAccessChain %94 %82 %45
-%123 = OpLoad %77 %122
-%124 = OpIAdd %77 %123 %121
-%125 = OpAccessChain %94 %82 %45
-OpStore %125 %124
-OpBranch %105
-%105 = OpLabel
%126 = OpLoad %24 %101
-%127 = OpIAdd %24 %126 %73
+%173 = OpIEqual %54 %126 %45
+OpSelectionMerge %174 None
+OpBranchConditional %173 %104 %176
+%176 = OpLabel
+%177 = OpLoad %13 %15
+%178 = OpConvertUToF %79 %177
+%180 = OpCompositeExtract %78 %178 0
+%181 = OpCompositeExtract %78 %178 1
+%182 = OpCompositeConstruct %179 %180 %181
+%183 = OpAccessChain %113 %82 %73 %21
+%184 = OpCompositeExtract %78 %182 0
-OpStore %101 %127
+OpStore %183 %184
+%185 = OpAccessChain %113 %82 %73 %40
+%186 = OpCompositeExtract %78 %182 1
+OpStore %185 %186
-OpBranch %102
+OpBranch %174
%104 = OpLabel
-OpMemoryBarrier %40 %41
-OpControlBarrier %40 %40 %42
%129 = OpLoad %25 %128
%131 = OpImageRead %38 %129 %130
%132 = OpCompositeExtract %24 %131 0
%133 = OpConvertSToF %78 %132
-%134 = OpCompositeConstruct %79 %133 %133 %133
-%135 = OpAccessChain %110 %82 %73
+%175 = OpAccessChain %113 %82 %73 %16
-OpStore %135 %134
+OpStore %175 %133
+OpBranch %174
+%174 = OpLabel
+OpBranch %172
+%172 = OpLabel
+%187 = OpLoad %24 %101
+%188 = OpIAdd %24 %187 %73
+OpStore %101 %188
+OpBranch %102
+%171 = OpLabel
%4 = OpFunction %2 None %3
%5 = OpLabel
-%136 = OpFunctionCall %2 %6
%137 = OpFunctionCall %2 %8
+%189 = OpFunctionCall %2 %6
OpReturn
OpFunctionEnd
%6 = OpFunction %2 None %3
@ -777,11 +699,89 @@ TEST(DiffTest, LargeFunctionsLargeDiffs) {
+OpImageWrite %163 %168 %170
OpReturn
OpFunctionEnd
%4 = OpFunction %2 None %3
%5 = OpLabel
-%136 = OpFunctionCall %2 %6
%137 = OpFunctionCall %2 %8
+%189 = OpFunctionCall %2 %6
%8 = OpFunction %2 None %3
%9 = OpLabel
%101 = OpVariable %43 Function
-%92 = OpAccessChain %91 %90 %73
-%93 = OpLoad %87 %92
-%95 = OpAccessChain %94 %82 %45
-%96 = OpLoad %77 %95
-%97 = OpConvertUToF %86 %96
-%98 = OpMatrixTimesVector %86 %93 %97
-%99 = OpConvertFToU %77 %98
-%100 = OpAccessChain %94 %82 %45
-OpStore %100 %99
+OpStore %101 %45
-OpStore %101 %45
OpBranch %102
%102 = OpLabel
-OpLoopMerge %104 %105 None
+OpLoopMerge %171 %172 None
OpBranch %106
%106 = OpLabel
%107 = OpLoad %24 %101
%109 = OpSLessThan %54 %107 %108
-OpBranchConditional %109 %103 %104
+OpBranchConditional %109 %103 %171
%103 = OpLabel
-%111 = OpAccessChain %110 %82 %73
-%112 = OpLoad %79 %111
-%114 = OpAccessChain %113 %90 %53
-%115 = OpLoad %78 %114
-%116 = OpVectorTimesScalar %79 %112 %115
-%117 = OpConvertFToU %13 %116
-%118 = OpCompositeExtract %10 %117 0
-%119 = OpCompositeExtract %10 %117 1
-%120 = OpCompositeExtract %10 %117 2
-%121 = OpCompositeConstruct %77 %118 %119 %120 %16
-%122 = OpAccessChain %94 %82 %45
-%123 = OpLoad %77 %122
-%124 = OpIAdd %77 %123 %121
-%125 = OpAccessChain %94 %82 %45
-OpStore %125 %124
-OpBranch %105
-%105 = OpLabel
%126 = OpLoad %24 %101
-%127 = OpIAdd %24 %126 %73
+%173 = OpIEqual %54 %126 %45
+OpSelectionMerge %174 None
+OpBranchConditional %173 %104 %176
+%176 = OpLabel
+%177 = OpLoad %13 %15
+%178 = OpConvertUToF %79 %177
+%180 = OpCompositeExtract %78 %178 0
+%181 = OpCompositeExtract %78 %178 1
+%182 = OpCompositeConstruct %179 %180 %181
+%183 = OpAccessChain %113 %82 %73 %21
+%184 = OpCompositeExtract %78 %182 0
-OpStore %101 %127
+OpStore %183 %184
+%185 = OpAccessChain %113 %82 %73 %40
+%186 = OpCompositeExtract %78 %182 1
+OpStore %185 %186
-OpBranch %102
+OpBranch %174
%104 = OpLabel
-OpMemoryBarrier %40 %41
-OpControlBarrier %40 %40 %42
%129 = OpLoad %25 %128
%131 = OpImageRead %38 %129 %130
%132 = OpCompositeExtract %24 %131 0
%133 = OpConvertSToF %78 %132
-%134 = OpCompositeConstruct %79 %133 %133 %133
-%135 = OpAccessChain %110 %82 %73
+%175 = OpAccessChain %113 %82 %73 %16
-OpStore %135 %134
+OpStore %175 %133
+OpBranch %174
+%174 = OpLabel
+OpBranch %172
+%172 = OpLabel
+%187 = OpLoad %24 %101
+%188 = OpIAdd %24 %187 %73
+OpStore %101 %188
+OpBranch %102
+%171 = OpLabel
OpReturn
OpFunctionEnd
)";
@ -1271,61 +1271,14 @@ TEST(DiffTest, LargeFunctionsLargeDiffsNoDebug) {
%113 = OpTypePointer Uniform %78
%128 = OpVariable %26 UniformConstant
%130 = OpConstantComposite %32 %45 %45
-%8 = OpFunction %2 None %3
-%9 = OpLabel
-%101 = OpVariable %43 Function
-%92 = OpAccessChain %91 %90 %73
-%93 = OpLoad %87 %92
-%95 = OpAccessChain %94 %82 %45
-%96 = OpLoad %77 %95
-%97 = OpConvertUToF %86 %96
-%98 = OpMatrixTimesVector %86 %93 %97
-%99 = OpConvertFToU %77 %98
-%100 = OpAccessChain %94 %82 %45
-OpStore %100 %99
-OpStore %101 %45
-OpBranch %102
-%102 = OpLabel
-OpLoopMerge %104 %105 None
-OpBranch %106
-%106 = OpLabel
-%107 = OpLoad %24 %101
-%109 = OpSLessThan %54 %107 %108
-OpBranchConditional %109 %103 %104
-%103 = OpLabel
-%111 = OpAccessChain %110 %82 %73
-%112 = OpLoad %79 %111
-%114 = OpAccessChain %113 %90 %53
-%115 = OpLoad %78 %114
-%116 = OpVectorTimesScalar %79 %112 %115
-%117 = OpConvertFToU %13 %116
-%118 = OpCompositeExtract %10 %117 0
-%119 = OpCompositeExtract %10 %117 1
-%120 = OpCompositeExtract %10 %117 2
-%121 = OpCompositeConstruct %77 %118 %119 %120 %16
-%122 = OpAccessChain %94 %82 %45
-%123 = OpLoad %77 %122
-%124 = OpIAdd %77 %123 %121
-%125 = OpAccessChain %94 %82 %45
-OpStore %125 %124
-OpBranch %105
-%105 = OpLabel
-%126 = OpLoad %24 %101
-%127 = OpIAdd %24 %126 %73
-OpStore %101 %127
-OpBranch %102
-%104 = OpLabel
-OpMemoryBarrier %40 %41
-OpControlBarrier %40 %40 %42
-%129 = OpLoad %25 %128
-%131 = OpImageRead %38 %129 %130
-%132 = OpCompositeExtract %24 %131 0
-%133 = OpConvertSToF %78 %132
-%134 = OpCompositeConstruct %79 %133 %133 %133
-%135 = OpAccessChain %110 %82 %73
-OpStore %135 %134
-OpReturn
-OpFunctionEnd
%4 = OpFunction %2 None %3
%5 = OpLabel
-%136 = OpFunctionCall %2 %6
+%136 = OpFunctionCall %2 %140
-%137 = OpFunctionCall %2 %8
+%137 = OpFunctionCall %2 %138
OpReturn
OpFunctionEnd
-%6 = OpFunction %2 None %3
-%7 = OpLabel
-%12 = OpVariable %11 Function
@ -1402,62 +1355,61 @@ TEST(DiffTest, LargeFunctionsLargeDiffsNoDebug) {
-OpStore %85 %83
-OpReturn
-OpFunctionEnd
%4 = OpFunction %2 None %3
%5 = OpLabel
-%136 = OpFunctionCall %2 %6
+%136 = OpFunctionCall %2 %140
-%137 = OpFunctionCall %2 %8
+%137 = OpFunctionCall %2 %138
OpReturn
OpFunctionEnd
+%140 = OpFunction %2 None %3
+%141 = OpLabel
+%190 = OpVariable %43 Function
+OpStore %190 %45
+OpBranch %191
+%191 = OpLabel
+OpLoopMerge %193 %194 None
+OpBranch %195
+%195 = OpLabel
+%196 = OpLoad %24 %190
+%197 = OpSLessThan %54 %196 %108
+OpBranchConditional %197 %192 %193
+%192 = OpLabel
+%198 = OpLoad %24 %190
+%199 = OpIEqual %54 %198 %45
+OpSelectionMerge %201 None
+OpBranchConditional %199 %200 %207
+%207 = OpLabel
+%208 = OpLoad %13 %15
+%209 = OpConvertUToF %79 %208
+%211 = OpCompositeExtract %78 %209 0
+%212 = OpCompositeExtract %78 %209 1
+%213 = OpCompositeConstruct %210 %211 %212
+%214 = OpAccessChain %113 %82 %73 %21
+%215 = OpCompositeExtract %78 %213 0
+OpStore %214 %215
+%216 = OpAccessChain %113 %82 %73 %40
+%217 = OpCompositeExtract %78 %213 1
+OpStore %216 %217
+OpBranch %201
+%200 = OpLabel
+%202 = OpLoad %25 %128
+%203 = OpImageRead %38 %202 %130
+%204 = OpCompositeExtract %24 %203 0
+%205 = OpConvertSToF %78 %204
+%206 = OpAccessChain %113 %82 %73 %16
+OpStore %206 %205
+OpBranch %201
+%201 = OpLabel
+OpBranch %194
+%194 = OpLabel
+%218 = OpLoad %24 %190
+%219 = OpIAdd %24 %218 %73
+OpStore %190 %219
+OpBranch %191
+%193 = OpLabel
+OpReturn
+OpFunctionEnd
-%8 = OpFunction %2 None %3
-%9 = OpLabel
-%101 = OpVariable %43 Function
-%92 = OpAccessChain %91 %90 %73
-%93 = OpLoad %87 %92
-%95 = OpAccessChain %94 %82 %45
-%96 = OpLoad %77 %95
-%97 = OpConvertUToF %86 %96
-%98 = OpMatrixTimesVector %86 %93 %97
-%99 = OpConvertFToU %77 %98
-%100 = OpAccessChain %94 %82 %45
-OpStore %100 %99
-OpStore %101 %45
-OpBranch %102
-%102 = OpLabel
-OpLoopMerge %104 %105 None
-OpBranch %106
-%106 = OpLabel
-%107 = OpLoad %24 %101
-%109 = OpSLessThan %54 %107 %108
-OpBranchConditional %109 %103 %104
-%103 = OpLabel
-%111 = OpAccessChain %110 %82 %73
-%112 = OpLoad %79 %111
-%114 = OpAccessChain %113 %90 %53
-%115 = OpLoad %78 %114
-%116 = OpVectorTimesScalar %79 %112 %115
-%117 = OpConvertFToU %13 %116
-%118 = OpCompositeExtract %10 %117 0
-%119 = OpCompositeExtract %10 %117 1
-%120 = OpCompositeExtract %10 %117 2
-%121 = OpCompositeConstruct %77 %118 %119 %120 %16
-%122 = OpAccessChain %94 %82 %45
-%123 = OpLoad %77 %122
-%124 = OpIAdd %77 %123 %121
-%125 = OpAccessChain %94 %82 %45
-OpStore %125 %124
-OpBranch %105
-%105 = OpLabel
-%126 = OpLoad %24 %101
-%127 = OpIAdd %24 %126 %73
-OpStore %101 %127
-OpBranch %102
-%104 = OpLabel
-OpMemoryBarrier %40 %41
-OpControlBarrier %40 %40 %42
-%129 = OpLoad %25 %128
-%131 = OpImageRead %38 %129 %130
-%132 = OpCompositeExtract %24 %131 0
-%133 = OpConvertSToF %78 %132
-%134 = OpCompositeConstruct %79 %133 %133 %133
-%135 = OpAccessChain %110 %82 %73
-OpStore %135 %134
-OpReturn
-OpFunctionEnd
+%138 = OpFunction %2 None %3
+%139 = OpLabel
+%142 = OpVariable %11 Function
@ -1524,6 +1476,54 @@ TEST(DiffTest, LargeFunctionsLargeDiffsNoDebug) {
+OpImageWrite %181 %186 %189
+OpReturn
+OpFunctionEnd
+%140 = OpFunction %2 None %3
+%141 = OpLabel
+%190 = OpVariable %43 Function
+OpStore %190 %45
+OpBranch %191
+%191 = OpLabel
+OpLoopMerge %193 %194 None
+OpBranch %195
+%195 = OpLabel
+%196 = OpLoad %24 %190
+%197 = OpSLessThan %54 %196 %108
+OpBranchConditional %197 %192 %193
+%192 = OpLabel
+%198 = OpLoad %24 %190
+%199 = OpIEqual %54 %198 %45
+OpSelectionMerge %201 None
+OpBranchConditional %199 %200 %207
+%207 = OpLabel
+%208 = OpLoad %13 %15
+%209 = OpConvertUToF %79 %208
+%211 = OpCompositeExtract %78 %209 0
+%212 = OpCompositeExtract %78 %209 1
+%213 = OpCompositeConstruct %210 %211 %212
+%214 = OpAccessChain %113 %82 %73 %21
+%215 = OpCompositeExtract %78 %213 0
+OpStore %214 %215
+%216 = OpAccessChain %113 %82 %73 %40
+%217 = OpCompositeExtract %78 %213 1
+OpStore %216 %217
+OpBranch %201
+%200 = OpLabel
+%202 = OpLoad %25 %128
+%203 = OpImageRead %38 %202 %130
+%204 = OpCompositeExtract %24 %203 0
+%205 = OpConvertSToF %78 %204
+%206 = OpAccessChain %113 %82 %73 %16
+OpStore %206 %205
+OpBranch %201
+%201 = OpLabel
+OpBranch %194
+%194 = OpLabel
+%218 = OpLoad %24 %190
+%219 = OpIAdd %24 %218 %73
+OpStore %190 %219
+OpBranch %191
+%193 = OpLabel
+OpReturn
+OpFunctionEnd
)";
Options options;
DoStringDiffTest(kSrcNoDebug, kDstNoDebug, kDiff, options);

Просмотреть файл

@ -578,61 +578,10 @@ TEST(DiffTest, LargeFunctionsSmallDiffs) {
%113 = OpTypePointer Uniform %78
+%138 = OpVariable %26 UniformConstant
%129 = OpConstantComposite %32 %45 %45
%8 = OpFunction %2 None %3
%9 = OpLabel
%101 = OpVariable %43 Function
%92 = OpAccessChain %91 %90 %73
%93 = OpLoad %87 %92
%95 = OpAccessChain %94 %82 %45
%96 = OpLoad %77 %95
%97 = OpConvertUToF %86 %96
%98 = OpMatrixTimesVector %86 %93 %97
%99 = OpConvertFToU %77 %98
%100 = OpAccessChain %94 %82 %45
OpStore %100 %99
OpStore %101 %45
OpBranch %102
%102 = OpLabel
OpLoopMerge %104 %105 None
OpBranch %106
%106 = OpLabel
%107 = OpLoad %24 %101
%109 = OpSLessThan %54 %107 %108
OpBranchConditional %109 %103 %104
%103 = OpLabel
%111 = OpAccessChain %110 %82 %73
%112 = OpLoad %79 %111
%114 = OpAccessChain %113 %90 %53
%115 = OpLoad %78 %114
%116 = OpVectorTimesScalar %79 %112 %115
%117 = OpConvertFToU %13 %116
%118 = OpCompositeExtract %10 %117 0
%119 = OpCompositeExtract %10 %117 1
%120 = OpCompositeExtract %10 %117 2
%121 = OpCompositeConstruct %77 %118 %119 %120 %16
%122 = OpAccessChain %94 %82 %45
%123 = OpLoad %77 %122
%124 = OpIAdd %77 %123 %121
%125 = OpAccessChain %94 %82 %45
OpStore %125 %124
OpBranch %105
%105 = OpLabel
%126 = OpLoad %24 %101
%127 = OpIAdd %24 %126 %73
OpStore %101 %127
OpBranch %102
%104 = OpLabel
OpMemoryBarrier %40 %41
OpControlBarrier %40 %40 %42
-%128 = OpLoad %25 %27
+%139 = OpLoad %25 %138
-%130 = OpImageRead %38 %128 %129
+%130 = OpImageRead %38 %139 %129
%131 = OpCompositeExtract %24 %130 0
%132 = OpConvertSToF %78 %131
%133 = OpCompositeConstruct %79 %132 %132 %132
%134 = OpAccessChain %110 %82 %73
OpStore %134 %133
%4 = OpFunction %2 None %3
%5 = OpLabel
%135 = OpFunctionCall %2 %6
%136 = OpFunctionCall %2 %8
OpReturn
OpFunctionEnd
%6 = OpFunction %2 None %3
@ -713,10 +662,61 @@ TEST(DiffTest, LargeFunctionsSmallDiffs) {
OpStore %85 %83
OpReturn
OpFunctionEnd
%4 = OpFunction %2 None %3
%5 = OpLabel
%135 = OpFunctionCall %2 %6
%136 = OpFunctionCall %2 %8
%8 = OpFunction %2 None %3
%9 = OpLabel
%101 = OpVariable %43 Function
%92 = OpAccessChain %91 %90 %73
%93 = OpLoad %87 %92
%95 = OpAccessChain %94 %82 %45
%96 = OpLoad %77 %95
%97 = OpConvertUToF %86 %96
%98 = OpMatrixTimesVector %86 %93 %97
%99 = OpConvertFToU %77 %98
%100 = OpAccessChain %94 %82 %45
OpStore %100 %99
OpStore %101 %45
OpBranch %102
%102 = OpLabel
OpLoopMerge %104 %105 None
OpBranch %106
%106 = OpLabel
%107 = OpLoad %24 %101
%109 = OpSLessThan %54 %107 %108
OpBranchConditional %109 %103 %104
%103 = OpLabel
%111 = OpAccessChain %110 %82 %73
%112 = OpLoad %79 %111
%114 = OpAccessChain %113 %90 %53
%115 = OpLoad %78 %114
%116 = OpVectorTimesScalar %79 %112 %115
%117 = OpConvertFToU %13 %116
%118 = OpCompositeExtract %10 %117 0
%119 = OpCompositeExtract %10 %117 1
%120 = OpCompositeExtract %10 %117 2
%121 = OpCompositeConstruct %77 %118 %119 %120 %16
%122 = OpAccessChain %94 %82 %45
%123 = OpLoad %77 %122
%124 = OpIAdd %77 %123 %121
%125 = OpAccessChain %94 %82 %45
OpStore %125 %124
OpBranch %105
%105 = OpLabel
%126 = OpLoad %24 %101
%127 = OpIAdd %24 %126 %73
OpStore %101 %127
OpBranch %102
%104 = OpLabel
OpMemoryBarrier %40 %41
OpControlBarrier %40 %40 %42
-%128 = OpLoad %25 %27
+%139 = OpLoad %25 %138
-%130 = OpImageRead %38 %128 %129
+%130 = OpImageRead %38 %139 %129
%131 = OpCompositeExtract %24 %130 0
%132 = OpConvertSToF %78 %131
%133 = OpCompositeConstruct %79 %132 %132 %132
%134 = OpAccessChain %110 %82 %73
OpStore %134 %133
OpReturn
OpFunctionEnd
)";
@ -1213,61 +1213,10 @@ TEST(DiffTest, LargeFunctionsSmallDiffsNoDebug) {
%113 = OpTypePointer Uniform %78
+%138 = OpVariable %26 UniformConstant
%129 = OpConstantComposite %32 %45 %45
%8 = OpFunction %2 None %3
%9 = OpLabel
%101 = OpVariable %43 Function
%92 = OpAccessChain %91 %90 %73
%93 = OpLoad %87 %92
%95 = OpAccessChain %94 %82 %45
%96 = OpLoad %77 %95
%97 = OpConvertUToF %86 %96
%98 = OpMatrixTimesVector %86 %93 %97
%99 = OpConvertFToU %77 %98
%100 = OpAccessChain %94 %82 %45
OpStore %100 %99
OpStore %101 %45
OpBranch %102
%102 = OpLabel
OpLoopMerge %104 %105 None
OpBranch %106
%106 = OpLabel
%107 = OpLoad %24 %101
%109 = OpSLessThan %54 %107 %108
OpBranchConditional %109 %103 %104
%103 = OpLabel
%111 = OpAccessChain %110 %82 %73
%112 = OpLoad %79 %111
%114 = OpAccessChain %113 %90 %53
%115 = OpLoad %78 %114
%116 = OpVectorTimesScalar %79 %112 %115
%117 = OpConvertFToU %13 %116
%118 = OpCompositeExtract %10 %117 0
%119 = OpCompositeExtract %10 %117 1
%120 = OpCompositeExtract %10 %117 2
%121 = OpCompositeConstruct %77 %118 %119 %120 %16
%122 = OpAccessChain %94 %82 %45
%123 = OpLoad %77 %122
%124 = OpIAdd %77 %123 %121
%125 = OpAccessChain %94 %82 %45
OpStore %125 %124
OpBranch %105
%105 = OpLabel
%126 = OpLoad %24 %101
%127 = OpIAdd %24 %126 %73
OpStore %101 %127
OpBranch %102
%104 = OpLabel
OpMemoryBarrier %40 %41
OpControlBarrier %40 %40 %42
-%128 = OpLoad %25 %27
+%139 = OpLoad %25 %138
-%130 = OpImageRead %38 %128 %129
+%130 = OpImageRead %38 %139 %129
%131 = OpCompositeExtract %24 %130 0
%132 = OpConvertSToF %78 %131
%133 = OpCompositeConstruct %79 %132 %132 %132
%134 = OpAccessChain %110 %82 %73
OpStore %134 %133
%4 = OpFunction %2 None %3
%5 = OpLabel
%135 = OpFunctionCall %2 %6
%136 = OpFunctionCall %2 %8
OpReturn
OpFunctionEnd
%6 = OpFunction %2 None %3
@ -1348,10 +1297,61 @@ TEST(DiffTest, LargeFunctionsSmallDiffsNoDebug) {
OpStore %85 %83
OpReturn
OpFunctionEnd
%4 = OpFunction %2 None %3
%5 = OpLabel
%135 = OpFunctionCall %2 %6
%136 = OpFunctionCall %2 %8
%8 = OpFunction %2 None %3
%9 = OpLabel
%101 = OpVariable %43 Function
%92 = OpAccessChain %91 %90 %73
%93 = OpLoad %87 %92
%95 = OpAccessChain %94 %82 %45
%96 = OpLoad %77 %95
%97 = OpConvertUToF %86 %96
%98 = OpMatrixTimesVector %86 %93 %97
%99 = OpConvertFToU %77 %98
%100 = OpAccessChain %94 %82 %45
OpStore %100 %99
OpStore %101 %45
OpBranch %102
%102 = OpLabel
OpLoopMerge %104 %105 None
OpBranch %106
%106 = OpLabel
%107 = OpLoad %24 %101
%109 = OpSLessThan %54 %107 %108
OpBranchConditional %109 %103 %104
%103 = OpLabel
%111 = OpAccessChain %110 %82 %73
%112 = OpLoad %79 %111
%114 = OpAccessChain %113 %90 %53
%115 = OpLoad %78 %114
%116 = OpVectorTimesScalar %79 %112 %115
%117 = OpConvertFToU %13 %116
%118 = OpCompositeExtract %10 %117 0
%119 = OpCompositeExtract %10 %117 1
%120 = OpCompositeExtract %10 %117 2
%121 = OpCompositeConstruct %77 %118 %119 %120 %16
%122 = OpAccessChain %94 %82 %45
%123 = OpLoad %77 %122
%124 = OpIAdd %77 %123 %121
%125 = OpAccessChain %94 %82 %45
OpStore %125 %124
OpBranch %105
%105 = OpLabel
%126 = OpLoad %24 %101
%127 = OpIAdd %24 %126 %73
OpStore %101 %127
OpBranch %102
%104 = OpLabel
OpMemoryBarrier %40 %41
OpControlBarrier %40 %40 %42
-%128 = OpLoad %25 %27
+%139 = OpLoad %25 %138
-%130 = OpImageRead %38 %128 %129
+%130 = OpImageRead %38 %139 %129
%131 = OpCompositeExtract %24 %130 0
%132 = OpConvertSToF %78 %131
%133 = OpCompositeConstruct %79 %132 %132 %132
%134 = OpAccessChain %110 %82 %73
OpStore %134 %133
OpReturn
OpFunctionEnd
)";

Просмотреть файл

@ -167,6 +167,12 @@ TEST(DiffTest, MultipleDifferentEntryPoints) {
%10 = OpVariable %17 Input
%19 = OpTypePointer Output %16
%9 = OpVariable %19 Output
%2 = OpFunction %14 None %3
%5 = OpLabel
%11 = OpLoad %15 %7
OpStore %4 %11
OpReturn
OpFunctionEnd
%8 = OpFunction %14 None %3
%6 = OpLabel
%12 = OpLoad %15 %10
@ -174,12 +180,6 @@ TEST(DiffTest, MultipleDifferentEntryPoints) {
OpStore %9 %13
OpReturn
OpFunctionEnd
%2 = OpFunction %14 None %3
%5 = OpLabel
%11 = OpLoad %15 %7
OpStore %4 %11
OpReturn
OpFunctionEnd
)";
Options options;
DoStringDiffTest(kSrc, kDst, kDiff, options);
@ -307,6 +307,12 @@ TEST(DiffTest, MultipleDifferentEntryPointsNoDebug) {
%10 = OpVariable %17 Input
%19 = OpTypePointer Output %16
%9 = OpVariable %19 Output
%2 = OpFunction %14 None %3
%5 = OpLabel
%11 = OpLoad %15 %7
OpStore %4 %11
OpReturn
OpFunctionEnd
%8 = OpFunction %14 None %3
%6 = OpLabel
%12 = OpLoad %15 %10
@ -314,12 +320,6 @@ TEST(DiffTest, MultipleDifferentEntryPointsNoDebug) {
OpStore %9 %13
OpReturn
OpFunctionEnd
%2 = OpFunction %14 None %3
%5 = OpLabel
%11 = OpLoad %15 %7
OpStore %4 %11
OpReturn
OpFunctionEnd
)";
Options options;
DoStringDiffTest(kSrcNoDebug, kDstNoDebug, kDiff, options);

Просмотреть файл

@ -151,6 +151,12 @@ TEST(DiffTest, MultipleSameEntryPoints) {
%13 = OpVariable %7 Output
%14 = OpVariable %9 Input
%15 = OpVariable %9 Input
%4 = OpFunction %2 None %3
%5 = OpLabel
%11 = OpLoad %6 %10
OpStore %8 %11
OpReturn
OpFunctionEnd
%12 = OpFunction %2 None %3
%16 = OpLabel
%17 = OpLoad %6 %14
@ -159,12 +165,6 @@ TEST(DiffTest, MultipleSameEntryPoints) {
OpStore %13 %19
OpReturn
OpFunctionEnd
%4 = OpFunction %2 None %3
%5 = OpLabel
%11 = OpLoad %6 %10
OpStore %8 %11
OpReturn
OpFunctionEnd
)";
Options options;
DoStringDiffTest(kSrc, kDst, kDiff, options);
@ -276,6 +276,12 @@ TEST(DiffTest, MultipleSameEntryPointsNoDebug) {
%13 = OpVariable %7 Output
%14 = OpVariable %9 Input
%15 = OpVariable %9 Input
%4 = OpFunction %2 None %3
%5 = OpLabel
%11 = OpLoad %6 %10
OpStore %8 %11
OpReturn
OpFunctionEnd
%12 = OpFunction %2 None %3
%16 = OpLabel
%17 = OpLoad %6 %14
@ -284,12 +290,6 @@ TEST(DiffTest, MultipleSameEntryPointsNoDebug) {
OpStore %13 %19
OpReturn
OpFunctionEnd
%4 = OpFunction %2 None %3
%5 = OpLabel
%11 = OpLoad %6 %10
OpStore %8 %11
OpReturn
OpFunctionEnd
)";
Options options;
DoStringDiffTest(kSrcNoDebug, kDstNoDebug, kDiff, options);
@ -330,6 +330,12 @@ TEST(DiffTest, MultipleSameEntryPointsDumpIds) {
%13 = OpVariable %7 Output
%14 = OpVariable %9 Input
%15 = OpVariable %9 Input
%4 = OpFunction %2 None %3
%5 = OpLabel
%11 = OpLoad %6 %10
OpStore %8 %11
OpReturn
OpFunctionEnd
%12 = OpFunction %2 None %3
%16 = OpLabel
%17 = OpLoad %6 %14
@ -338,12 +344,6 @@ TEST(DiffTest, MultipleSameEntryPointsDumpIds) {
OpStore %13 %19
OpReturn
OpFunctionEnd
%4 = OpFunction %2 None %3
%5 = OpLabel
%11 = OpLoad %6 %10
OpStore %8 %11
OpReturn
OpFunctionEnd
Src -> Dst
1 -> 1 [ExtInstImport]
2 -> 2 [TypeVoid]

Просмотреть файл

@ -257,15 +257,41 @@ TEST(DiffTest, SmallFunctionsSmallDiffs) {
%25 = OpTypePointer Uniform %16
%31 = OpConstant %20 1
%36 = OpConstant %16 2
%14 = OpFunction %2 None %3
%15 = OpLabel
%41 = OpAccessChain %25 %19 %21
%42 = OpLoad %16 %41
-%43 = OpUDiv %16 %42 %36
+%53 = OpIAdd %16 %42 %36
%44 = OpAccessChain %25 %19 %21
-OpStore %44 %43
+OpStore %44 %53
%4 = OpFunction %2 None %3
%5 = OpLabel
%45 = OpFunctionCall %2 %6
%46 = OpFunctionCall %2 %8
%47 = OpFunctionCall %2 %10
%48 = OpFunctionCall %2 %12
%49 = OpFunctionCall %2 %14
OpReturn
OpFunctionEnd
%6 = OpFunction %2 None %3
%7 = OpLabel
%26 = OpAccessChain %25 %24 %21
%27 = OpLoad %16 %26
%28 = OpAccessChain %25 %19 %21
OpStore %28 %27
OpReturn
OpFunctionEnd
%8 = OpFunction %2 None %3
%9 = OpLabel
%29 = OpAccessChain %25 %19 %21
%30 = OpLoad %16 %29
-%32 = OpIAdd %16 %30 %31
+%50 = OpISub %16 %30 %31
-OpStore %29 %32
+OpStore %29 %50
OpReturn
OpFunctionEnd
%10 = OpFunction %2 None %3
%11 = OpLabel
%33 = OpAccessChain %25 %19 %21
%34 = OpLoad %16 %33
-%35 = OpISub %16 %34 %31
+%51 = OpIAdd %16 %34 %31
-OpStore %33 %35
+OpStore %33 %51
OpReturn
OpFunctionEnd
%12 = OpFunction %2 None %3
@ -279,41 +305,15 @@ TEST(DiffTest, SmallFunctionsSmallDiffs) {
+OpStore %40 %52
OpReturn
OpFunctionEnd
%10 = OpFunction %2 None %3
%11 = OpLabel
%33 = OpAccessChain %25 %19 %21
%34 = OpLoad %16 %33
-%35 = OpISub %16 %34 %31
+%51 = OpIAdd %16 %34 %31
-OpStore %33 %35
+OpStore %33 %51
OpReturn
OpFunctionEnd
%8 = OpFunction %2 None %3
%9 = OpLabel
%29 = OpAccessChain %25 %19 %21
%30 = OpLoad %16 %29
-%32 = OpIAdd %16 %30 %31
+%50 = OpISub %16 %30 %31
-OpStore %29 %32
+OpStore %29 %50
OpReturn
OpFunctionEnd
%6 = OpFunction %2 None %3
%7 = OpLabel
%26 = OpAccessChain %25 %24 %21
%27 = OpLoad %16 %26
%28 = OpAccessChain %25 %19 %21
OpStore %28 %27
OpReturn
OpFunctionEnd
%4 = OpFunction %2 None %3
%5 = OpLabel
%45 = OpFunctionCall %2 %6
%46 = OpFunctionCall %2 %8
%47 = OpFunctionCall %2 %10
%48 = OpFunctionCall %2 %12
%49 = OpFunctionCall %2 %14
%14 = OpFunction %2 None %3
%15 = OpLabel
%41 = OpAccessChain %25 %19 %21
%42 = OpLoad %16 %41
-%43 = OpUDiv %16 %42 %36
+%53 = OpIAdd %16 %42 %36
%44 = OpAccessChain %25 %19 %21
-OpStore %44 %43
+OpStore %44 %53
OpReturn
OpFunctionEnd
)";
@ -518,15 +518,39 @@ TEST(DiffTest, SmallFunctionsSmallDiffsNoDebug) {
%25 = OpTypePointer Uniform %16
%31 = OpConstant %20 1
%36 = OpConstant %16 2
%14 = OpFunction %2 None %3
%15 = OpLabel
%41 = OpAccessChain %25 %19 %21
%42 = OpLoad %16 %41
-%43 = OpUDiv %16 %42 %36
+%51 = OpIAdd %16 %42 %36
%44 = OpAccessChain %25 %19 %21
-OpStore %44 %43
+OpStore %44 %51
%4 = OpFunction %2 None %3
%5 = OpLabel
%45 = OpFunctionCall %2 %6
-%46 = OpFunctionCall %2 %8
+%46 = OpFunctionCall %2 %10
-%47 = OpFunctionCall %2 %10
+%47 = OpFunctionCall %2 %8
%48 = OpFunctionCall %2 %12
%49 = OpFunctionCall %2 %14
OpReturn
OpFunctionEnd
%6 = OpFunction %2 None %3
%7 = OpLabel
%26 = OpAccessChain %25 %24 %21
%27 = OpLoad %16 %26
%28 = OpAccessChain %25 %19 %21
OpStore %28 %27
OpReturn
OpFunctionEnd
%8 = OpFunction %2 None %3
%9 = OpLabel
%29 = OpAccessChain %25 %19 %21
%30 = OpLoad %16 %29
%32 = OpIAdd %16 %30 %31
OpStore %29 %32
OpReturn
OpFunctionEnd
%10 = OpFunction %2 None %3
%11 = OpLabel
%33 = OpAccessChain %25 %19 %21
%34 = OpLoad %16 %33
%35 = OpISub %16 %34 %31
OpStore %33 %35
OpReturn
OpFunctionEnd
%12 = OpFunction %2 None %3
@ -540,39 +564,15 @@ TEST(DiffTest, SmallFunctionsSmallDiffsNoDebug) {
+OpStore %40 %50
OpReturn
OpFunctionEnd
%10 = OpFunction %2 None %3
%11 = OpLabel
%33 = OpAccessChain %25 %19 %21
%34 = OpLoad %16 %33
%35 = OpISub %16 %34 %31
OpStore %33 %35
OpReturn
OpFunctionEnd
%8 = OpFunction %2 None %3
%9 = OpLabel
%29 = OpAccessChain %25 %19 %21
%30 = OpLoad %16 %29
%32 = OpIAdd %16 %30 %31
OpStore %29 %32
OpReturn
OpFunctionEnd
%6 = OpFunction %2 None %3
%7 = OpLabel
%26 = OpAccessChain %25 %24 %21
%27 = OpLoad %16 %26
%28 = OpAccessChain %25 %19 %21
OpStore %28 %27
OpReturn
OpFunctionEnd
%4 = OpFunction %2 None %3
%5 = OpLabel
%45 = OpFunctionCall %2 %6
-%46 = OpFunctionCall %2 %8
+%46 = OpFunctionCall %2 %10
-%47 = OpFunctionCall %2 %10
+%47 = OpFunctionCall %2 %8
%48 = OpFunctionCall %2 %12
%49 = OpFunctionCall %2 %14
%14 = OpFunction %2 None %3
%15 = OpLabel
%41 = OpAccessChain %25 %19 %21
%42 = OpLoad %16 %41
-%43 = OpUDiv %16 %42 %36
+%51 = OpIAdd %16 %42 %36
%44 = OpAccessChain %25 %19 %21
-OpStore %44 %43
+OpStore %44 %51
OpReturn
OpFunctionEnd
)";
@ -627,15 +627,41 @@ TEST(DiffTest, SmallFunctionsSmallDiffsDumpIds) {
%25 = OpTypePointer Uniform %16
%31 = OpConstant %20 1
%36 = OpConstant %16 2
%14 = OpFunction %2 None %3
%15 = OpLabel
%41 = OpAccessChain %25 %19 %21
%42 = OpLoad %16 %41
-%43 = OpUDiv %16 %42 %36
+%53 = OpIAdd %16 %42 %36
%44 = OpAccessChain %25 %19 %21
-OpStore %44 %43
+OpStore %44 %53
%4 = OpFunction %2 None %3
%5 = OpLabel
%45 = OpFunctionCall %2 %6
%46 = OpFunctionCall %2 %8
%47 = OpFunctionCall %2 %10
%48 = OpFunctionCall %2 %12
%49 = OpFunctionCall %2 %14
OpReturn
OpFunctionEnd
%6 = OpFunction %2 None %3
%7 = OpLabel
%26 = OpAccessChain %25 %24 %21
%27 = OpLoad %16 %26
%28 = OpAccessChain %25 %19 %21
OpStore %28 %27
OpReturn
OpFunctionEnd
%8 = OpFunction %2 None %3
%9 = OpLabel
%29 = OpAccessChain %25 %19 %21
%30 = OpLoad %16 %29
-%32 = OpIAdd %16 %30 %31
+%50 = OpISub %16 %30 %31
-OpStore %29 %32
+OpStore %29 %50
OpReturn
OpFunctionEnd
%10 = OpFunction %2 None %3
%11 = OpLabel
%33 = OpAccessChain %25 %19 %21
%34 = OpLoad %16 %33
-%35 = OpISub %16 %34 %31
+%51 = OpIAdd %16 %34 %31
-OpStore %33 %35
+OpStore %33 %51
OpReturn
OpFunctionEnd
%12 = OpFunction %2 None %3
@ -649,41 +675,15 @@ TEST(DiffTest, SmallFunctionsSmallDiffsDumpIds) {
+OpStore %40 %52
OpReturn
OpFunctionEnd
%10 = OpFunction %2 None %3
%11 = OpLabel
%33 = OpAccessChain %25 %19 %21
%34 = OpLoad %16 %33
-%35 = OpISub %16 %34 %31
+%51 = OpIAdd %16 %34 %31
-OpStore %33 %35
+OpStore %33 %51
OpReturn
OpFunctionEnd
%8 = OpFunction %2 None %3
%9 = OpLabel
%29 = OpAccessChain %25 %19 %21
%30 = OpLoad %16 %29
-%32 = OpIAdd %16 %30 %31
+%50 = OpISub %16 %30 %31
-OpStore %29 %32
+OpStore %29 %50
OpReturn
OpFunctionEnd
%6 = OpFunction %2 None %3
%7 = OpLabel
%26 = OpAccessChain %25 %24 %21
%27 = OpLoad %16 %26
%28 = OpAccessChain %25 %19 %21
OpStore %28 %27
OpReturn
OpFunctionEnd
%4 = OpFunction %2 None %3
%5 = OpLabel
%45 = OpFunctionCall %2 %6
%46 = OpFunctionCall %2 %8
%47 = OpFunctionCall %2 %10
%48 = OpFunctionCall %2 %12
%49 = OpFunctionCall %2 %14
%14 = OpFunction %2 None %3
%15 = OpLabel
%41 = OpAccessChain %25 %19 %21
%42 = OpLoad %16 %41
-%43 = OpUDiv %16 %42 %36
+%53 = OpIAdd %16 %42 %36
%44 = OpAccessChain %25 %19 %21
-OpStore %44 %43
+OpStore %44 %53
OpReturn
OpFunctionEnd
Src -> Dst

Просмотреть файл

@ -220,104 +220,104 @@ TEST(LCSTest, WithDuplicates) {
VerifyMatch(src, dst, 6);
}
const std::string large_lcs_src_str =
"GUJwrJSlkKJXxCVIAxlVgnUyOrdyRyFtlZwWMmFhYGfkFTNnhiBmClgHyrcXMVwfrRxNUfQk"
"qaoGvCbPZHAzXsaZpXHPfJxOMCUtRDmIQpfiXKbHQbhTfPqhxBDWvmTQAqwsWTLajZYtMUnf"
"hNNCfkuAXkZsaebwEbIZOxTDZsqSMUfCMoGeKJGVSNFgLTiBMbdvchHGfFRkHKcYCDjBfIcj"
"todPnvDjzQYWBcvIfVvyBzHikrwpDORaGEZLhmyztIFCLJOqeLhOzERYmVqzlsoUzruTXTXq"
"DLTxQRakOCMRrgRzCDTXfwwfDcKMBVnxRZemjcwcEsOVxwtwdBCWJycsDcZKlvrCvZaenKlv"
"vyByDQeLdxAyBnPkIMQlMQwqjUfRLybeoaOanlbFkpTPPZdHelQrIvucTHzMpWWQTbuANwvN"
"OVhCGGoIcGNDpfIsaBexlMMdHsxMGerTngmjpdPeQQJHfvKZkdYqAzrtDohqtDsaFMxQViVQ"
"YszDVgyoSHZdOXAvXkJidojLvGZOzhRajVPhWDwKuGqdaympELxHsrXAJYufdCPwJdGJfWqq"
"yvTWpcrFHOIuCEmNLnSCDsxQGRVDwyCykBJazhApfCnrOadnafvqfVuFqEXMSrYbHTfTnzbz"
"MhISyOtMUITaurCXvanCbuOXBhHyCjOhVbxnMvhlPmZBMQgEHCghtAJVMXGPNRtszVZlPxVl"
"QIPTBnPUPejlyZGPqeICyNngdQGkvKbIoWlTLBtVhMdBeUMozNlKQTIPYBeImVcMdLafuxUf"
"TIXysmcTrUTcspOSKBxhdhLwiRnREGFWJTfUKsgGOAQeYojXdrqsGjMJfiKalyoiqrgLnlij"
"CtOapoxDGVOOBalNYGzCtBlxbvaAzxipGnJpOEbmXcpeoIsAdxspKBzBDgoPVxnuRBUwmTSr"
"CRpWhxikgUYQVCwalLUIeBPRyhhsECGCXJmGDZSCIUaBwROkigzdeVPOXhgCGBEprWtNdYfL"
"tOUYJHQXxiIJgSGmWntezJFpNQoTPbRRYAGhtYvAechvBcYWocLkYFxsDAuszvQNLXdhmAHw"
"DErcjbtCdQllnKcDADVNWVezljjLrAuyGHetINMgAvJZwOEYakihYVUbZGCsHEufluLNyNHy"
"gqtSTSFFjBHiIqQejTPWybLdpWNwZrWvIWnlzUcGNQPEYHVPCbteWknjAnWrdTBeCbHUDBoK"
"aHvDStmpNRGIjvlumiZTbdZNAzUeSFnFChCsSExwXeEfDJfjyOoSBofHzJqJErvHLNyUJTjX"
"qmtgKPpMKohUPBMhtCteQFcNEpWrUVGbibMOpvBwdiWYXNissArpSasVJFgDzrqTyGkerTMX"
"gcrzFUGFZRhNdekaJeKYPogsofJaRsUQmIRyYdkrxKeMgLPpwOfSKJOqzXDoeHljTzhOwEVy"
"krOEnACFrWhufajsMitjOWdLOHHchQDddGPzxknEgdwmZepKDvRZGCuPqzeQkjOPqUBKpKLJ"
"eKieSsRXkaqxSPGajfvPKmwFWdLByEcLgvrmteazgFjmMGrLYqRRxzUOfOCokenqHVYstBHf"
"AwsWsqPTvqsRJUfGGTaYiylZMGbQqTzINhFHvdlRQvvYKBcuAHdBeKlHSxVrSsEKbcAvnIcf"
"xzdVDdwQPHMCHeZZRpGHWvKzgTGzSTbYTeOPyKvvYWmQToTpsjAtKUJUjcEHWhmdBLDTBMHJ"
"ivBXcLGtCsumNNVFyGbVviGmqHTdyBlkneibXBesKJGOUzOtIwXCPJggqBekSzNQYkALlItk"
"cbEhbdXAIKVHYpInLwxXalKZrkrpxtfuagqMGmRJnJbFQaEoYMoqPsxZpocddPXXPyvxVkaF"
"qdKISejWDhBImnEEOPDcyWTubbfVfwUztciaFJcsPLhgYVfhqlOfoNjKbmTFptFttYuyBrUI"
"zzmZypOqrjQHTGFwlHStpIwxPtMvtsEDpsmWIgwzYgwmdpbMOnfElZMYpVIcvzSWejeJcdUB"
"QUoBRUmGQVVWvEDseuozrDjgdXFScPwwsgaUPwSzScfBNrkpmEFDSZLKfNjMqvOmUtocUkbo"
"VGFEKgGLbNruwLgXHTloWDrnqymPVAtzjWPutonIsMDPeeCmTjYWAFXcyTAlBeiJTIRkZxiM"
"kLjMnAflSNJzmZkatXkYiPEMYSmzHbLKEizHbEjQOxBDzpRHiFjhedqiyMiUMvThjaRFmwll"
"aMGgwKBIKepwyoEdnuhtzJzboiNEAFKiqiWxxmkRFRoTiFWXLPAWLuzSCrajgkQhDxAQDqyM"
"VwZlhZicQLEDYYisEalesDWZAYzcvENuHUwRutIsGgsdoYwOZiURhcgdbTGWBNqhrFjvTQCj"
"VlTPNlRdRLaaqzUBBwbdtyXFkCBUYYMbmRrkFxfxbCqkgZNGyHPKLkOPnezfVTRmRQgCgHbx"
"wcZlInVOwmFePnSIbThMJosimzkhfuiqYEpwHQiemqsSDNNdbNhBLzbsPZBJZujSHJGtYKGb"
"HaAYGJZxBumsKUrATwPuqXFLfwNyImLQbchBKiJAYRZhkcrKCHXBEGYyBhBGvSqvabcRUrfq"
"AbPiMzjHAehGYjDEmxAnYLyoSFdeWVrfJUCuYZPluhXEBuyUpKaRXDKXeiCvGidpvATwMbcz"
"DZpzxrhTZYyrFORFQWTbPLCBjMKMhlRMFEiarDgGPttjmkrQVlujztMSkxXffXFNqLWOLThI"
"KBoyMHoFTEPCdUAZjLTifAdjjUehyDLEGKlRTFoLpjalziRSUjZfRYbNzhiHgTHowMMkKTwE"
"ZgnqiirMtnNpaBJqhcIVrWXPpcPWZfRpsPstHleFJDZYAsxYhOREVbFtebXTZRAIjGgWeoiN"
"qPLCCAVadqmUrjOcqIbdCTpcDRWuDVbHrZOQRPhqbyvOWwxAWJphjLiDgoAybcjzgfVktPlj"
"kNBCjelpuQfnYsiTgPpCNKYtOrxGaLEEtAuLdGdDsONHNhSn";
const std::string large_lcs_dst_str =
"KzitfifORCbGhfNEbnbObUdFLLaAsLOpMkOeKupjCoatzqfHBkNJfSgqSMYouswfNMnoQngK"
"jWwyPKmEnoZWyPBUdQRmKUNudUclueKXKQefUdXWUyyqtumzsFKznrLVLwfvPZpLChNYrrHK"
"AtpfOuVHiUKyeRCrktJAhkyFKmPWrASEMvBLNOzuGlvinZjvZUUXazNEkyMPiOLdqXvCIroC"
"MeWsvjHShlLhDwLZrVlpYBnDJmILcsNFDSoaLWOKNNkNGBgNBvVjPCJXAuKfsrKZhYcdEpxK"
"UihiRkYvMiLyOUvaqBMklLDwEhvQBfCXHSRoqsLsSCzLZQhIYMhBapvHaPbDoRrHoJXZsNXc"
"rxZYCrOMIzYcVPwDCFiHBFnPNTTeAeKEMGeVUeCaAeuWZmngyPWlQBcgWumSUIfbhjVYdnpV"
"hRSJXrIoFZubBXfNOMhilAkVPixrhILZKgDoFTvytPFPfBLMnbhSOBmLWCbJsLQxrCrMAlOw"
"RmfSQyGhrjhzYVqFSBHeoQBagFwyxIjcHFZngntpVHbSwqhwHeMnWSsISPljTxSNXfCxLebW"
"GhMdlphtJbdvhEcjNpwPCFqhdquxCyOxkjsDUPNgjpDcpIMhMwMclNhfESTrroJaoyeGQclV"
"gonnhuQRmXcBwcsWeLqjNngZOlyMyfeQBwnwMVJEvGqknDyzSApniRTPgJpFoDkJJhXQFuFB"
"VqhuEPMRGCeTDOSEFmXeIHOnDxaJacvnmORwVpmrRhGjDpUCkuODNPdZMdupYExDEDnDLdNF"
"iObKBaVWpGVMKdgNLgsNxcpypBPPKKoaajeSGPZQJWSOKrkLjiFexYVmUGxJnbTNsCXXLfZp"
"jfxQAEVYvqKehBzMsVHVGWmTshWFAoCNDkNppzzjHBZWckrzSTANICioCJSpLwPwQvtXVxst"
"nTRBAboPFREEUFazibpFesCsjzUOnECwoPCOFiwGORlIZVLpUkJyhYXCENmzTBLVigOFuCWO"
"IiXBYmiMtsxnUdoqSTTGyEFFrQsNAjcDdOKDtHwlANWoUVwiJCMCQFILdGqzEePuSXFbOEOz"
"dLlEnTJbKRSTfAFToOZNtDXTfFgvQiefAKbSUWUXFcpCjRYCBNXCCcLMjjuUDXErpiNsRuIx"
"mgHsrObTEXcnmjdqxTGhTjTeYizNnkrJRhNQIqDXmZMwArBccnixpcuiGOOexjgkpcEyGAnz"
"UbgiBfflTUyJfZeFFLrZVueFkSRosebnnwAnakIrywTGByhQKWvmNQJsWQezqLhHQzXnEpeD"
"rFRTSQSpVxPzSeEzfWYzfpcenxsUyzOMLxhNEhfcuprDtqubsXehuqKqZlLQeSclvoGjuKJK"
"XoWrazsgjXXnkWHdqFESZdMGDYldyYdbpSZcgBPgEKLWZHfBirNPLUadmajYkiEzmGuWGELB"
"WLiSrMdaGSbptKmgYVqMGcQaaATStiZYteGAPxSEBHuAzzjlRHYsrdDkaGNXmzRGoalJMiCC"
"GMtWSDMhgvRSEgKnywbRgnqWXFlwrhXbbvcgLGtWSuKQBiqIlWkfPMozOTWgVoLHavDJGRYI"
"YerrmZnTMtuuxmZALWakfzUbksTwoetqkOiRPGqGZepcVXHoZyOaaaijjZWQLlIhYwiQNbfc"
"KCwhhFaMQBoaCnOecJEdKzdsMPFEYQuJNPYiiNtsYxaWBRuWjlLqGokHMNtyTQfSJKbgGdol"
"fWlOZdupouQMfUWXIYHzyJHefMDnqxxasDxtgArvDqtwjDBaVEMACPkLFpiDOoKCHqkWVizh"
"lKqbOHpsPKkhjRQRNGYRYEfxtBjYvlCvHBNUwVuIwDJYMqHxEFtwdLqYWvjdOfQmNiviDfUq"
"pbucbNwjNQfMYgwUuPnQWIPOlqHcbjtuDXvTzLtkdBQanJbrmLSyFqSapZCSPMDOrxWVYzyO"
"lwDTTJFmKxoyfPunadkHcrcSQaQsAbrQtbhqwSTXGTPURYTCbNozjAVwbmcyVxIbZudBZWYm"
"rnSDyelGCRRWYtrUxvOVWlTLHHdYuAmVMGnGbHscbjmjmAzmYLaCxNNwhmMYdExKvySxuYpE"
"rVGwfqMngBCHnZodotNaNJZiNRFWubuPDfiywXPiyVWoQMeOlSuWmpilLTIFOvfpjmJTgrWa"
"dgoxYeyPyOaglOvZVGdFOBSeqEcGXBwjoeUAXqkpvOxEpSXhmklKZydTvRVYVvfQdRNNDkCT"
"dLNfcZCFQbZORdcDOhwotoyccrSbWvlqYMoiAYeEpDzZTvkamapzZMmCpEutZFCcHBWGIIkr"
"urwDNHrobaErPpclyEegLJDtkfUWSNWZosWSbBGAHIvJsFNUlJXbnkSVycLkOVQVcNcUtiBy"
"djLDIFsycbPBEWaMvCbntNtJlOeCttvXypGnHAQFnFSiXFWWqonWuVIKmVPpKXuJtFguXCWC"
"rNExYYvxLGEmuZJLJDjHgjlQyOzeieCpizJxkrdqKCgomyEkvsyVYSsLeyLvOZQrrgEJgRFK"
"CjYtoOfluNrLdRMTRkQXmAiMRFwloYECpXCReAMxOkNiwCtutsrqWoMHsrogRqPoUCueonvW"
"MTwmkAkajfGJkhnQidwpwIMEttQkzIMOPvvyWZHpqkMHWlNTeSKibfRfwDyxveKENZhtlPwP"
"dfAjwegjRcavtFnkkTNVYdCdCrgdUvzsIcqmUjwGmVvuuQvjVrWWIDBmAzQtiZPYvCOEWjce"
"rWzeqVKeiYTJBOedmQCVidOgUIEjfRnbGvUbctYxfRybJkdmeAkLZQMRMGPOnsPbFswXAoCK"
"IxWGwohoPpEJxslbqHFKSwknxTmrDCITRZWEDkGQeucPxHBdYkduwbYhKnoxCKhgjBFiFawC"
"QtgTDldTQmlOsBiGLquMjuecAbrUJJvNtXbFNGjWxaZPimSRXUJWgRbydpsczOqSFIeEtuKA"
"ZpRhmLtPdVNKdSDQZeeImUFmUwXApRTUNHItyvFyJtNtn";
TEST(LCSTest, Large) {
const std::string src_str =
"GUJwrJSlkKJXxCVIAxlVgnUyOrdyRyFtlZwWMmFhYGfkFTNnhiBmClgHyrcXMVwfrRxNUfQk"
"qaoGvCbPZHAzXsaZpXHPfJxOMCUtRDmIQpfiXKbHQbhTfPqhxBDWvmTQAqwsWTLajZYtMUnf"
"hNNCfkuAXkZsaebwEbIZOxTDZsqSMUfCMoGeKJGVSNFgLTiBMbdvchHGfFRkHKcYCDjBfIcj"
"todPnvDjzQYWBcvIfVvyBzHikrwpDORaGEZLhmyztIFCLJOqeLhOzERYmVqzlsoUzruTXTXq"
"DLTxQRakOCMRrgRzCDTXfwwfDcKMBVnxRZemjcwcEsOVxwtwdBCWJycsDcZKlvrCvZaenKlv"
"vyByDQeLdxAyBnPkIMQlMQwqjUfRLybeoaOanlbFkpTPPZdHelQrIvucTHzMpWWQTbuANwvN"
"OVhCGGoIcGNDpfIsaBexlMMdHsxMGerTngmjpdPeQQJHfvKZkdYqAzrtDohqtDsaFMxQViVQ"
"YszDVgyoSHZdOXAvXkJidojLvGZOzhRajVPhWDwKuGqdaympELxHsrXAJYufdCPwJdGJfWqq"
"yvTWpcrFHOIuCEmNLnSCDsxQGRVDwyCykBJazhApfCnrOadnafvqfVuFqEXMSrYbHTfTnzbz"
"MhISyOtMUITaurCXvanCbuOXBhHyCjOhVbxnMvhlPmZBMQgEHCghtAJVMXGPNRtszVZlPxVl"
"QIPTBnPUPejlyZGPqeICyNngdQGkvKbIoWlTLBtVhMdBeUMozNlKQTIPYBeImVcMdLafuxUf"
"TIXysmcTrUTcspOSKBxhdhLwiRnREGFWJTfUKsgGOAQeYojXdrqsGjMJfiKalyoiqrgLnlij"
"CtOapoxDGVOOBalNYGzCtBlxbvaAzxipGnJpOEbmXcpeoIsAdxspKBzBDgoPVxnuRBUwmTSr"
"CRpWhxikgUYQVCwalLUIeBPRyhhsECGCXJmGDZSCIUaBwROkigzdeVPOXhgCGBEprWtNdYfL"
"tOUYJHQXxiIJgSGmWntezJFpNQoTPbRRYAGhtYvAechvBcYWocLkYFxsDAuszvQNLXdhmAHw"
"DErcjbtCdQllnKcDADVNWVezljjLrAuyGHetINMgAvJZwOEYakihYVUbZGCsHEufluLNyNHy"
"gqtSTSFFjBHiIqQejTPWybLdpWNwZrWvIWnlzUcGNQPEYHVPCbteWknjAnWrdTBeCbHUDBoK"
"aHvDStmpNRGIjvlumiZTbdZNAzUeSFnFChCsSExwXeEfDJfjyOoSBofHzJqJErvHLNyUJTjX"
"qmtgKPpMKohUPBMhtCteQFcNEpWrUVGbibMOpvBwdiWYXNissArpSasVJFgDzrqTyGkerTMX"
"gcrzFUGFZRhNdekaJeKYPogsofJaRsUQmIRyYdkrxKeMgLPpwOfSKJOqzXDoeHljTzhOwEVy"
"krOEnACFrWhufajsMitjOWdLOHHchQDddGPzxknEgdwmZepKDvRZGCuPqzeQkjOPqUBKpKLJ"
"eKieSsRXkaqxSPGajfvPKmwFWdLByEcLgvrmteazgFjmMGrLYqRRxzUOfOCokenqHVYstBHf"
"AwsWsqPTvqsRJUfGGTaYiylZMGbQqTzINhFHvdlRQvvYKBcuAHdBeKlHSxVrSsEKbcAvnIcf"
"xzdVDdwQPHMCHeZZRpGHWvKzgTGzSTbYTeOPyKvvYWmQToTpsjAtKUJUjcEHWhmdBLDTBMHJ"
"ivBXcLGtCsumNNVFyGbVviGmqHTdyBlkneibXBesKJGOUzOtIwXCPJggqBekSzNQYkALlItk"
"cbEhbdXAIKVHYpInLwxXalKZrkrpxtfuagqMGmRJnJbFQaEoYMoqPsxZpocddPXXPyvxVkaF"
"qdKISejWDhBImnEEOPDcyWTubbfVfwUztciaFJcsPLhgYVfhqlOfoNjKbmTFptFttYuyBrUI"
"zzmZypOqrjQHTGFwlHStpIwxPtMvtsEDpsmWIgwzYgwmdpbMOnfElZMYpVIcvzSWejeJcdUB"
"QUoBRUmGQVVWvEDseuozrDjgdXFScPwwsgaUPwSzScfBNrkpmEFDSZLKfNjMqvOmUtocUkbo"
"VGFEKgGLbNruwLgXHTloWDrnqymPVAtzjWPutonIsMDPeeCmTjYWAFXcyTAlBeiJTIRkZxiM"
"kLjMnAflSNJzmZkatXkYiPEMYSmzHbLKEizHbEjQOxBDzpRHiFjhedqiyMiUMvThjaRFmwll"
"aMGgwKBIKepwyoEdnuhtzJzboiNEAFKiqiWxxmkRFRoTiFWXLPAWLuzSCrajgkQhDxAQDqyM"
"VwZlhZicQLEDYYisEalesDWZAYzcvENuHUwRutIsGgsdoYwOZiURhcgdbTGWBNqhrFjvTQCj"
"VlTPNlRdRLaaqzUBBwbdtyXFkCBUYYMbmRrkFxfxbCqkgZNGyHPKLkOPnezfVTRmRQgCgHbx"
"wcZlInVOwmFePnSIbThMJosimzkhfuiqYEpwHQiemqsSDNNdbNhBLzbsPZBJZujSHJGtYKGb"
"HaAYGJZxBumsKUrATwPuqXFLfwNyImLQbchBKiJAYRZhkcrKCHXBEGYyBhBGvSqvabcRUrfq"
"AbPiMzjHAehGYjDEmxAnYLyoSFdeWVrfJUCuYZPluhXEBuyUpKaRXDKXeiCvGidpvATwMbcz"
"DZpzxrhTZYyrFORFQWTbPLCBjMKMhlRMFEiarDgGPttjmkrQVlujztMSkxXffXFNqLWOLThI"
"KBoyMHoFTEPCdUAZjLTifAdjjUehyDLEGKlRTFoLpjalziRSUjZfRYbNzhiHgTHowMMkKTwE"
"ZgnqiirMtnNpaBJqhcIVrWXPpcPWZfRpsPstHleFJDZYAsxYhOREVbFtebXTZRAIjGgWeoiN"
"qPLCCAVadqmUrjOcqIbdCTpcDRWuDVbHrZOQRPhqbyvOWwxAWJphjLiDgoAybcjzgfVktPlj"
"kNBCjelpuQfnYsiTgPpCNKYtOrxGaLEEtAuLdGdDsONHNhSn";
const std::string dst_str =
"KzitfifORCbGhfNEbnbObUdFLLaAsLOpMkOeKupjCoatzqfHBkNJfSgqSMYouswfNMnoQngK"
"jWwyPKmEnoZWyPBUdQRmKUNudUclueKXKQefUdXWUyyqtumzsFKznrLVLwfvPZpLChNYrrHK"
"AtpfOuVHiUKyeRCrktJAhkyFKmPWrASEMvBLNOzuGlvinZjvZUUXazNEkyMPiOLdqXvCIroC"
"MeWsvjHShlLhDwLZrVlpYBnDJmILcsNFDSoaLWOKNNkNGBgNBvVjPCJXAuKfsrKZhYcdEpxK"
"UihiRkYvMiLyOUvaqBMklLDwEhvQBfCXHSRoqsLsSCzLZQhIYMhBapvHaPbDoRrHoJXZsNXc"
"rxZYCrOMIzYcVPwDCFiHBFnPNTTeAeKEMGeVUeCaAeuWZmngyPWlQBcgWumSUIfbhjVYdnpV"
"hRSJXrIoFZubBXfNOMhilAkVPixrhILZKgDoFTvytPFPfBLMnbhSOBmLWCbJsLQxrCrMAlOw"
"RmfSQyGhrjhzYVqFSBHeoQBagFwyxIjcHFZngntpVHbSwqhwHeMnWSsISPljTxSNXfCxLebW"
"GhMdlphtJbdvhEcjNpwPCFqhdquxCyOxkjsDUPNgjpDcpIMhMwMclNhfESTrroJaoyeGQclV"
"gonnhuQRmXcBwcsWeLqjNngZOlyMyfeQBwnwMVJEvGqknDyzSApniRTPgJpFoDkJJhXQFuFB"
"VqhuEPMRGCeTDOSEFmXeIHOnDxaJacvnmORwVpmrRhGjDpUCkuODNPdZMdupYExDEDnDLdNF"
"iObKBaVWpGVMKdgNLgsNxcpypBPPKKoaajeSGPZQJWSOKrkLjiFexYVmUGxJnbTNsCXXLfZp"
"jfxQAEVYvqKehBzMsVHVGWmTshWFAoCNDkNppzzjHBZWckrzSTANICioCJSpLwPwQvtXVxst"
"nTRBAboPFREEUFazibpFesCsjzUOnECwoPCOFiwGORlIZVLpUkJyhYXCENmzTBLVigOFuCWO"
"IiXBYmiMtsxnUdoqSTTGyEFFrQsNAjcDdOKDtHwlANWoUVwiJCMCQFILdGqzEePuSXFbOEOz"
"dLlEnTJbKRSTfAFToOZNtDXTfFgvQiefAKbSUWUXFcpCjRYCBNXCCcLMjjuUDXErpiNsRuIx"
"mgHsrObTEXcnmjdqxTGhTjTeYizNnkrJRhNQIqDXmZMwArBccnixpcuiGOOexjgkpcEyGAnz"
"UbgiBfflTUyJfZeFFLrZVueFkSRosebnnwAnakIrywTGByhQKWvmNQJsWQezqLhHQzXnEpeD"
"rFRTSQSpVxPzSeEzfWYzfpcenxsUyzOMLxhNEhfcuprDtqubsXehuqKqZlLQeSclvoGjuKJK"
"XoWrazsgjXXnkWHdqFESZdMGDYldyYdbpSZcgBPgEKLWZHfBirNPLUadmajYkiEzmGuWGELB"
"WLiSrMdaGSbptKmgYVqMGcQaaATStiZYteGAPxSEBHuAzzjlRHYsrdDkaGNXmzRGoalJMiCC"
"GMtWSDMhgvRSEgKnywbRgnqWXFlwrhXbbvcgLGtWSuKQBiqIlWkfPMozOTWgVoLHavDJGRYI"
"YerrmZnTMtuuxmZALWakfzUbksTwoetqkOiRPGqGZepcVXHoZyOaaaijjZWQLlIhYwiQNbfc"
"KCwhhFaMQBoaCnOecJEdKzdsMPFEYQuJNPYiiNtsYxaWBRuWjlLqGokHMNtyTQfSJKbgGdol"
"fWlOZdupouQMfUWXIYHzyJHefMDnqxxasDxtgArvDqtwjDBaVEMACPkLFpiDOoKCHqkWVizh"
"lKqbOHpsPKkhjRQRNGYRYEfxtBjYvlCvHBNUwVuIwDJYMqHxEFtwdLqYWvjdOfQmNiviDfUq"
"pbucbNwjNQfMYgwUuPnQWIPOlqHcbjtuDXvTzLtkdBQanJbrmLSyFqSapZCSPMDOrxWVYzyO"
"lwDTTJFmKxoyfPunadkHcrcSQaQsAbrQtbhqwSTXGTPURYTCbNozjAVwbmcyVxIbZudBZWYm"
"rnSDyelGCRRWYtrUxvOVWlTLHHdYuAmVMGnGbHscbjmjmAzmYLaCxNNwhmMYdExKvySxuYpE"
"rVGwfqMngBCHnZodotNaNJZiNRFWubuPDfiywXPiyVWoQMeOlSuWmpilLTIFOvfpjmJTgrWa"
"dgoxYeyPyOaglOvZVGdFOBSeqEcGXBwjoeUAXqkpvOxEpSXhmklKZydTvRVYVvfQdRNNDkCT"
"dLNfcZCFQbZORdcDOhwotoyccrSbWvlqYMoiAYeEpDzZTvkamapzZMmCpEutZFCcHBWGIIkr"
"urwDNHrobaErPpclyEegLJDtkfUWSNWZosWSbBGAHIvJsFNUlJXbnkSVycLkOVQVcNcUtiBy"
"djLDIFsycbPBEWaMvCbntNtJlOeCttvXypGnHAQFnFSiXFWWqonWuVIKmVPpKXuJtFguXCWC"
"rNExYYvxLGEmuZJLJDjHgjlQyOzeieCpizJxkrdqKCgomyEkvsyVYSsLeyLvOZQrrgEJgRFK"
"CjYtoOfluNrLdRMTRkQXmAiMRFwloYECpXCReAMxOkNiwCtutsrqWoMHsrogRqPoUCueonvW"
"MTwmkAkajfGJkhnQidwpwIMEttQkzIMOPvvyWZHpqkMHWlNTeSKibfRfwDyxveKENZhtlPwP"
"dfAjwegjRcavtFnkkTNVYdCdCrgdUvzsIcqmUjwGmVvuuQvjVrWWIDBmAzQtiZPYvCOEWjce"
"rWzeqVKeiYTJBOedmQCVidOgUIEjfRnbGvUbctYxfRybJkdmeAkLZQMRMGPOnsPbFswXAoCK"
"IxWGwohoPpEJxslbqHFKSwknxTmrDCITRZWEDkGQeucPxHBdYkduwbYhKnoxCKhgjBFiFawC"
"QtgTDldTQmlOsBiGLquMjuecAbrUJJvNtXbFNGjWxaZPimSRXUJWgRbydpsczOqSFIeEtuKA"
"ZpRhmLtPdVNKdSDQZeeImUFmUwXApRTUNHItyvFyJtNtn";
Sequence src;
Sequence dst;
src.reserve(large_lcs_src_str.length());
dst.reserve(large_lcs_dst_str.length());
src.reserve(src_str.length());
dst.reserve(dst_str.length());
for (char c : large_lcs_src_str) {
for (char c : src_str) {
src.push_back(c);
}
for (char c : large_lcs_dst_str) {
for (char c : dst_str) {
dst.push_back(c);
}