The current IRSimilarityIdentifier does not try to find similarity across blocks, this patch provides a mechanism to compare two branches against one another, to find similarity across basic blocks, rather than just within them. This adds a step in the similarity identification process that labels all of the basic blocks so that we can identify the relative branching locations. Within an IRSimilarityCandidate we use these relative locations to determine whether if the branching to other relative locations in the same region is the same between branches. If they are, we consider them similar. We do not consider the relative location of the branch if the target branch is outside of the region. In this case, both branches must exit to a location outside the region, but the exact relative location does not matter. Reviewers: paquette, yroux Differential Revision: https://reviews.llvm.org/D106989
139 lines
5.7 KiB
LLVM
139 lines
5.7 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt -disable-output -S -passes=print-ir-similarity < %s 2>&1 | FileCheck %s
|
|
|
|
; This is a simple test to make sure the IRSimilarityIdentifier and
|
|
; IRSimilarityPrinterPass is working.
|
|
|
|
; CHECK: 4 candidates of length 2. Found in:
|
|
; CHECK-NEXT: Function: turtle, Basic Block: (unnamed)
|
|
; CHECK-NEXT: Start Instruction: store i32 5, i32* %5, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 6, i32* %6, align 4
|
|
; CHECK-NEXT: Function: cat, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 4, i32* %4, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, i32* %5, align 4
|
|
; CHECK-NEXT: Function: fish, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 4, i32* %4, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, i32* %5, align 4
|
|
; CHECK-NEXT: Function: dog, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 4, i32* %4, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, i32* %5, align 4
|
|
; CHECK-NEXT:4 candidates of length 3. Found in:
|
|
; CHECK-NEXT: Function: turtle, Basic Block: (unnamed)
|
|
; CHECK-NEXT: Start Instruction: store i32 4, i32* %4, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 6, i32* %6, align 4
|
|
; CHECK-NEXT: Function: cat, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 3, i32* %3, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, i32* %5, align 4
|
|
; CHECK-NEXT: Function: fish, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 3, i32* %3, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, i32* %5, align 4
|
|
; CHECK-NEXT: Function: dog, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 3, i32* %3, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, i32* %5, align 4
|
|
; CHECK-NEXT:4 candidates of length 4. Found in:
|
|
; CHECK-NEXT: Function: turtle, Basic Block: (unnamed)
|
|
; CHECK-NEXT: Start Instruction: store i32 3, i32* %3, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 6, i32* %6, align 4
|
|
; CHECK-NEXT: Function: cat, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 2, i32* %2, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, i32* %5, align 4
|
|
; CHECK-NEXT: Function: fish, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 2, i32* %2, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, i32* %5, align 4
|
|
; CHECK-NEXT: Function: dog, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 2, i32* %2, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, i32* %5, align 4
|
|
; CHECK-NEXT:4 candidates of length 5. Found in:
|
|
; CHECK-NEXT: Function: turtle, Basic Block: (unnamed)
|
|
; CHECK-NEXT: Start Instruction: store i32 2, i32* %2, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 6, i32* %6, align 4
|
|
; CHECK-NEXT: Function: cat, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 1, i32* %1, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, i32* %5, align 4
|
|
; CHECK-NEXT: Function: fish, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 1, i32* %1, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, i32* %5, align 4
|
|
; CHECK-NEXT: Function: dog, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 1, i32* %1, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, i32* %5, align 4
|
|
; CHECK-NEXT:4 candidates of length 6. Found in:
|
|
; CHECK-NEXT: Function: turtle, Basic Block: (unnamed)
|
|
; CHECK-NEXT: Start Instruction: store i32 1, i32* %1, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 6, i32* %6, align 4
|
|
; CHECK-NEXT: Function: cat, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 6, i32* %0, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, i32* %5, align 4
|
|
; CHECK-NEXT: Function: fish, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 6, i32* %0, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, i32* %5, align 4
|
|
; CHECK-NEXT: Function: dog, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 6, i32* %0, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, i32* %5, align 4
|
|
|
|
define linkonce_odr void @fish() {
|
|
entry:
|
|
%0 = alloca i32, align 4
|
|
%1 = alloca i32, align 4
|
|
%2 = alloca i32, align 4
|
|
%3 = alloca i32, align 4
|
|
%4 = alloca i32, align 4
|
|
%5 = alloca i32, align 4
|
|
store i32 6, i32* %0, align 4
|
|
store i32 1, i32* %1, align 4
|
|
store i32 2, i32* %2, align 4
|
|
store i32 3, i32* %3, align 4
|
|
store i32 4, i32* %4, align 4
|
|
store i32 5, i32* %5, align 4
|
|
ret void
|
|
}
|
|
|
|
define void @turtle() {
|
|
%1 = alloca i32, align 4
|
|
%2 = alloca i32, align 4
|
|
%3 = alloca i32, align 4
|
|
%4 = alloca i32, align 4
|
|
%5 = alloca i32, align 4
|
|
%6 = alloca i32, align 4
|
|
store i32 1, i32* %1, align 4
|
|
store i32 2, i32* %2, align 4
|
|
store i32 3, i32* %3, align 4
|
|
store i32 4, i32* %4, align 4
|
|
store i32 5, i32* %5, align 4
|
|
store i32 6, i32* %6, align 4
|
|
ret void
|
|
}
|
|
|
|
define void @cat() {
|
|
entry:
|
|
%0 = alloca i32, align 4
|
|
%1 = alloca i32, align 4
|
|
%2 = alloca i32, align 4
|
|
%3 = alloca i32, align 4
|
|
%4 = alloca i32, align 4
|
|
%5 = alloca i32, align 4
|
|
store i32 6, i32* %0, align 4
|
|
store i32 1, i32* %1, align 4
|
|
store i32 2, i32* %2, align 4
|
|
store i32 3, i32* %3, align 4
|
|
store i32 4, i32* %4, align 4
|
|
store i32 5, i32* %5, align 4
|
|
ret void
|
|
}
|
|
|
|
define void @dog() {
|
|
entry:
|
|
%0 = alloca i32, align 4
|
|
%1 = alloca i32, align 4
|
|
%2 = alloca i32, align 4
|
|
%3 = alloca i32, align 4
|
|
%4 = alloca i32, align 4
|
|
%5 = alloca i32, align 4
|
|
store i32 6, i32* %0, align 4
|
|
store i32 1, i32* %1, align 4
|
|
store i32 2, i32* %2, align 4
|
|
store i32 3, i32* %3, align 4
|
|
store i32 4, i32* %4, align 4
|
|
store i32 5, i32* %5, align 4
|
|
ret void
|
|
}
|