| ; RUN: opt -deadargelim -S < %s | FileCheck %s |
| |
| define void @test(i32) { |
| ret void |
| } |
| |
| define void @foo() { |
| call void @test(i32 0) |
| ret void |
| ; CHECK-LABEL: @foo( |
| ; CHECK: i32 undef |
| } |
| |
| define void @f(i32 %X) { |
| entry: |
| tail call void @sideeffect() nounwind |
| ret void |
| } |
| |
| declare void @sideeffect() |
| |
| define void @g(i32 %n) { |
| entry: |
| %add = add nsw i32 %n, 1 |
| ; CHECK: tail call void @f(i32 undef) |
| tail call void @f(i32 %add) |
| ret void |
| } |
| |
| define void @h() { |
| entry: |
| %i = alloca i32, align 4 |
| store volatile i32 10, i32* %i, align 4 |
| ; CHECK: %tmp = load volatile i32, i32* %i, align 4 |
| ; CHECK-NEXT: call void @f(i32 undef) |
| %tmp = load volatile i32, i32* %i, align 4 |
| call void @f(i32 %tmp) |
| ret void |
| } |
| |
| ; Check that callers are not transformed for weak definitions. |
| define weak i32 @weak_f(i32 %x) nounwind { |
| entry: |
| ret i32 0 |
| } |
| define void @weak_f_caller() nounwind { |
| entry: |
| ; CHECK: call i32 @weak_f(i32 10) |
| %call = tail call i32 @weak_f(i32 10) |
| ret void |
| } |
| |
| %swift_error = type opaque |
| |
| define void @unused_swifterror_arg(%swift_error** swifterror %dead_arg) { |
| tail call void @sideeffect() nounwind |
| ret void |
| } |
| |
| ; CHECK-LABEL: @dont_replace_by_undef |
| ; CHECK-NOT: call void @unused_swifterror_arg({{.*}}undef) |
| define void @dont_replace_by_undef() { |
| %error_ptr_ref = alloca swifterror %swift_error* |
| store %swift_error* null, %swift_error** %error_ptr_ref |
| call void @unused_swifterror_arg(%swift_error** %error_ptr_ref) |
| ret void |
| } |