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 }