llvm-project/llvm/test/tools/llvm-reduce/reduce-blocks-only-phi-nodes-may-reference-own-value.ll
Matt Arsenault 45a91c1521 llvm-reduce: Fix block reduction with unreachable blocks
Previously this would produce many invalid reductions with
"Instruction does not dominate uses" verifier errors.

This fixes issues in cases where the incoming IR
has unreachable blocks, and the resulting reduction
introduced new reachable blocks.

Have basic-blocks skip functions that have unreachable
blocks, Introduce a separate reduction which only
deletes unreachable blocks. Cleanup any newly unreachable
blocks after trimming out the requested deletions.

Includes a variety of meta-reduced tests for llvm-reduce
itself with -abort-on-invalid-reduction that were failing
on different iterations of this patch.

Bugpoint's implementation is much simpler (but currently I don't
understand how it avoids disconnecting interesting blocks from the CFG).
2022-10-28 17:07:26 -07:00

52 lines
1.4 KiB
LLVM

; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=basic-blocks --test=FileCheck --test-arg=--check-prefix=CHECK-INTERESTINGNESS --test-arg=%s --test-arg=--input-file %s -o %t
; RUN: FileCheck %s < %t
; Make sure an invalid reduction isn't tried when deleting %bb5,
; causing the or in %bb6 to use its own output value.
; CHECK-INTERESTINGNESS: store i32 0
; CHECK-INTERESTINGNESS: store i32 1
; CHECK-INTERESTINGNESS: store i32 2
; CHECK: store i32 0
; CHECK-NEXT: br label %bb5
; CHECK: bb5:
; CHECK-NEXT: switch
; CHECK: bb6:
; CHECK-NEXT: %tmp = phi i32 [ %tmp7, %bb6 ]
; CHECK-NEXT: store i32 1
; CHECK-NEXT: %tmp7 = or i32 %tmp, 0
; CHECK-NEXT: br label %bb6
; CHECK-NOT: bb7
; CHECK: bb8:
; CHECK-NEXT: store i32 2,
define amdgpu_kernel void @snork(i32 %arg, i1 %arg1) {
bb:
store i32 0, ptr addrspace(3) null
br i1 %arg1, label %bb5, label %bb7
bb5: ; preds = %bb5, %bb
switch i32 %arg, label %bb5 [
i32 0, label %bb8
i32 1, label %bb6
]
bb6: ; preds = %bb6, %bb5
%tmp = phi i32 [ %tmp7, %bb6 ], [ 0, %bb5 ]
store i32 1, ptr addrspace(3) null
%tmp7 = or i32 %tmp, 0
br label %bb6
bb7:
store i32 3, ptr addrspace(3) null
br label %bb8
bb8: ; preds = %bb5
store i32 2, ptr addrspace(3) null
unreachable
}