52 lines · plain
1; RUN: llc -mcpu=atmega328 < %s -mtriple=avr | FileCheck %s2 3; This test verifies that the pointer to a basic block4; should always be a pointer in address space 1.5;6; If this were not the case, then programs targeting7; AVR that attempted to read their own machine code8; via a pointer to a label would actually read from RAM9; using a pointer relative to the the start of program flash.10;11; This would cause a load of uninitialized memory, not even12; 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_reference17define i8 @load_with_no_forward_reference(i8 %a, i8 %b) {18second:19 ; CHECK: ldi r30, .Ltmp0+220 ; CHECK-NEXT: ldi r31, .Ltmp0+421 ; CHECK: lpm r24, Z22 %bar = load i8, ptr addrspace(1) blockaddress(@function_with_no_forward_reference, %second)23 ret i8 %bar24}25 26; CHECK-LABEL: load_from_local_label27define i8 @load_from_local_label(i8 %a, i8 %b) {28entry:29 %result1 = add i8 %a, %b30 31 br label %second32 33; CHECK-LABEL: .Ltmp1:34second:35 ; CHECK: ldi r30, .Ltmp1+236 ; CHECK-NEXT: ldi r31, .Ltmp1+437 ; CHECK-NEXT: lpm r24, Z38 %result2 = load i8, ptr addrspace(1) blockaddress(@load_from_local_label, %second)39 ret i8 %result240}41 42; A function with no forward reference, right at the end43; of the file.44define i8 @function_with_no_forward_reference(i8 %a, i8 %b) {45entry:46 %result = add i8 %a, %b47 br label %second48second:49 ret i8 050}51 52