| ; RUN: llc %s -o - -mtriple=thumbv7-apple-darwin10 | |
| ; RUN: llc %s -o - | |
| ; REQUIRES: arm-registered-target | |
| ; NVPTX cannot select BlockAddress | |
| ; XFAIL: target=nvptx{{.*}} | |
| ; The behavior of this test is not well defined. On PowerPC the test may pass | |
| ; or fail depending on the order in which the test functions are processed by | |
| ; llc. | |
| ; UNSUPPORTED: target=powerpc{{.*}} | |
| ;; Reference to a label that gets deleted. | |
| define ptr @test1() nounwind { | |
| entry: | |
| ret ptr blockaddress(@test1b, %test_label) | |
| } | |
| define i32 @test1b() nounwind { | |
| entry: | |
| ret i32 -1 | |
| test_label: | |
| br label %ret | |
| ret: | |
| ret i32 -1 | |
| } | |
| ; Issues with referring to a label that gets RAUW'd later. | |
| define i32 @test2a() nounwind { | |
| entry: | |
| %target = bitcast ptr blockaddress(@test2b, %test_label) to ptr | |
| call i32 @test2b(ptr %target) | |
| ret i32 0 | |
| } | |
| define i32 @test2b(ptr %target) nounwind { | |
| entry: | |
| indirectbr ptr %target, [label %test_label] | |
| test_label: | |
| ; assume some code here... | |
| br label %ret | |
| ret: | |
| ret i32 -1 | |
| } | |
| ; Issues with a BB that gets RAUW'd to another one after references are | |
| ; generated. | |
| define void @test3(ptr %P, ptr %Q) nounwind { | |
| entry: | |
| store ptr blockaddress(@test3b, %test_label), ptr %P | |
| store ptr blockaddress(@test3b, %ret), ptr %Q | |
| ret void | |
| } | |
| define i32 @test3b() nounwind { | |
| entry: | |
| br label %test_label | |
| test_label: | |
| br label %ret | |
| ret: | |
| ret i32 -1 | |
| } | |
| ; PR6673 | |
| define i64 @test4a() { | |
| %target = bitcast ptr blockaddress(@test4b, %usermain) to ptr | |
| %ret = call i64 @test4b(ptr %target) | |
| ret i64 %ret | |
| } | |
| define i64 @test4b(ptr %Code) { | |
| entry: | |
| indirectbr ptr %Code, [label %usermain] | |
| usermain: | |
| br label %label_line_0 | |
| label_line_0: | |
| br label %label_line_1 | |
| label_line_1: | |
| %target = ptrtoint ptr blockaddress(@test4b, %label_line_0) to i64 | |
| ret i64 %target | |
| } |