xref: /llvm-project/llvm/test/CodeGen/AVR/block-address-is-in-progmem-space.ll (revision 9ef1d37ffb5f56a9b949a6307bbb16c2ea0130e3)
1; RUN: llc -mcpu=atmega328 < %s -mtriple=avr | FileCheck %s
2
3; This test verifies that the pointer to a basic block
4; should always be a pointer in address space 1.
5;
6; If this were not the case, then programs targeting
7; AVR that attempted to read their own machine code
8; via a pointer to a label would actually read from RAM
9; using a pointer relative to the the start of program flash.
10;
11; This would cause a load of uninitialized memory, not even
12; touching the program's machine code as otherwise desired.
13
14target datalayout = "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8"
15
16; CHECK-LABEL: load_with_no_forward_reference
17define i8 @load_with_no_forward_reference(i8 %a, i8 %b) {
18second:
19  ; CHECK:      ldi r30, .Ltmp0+2
20  ; CHECK-NEXT: ldi r31, .Ltmp0+4
21  ; CHECK: lpm r24, Z
22  %bar = load i8, ptr addrspace(1) blockaddress(@function_with_no_forward_reference, %second)
23  ret i8 %bar
24}
25
26; CHECK-LABEL: load_from_local_label
27define i8 @load_from_local_label(i8 %a, i8 %b) {
28entry:
29  %result1 = add i8 %a, %b
30
31  br label %second
32
33; CHECK-LABEL: .Ltmp1:
34second:
35  ; CHECK:      ldi r30, .Ltmp1+2
36  ; CHECK-NEXT: ldi r31, .Ltmp1+4
37  ; CHECK-NEXT: lpm r24, Z
38  %result2 = load i8, ptr addrspace(1) blockaddress(@load_from_local_label, %second)
39  ret i8 %result2
40}
41
42; A function with no forward reference, right at the end
43; of the file.
44define i8 @function_with_no_forward_reference(i8 %a, i8 %b) {
45entry:
46  %result = add i8 %a, %b
47  br label %second
48second:
49  ret i8 0
50}
51
52