[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / GVNSink / struct.ll
blobf7300bdf54f764891b5c4d1a2be6bd8946df82a0
1 ; RUN: opt -gvn-sink -S < %s | FileCheck %s
2 ; RUN: opt -passes=gvn-sink -S < %s | FileCheck %s
4 %struct = type {i32, i32}
5 %struct2 = type { [ 2 x i32], i32 }
7 ; Struct indices cannot be variant.
9 ; CHECK-LABEL: @f() {
10 ; CHECK: getelementptr
11 ; CHECK: getelementptr
12 define void @f() {
13 bb:
14   br i1 undef, label %bb2, label %bb1
16 bb1:                                              ; preds = %bb
17   %tmp = getelementptr inbounds %struct, %struct* null, i64 0, i32 1
18   br label %bb4
20 bb2:                                              ; preds = %bb
21   %tmp3 = getelementptr inbounds %struct, %struct* null, i64 0, i32 0
22   br label %bb4
24 bb4:                                              ; preds = %bb2, %bb1
25   %tmp5 = phi i32 [ 1, %bb1 ], [ 0, %bb2 ]
26   ret void
29 ; Struct indices cannot be variant.
31 ; CHECK-LABEL: @g() {
32 ; CHECK: getelementptr
33 ; CHECK: getelementptr
34 define void @g() {
35 bb:
36   br i1 undef, label %bb2, label %bb1
38 bb1:                                              ; preds = %bb
39   %tmp = getelementptr inbounds %struct2, %struct2* null, i64 0, i32 0, i32 1
40   br label %bb4
42 bb2:                                              ; preds = %bb
43   %tmp3 = getelementptr inbounds %struct2, %struct2* null, i64 0, i32 0, i32 0
44   br label %bb4
46 bb4:                                              ; preds = %bb2, %bb1
47   %tmp5 = phi i32 [ 1, %bb1 ], [ 0, %bb2 ]
48   ret void
52 ; ... but the first parameter to a GEP can.
54 ; CHECK-LABEL: @h() {
55 ; CHECK: getelementptr
56 ; CHECK-NOT: getelementptr
57 define void @h() {
58 bb:
59   br i1 undef, label %bb2, label %bb1
61 bb1:                                              ; preds = %bb
62   %tmp = getelementptr inbounds %struct, %struct* null, i32 0, i32 0
63   br label %bb4
65 bb2:                                              ; preds = %bb
66   %tmp3 = getelementptr inbounds %struct, %struct* null, i32 1, i32 0
67   br label %bb4
69 bb4:                                              ; preds = %bb2, %bb1
70   %tmp5 = phi i32 [ 0, %bb1 ], [ 1, %bb2 ]
71   ret void