72 lines · plain
1; RUN: opt -passes=gvn-sink -S < %s | FileCheck %s2 3%struct = type {i32, i32, i32}4%struct2 = type { [ 2 x i32], i32 }5 6; Struct indices cannot be variant.7 8; CHECK-LABEL: @f(i1 %arg) {9; CHECK: getelementptr10; CHECK: getelementptr11define void @f(i1 %arg) {12bb:13 br i1 %arg, label %bb2, label %bb114 15bb1: ; preds = %bb16 %tmp = getelementptr inbounds %struct, ptr null, i64 0, i32 117 br label %bb418 19bb2: ; preds = %bb20 %tmp3 = getelementptr inbounds %struct, ptr null, i64 0, i32 221 br label %bb422 23bb4: ; preds = %bb2, %bb124 %tmp5 = phi i32 [ 1, %bb1 ], [ 2, %bb2 ]25 ret void26}27 28; Struct indices cannot be variant.29 30; CHECK-LABEL: @g(i1 %arg) {31; CHECK: getelementptr32; CHECK: getelementptr33define void @g(i1 %arg) {34bb:35 br i1 %arg, label %bb2, label %bb136 37bb1: ; preds = %bb38 %tmp = getelementptr inbounds %struct2, ptr null, i64 0, i32 0, i32 139 br label %bb440 41bb2: ; preds = %bb42 %tmp3 = getelementptr inbounds %struct2, ptr null, i64 0, i32 0, i32 243 br label %bb444 45bb4: ; preds = %bb2, %bb146 %tmp5 = phi i32 [ 1, %bb1 ], [ 2, %bb2 ]47 ret void48}49 50 51; ... but the first parameter to a GEP can.52 53; CHECK-LABEL: @h(i1 %arg) {54; CHECK: getelementptr55; CHECK-NOT: getelementptr56define void @h(i1 %arg) {57bb:58 br i1 %arg, label %bb2, label %bb159 60bb1: ; preds = %bb61 %tmp = getelementptr inbounds %struct, ptr null, i32 1, i32 062 br label %bb463 64bb2: ; preds = %bb65 %tmp3 = getelementptr inbounds %struct, ptr null, i32 2, i32 066 br label %bb467 68bb4: ; preds = %bb2, %bb169 %tmp5 = phi i32 [ 1, %bb1 ], [ 2, %bb2 ]70 ret void71}72