| ; RUN: llc %s -o - |
| |
| ;; Reference to a label that gets deleted. |
| define i8* @test1() nounwind { |
| entry: |
| ret i8* 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 i8* blockaddress(@test2b, %test_label) to i8* |
| |
| call i32 @test2b(i8* %target) |
| |
| ret i32 0 |
| } |
| |
| define i32 @test2b(i8* %target) nounwind { |
| entry: |
| indirectbr i8* %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(i8** %P, i8** %Q) nounwind { |
| entry: |
| store i8* blockaddress(@test3b, %test_label), i8** %P |
| store i8* blockaddress(@test3b, %ret), i8** %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 i8* blockaddress(@test4b, %usermain) to i8* |
| %ret = call i64 @test4b(i8* %target) |
| |
| ret i64 %ret |
| } |
| |
| define i64 @test4b(i8* %Code) { |
| entry: |
| indirectbr i8* %Code, [label %usermain] |
| usermain: |
| br label %label_line_0 |
| |
| label_line_0: |
| br label %label_line_1 |
| |
| label_line_1: |
| %target = ptrtoint i8* blockaddress(@test4b, %label_line_0) to i64 |
| ret i64 %target |
| } |