
Also add unit tests. This is the first of several transformation (optimization/lowering) passes that I'd like to move to the new transform package. This separates the compiler from the optimizer. Also, it finally adds unit tests for the compiler, not just end-to-end compilation tests. This should improve robustness and should make it easier to change these transformation passes in the future. While the heap-to-stack transform is relatively simple, other passes are much more complex. Adding unit tests not only helps robustness over time, but also doubles as documentation as to what these transformation passes do exactly.
57 строки
1,6 КиБ
LLVM
57 строки
1,6 КиБ
LLVM
target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
|
|
target triple = "armv7m-none-eabi"
|
|
|
|
declare nonnull i8* @runtime.alloc(i32)
|
|
|
|
define void @testInt() {
|
|
%stackalloc.alloca = alloca [1 x i32]
|
|
store [1 x i32] zeroinitializer, [1 x i32]* %stackalloc.alloca
|
|
%stackalloc = bitcast [1 x i32]* %stackalloc.alloca to i32*
|
|
store i32 5, i32* %stackalloc
|
|
ret void
|
|
}
|
|
|
|
define i16 @testArray() {
|
|
%stackalloc.alloca = alloca [2 x i32]
|
|
store [2 x i32] zeroinitializer, [2 x i32]* %stackalloc.alloca
|
|
%stackalloc = bitcast [2 x i32]* %stackalloc.alloca to i16*
|
|
%1 = getelementptr i16, i16* %stackalloc, i32 1
|
|
store i16 5, i16* %1
|
|
%2 = getelementptr i16, i16* %stackalloc, i32 2
|
|
%3 = load i16, i16* %2
|
|
ret i16 %3
|
|
}
|
|
|
|
define void @testEscapingCall() {
|
|
%1 = call i8* @runtime.alloc(i32 4)
|
|
%2 = bitcast i8* %1 to i32*
|
|
%3 = call i32* @escapeIntPtr(i32* %2)
|
|
ret void
|
|
}
|
|
|
|
define void @testEscapingCall2() {
|
|
%1 = call i8* @runtime.alloc(i32 4)
|
|
%2 = bitcast i8* %1 to i32*
|
|
%3 = call i32* @escapeIntPtrSometimes(i32* %2, i32* %2)
|
|
ret void
|
|
}
|
|
|
|
define void @testNonEscapingCall() {
|
|
%stackalloc.alloca = alloca [1 x i32]
|
|
store [1 x i32] zeroinitializer, [1 x i32]* %stackalloc.alloca
|
|
%stackalloc = bitcast [1 x i32]* %stackalloc.alloca to i32*
|
|
%1 = call i32* @noescapeIntPtr(i32* %stackalloc)
|
|
ret void
|
|
}
|
|
|
|
define i32* @testEscapingReturn() {
|
|
%1 = call i8* @runtime.alloc(i32 4)
|
|
%2 = bitcast i8* %1 to i32*
|
|
ret i32* %2
|
|
}
|
|
|
|
declare i32* @escapeIntPtr(i32*)
|
|
|
|
declare i32* @noescapeIntPtr(i32* nocapture)
|
|
|
|
declare i32* @escapeIntPtrSometimes(i32* nocapture, i32*)
|