| ; RUN: llc < %s -stop-after=finalize-isel -mtriple=x86_64-unknown-linux - | FileCheck %s --implicit-check-not FAKE_USE |
| ; Fake uses following tail calls should be pulled in front |
| ; of the TCRETURN instruction. Fake uses using something defined by |
| ; the tail call or after it should be suppressed. |
| |
| ; CHECK: name:{{ +}}bar |
| ; CHECK: body: |
| ; CHECK: bb.0.{{.*}}: |
| ; CHECK: %0:{{.*}}= COPY |
| ; CHECK: FAKE_USE %0 |
| ; CHECK: TCRETURN |
| |
| ; CHECK: name:{{ +}}baz |
| ; CHECK: body: |
| ; CHECK: bb.0.{{.*}}: |
| ; CHECK: %0:{{.*}}= COPY |
| ; CHECK: FAKE_USE %0 |
| ; CHECK: TCRETURN |
| |
| define void @bar(i32 %v) optdebug { |
| entry: |
| %call = tail call i32 @_Z3fooi(i32 %v) |
| %mul = mul nsw i32 %call, 3 |
| notail call void (...) @llvm.fake.use(i32 %mul) |
| notail call void (...) @llvm.fake.use(i32 %call) |
| notail call void (...) @llvm.fake.use(i32 %v) |
| ret void |
| } |
| |
| define i32 @baz(i32 %v) optdebug { |
| entry: |
| %call = tail call i32 @_Z3fooi(i32 %v) |
| notail call void (...) @llvm.fake.use(i32 %v) |
| ret i32 %call |
| } |
| |
| declare i32 @_Z3fooi(i32) local_unnamed_addr |