Home | History | Annotate | Download | only in GVNHoist
      1 ; RUN: opt -S -gvn-hoist < %s | FileCheck %s
      2 
      3 %struct.__jmp_buf_tag = type { [8 x i64], i32 }
      4 
      5 ; Check that hoisting only happens when the expression is very busy.
      6 ; CHECK: store
      7 ; CHECK: store
      8 
      9 @test_exit_buf = global %struct.__jmp_buf_tag zeroinitializer
     10 @G = global i32 0
     11 
     12 define void @test_command(i32 %c1) {
     13 entry:
     14   switch i32 %c1, label %exit [
     15     i32 0, label %sw0
     16     i32 1, label %sw1
     17   ]
     18 
     19 sw0:
     20   store i32 1, i32* @G
     21   br label %exit
     22 
     23 sw1:
     24   store i32 1, i32* @G
     25   br label %exit
     26 
     27 exit:
     28   call void @longjmp(%struct.__jmp_buf_tag* @test_exit_buf, i32 1) #0
     29   unreachable
     30 }
     31 
     32 declare void @longjmp(%struct.__jmp_buf_tag*, i32) #0
     33 
     34 attributes #0 = { noreturn nounwind }
     35 
     36 ; Check that the store is hoisted.
     37 ; CHECK-LABEL: define void @fun(
     38 ; CHECK: store
     39 ; CHECK-NOT: store
     40 
     41 define void @fun() {
     42 entry:
     43   br label %if.then
     44 
     45 if.then:                                          ; preds = %entry
     46   br i1 undef, label %sw0, label %sw1
     47 
     48 sw0:
     49   store i32 1, i32* @G
     50   unreachable
     51 
     52 sw1:
     53   store i32 1, i32* @G
     54   ret void
     55 }
     56