forked from OSchip/llvm-project
52 lines
1.4 KiB
LLVM
52 lines
1.4 KiB
LLVM
; RUN: llc -mcpu=atmega328 < %s -march=avr | FileCheck %s
|
|
|
|
; This test verifies that the pointer to a basic block
|
|
; should always be a pointer in address space 1.
|
|
;
|
|
; If this were not the case, then programs targeting
|
|
; AVR that attempted to read their own machine code
|
|
; via a pointer to a label would actually read from RAM
|
|
; using a pointer relative to the the start of program flash.
|
|
;
|
|
; This would cause a load of uninitialized memory, not even
|
|
; touching the program's machine code as otherwise desired.
|
|
|
|
target datalayout = "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8"
|
|
|
|
; CHECK-LABEL: load_with_no_forward_reference
|
|
define i8 @load_with_no_forward_reference(i8 %a, i8 %b) {
|
|
second:
|
|
; CHECK: ldi r30, .Ltmp0+2
|
|
; CHECK-NEXT: ldi r31, .Ltmp0+4
|
|
; CHECK: lpm r24, Z
|
|
%bar = load i8, i8 addrspace(1)* blockaddress(@function_with_no_forward_reference, %second)
|
|
ret i8 %bar
|
|
}
|
|
|
|
; CHECK-LABEL: load_from_local_label
|
|
define i8 @load_from_local_label(i8 %a, i8 %b) {
|
|
entry:
|
|
%result1 = add i8 %a, %b
|
|
|
|
br label %second
|
|
|
|
; CHECK-LABEL: .Ltmp1:
|
|
second:
|
|
; CHECK: ldi r30, .Ltmp1+2
|
|
; CHECK-NEXT: ldi r31, .Ltmp1+4
|
|
; CHECK-NEXT: lpm r24, Z
|
|
%result2 = load i8, i8 addrspace(1)* blockaddress(@load_from_local_label, %second)
|
|
ret i8 %result2
|
|
}
|
|
|
|
; A function with no forward reference, right at the end
|
|
; of the file.
|
|
define i8 @function_with_no_forward_reference(i8 %a, i8 %b) {
|
|
entry:
|
|
%result = add i8 %a, %b
|
|
br label %second
|
|
second:
|
|
ret i8 0
|
|
}
|
|
|