forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Thumb] Fix invalid symbol redefinition due to duplicated jumptable (…
…PR42760) Fix for https://bugs.llvm.org/show_bug.cgi?id=42760. A tBR_JTr instruction is duplicated by tail duplication, which results in the same jumptable with the same label being emitted twice. Fix this by marking tBR_JTr as not duplicable. The corresponding ARM/Thumb instructions are already marked as not duplicable. Additionally also mark tTBB_JT and tTBH_JT to be consistent with Thumb2, even though this shouldn't be strictly necessary. Differential Revision: https://reviews.llvm.org/D65606 llvm-svn: 367753
- Loading branch information
Showing
2 changed files
with
58 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | ||
; RUN: llc -mtriple=thumbv6m-none-unknown-eabi -tail-dup-placement-threshold=3 < %s | FileCheck %s | ||
|
||
define hidden void @test() { | ||
; CHECK-LABEL: test: | ||
; CHECK: @ %bb.0: @ %entry | ||
; CHECK-NEXT: movs r0, #1 | ||
; CHECK-NEXT: lsls r1, r0, #2 | ||
; CHECK-NEXT: b .LBB0_2 | ||
; CHECK-NEXT: .LBB0_1: @ %bb2 | ||
; CHECK-NEXT: @ in Loop: Header=BB0_2 Depth=1 | ||
; CHECK-NEXT: cmp r0, #0 | ||
; CHECK-NEXT: bne .LBB0_6 | ||
; CHECK-NEXT: .LBB0_2: @ %switch | ||
; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1 | ||
; CHECK-NEXT: adr r2, .LJTI0_0 | ||
; CHECK-NEXT: ldr r2, [r2, r1] | ||
; CHECK-NEXT: mov pc, r2 | ||
; CHECK-NEXT: @ %bb.3: | ||
; CHECK-NEXT: .p2align 2 | ||
; CHECK-NEXT: .LJTI0_0: | ||
; CHECK-NEXT: .long .LBB0_6+1 | ||
; CHECK-NEXT: .long .LBB0_4+1 | ||
; CHECK-NEXT: .long .LBB0_6+1 | ||
; CHECK-NEXT: .long .LBB0_5+1 | ||
; CHECK-NEXT: .LBB0_4: @ %switch | ||
; CHECK-NEXT: @ in Loop: Header=BB0_2 Depth=1 | ||
; CHECK-NEXT: b .LBB0_1 | ||
; CHECK-NEXT: .LBB0_5: @ %bb | ||
; CHECK-NEXT: @ in Loop: Header=BB0_2 Depth=1 | ||
; CHECK-NEXT: cmp r0, #0 | ||
; CHECK-NEXT: beq .LBB0_1 | ||
; CHECK-NEXT: .LBB0_6: @ %dead | ||
entry: | ||
br label %switch | ||
|
||
switch: ; preds = %bb2, %entry | ||
switch i32 undef, label %dead2 [ | ||
i32 0, label %dead | ||
i32 1, label %bb2 | ||
i32 2, label %dead | ||
i32 3, label %bb | ||
] | ||
|
||
dead: ; preds = %bb2, %bb, %switch, %switch | ||
unreachable | ||
|
||
dead2: ; preds = %switch | ||
unreachable | ||
|
||
bb: ; preds = %switch | ||
br i1 undef, label %dead, label %bb2 | ||
|
||
bb2: ; preds = %bb, %switch | ||
br i1 undef, label %dead, label %switch | ||
} |