| ; RUN: opt -S -passes=adce < %s | FileCheck %s |
| |
| ; While it is normally okay to DCE out calls to @readonly_function and |
| ; @readnone_function, we cannot do that if they're carrying operand |
| ; bundles since the presence of unknown operand bundles implies |
| ; arbitrary memory effects. |
| |
| declare void @readonly_function() readonly nounwind willreturn |
| declare void @readnone_function() readnone nounwind willreturn |
| |
| define void @test0() { |
| ; CHECK-LABEL: @test0( |
| entry: |
| call void @readonly_function() [ "tag"() ] |
| ; CHECK: call void @readonly_function |
| ret void |
| } |
| |
| define void @test1() { |
| ; CHECK-LABEL: @test1( |
| entry: |
| call void @readnone_function() [ "tag"() ] |
| ; CHECK: call void @readnone_function |
| ret void |
| } |
| |
| define void @test2() { |
| ; CHECK-LABEL: @test2( |
| entry: |
| ; CHECK-NOT: @readonly_function( |
| call void @readonly_function() readonly [ "tag"() ] |
| ret void |
| } |
| |
| define void @test3() { |
| ; CHECK-LABEL: @test3( |
| entry: |
| ; CHECK-NOT: @readnone_function( |
| call void @readnone_function() readnone [ "tag"() ] |
| ret void |
| } |
| |
| define void @test4() { |
| ; CHECK-LABEL: @test4( |
| entry: |
| ; CHECK-NOT: @readonly_function() |
| call void @readonly_function() [ "deopt"() ] |
| ret void |
| } |