1; RUN: opt -S -early-cse -earlycse-debug-hash < %s | FileCheck %s 2 3; While it is normally okay to do memory optimizations over calls to 4; @readonly_function and @readnone_function, we cannot do that if 5; they're carrying unknown operand bundles since the presence of 6; unknown operand bundles implies arbitrary memory effects. 7 8declare void @readonly_function() readonly nounwind 9declare void @readnone_function() readnone nounwind 10 11define i32 @test0(i32* %x) { 12; CHECK-LABEL: @test0( 13 entry: 14 store i32 100, i32* %x 15; CHECK: store i32 100, i32* %x 16 call void @readonly_function() [ "tag"() ] 17; CHECK: call void @readonly_function() 18 19 %v = load i32, i32* %x 20; CHECK: %v = load i32, i32* %x 21; CHECK: ret i32 %v 22 ret i32 %v 23} 24 25define i32 @test1(i32* %x) { 26; CHECK: @test1( 27 entry: 28 store i32 100, i32* %x 29; CHECK: store i32 100, i32* %x 30 call void @readonly_function() readonly [ "tag"() ] 31; CHECK-NOT: call void @readonly_function 32 %v = load i32, i32* %x 33 ret i32 %v 34; CHECK: ret i32 100 35} 36 37define i32 @test3(i32* %x) { 38; CHECK-LABEL: @test3( 39 entry: 40 store i32 100, i32* %x 41; CHECK: store i32 100, i32* %x 42 call void @readonly_function() 43; CHECK-NOT: call void @readonly_function 44 %v = load i32, i32* %x 45 ret i32 %v 46; CHECK: ret i32 100 47} 48 49define void @test4(i32* %x) { 50; CHECK-LABEL: @test4( 51 entry: 52 store i32 100, i32* %x 53; CHECK: store i32 100, i32* %x 54 call void @readnone_function() [ "tag"() ] 55; CHECK: call void @readnone_function 56 store i32 200, i32* %x 57; CHECK: store i32 200, i32* %x 58 ret void 59} 60 61define void @test5(i32* %x) { 62; CHECK-LABEL: @test5( 63 entry: 64 store i32 100, i32* %x 65; CHECK-NOT: store i32 100, i32* %x 66; CHECK-NOT: call void @readnone_function 67 call void @readnone_function() readnone [ "tag"() ] 68 store i32 200, i32* %x 69; CHECK: store i32 200, i32* %x 70 ret void 71} 72 73define void @test6(i32* %x) { 74; The "deopt" operand bundle does not make the call to 75; @readonly_function read-write; and so the nounwind readonly call can 76; be deleted. 77 78; CHECK-LABEL: @test6( 79 entry: 80 81; CHECK-NEXT: entry: 82; CHECK-NEXT: store i32 200, i32* %x 83; CHECK-NEXT: ret void 84 85 store i32 100, i32* %x 86 call void @readonly_function() [ "deopt"() ] 87 store i32 200, i32* %x 88 ret void 89} 90