xref: /llvm-project/llvm/test/Transforms/MergedLoadStoreMotion/st_sink_no_gep.ll (revision cb03470aefb91dfd0d01f2651d604e9afaef5cb1)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=mldst-motion -S < %s | FileCheck %s
3;target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
4
5define void @no_gep_same_ptr(i1 %c, ptr %p, i32 %x, i32 %y) {
6; CHECK-LABEL: @no_gep_same_ptr(
7; CHECK-NEXT:  entry:
8; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
9; CHECK:       if.then:
10; CHECK-NEXT:    br label [[IF_END:%.*]]
11; CHECK:       if.else:
12; CHECK-NEXT:    br label [[IF_END]]
13; CHECK:       if.end:
14; CHECK-NEXT:    [[Y_SINK:%.*]] = phi i32 [ [[X:%.*]], [[IF_THEN]] ], [ [[Y:%.*]], [[IF_ELSE]] ]
15; CHECK-NEXT:    store i32 [[Y_SINK]], ptr [[P:%.*]], align 4
16; CHECK-NEXT:    ret void
17;
18entry:
19  br i1 %c, label %if.then, label %if.else
20
21if.then:
22  store i32 %x, ptr %p
23  br label %if.end
24
25if.else:
26  store i32 %y, ptr %p
27  br label %if.end
28
29if.end:
30  ret void
31}
32
33define void @no_gep_different_ptr(i1 %c, ptr %p1, ptr %p2, i32 %x, i32 %y) {
34; CHECK-LABEL: @no_gep_different_ptr(
35; CHECK-NEXT:  entry:
36; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
37; CHECK:       if.then:
38; CHECK-NEXT:    store i32 [[X:%.*]], ptr [[P1:%.*]], align 4
39; CHECK-NEXT:    br label [[IF_END:%.*]]
40; CHECK:       if.else:
41; CHECK-NEXT:    store i32 [[Y:%.*]], ptr [[P2:%.*]], align 4
42; CHECK-NEXT:    br label [[IF_END]]
43; CHECK:       if.end:
44; CHECK-NEXT:    ret void
45;
46entry:
47  br i1 %c, label %if.then, label %if.else
48
49if.then:
50  store i32 %x, ptr %p1
51  br label %if.end
52
53if.else:
54  store i32 %y, ptr %p2
55  br label %if.end
56
57if.end:
58  ret void
59}
60
61define void @shared_gep(i1 %c, ptr %p, i32 %x, i32 %y) {
62; CHECK-LABEL: @shared_gep(
63; CHECK-NEXT:  entry:
64; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 1
65; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
66; CHECK:       if.then:
67; CHECK-NEXT:    br label [[IF_END:%.*]]
68; CHECK:       if.else:
69; CHECK-NEXT:    br label [[IF_END]]
70; CHECK:       if.end:
71; CHECK-NEXT:    [[Y_SINK:%.*]] = phi i32 [ [[X:%.*]], [[IF_THEN]] ], [ [[Y:%.*]], [[IF_ELSE]] ]
72; CHECK-NEXT:    store i32 [[Y_SINK]], ptr [[GEP]], align 4
73; CHECK-NEXT:    ret void
74;
75entry:
76  %gep = getelementptr i32, ptr %p, i32 1
77  br i1 %c, label %if.then, label %if.else
78
79if.then:
80  store i32 %x, ptr %gep
81  br label %if.end
82
83if.else:
84  store i32 %y, ptr %gep
85  br label %if.end
86
87if.end:
88  ret void
89}
90
91define void @separate_geps(i1 %c, ptr %p, i32 %x, i32 %y) {
92; CHECK-LABEL: @separate_geps(
93; CHECK-NEXT:  entry:
94; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
95; CHECK:       if.then:
96; CHECK-NEXT:    br label [[IF_END:%.*]]
97; CHECK:       if.else:
98; CHECK-NEXT:    br label [[IF_END]]
99; CHECK:       if.end:
100; CHECK-NEXT:    [[Y_SINK:%.*]] = phi i32 [ [[X:%.*]], [[IF_THEN]] ], [ [[Y:%.*]], [[IF_ELSE]] ]
101; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 1
102; CHECK-NEXT:    store i32 [[Y_SINK]], ptr [[TMP0]], align 4
103; CHECK-NEXT:    ret void
104;
105entry:
106  br i1 %c, label %if.then, label %if.else
107
108if.then:
109  %gep1 = getelementptr i32, ptr %p, i32 1
110  store i32 %x, ptr %gep1
111  br label %if.end
112
113if.else:
114  %gep2 = getelementptr i32, ptr %p, i32 1
115  store i32 %y, ptr %gep2
116  br label %if.end
117
118if.end:
119  ret void
120}
121