xref: /llvm-project/llvm/test/Transforms/MergedLoadStoreMotion/st_sink_split_bb.ll (revision cb03470aefb91dfd0d01f2651d604e9afaef5cb1)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; Test to make sure that a new block is inserted if we
3; have more than 2 predecessors for the block we're going to sink to.
4; RUN: opt -passes=mldst-motion -S < %s | FileCheck %s --check-prefix=CHECK-NO
5; RUN: opt -debug-pass-manager -aa-pipeline=basic-aa -passes='require<memdep>,mldst-motion' -S < %s 2>&1 | FileCheck %s --check-prefixes=CHECK-NO,CHECK-INV-NO
6; RUN: opt -debug-pass-manager -aa-pipeline=basic-aa -passes='require<memdep>,mldst-motion<split-footer-bb>' -S < %s 2>&1 | FileCheck %s --check-prefixes=CHECK-YES,CHECK-INV-YES
7target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
8
9; When passing split-footer-bb to MLSM, it invalidates CFG analyses
10; CHECK-INV-NO: Running pass: MergedLoadStoreMotionPass
11; CHECK-INV-NO-NOT: Invalidating analysis: DominatorTreeAnalysis
12; CHECK-INV-YES: Running pass: MergedLoadStoreMotionPass
13; CHECK-INV-YES: Invalidating analysis: DominatorTreeAnalysis
14
15; Function Attrs: nounwind uwtable
16define dso_local void @st_sink_split_bb(ptr nocapture %arg, ptr nocapture %arg1, i1 zeroext %arg2, i1 zeroext %arg3) local_unnamed_addr {
17; CHECK-NO-LABEL: @st_sink_split_bb(
18; CHECK-NO-NEXT:  bb:
19; CHECK-NO-NEXT:    br i1 [[ARG2:%.*]], label [[BB4:%.*]], label [[BB5:%.*]]
20; CHECK-NO:       bb4:
21; CHECK-NO-NEXT:    store i32 1, ptr [[ARG:%.*]], align 4
22; CHECK-NO-NEXT:    br label [[BB9:%.*]]
23; CHECK-NO:       bb5:
24; CHECK-NO-NEXT:    br i1 [[ARG3:%.*]], label [[BB6:%.*]], label [[BB7:%.*]]
25; CHECK-NO:       bb6:
26; CHECK-NO-NEXT:    store i32 2, ptr [[ARG]], align 4
27; CHECK-NO-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[ARG1:%.*]], i64 1
28; CHECK-NO-NEXT:    store i32 3, ptr [[TMP1]], align 4
29; CHECK-NO-NEXT:    [[TMP:%.*]] = getelementptr inbounds i32, ptr [[ARG1]], i64 2
30; CHECK-NO-NEXT:    store i32 3, ptr [[TMP]], align 4
31; CHECK-NO-NEXT:    br label [[BB9]]
32; CHECK-NO:       bb7:
33; CHECK-NO-NEXT:    store i32 3, ptr [[ARG]], align 4
34; CHECK-NO-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[ARG1]], i64 1
35; CHECK-NO-NEXT:    store i32 3, ptr [[TMP2]], align 4
36; CHECK-NO-NEXT:    [[TMP8:%.*]] = getelementptr inbounds i32, ptr [[ARG1]], i64 2
37; CHECK-NO-NEXT:    store i32 3, ptr [[TMP8]], align 4
38; CHECK-NO-NEXT:    br label [[BB9]]
39; CHECK-NO:       bb9:
40; CHECK-NO-NEXT:    ret void
41;
42; CHECK-YES-LABEL: @st_sink_split_bb(
43; CHECK-YES-NEXT:  bb:
44; CHECK-YES-NEXT:    br i1 [[ARG2:%.*]], label [[BB4:%.*]], label [[BB5:%.*]]
45; CHECK-YES:       bb4:
46; CHECK-YES-NEXT:    store i32 1, ptr [[ARG:%.*]], align 4
47; CHECK-YES-NEXT:    br label [[BB9:%.*]]
48; CHECK-YES:       bb5:
49; CHECK-YES-NEXT:    br i1 [[ARG3:%.*]], label [[BB6:%.*]], label [[BB7:%.*]]
50; CHECK-YES:       bb6:
51; CHECK-YES-NEXT:    br label [[BB9_SINK_SPLIT:%.*]]
52; CHECK-YES:       bb7:
53; CHECK-YES-NEXT:    br label [[BB9_SINK_SPLIT]]
54; CHECK-YES:       bb9.sink.split:
55; CHECK-YES-NEXT:    [[DOTSINK:%.*]] = phi i32 [ 2, [[BB6]] ], [ 3, [[BB7]] ]
56; CHECK-YES-NEXT:    store i32 [[DOTSINK]], ptr [[ARG]], align 4
57; CHECK-YES-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[ARG1:%.*]], i64 1
58; CHECK-YES-NEXT:    store i32 3, ptr [[TMP0]], align 4
59; CHECK-YES-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[ARG1]], i64 2
60; CHECK-YES-NEXT:    store i32 3, ptr [[TMP1]], align 4
61; CHECK-YES-NEXT:    br label [[BB9]]
62; CHECK-YES:       bb9:
63; CHECK-YES-NEXT:    ret void
64;
65bb:
66  br i1 %arg2, label %bb4, label %bb5
67
68bb4:                                              ; preds = %bb
69  store i32 1, ptr %arg, align 4
70  br label %bb9
71
72bb5:                                              ; preds = %bb
73  br i1 %arg3, label %bb6, label %bb7
74
75bb6:                                              ; preds = %bb5
76  store i32 2, ptr %arg, align 4
77  %tmp1 = getelementptr inbounds i32, ptr %arg1, i64 1
78  store i32 3, ptr %tmp1, align 4
79  %tmp = getelementptr inbounds i32, ptr %arg1, i64 2
80  store i32 3, ptr %tmp, align 4
81  br label %bb9
82
83bb7:                                              ; preds = %bb5
84  store i32 3, ptr %arg, align 4
85  %tmp2 = getelementptr inbounds i32, ptr %arg1, i64 1
86  store i32 3, ptr %tmp2, align 4
87  %tmp8 = getelementptr inbounds i32, ptr %arg1, i64 2
88  store i32 3, ptr %tmp8, align 4
89  br label %bb9
90
91
92bb9:                                              ; preds = %bb7, %bb6, %bb4
93  ret void
94}
95