xref: /llvm-project/llvm/test/Transforms/LICM/hoist-load-without-store.ll (revision 80e8f2beeb954f8c241897099bb01b24da400e8a)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=licm -S < %s | FileCheck %s
3
4;; C reproducer:
5;; void f(int *ptr, int n) {
6;;   for (int i = 0; i < n; ++i) {
7;;     int x = *ptr;
8;;     if (x)
9;;       break;
10;;
11;;     *ptr = x + 1;
12;;   }
13;; }
14
15define dso_local void @f(ptr nocapture %ptr, i32 %n) {
16; CHECK-LABEL: @f(
17; CHECK-NEXT:  entry:
18; CHECK-NEXT:    [[CMP7:%.*]] = icmp slt i32 0, [[N:%.*]]
19; CHECK-NEXT:    br i1 [[CMP7]], label [[FOR_BODY_LR_PH:%.*]], label [[CLEANUP1:%.*]]
20; CHECK:       for.body.lr.ph:
21; CHECK-NEXT:    [[PTR_PROMOTED:%.*]] = load i32, ptr [[PTR:%.*]], align 4
22; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
23; CHECK:       for.body:
24; CHECK-NEXT:    [[TMP0:%.*]] = phi i32 [ [[PTR_PROMOTED]], [[FOR_BODY_LR_PH]] ], [ 1, [[IF_END:%.*]] ]
25; CHECK-NEXT:    [[I_08:%.*]] = phi i32 [ 0, [[FOR_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END]] ]
26; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
27; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END]], label [[FOR_BODY_CLEANUP1_CRIT_EDGE:%.*]]
28; CHECK:       if.end:
29; CHECK-NEXT:    store i32 1, ptr [[PTR]], align 4
30; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_08]], 1
31; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[INC]], [[N]]
32; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_COND_CLEANUP1_CRIT_EDGE:%.*]]
33; CHECK:       for.body.cleanup1_crit_edge:
34; CHECK-NEXT:    br label [[CLEANUP1]]
35; CHECK:       for.cond.cleanup1_crit_edge:
36; CHECK-NEXT:    br label [[CLEANUP1]]
37; CHECK:       cleanup1:
38; CHECK-NEXT:    ret void
39;
40entry:
41  %cmp7 = icmp slt i32 0, %n
42  br i1 %cmp7, label %for.body.lr.ph, label %cleanup1
43
44for.body.lr.ph:                                   ; preds = %entry
45  br label %for.body
46
47for.body:                                         ; preds = %for.body.lr.ph, %if.end
48  %i.08 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %if.end ]
49  %0 = load i32, ptr %ptr, align 4
50  %tobool.not = icmp eq i32 %0, 0
51  br i1 %tobool.not, label %if.end, label %for.body.cleanup1_crit_edge
52
53if.end:                                           ; preds = %for.body
54  store i32 1, ptr %ptr, align 4
55  %inc = add nuw nsw i32 %i.08, 1
56  %cmp = icmp slt i32 %inc, %n
57  br i1 %cmp, label %for.body, label %for.cond.cleanup1_crit_edge
58
59for.body.cleanup1_crit_edge:                      ; preds = %for.body
60  br label %cleanup1
61
62for.cond.cleanup1_crit_edge:                      ; preds = %if.end
63  br label %cleanup1
64
65cleanup1:                                         ; preds = %for.cond.cleanup1_crit_edge, %for.body.cleanup1_crit_edge, %entry
66  ret void
67}
68