
In void functions, try to replace instruction uses with a new non-void return. If the return type matches the instruction, also try to directly return it. This handles most of the cases, but doesn't try to handle all of the weird exception related terminators. Also doesn't try to replace argument uses, although it could. We could also handle cases where we can insert a simple cast to an original return value. I didn't think too hard about where to put this in the default pass order. In many cases it obviates the need for most of the CFG folds, but I've left it near the end initially. I also think this is too aggressive about removing dead code, and should leave existing dead code alone. I'm also not sure why we have both "removeUnreachableBlocks" and EliminateUnreachableBlocks" in Utils. Fixes #66039, fixes #107327
34 lines
1.3 KiB
LLVM
34 lines
1.3 KiB
LLVM
; Test that llvm-reduce can reduce pointer operands
|
|
; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=operands-one --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t
|
|
; RUN: FileCheck --check-prefixes=CHECK,ONE %s < %t
|
|
|
|
; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=operands-zero --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t
|
|
; RUN: FileCheck --check-prefixes=CHECK,ZERO %s < %t
|
|
|
|
; RUN: llvm-reduce --abort-on-invalid-reduction --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t
|
|
; RUN: FileCheck --check-prefixes=CHECK,ZERO %s < %t
|
|
|
|
; CHECK-LABEL: define {{(void|ptr)}} @foo(
|
|
|
|
; ONE: load i32, ptr %a0
|
|
; ONE: load i32, ptr @g
|
|
; ONE: extractelement <4 x ptr> <ptr @g, ptr null, ptr @g, ptr @g>, i32 11
|
|
|
|
; ZERO: load i32, ptr null
|
|
; ZERO: load i32, ptr null
|
|
; ZERO: extractelement <4 x ptr> zeroinitializer, i32 11
|
|
|
|
@g = global i32 0
|
|
|
|
define void @foo(ptr %a0) {
|
|
; CHECK-INTERESTINGNESS: load i32
|
|
%v0 = load i32, ptr %a0
|
|
; CHECK-INTERESTINGNESS: load i32
|
|
%v1 = load i32, ptr @g
|
|
|
|
; CHECK-INTERESTINGNESS: extractelement{{.*}}i32 11
|
|
%v2 = extractelement <4 x ptr> <ptr @g, ptr null, ptr @g, ptr @g>, i32 11
|
|
|
|
ret void
|
|
}
|