| ; RUN: opt -deadargelim -S %s | FileCheck %s | |
| define void @test(i32) { | |
| ret void | |
| } | |
| define void @foo() { | |
| call void @test(i32 0) | |
| ret void | |
| ; CHECK: @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 | |
| volatile store i32 10, i32* %i, align 4 | |
| ; CHECK: %tmp = load volatile i32* %i, align 4 | |
| ; CHECK-next: call void @f(i32 undef) | |
| %tmp = volatile load 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 | |
| } | |