aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/Transforms/LoadStoreVectorizer/batch-aa-compile-time.ll
blob: 049c9a3f70e0f16b368d7df7db3a9ae90a2cbc81 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
; RUN: opt -S < %s -passes='loop-unroll,load-store-vectorizer' -unroll-count=128 --capture-tracking-max-uses-to-explore=1024 | FileCheck %s

; Without using batching alias analysis, this test takes 6 seconds to compile. With, less than a second.
; This is because the mechanism that proves NoAlias in this case is very expensive (CaptureTracking.cpp),
; and caching the result leads to 2 calls to that mechanism instead of ~300,000 (run with -stats to see the difference)

; This test only demonstrates the compile time issue if capture-tracking-max-uses-to-explore is set to at least 1024,
; because with the default value of 100, the CaptureTracking analysis is not run, NoAlias is not proven, and the vectorizer gives up early.

@global_mem = external global i8, align 4

define void @compile-time-test() {
; CHECK-LABEL: define void @compile-time-test() {
; CHECK-COUNT-128: load <4 x i8>
entry:
  ; Create base pointer to a global variable with the inefficient pattern that Alias Analysis cannot easily traverse through.
  %global_base_loads = getelementptr i8, ptr inttoptr (i32 ptrtoint (ptr @global_mem to i32) to ptr), i64 0

  ; Create another pointer for the stores.
  %local_base_stores = alloca <512 x i8>, align 4

  ; 512 interwoven loads and stores in a loop that gets unrolled
  br label %loop

loop:
  %i = phi i64 [ 0, %entry ], [ %i_next, %loop ]

  %ptr_0 = getelementptr i8, ptr %global_base_loads, i64 %i
  %load_0 = load i8, ptr %ptr_0, align 4
  %ptr2_0 = getelementptr i8, ptr %local_base_stores, i64 %i
  store i8 %load_0, ptr %ptr2_0, align 4

  %i_1 = add i64 %i, 1

  %ptr_1 = getelementptr i8, ptr %global_base_loads, i64 %i_1
  %load_1 = load i8, ptr %ptr_1, align 1
  %ptr2_1 = getelementptr i8, ptr %local_base_stores, i64 %i_1
  store i8 %load_1, ptr %ptr2_1, align 1

  %i_2 = add i64 %i, 2

  %ptr_2 = getelementptr i8, ptr %global_base_loads, i64 %i_2
  %load_2 = load i8, ptr %ptr_2, align 2
  %ptr2_2 = getelementptr i8, ptr %local_base_stores, i64 %i_2
  store i8 %load_2, ptr %ptr2_2, align 2

  %i_3 = add i64 %i, 3

  %ptr_3 = getelementptr i8, ptr %global_base_loads, i64 %i_3
  %load_3 = load i8, ptr %ptr_3, align 1
  %ptr2_3 = getelementptr i8, ptr %local_base_stores, i64 %i_3
  store i8 %load_3, ptr %ptr2_3, align 1

  %i_next = add i64 %i, 4
  %cmp = icmp ult i64 %i_next, 512
  br i1 %cmp, label %loop, label %done

done:
  ret void
}