More optimized memclear. Added helper function on array gep.

This commit is contained in:
Christoffer Lerno
2021-10-21 23:37:14 +02:00
parent b87e14cba8
commit 9942be54dc
18 changed files with 214 additions and 170 deletions

View File

@@ -68,90 +68,89 @@ entry:
%w = alloca <4 x i32>, align 16
store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, <4 x i32>* %y, align 16
store <4 x i32> <i32 2, i32 3, i32 13, i32 -100>, <4 x i32>* %z, align 16
%0 = bitcast <4 x i32>* %w to i8*
call void @llvm.memset.p0i8.i64(i8* align 16 %0, i8 0, i64 16, i1 false)
%1 = load <4 x i32>, <4 x i32>* %y, align 16
%2 = load <4 x i32>, <4 x i32>* %z, align 16
%and = and <4 x i32> %1, %2
store <4 x i32> zeroinitializer, <4 x i32>* %w, align 16
%0 = load <4 x i32>, <4 x i32>* %y, align 16
%1 = load <4 x i32>, <4 x i32>* %z, align 16
%and = and <4 x i32> %0, %1
store <4 x i32> %and, <4 x i32>* %w, align 16
%3 = load <4 x i32>, <4 x i32>* %w, align 16
%4 = extractelement <4 x i32> %3, i64 0
%5 = load <4 x i32>, <4 x i32>* %w, align 16
%6 = extractelement <4 x i32> %5, i64 1
%7 = load <4 x i32>, <4 x i32>* %w, align 16
%8 = extractelement <4 x i32> %7, i64 2
%9 = load <4 x i32>, <4 x i32>* %w, align 16
%10 = extractelement <4 x i32> %9, i64 3
%11 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.1, i32 0, i32 0), i32 %4, i32 %6, i32 %8, i32 %10)
%12 = load <4 x i32>, <4 x i32>* %y, align 16
%13 = load <4 x i32>, <4 x i32>* %z, align 16
%or = or <4 x i32> %12, %13
%2 = load <4 x i32>, <4 x i32>* %w, align 16
%3 = extractelement <4 x i32> %2, i64 0
%4 = load <4 x i32>, <4 x i32>* %w, align 16
%5 = extractelement <4 x i32> %4, i64 1
%6 = load <4 x i32>, <4 x i32>* %w, align 16
%7 = extractelement <4 x i32> %6, i64 2
%8 = load <4 x i32>, <4 x i32>* %w, align 16
%9 = extractelement <4 x i32> %8, i64 3
%10 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.1, i32 0, i32 0), i32 %3, i32 %5, i32 %7, i32 %9)
%11 = load <4 x i32>, <4 x i32>* %y, align 16
%12 = load <4 x i32>, <4 x i32>* %z, align 16
%or = or <4 x i32> %11, %12
store <4 x i32> %or, <4 x i32>* %w, align 16
%14 = load <4 x i32>, <4 x i32>* %w, align 16
%15 = extractelement <4 x i32> %14, i64 0
%16 = load <4 x i32>, <4 x i32>* %w, align 16
%17 = extractelement <4 x i32> %16, i64 1
%18 = load <4 x i32>, <4 x i32>* %w, align 16
%19 = extractelement <4 x i32> %18, i64 2
%20 = load <4 x i32>, <4 x i32>* %w, align 16
%21 = extractelement <4 x i32> %20, i64 3
%22 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.2, i32 0, i32 0), i32 %15, i32 %17, i32 %19, i32 %21)
%23 = load <4 x i32>, <4 x i32>* %y, align 16
%24 = load <4 x i32>, <4 x i32>* %z, align 16
%xor = xor <4 x i32> %23, %24
%13 = load <4 x i32>, <4 x i32>* %w, align 16
%14 = extractelement <4 x i32> %13, i64 0
%15 = load <4 x i32>, <4 x i32>* %w, align 16
%16 = extractelement <4 x i32> %15, i64 1
%17 = load <4 x i32>, <4 x i32>* %w, align 16
%18 = extractelement <4 x i32> %17, i64 2
%19 = load <4 x i32>, <4 x i32>* %w, align 16
%20 = extractelement <4 x i32> %19, i64 3
%21 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.2, i32 0, i32 0), i32 %14, i32 %16, i32 %18, i32 %20)
%22 = load <4 x i32>, <4 x i32>* %y, align 16
%23 = load <4 x i32>, <4 x i32>* %z, align 16
%xor = xor <4 x i32> %22, %23
store <4 x i32> %xor, <4 x i32>* %w, align 16
%25 = load <4 x i32>, <4 x i32>* %w, align 16
%26 = extractelement <4 x i32> %25, i64 0
%27 = load <4 x i32>, <4 x i32>* %w, align 16
%28 = extractelement <4 x i32> %27, i64 1
%29 = load <4 x i32>, <4 x i32>* %w, align 16
%30 = extractelement <4 x i32> %29, i64 2
%31 = load <4 x i32>, <4 x i32>* %w, align 16
%32 = extractelement <4 x i32> %31, i64 3
%33 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.3, i32 0, i32 0), i32 %26, i32 %28, i32 %30, i32 %32)
%34 = load <4 x i32>, <4 x i32>* %y, align 16
%bnot = xor <4 x i32> %34, <i32 -1, i32 -1, i32 -1, i32 -1>
%24 = load <4 x i32>, <4 x i32>* %w, align 16
%25 = extractelement <4 x i32> %24, i64 0
%26 = load <4 x i32>, <4 x i32>* %w, align 16
%27 = extractelement <4 x i32> %26, i64 1
%28 = load <4 x i32>, <4 x i32>* %w, align 16
%29 = extractelement <4 x i32> %28, i64 2
%30 = load <4 x i32>, <4 x i32>* %w, align 16
%31 = extractelement <4 x i32> %30, i64 3
%32 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.3, i32 0, i32 0), i32 %25, i32 %27, i32 %29, i32 %31)
%33 = load <4 x i32>, <4 x i32>* %y, align 16
%bnot = xor <4 x i32> %33, <i32 -1, i32 -1, i32 -1, i32 -1>
store <4 x i32> %bnot, <4 x i32>* %w, align 16
%35 = load <4 x i32>, <4 x i32>* %w, align 16
%36 = extractelement <4 x i32> %35, i64 0
%37 = load <4 x i32>, <4 x i32>* %w, align 16
%38 = extractelement <4 x i32> %37, i64 1
%39 = load <4 x i32>, <4 x i32>* %w, align 16
%40 = extractelement <4 x i32> %39, i64 2
%41 = load <4 x i32>, <4 x i32>* %w, align 16
%42 = extractelement <4 x i32> %41, i64 3
%43 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.4, i32 0, i32 0), i32 %36, i32 %38, i32 %40, i32 %42)
%34 = load <4 x i32>, <4 x i32>* %w, align 16
%35 = extractelement <4 x i32> %34, i64 0
%36 = load <4 x i32>, <4 x i32>* %w, align 16
%37 = extractelement <4 x i32> %36, i64 1
%38 = load <4 x i32>, <4 x i32>* %w, align 16
%39 = extractelement <4 x i32> %38, i64 2
%40 = load <4 x i32>, <4 x i32>* %w, align 16
%41 = extractelement <4 x i32> %40, i64 3
%42 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.4, i32 0, i32 0), i32 %35, i32 %37, i32 %39, i32 %41)
%43 = load <4 x i32>, <4 x i32>* %y, align 16
%44 = load <4 x i32>, <4 x i32>* %y, align 16
%45 = load <4 x i32>, <4 x i32>* %y, align 16
%neg = sub <4 x i32> zeroinitializer, %45
%neg = sub <4 x i32> zeroinitializer, %44
store <4 x i32> %neg, <4 x i32>* %w, align 16
%46 = load <4 x i32>, <4 x i32>* %w, align 16
%47 = extractelement <4 x i32> %46, i64 0
%48 = load <4 x i32>, <4 x i32>* %w, align 16
%49 = extractelement <4 x i32> %48, i64 1
%50 = load <4 x i32>, <4 x i32>* %w, align 16
%51 = extractelement <4 x i32> %50, i64 2
%52 = load <4 x i32>, <4 x i32>* %w, align 16
%53 = extractelement <4 x i32> %52, i64 3
%54 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.5, i32 0, i32 0), i32 %47, i32 %49, i32 %51, i32 %53)
%55 = load <4 x i32>, <4 x i32>* %y, align 16
%not = icmp eq <4 x i32> %55, zeroinitializer
%56 = sext <4 x i1> %not to <4 x i32>
store <4 x i32> %56, <4 x i32>* %w, align 16
%45 = load <4 x i32>, <4 x i32>* %w, align 16
%46 = extractelement <4 x i32> %45, i64 0
%47 = load <4 x i32>, <4 x i32>* %w, align 16
%48 = extractelement <4 x i32> %47, i64 1
%49 = load <4 x i32>, <4 x i32>* %w, align 16
%50 = extractelement <4 x i32> %49, i64 2
%51 = load <4 x i32>, <4 x i32>* %w, align 16
%52 = extractelement <4 x i32> %51, i64 3
%53 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.5, i32 0, i32 0), i32 %46, i32 %48, i32 %50, i32 %52)
%54 = load <4 x i32>, <4 x i32>* %y, align 16
%not = icmp eq <4 x i32> %54, zeroinitializer
%55 = sext <4 x i1> %not to <4 x i32>
store <4 x i32> %55, <4 x i32>* %w, align 16
store <4 x i32> <i32 -1, i32 13, i32 0, i32 0>, <4 x i32>* %w, align 16
%57 = load <4 x i32>, <4 x i32>* %w, align 16
%not1 = icmp eq <4 x i32> %57, zeroinitializer
%58 = sext <4 x i1> %not1 to <4 x i32>
store <4 x i32> %58, <4 x i32>* %w, align 16
%59 = load <4 x i32>, <4 x i32>* %w, align 16
%60 = extractelement <4 x i32> %59, i64 0
%61 = load <4 x i32>, <4 x i32>* %w, align 16
%62 = extractelement <4 x i32> %61, i64 1
%63 = load <4 x i32>, <4 x i32>* %w, align 16
%64 = extractelement <4 x i32> %63, i64 2
%65 = load <4 x i32>, <4 x i32>* %w, align 16
%66 = extractelement <4 x i32> %65, i64 3
%67 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.6, i32 0, i32 0), i32 %60, i32 %62, i32 %64, i32 %66)
%56 = load <4 x i32>, <4 x i32>* %w, align 16
%not1 = icmp eq <4 x i32> %56, zeroinitializer
%57 = sext <4 x i1> %not1 to <4 x i32>
store <4 x i32> %57, <4 x i32>* %w, align 16
%58 = load <4 x i32>, <4 x i32>* %w, align 16
%59 = extractelement <4 x i32> %58, i64 0
%60 = load <4 x i32>, <4 x i32>* %w, align 16
%61 = extractelement <4 x i32> %60, i64 1
%62 = load <4 x i32>, <4 x i32>* %w, align 16
%63 = extractelement <4 x i32> %62, i64 2
%64 = load <4 x i32>, <4 x i32>* %w, align 16
%65 = extractelement <4 x i32> %64, i64 3
%66 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.6, i32 0, i32 0), i32 %59, i32 %61, i32 %63, i32 %65)
ret void
}