Home | History | Annotate | Download | only in GVNSink
      1 ; RUN: opt -gvn-sink -S < %s | FileCheck %s
      2 
      3 %struct = type {i32, i32}
      4 %struct2 = type { [ 2 x i32], i32 }
      5 
      6 ; Struct indices cannot be variant.
      7 
      8 ; CHECK-LABEL: @f() {
      9 ; CHECK: getelementptr
     10 ; CHECK: getelementptr
     11 define void @f() {
     12 bb:
     13   br i1 undef, label %bb2, label %bb1
     14 
     15 bb1:                                              ; preds = %bb
     16   %tmp = getelementptr inbounds %struct, %struct* null, i64 0, i32 1
     17   br label %bb4
     18 
     19 bb2:                                              ; preds = %bb
     20   %tmp3 = getelementptr inbounds %struct, %struct* null, i64 0, i32 0
     21   br label %bb4
     22 
     23 bb4:                                              ; preds = %bb2, %bb1
     24   %tmp5 = phi i32 [ 1, %bb1 ], [ 0, %bb2 ]
     25   ret void
     26 }
     27 
     28 ; Struct indices cannot be variant.
     29 
     30 ; CHECK-LABEL: @g() {
     31 ; CHECK: getelementptr
     32 ; CHECK: getelementptr
     33 define void @g() {
     34 bb:
     35   br i1 undef, label %bb2, label %bb1
     36 
     37 bb1:                                              ; preds = %bb
     38   %tmp = getelementptr inbounds %struct2, %struct2* null, i64 0, i32 0, i32 1
     39   br label %bb4
     40 
     41 bb2:                                              ; preds = %bb
     42   %tmp3 = getelementptr inbounds %struct2, %struct2* null, i64 0, i32 0, i32 0
     43   br label %bb4
     44 
     45 bb4:                                              ; preds = %bb2, %bb1
     46   %tmp5 = phi i32 [ 1, %bb1 ], [ 0, %bb2 ]
     47   ret void
     48 }
     49 
     50 
     51 ; ... but the first parameter to a GEP can.
     52 
     53 ; CHECK-LABEL: @h() {
     54 ; CHECK: getelementptr
     55 ; CHECK-NOT: getelementptr
     56 define void @h() {
     57 bb:
     58   br i1 undef, label %bb2, label %bb1
     59 
     60 bb1:                                              ; preds = %bb
     61   %tmp = getelementptr inbounds %struct, %struct* null, i32 0, i32 0
     62   br label %bb4
     63 
     64 bb2:                                              ; preds = %bb
     65   %tmp3 = getelementptr inbounds %struct, %struct* null, i32 1, i32 0
     66   br label %bb4
     67 
     68 bb4:                                              ; preds = %bb2, %bb1
     69   %tmp5 = phi i32 [ 0, %bb1 ], [ 1, %bb2 ]
     70   ret void
     71 }