tinygo/transform/testdata/allocs.out.ll
Ayke van Laethem d905476231 all: refactor heap-to-stack transform into the transform package
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.
2019-09-15 21:26:27 +02:00

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*)