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