Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / MergedLoadStoreMotion / st_sink_no_gep.ll
blob457b4942d812106dc5175e250eaec01292af4aba
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"
5 define 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
18 entry:
19   br i1 %c, label %if.then, label %if.else
21 if.then:
22   store i32 %x, ptr %p
23   br label %if.end
25 if.else:
26   store i32 %y, ptr %p
27   br label %if.end
29 if.end:
30   ret void
33 define 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
46 entry:
47   br i1 %c, label %if.then, label %if.else
49 if.then:
50   store i32 %x, ptr %p1
51   br label %if.end
53 if.else:
54   store i32 %y, ptr %p2
55   br label %if.end
57 if.end:
58   ret void
61 define 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
75 entry:
76   %gep = getelementptr i32, ptr %p, i32 1
77   br i1 %c, label %if.then, label %if.else
79 if.then:
80   store i32 %x, ptr %gep
81   br label %if.end
83 if.else:
84   store i32 %y, ptr %gep
85   br label %if.end
87 if.end:
88   ret void
91 define 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
105 entry:
106   br i1 %c, label %if.then, label %if.else
108 if.then:
109   %gep1 = getelementptr i32, ptr %p, i32 1
110   store i32 %x, ptr %gep1
111   br label %if.end
113 if.else:
114   %gep2 = getelementptr i32, ptr %p, i32 1
115   store i32 %y, ptr %gep2
116   br label %if.end
118 if.end:
119   ret void