diff options
Diffstat (limited to 'llvm/test/Feature/OperandBundles')
-rw-r--r-- | llvm/test/Feature/OperandBundles/adce.ll | 41 | ||||
-rw-r--r-- | llvm/test/Feature/OperandBundles/early-cse.ll | 71 |
2 files changed, 112 insertions, 0 deletions
diff --git a/llvm/test/Feature/OperandBundles/adce.ll b/llvm/test/Feature/OperandBundles/adce.ll new file mode 100644 index 00000000000..33bb87e5fc1 --- /dev/null +++ b/llvm/test/Feature/OperandBundles/adce.ll @@ -0,0 +1,41 @@ +; RUN: opt -S -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 +declare void @readnone_function() readnone nounwind + +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 +} diff --git a/llvm/test/Feature/OperandBundles/early-cse.ll b/llvm/test/Feature/OperandBundles/early-cse.ll new file mode 100644 index 00000000000..076ce3baeab --- /dev/null +++ b/llvm/test/Feature/OperandBundles/early-cse.ll @@ -0,0 +1,71 @@ +; RUN: opt -S -early-cse < %s | FileCheck %s + +; While it is normally okay to do memory optimizations over 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 +declare void @readnone_function() readnone nounwind + +define i32 @test0(i32* %x) { +; CHECK-LABEL: @test0( + entry: + store i32 100, i32* %x +; CHECK: store i32 100, i32* %x + call void @readonly_function() [ "tag"() ] +; CHECK: call void @readonly_function() + + %v = load i32, i32* %x +; CHECK: %v = load i32, i32* %x +; CHECK: ret i32 %v + ret i32 %v +} + +define i32 @test1(i32* %x) { +; CHECK: @test1( + entry: + store i32 100, i32* %x +; CHECK: store i32 100, i32* %x + call void @readonly_function() readonly [ "tag"() ] +; CHECK-NOT: call void @readonly_function + %v = load i32, i32* %x + ret i32 %v +; CHECK: ret i32 100 +} + +define i32 @test3(i32* %x) { +; CHECK-LABEL: @test3( + entry: + store i32 100, i32* %x +; CHECK: store i32 100, i32* %x + call void @readonly_function() +; CHECK-NOT: call void @readonly_function + %v = load i32, i32* %x + ret i32 %v +; CHECK: ret i32 100 +} + +define void @test4(i32* %x) { +; CHECK-LABEL: @test4( + entry: + store i32 100, i32* %x +; CHECK: store i32 100, i32* %x + call void @readnone_function() [ "tag"() ] +; CHECK: call void @readnone_function + store i32 200, i32* %x +; CHECK: store i32 200, i32* %x + ret void +} + +define void @test5(i32* %x) { +; CHECK-LABEL: @test5( + entry: + store i32 100, i32* %x +; CHECK-NOT: store i32 100, i32* %x +; CHECK-NOT: call void @readnone_function + call void @readnone_function() readnone [ "tag"() ] + store i32 200, i32* %x +; CHECK: store i32 200, i32* %x + ret void +} |