When we check for similarity, right now there is no order to how it is checked, except for via the suffix tree ordering. We can reduce how much structural analysis we perform by checking the the regions in decreasing size. In doing so, we know that if two large sections match, each of their contained regions also match. This allows us to skip the structural checking for each smaller section. IT does require that we use the large regions as a "bridge" to create the canonical mapping between the two regions. This reduces compile time significantly for some benchmarks. It will not perform as well for programs with many small items. Recommit fixes the IRSimilarity tests. Recommit of: 805ec19d7d9915989be8a8a626176b5e29e19eee Recommit fixes llvm-sim tests Recommit of: 082ec267583100455fee356bb0d4ebd55aba2d46 Reviewer: paquette Differential Revision: https://reviews.llvm.org/D139338
141 lines
5.8 KiB
LLVM
141 lines
5.8 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 6. Found in:
|
|
; CHECK-NEXT: Function: turtle, Basic Block: (unnamed)
|
|
; CHECK-NEXT: Start Instruction: store i32 1, ptr %1, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 6, ptr %6, align 4
|
|
; CHECK-NEXT: Function: cat, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 6, ptr %0, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, ptr %5, align 4
|
|
; CHECK-NEXT: Function: fish, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 6, ptr %0, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, ptr %5, align 4
|
|
; CHECK-NEXT: Function: dog, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 6, ptr %0, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, ptr %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, ptr %2, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 6, ptr %6, align 4
|
|
; CHECK-NEXT: Function: cat, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 1, ptr %1, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, ptr %5, align 4
|
|
; CHECK-NEXT: Function: fish, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 1, ptr %1, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, ptr %5, align 4
|
|
; CHECK-NEXT: Function: dog, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 1, ptr %1, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, ptr %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, ptr %3, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 6, ptr %6, align 4
|
|
; CHECK-NEXT: Function: cat, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 2, ptr %2, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, ptr %5, align 4
|
|
; CHECK-NEXT: Function: fish, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 2, ptr %2, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, ptr %5, align 4
|
|
; CHECK-NEXT: Function: dog, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 2, ptr %2, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, ptr %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, ptr %4, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 6, ptr %6, align 4
|
|
; CHECK-NEXT: Function: cat, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 3, ptr %3, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, ptr %5, align 4
|
|
; CHECK-NEXT: Function: fish, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 3, ptr %3, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, ptr %5, align 4
|
|
; CHECK-NEXT: Function: dog, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 3, ptr %3, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, ptr %5, align 4
|
|
; CHECK-NEXT:4 candidates of length 2. Found in:
|
|
; CHECK-NEXT: Function: turtle, Basic Block: (unnamed)
|
|
; CHECK-NEXT: Start Instruction: store i32 5, ptr %5, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 6, ptr %6, align 4
|
|
; CHECK-NEXT: Function: cat, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 4, ptr %4, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, ptr %5, align 4
|
|
; CHECK-NEXT: Function: fish, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 4, ptr %4, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, ptr %5, align 4
|
|
; CHECK-NEXT: Function: dog, Basic Block: entry
|
|
; CHECK-NEXT: Start Instruction: store i32 4, ptr %4, align 4
|
|
; CHECK-NEXT: End Instruction: store i32 5, ptr %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, ptr %0, align 4
|
|
store i32 1, ptr %1, align 4
|
|
store i32 2, ptr %2, align 4
|
|
store i32 3, ptr %3, align 4
|
|
store i32 4, ptr %4, align 4
|
|
store i32 5, ptr %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, ptr %1, align 4
|
|
store i32 2, ptr %2, align 4
|
|
store i32 3, ptr %3, align 4
|
|
store i32 4, ptr %4, align 4
|
|
store i32 5, ptr %5, align 4
|
|
store i32 6, ptr %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, ptr %0, align 4
|
|
store i32 1, ptr %1, align 4
|
|
store i32 2, ptr %2, align 4
|
|
store i32 3, ptr %3, align 4
|
|
store i32 4, ptr %4, align 4
|
|
store i32 5, ptr %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, ptr %0, align 4
|
|
store i32 1, ptr %1, align 4
|
|
store i32 2, ptr %2, align 4
|
|
store i32 3, ptr %3, align 4
|
|
store i32 4, ptr %4, align 4
|
|
store i32 5, ptr %5, align 4
|
|
ret void
|
|
}
|
|
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
|
|
; CHECK: {{.*}}
|