Home | History | Annotate | Download | only in OperandBundles
      1 ; RUN: opt -S -early-cse < %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 
      8 declare void @readonly_function() readonly nounwind
      9 declare void @readnone_function() readnone nounwind
     10 
     11 define 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 
     25 define 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 
     37 define 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 
     49 define 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 
     61 define 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 
     73 define 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