Add test to verify new pass APIs and loop-vectorizer.
This commit is contained in:
parent
7f9c91e2aa
commit
e2ec14bbb9
4 changed files with 496 additions and 0 deletions
44
test/loopvectorize.c
Normal file
44
test/loopvectorize.c
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
void ex1(float *A, float* B, float K, int start, int end) {
|
||||
for (int i = start; i < end; ++i)
|
||||
A[i] *= B[i] + K;
|
||||
}
|
||||
|
||||
void ex2(float *A, float* B, float K, int n) {
|
||||
for (int i = 0; i < n; ++i)
|
||||
A[i] *= B[i] + K;
|
||||
}
|
||||
|
||||
int ex3(int *A, int *B, int n) {
|
||||
unsigned sum = 0;
|
||||
for (int i = 0; i < n; ++i)
|
||||
sum += A[i] + 5;
|
||||
return sum;
|
||||
}
|
||||
|
||||
void ex4(float *A, float* B, float K, int n) {
|
||||
for (int i = 0; i < n; ++i)
|
||||
A[i] = i;
|
||||
}
|
||||
|
||||
int ex5(int *A, int *B, int n) {
|
||||
unsigned sum = 0;
|
||||
for (int i = 0; i < n; ++i)
|
||||
if (A[i] > B[i])
|
||||
sum += A[i] + 5;
|
||||
return sum;
|
||||
}
|
||||
|
||||
void ex6(int *A, int *B, int n) {
|
||||
for (int i = n; i > 0; --i)
|
||||
A[i] +=1;
|
||||
}
|
||||
|
||||
void ex7(int *A, int *B, int n, int k) {
|
||||
for (int i = 0; i < n; ++i)
|
||||
A[i*7] += B[i*k];
|
||||
}
|
||||
|
||||
void ex8(int *A, char *B, int n, int k) {
|
||||
for (int i = 0; i < n; ++i)
|
||||
A[i] += 4 * B[i];
|
||||
}
|
||||
369
test/loopvectorize.ll
Normal file
369
test/loopvectorize.ll
Normal file
|
|
@ -0,0 +1,369 @@
|
|||
; ModuleID = 'loopvectorize.c'
|
||||
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
|
||||
;target triple = "x86_64-apple-macosx10.8.0"
|
||||
target triple = "x86-64-unknown-linux-gnu"
|
||||
|
||||
define void @ex1(float* %A, float* %B, float %K, i32 %start, i32 %end) nounwind uwtable ssp {
|
||||
%1 = alloca float*, align 8
|
||||
%2 = alloca float*, align 8
|
||||
%3 = alloca float, align 4
|
||||
%4 = alloca i32, align 4
|
||||
%5 = alloca i32, align 4
|
||||
%i = alloca i32, align 4
|
||||
store float* %A, float** %1, align 8
|
||||
store float* %B, float** %2, align 8
|
||||
store float %K, float* %3, align 4
|
||||
store i32 %start, i32* %4, align 4
|
||||
store i32 %end, i32* %5, align 4
|
||||
%6 = load i32* %4, align 4
|
||||
store i32 %6, i32* %i, align 4
|
||||
br label %7
|
||||
|
||||
; <label>:7 ; preds = %25, %0
|
||||
%8 = load i32* %i, align 4
|
||||
%9 = load i32* %5, align 4
|
||||
%10 = icmp slt i32 %8, %9
|
||||
br i1 %10, label %11, label %28
|
||||
|
||||
; <label>:11 ; preds = %7
|
||||
%12 = load i32* %i, align 4
|
||||
%13 = sext i32 %12 to i64
|
||||
%14 = load float** %2, align 8
|
||||
%15 = getelementptr inbounds float* %14, i64 %13
|
||||
%16 = load float* %15, align 4
|
||||
%17 = load float* %3, align 4
|
||||
%18 = fadd float %16, %17
|
||||
%19 = load i32* %i, align 4
|
||||
%20 = sext i32 %19 to i64
|
||||
%21 = load float** %1, align 8
|
||||
%22 = getelementptr inbounds float* %21, i64 %20
|
||||
%23 = load float* %22, align 4
|
||||
%24 = fmul float %23, %18
|
||||
store float %24, float* %22, align 4
|
||||
br label %25
|
||||
|
||||
; <label>:25 ; preds = %11
|
||||
%26 = load i32* %i, align 4
|
||||
%27 = add nsw i32 %26, 1
|
||||
store i32 %27, i32* %i, align 4
|
||||
br label %7
|
||||
|
||||
; <label>:28 ; preds = %7
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @ex2(float* %A, float* %B, float %K, i32 %n) nounwind uwtable ssp {
|
||||
%1 = alloca float*, align 8
|
||||
%2 = alloca float*, align 8
|
||||
%3 = alloca float, align 4
|
||||
%4 = alloca i32, align 4
|
||||
%i = alloca i32, align 4
|
||||
store float* %A, float** %1, align 8
|
||||
store float* %B, float** %2, align 8
|
||||
store float %K, float* %3, align 4
|
||||
store i32 %n, i32* %4, align 4
|
||||
store i32 0, i32* %i, align 4
|
||||
br label %5
|
||||
|
||||
; <label>:5 ; preds = %23, %0
|
||||
%6 = load i32* %i, align 4
|
||||
%7 = load i32* %4, align 4
|
||||
%8 = icmp slt i32 %6, %7
|
||||
br i1 %8, label %9, label %26
|
||||
|
||||
; <label>:9 ; preds = %5
|
||||
%10 = load i32* %i, align 4
|
||||
%11 = sext i32 %10 to i64
|
||||
%12 = load float** %2, align 8
|
||||
%13 = getelementptr inbounds float* %12, i64 %11
|
||||
%14 = load float* %13, align 4
|
||||
%15 = load float* %3, align 4
|
||||
%16 = fadd float %14, %15
|
||||
%17 = load i32* %i, align 4
|
||||
%18 = sext i32 %17 to i64
|
||||
%19 = load float** %1, align 8
|
||||
%20 = getelementptr inbounds float* %19, i64 %18
|
||||
%21 = load float* %20, align 4
|
||||
%22 = fmul float %21, %16
|
||||
store float %22, float* %20, align 4
|
||||
br label %23
|
||||
|
||||
; <label>:23 ; preds = %9
|
||||
%24 = load i32* %i, align 4
|
||||
%25 = add nsw i32 %24, 1
|
||||
store i32 %25, i32* %i, align 4
|
||||
br label %5
|
||||
|
||||
; <label>:26 ; preds = %5
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @ex3(i32* %A, i32* %B, i32 %n) nounwind uwtable ssp {
|
||||
%1 = alloca i32*, align 8
|
||||
%2 = alloca i32*, align 8
|
||||
%3 = alloca i32, align 4
|
||||
%sum = alloca i32, align 4
|
||||
%i = alloca i32, align 4
|
||||
store i32* %A, i32** %1, align 8
|
||||
store i32* %B, i32** %2, align 8
|
||||
store i32 %n, i32* %3, align 4
|
||||
store i32 0, i32* %sum, align 4
|
||||
store i32 0, i32* %i, align 4
|
||||
br label %4
|
||||
|
||||
; <label>:4 ; preds = %17, %0
|
||||
%5 = load i32* %i, align 4
|
||||
%6 = load i32* %3, align 4
|
||||
%7 = icmp slt i32 %5, %6
|
||||
br i1 %7, label %8, label %20
|
||||
|
||||
; <label>:8 ; preds = %4
|
||||
%9 = load i32* %i, align 4
|
||||
%10 = sext i32 %9 to i64
|
||||
%11 = load i32** %1, align 8
|
||||
%12 = getelementptr inbounds i32* %11, i64 %10
|
||||
%13 = load i32* %12, align 4
|
||||
%14 = add nsw i32 %13, 5
|
||||
%15 = load i32* %sum, align 4
|
||||
%16 = add i32 %15, %14
|
||||
store i32 %16, i32* %sum, align 4
|
||||
br label %17
|
||||
|
||||
; <label>:17 ; preds = %8
|
||||
%18 = load i32* %i, align 4
|
||||
%19 = add nsw i32 %18, 1
|
||||
store i32 %19, i32* %i, align 4
|
||||
br label %4
|
||||
|
||||
; <label>:20 ; preds = %4
|
||||
%21 = load i32* %sum, align 4
|
||||
ret i32 %21
|
||||
}
|
||||
|
||||
define void @ex4(float* %A, float* %B, float %K, i32 %n) nounwind uwtable ssp {
|
||||
%1 = alloca float*, align 8
|
||||
%2 = alloca float*, align 8
|
||||
%3 = alloca float, align 4
|
||||
%4 = alloca i32, align 4
|
||||
%i = alloca i32, align 4
|
||||
store float* %A, float** %1, align 8
|
||||
store float* %B, float** %2, align 8
|
||||
store float %K, float* %3, align 4
|
||||
store i32 %n, i32* %4, align 4
|
||||
store i32 0, i32* %i, align 4
|
||||
br label %5
|
||||
|
||||
; <label>:5 ; preds = %16, %0
|
||||
%6 = load i32* %i, align 4
|
||||
%7 = load i32* %4, align 4
|
||||
%8 = icmp slt i32 %6, %7
|
||||
br i1 %8, label %9, label %19
|
||||
|
||||
; <label>:9 ; preds = %5
|
||||
%10 = load i32* %i, align 4
|
||||
%11 = sitofp i32 %10 to float
|
||||
%12 = load i32* %i, align 4
|
||||
%13 = sext i32 %12 to i64
|
||||
%14 = load float** %1, align 8
|
||||
%15 = getelementptr inbounds float* %14, i64 %13
|
||||
store float %11, float* %15, align 4
|
||||
br label %16
|
||||
|
||||
; <label>:16 ; preds = %9
|
||||
%17 = load i32* %i, align 4
|
||||
%18 = add nsw i32 %17, 1
|
||||
store i32 %18, i32* %i, align 4
|
||||
br label %5
|
||||
|
||||
; <label>:19 ; preds = %5
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @ex5(i32* %A, i32* %B, i32 %n) nounwind uwtable ssp {
|
||||
%1 = alloca i32*, align 8
|
||||
%2 = alloca i32*, align 8
|
||||
%3 = alloca i32, align 4
|
||||
%sum = alloca i32, align 4
|
||||
%i = alloca i32, align 4
|
||||
store i32* %A, i32** %1, align 8
|
||||
store i32* %B, i32** %2, align 8
|
||||
store i32 %n, i32* %3, align 4
|
||||
store i32 0, i32* %sum, align 4
|
||||
store i32 0, i32* %i, align 4
|
||||
br label %4
|
||||
|
||||
; <label>:4 ; preds = %30, %0
|
||||
%5 = load i32* %i, align 4
|
||||
%6 = load i32* %3, align 4
|
||||
%7 = icmp slt i32 %5, %6
|
||||
br i1 %7, label %8, label %33
|
||||
|
||||
; <label>:8 ; preds = %4
|
||||
%9 = load i32* %i, align 4
|
||||
%10 = sext i32 %9 to i64
|
||||
%11 = load i32** %1, align 8
|
||||
%12 = getelementptr inbounds i32* %11, i64 %10
|
||||
%13 = load i32* %12, align 4
|
||||
%14 = load i32* %i, align 4
|
||||
%15 = sext i32 %14 to i64
|
||||
%16 = load i32** %2, align 8
|
||||
%17 = getelementptr inbounds i32* %16, i64 %15
|
||||
%18 = load i32* %17, align 4
|
||||
%19 = icmp sgt i32 %13, %18
|
||||
br i1 %19, label %20, label %29
|
||||
|
||||
; <label>:20 ; preds = %8
|
||||
%21 = load i32* %i, align 4
|
||||
%22 = sext i32 %21 to i64
|
||||
%23 = load i32** %1, align 8
|
||||
%24 = getelementptr inbounds i32* %23, i64 %22
|
||||
%25 = load i32* %24, align 4
|
||||
%26 = add nsw i32 %25, 5
|
||||
%27 = load i32* %sum, align 4
|
||||
%28 = add i32 %27, %26
|
||||
store i32 %28, i32* %sum, align 4
|
||||
br label %29
|
||||
|
||||
; <label>:29 ; preds = %20, %8
|
||||
br label %30
|
||||
|
||||
; <label>:30 ; preds = %29
|
||||
%31 = load i32* %i, align 4
|
||||
%32 = add nsw i32 %31, 1
|
||||
store i32 %32, i32* %i, align 4
|
||||
br label %4
|
||||
|
||||
; <label>:33 ; preds = %4
|
||||
%34 = load i32* %sum, align 4
|
||||
ret i32 %34
|
||||
}
|
||||
|
||||
define void @ex6(i32* %A, i32* %B, i32 %n) nounwind uwtable ssp {
|
||||
%1 = alloca i32*, align 8
|
||||
%2 = alloca i32*, align 8
|
||||
%3 = alloca i32, align 4
|
||||
%i = alloca i32, align 4
|
||||
store i32* %A, i32** %1, align 8
|
||||
store i32* %B, i32** %2, align 8
|
||||
store i32 %n, i32* %3, align 4
|
||||
%4 = load i32* %3, align 4
|
||||
store i32 %4, i32* %i, align 4
|
||||
br label %5
|
||||
|
||||
; <label>:5 ; preds = %15, %0
|
||||
%6 = load i32* %i, align 4
|
||||
%7 = icmp sgt i32 %6, 0
|
||||
br i1 %7, label %8, label %18
|
||||
|
||||
; <label>:8 ; preds = %5
|
||||
%9 = load i32* %i, align 4
|
||||
%10 = sext i32 %9 to i64
|
||||
%11 = load i32** %1, align 8
|
||||
%12 = getelementptr inbounds i32* %11, i64 %10
|
||||
%13 = load i32* %12, align 4
|
||||
%14 = add nsw i32 %13, 1
|
||||
store i32 %14, i32* %12, align 4
|
||||
br label %15
|
||||
|
||||
; <label>:15 ; preds = %8
|
||||
%16 = load i32* %i, align 4
|
||||
%17 = add nsw i32 %16, -1
|
||||
store i32 %17, i32* %i, align 4
|
||||
br label %5
|
||||
|
||||
; <label>:18 ; preds = %5
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @ex7(i32* %A, i32* %B, i32 %n, i32 %k) nounwind uwtable ssp {
|
||||
%1 = alloca i32*, align 8
|
||||
%2 = alloca i32*, align 8
|
||||
%3 = alloca i32, align 4
|
||||
%4 = alloca i32, align 4
|
||||
%i = alloca i32, align 4
|
||||
store i32* %A, i32** %1, align 8
|
||||
store i32* %B, i32** %2, align 8
|
||||
store i32 %n, i32* %3, align 4
|
||||
store i32 %k, i32* %4, align 4
|
||||
store i32 0, i32* %i, align 4
|
||||
br label %5
|
||||
|
||||
; <label>:5 ; preds = %24, %0
|
||||
%6 = load i32* %i, align 4
|
||||
%7 = load i32* %3, align 4
|
||||
%8 = icmp slt i32 %6, %7
|
||||
br i1 %8, label %9, label %27
|
||||
|
||||
; <label>:9 ; preds = %5
|
||||
%10 = load i32* %i, align 4
|
||||
%11 = load i32* %4, align 4
|
||||
%12 = mul nsw i32 %10, %11
|
||||
%13 = sext i32 %12 to i64
|
||||
%14 = load i32** %2, align 8
|
||||
%15 = getelementptr inbounds i32* %14, i64 %13
|
||||
%16 = load i32* %15, align 4
|
||||
%17 = load i32* %i, align 4
|
||||
%18 = mul nsw i32 %17, 7
|
||||
%19 = sext i32 %18 to i64
|
||||
%20 = load i32** %1, align 8
|
||||
%21 = getelementptr inbounds i32* %20, i64 %19
|
||||
%22 = load i32* %21, align 4
|
||||
%23 = add nsw i32 %22, %16
|
||||
store i32 %23, i32* %21, align 4
|
||||
br label %24
|
||||
|
||||
; <label>:24 ; preds = %9
|
||||
%25 = load i32* %i, align 4
|
||||
%26 = add nsw i32 %25, 1
|
||||
store i32 %26, i32* %i, align 4
|
||||
br label %5
|
||||
|
||||
; <label>:27 ; preds = %5
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @ex8(i32* %A, i8* %B, i32 %n, i32 %k) nounwind uwtable ssp {
|
||||
%1 = alloca i32*, align 8
|
||||
%2 = alloca i8*, align 8
|
||||
%3 = alloca i32, align 4
|
||||
%4 = alloca i32, align 4
|
||||
%i = alloca i32, align 4
|
||||
store i32* %A, i32** %1, align 8
|
||||
store i8* %B, i8** %2, align 8
|
||||
store i32 %n, i32* %3, align 4
|
||||
store i32 %k, i32* %4, align 4
|
||||
store i32 0, i32* %i, align 4
|
||||
br label %5
|
||||
|
||||
; <label>:5 ; preds = %23, %0
|
||||
%6 = load i32* %i, align 4
|
||||
%7 = load i32* %3, align 4
|
||||
%8 = icmp slt i32 %6, %7
|
||||
br i1 %8, label %9, label %26
|
||||
|
||||
; <label>:9 ; preds = %5
|
||||
%10 = load i32* %i, align 4
|
||||
%11 = sext i32 %10 to i64
|
||||
%12 = load i8** %2, align 8
|
||||
%13 = getelementptr inbounds i8* %12, i64 %11
|
||||
%14 = load i8* %13, align 1
|
||||
%15 = sext i8 %14 to i32
|
||||
%16 = mul nsw i32 4, %15
|
||||
%17 = load i32* %i, align 4
|
||||
%18 = sext i32 %17 to i64
|
||||
%19 = load i32** %1, align 8
|
||||
%20 = getelementptr inbounds i32* %19, i64 %18
|
||||
%21 = load i32* %20, align 4
|
||||
%22 = add nsw i32 %21, %16
|
||||
store i32 %22, i32* %20, align 4
|
||||
br label %23
|
||||
|
||||
; <label>:23 ; preds = %9
|
||||
%24 = load i32* %i, align 4
|
||||
%25 = add nsw i32 %24, 1
|
||||
store i32 %25, i32* %i, align 4
|
||||
br label %5
|
||||
|
||||
; <label>:26 ; preds = %5
|
||||
ret void
|
||||
}
|
||||
38
test/loopvectorize.py
Normal file
38
test/loopvectorize.py
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
from llvm.core import *
|
||||
from llvm.passes import *
|
||||
from llvm.ee import *
|
||||
from os.path import dirname, join as join_path
|
||||
|
||||
import unittest
|
||||
import re
|
||||
|
||||
class TestLoopVectorizer(unittest.TestCase):
|
||||
def test_loop_vectorizer(self):
|
||||
|
||||
re_vector = re.compile("<\d+ x \w+>")
|
||||
|
||||
tm = TargetMachine.new(opt=3)
|
||||
|
||||
# Build passes
|
||||
pm = build_pass_managers(tm, opt=3, loop_vectorize=True, fpm=False).pm
|
||||
|
||||
# Load test module
|
||||
asmfile = join_path(dirname(__file__), 'loopvectorize.ll')
|
||||
with open(asmfile) as asm:
|
||||
mod = Module.from_assembly(asm)
|
||||
|
||||
before = str(mod)
|
||||
|
||||
pm.run(mod)
|
||||
|
||||
after = str(mod)
|
||||
self.assertNotEqual(after, before)
|
||||
|
||||
before_vectors = re_vector.findall(before)
|
||||
self.assertFalse(before_vectors)
|
||||
after_vectors = re_vector.findall(after)
|
||||
self.assertLess(len(before_vectors), len(after_vectors))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
45
test/pass.py
Normal file
45
test/pass.py
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
from llvm.core import *
|
||||
from llvm.passes import *
|
||||
from llvm.ee import *
|
||||
import unittest
|
||||
|
||||
class TestPass(unittest.TestCase):
|
||||
def test_execerise_pass_api(self):
|
||||
# Test passes
|
||||
ps = Pass.new(PASS_DOT_DOM_ONLY)
|
||||
self.assertEqual(PASS_DOT_DOM_ONLY, ps.name)
|
||||
self.assertTrue(len(ps.description))
|
||||
|
||||
ps = Pass.new(PASS_INLINE)
|
||||
self.assertEqual(PASS_INLINE, ps.name)
|
||||
self.assertTrue(len(ps.description))
|
||||
|
||||
# Test target specific passes
|
||||
pm = PassManager.new()
|
||||
pm.add(ps)
|
||||
pm.add(TargetData.new("e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"))
|
||||
|
||||
tm = TargetMachine.new()
|
||||
|
||||
tli = TargetLibraryInfo.new(tm.triple)
|
||||
self.assertFalse(tli.name)
|
||||
self.assertTrue(tli.description)
|
||||
pm.add(tli)
|
||||
|
||||
tti = TargetTransformInfo.new(tm)
|
||||
self.assertFalse(tti.name)
|
||||
self.assertTrue(tti.description)
|
||||
|
||||
pm.add(tti)
|
||||
|
||||
pmb = PassManagerBuilder.new()
|
||||
pmb.opt_level = 3
|
||||
pmb.loop_vectorize = True
|
||||
|
||||
pmb.populate(pm)
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue