1; RUN: opt -S -function-attrs < %s | FileCheck %s 2 3declare void @f_readonly() readonly 4declare void @f_readnone() readnone 5 6define void @test_0(i32* %x) { 7; FunctionAttrs must not infer readonly / readnone for %x 8 9; CHECK-LABEL: define void @test_0(i32* %x) #2 { 10 entry: 11 ; CHECK: call void @f_readonly() [ "foo"(i32* %x) ] 12 call void @f_readonly() [ "foo"(i32* %x) ] 13 ret void 14} 15 16define void @test_1(i32* %x) { 17; FunctionAttrs must not infer readonly / readnone for %x 18 19; CHECK-LABEL: define void @test_1(i32* %x) #2 { 20 entry: 21 ; CHECK: call void @f_readnone() [ "foo"(i32* %x) ] 22 call void @f_readnone() [ "foo"(i32* %x) ] 23 ret void 24} 25 26define void @test_2(i32* %x) { 27; The "deopt" operand bundle does not capture or write to %x. 28 29; CHECK-LABEL: define void @test_2(i32* nocapture readonly %x) 30 entry: 31 call void @f_readonly() [ "deopt"(i32* %x) ] 32 ret void 33} 34 35; CHECK: attributes #2 = { nofree } 36 37