xref: /llvm-project/llvm/test/Transforms/GuardWidening/loop-schedule.ll (revision 0b5bb6923f09ebc257ebed4ace1d8b6b113b2bf5)
19ffe1b0aSSerguei Katkov; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2a43853aeSArthur Eubanks; RUN: opt -S -passes='licm,guard-widening,licm' -verify-memoryssa -debug-pass-manager < %s 2>&1 | FileCheck %s
3cee313d2SEric Christopher
4cee313d2SEric Christopher; Main point of this test is to check the scheduling -- there should be
5cee313d2SEric Christopher; no analysis passes needed between LICM and LoopGuardWidening
6cee313d2SEric Christopher
7a43853aeSArthur Eubanks; CHECK: LICMPass
8a43853aeSArthur Eubanks; CHECK-NEXT: GuardWideningPass
9a43853aeSArthur Eubanks; CHECK-NEXT: LICMPass
10cee313d2SEric Christopher
11cee313d2SEric Christopherdeclare void @llvm.experimental.guard(i1,...)
12cee313d2SEric Christopher
134b53f866SMatt Arsenaultdefine void @iter(i32 %a, i32 %b, ptr %c_p) {
149ffe1b0aSSerguei Katkov; CHECK-LABEL: @iter(
159ffe1b0aSSerguei Katkov; CHECK-NEXT:  entry:
16*0b5bb692SSerguei Katkov; CHECK-NEXT:    [[B_GW_FR:%.*]] = freeze i32 [[B:%.*]]
179ffe1b0aSSerguei Katkov; CHECK-NEXT:    [[COND_0:%.*]] = icmp ult i32 [[A:%.*]], 10
18*0b5bb692SSerguei Katkov; CHECK-NEXT:    [[COND_1:%.*]] = icmp ult i32 [[B_GW_FR]], 10
199ffe1b0aSSerguei Katkov; CHECK-NEXT:    [[WIDE_CHK:%.*]] = and i1 [[COND_0]], [[COND_1]]
209ffe1b0aSSerguei Katkov; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[WIDE_CHK]]) [ "deopt"() ]
214b53f866SMatt Arsenault; CHECK-NEXT:    [[CND:%.*]] = load i1, ptr [[C_P:%.*]], align 1
229ffe1b0aSSerguei Katkov; CHECK-NEXT:    br label [[LOOP:%.*]]
239ffe1b0aSSerguei Katkov; CHECK:       loop:
249ffe1b0aSSerguei Katkov; CHECK-NEXT:    br i1 [[CND]], label [[LOOP]], label [[LEAVE_LOOPEXIT:%.*]]
259ffe1b0aSSerguei Katkov; CHECK:       leave.loopexit:
269ffe1b0aSSerguei Katkov; CHECK-NEXT:    br label [[LEAVE:%.*]]
279ffe1b0aSSerguei Katkov; CHECK:       leave:
289ffe1b0aSSerguei Katkov; CHECK-NEXT:    ret void
299ffe1b0aSSerguei Katkov;
30cee313d2SEric Christopher
31cee313d2SEric Christopherentry:
32cee313d2SEric Christopher  %cond_0 = icmp ult i32 %a, 10
33cee313d2SEric Christopher  call void (i1, ...) @llvm.experimental.guard(i1 %cond_0) [ "deopt"() ]
34cee313d2SEric Christopher  br label %loop
35cee313d2SEric Christopher
36cee313d2SEric Christopherloop:                                             ; preds = %loop.preheader, %loop
37cee313d2SEric Christopher  %cond_1 = icmp ult i32 %b, 10
38cee313d2SEric Christopher  call void (i1, ...) @llvm.experimental.guard(i1 %cond_1) [ "deopt"() ]
394b53f866SMatt Arsenault  %cnd = load i1, ptr %c_p
40cee313d2SEric Christopher  br i1 %cnd, label %loop, label %leave.loopexit
41cee313d2SEric Christopher
42cee313d2SEric Christopherleave.loopexit:                                   ; preds = %loop
43cee313d2SEric Christopher  br label %leave
44cee313d2SEric Christopher
45cee313d2SEric Christopherleave:                                            ; preds = %leave.loopexit, %entry
46cee313d2SEric Christopher  ret void
47cee313d2SEric Christopher}
48cee313d2SEric Christopher
494b53f866SMatt Arsenaultdefine void @within_loop(i32 %a, i32 %b, ptr %c_p) {
509ffe1b0aSSerguei Katkov; CHECK-LABEL: @within_loop(
519ffe1b0aSSerguei Katkov; CHECK-NEXT:  entry:
52*0b5bb692SSerguei Katkov; CHECK-NEXT:    [[B_GW_FR:%.*]] = freeze i32 [[B:%.*]]
539ffe1b0aSSerguei Katkov; CHECK-NEXT:    [[COND_0:%.*]] = icmp ult i32 [[A:%.*]], 10
54*0b5bb692SSerguei Katkov; CHECK-NEXT:    [[COND_1:%.*]] = icmp ult i32 [[B_GW_FR]], 10
559ffe1b0aSSerguei Katkov; CHECK-NEXT:    [[WIDE_CHK:%.*]] = and i1 [[COND_0]], [[COND_1]]
569ffe1b0aSSerguei Katkov; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[WIDE_CHK]]) [ "deopt"() ]
574b53f866SMatt Arsenault; CHECK-NEXT:    [[CND:%.*]] = load i1, ptr [[C_P:%.*]], align 1
589ffe1b0aSSerguei Katkov; CHECK-NEXT:    br label [[LOOP:%.*]]
599ffe1b0aSSerguei Katkov; CHECK:       loop:
609ffe1b0aSSerguei Katkov; CHECK-NEXT:    br i1 [[CND]], label [[LOOP]], label [[LEAVE_LOOPEXIT:%.*]]
619ffe1b0aSSerguei Katkov; CHECK:       leave.loopexit:
629ffe1b0aSSerguei Katkov; CHECK-NEXT:    br label [[LEAVE:%.*]]
639ffe1b0aSSerguei Katkov; CHECK:       leave:
649ffe1b0aSSerguei Katkov; CHECK-NEXT:    ret void
659ffe1b0aSSerguei Katkov;
66cee313d2SEric Christopher
67cee313d2SEric Christopherentry:
68cee313d2SEric Christopher  br label %loop
69cee313d2SEric Christopher
70cee313d2SEric Christopherloop:                                             ; preds = %loop.preheader, %loop
71cee313d2SEric Christopher  %cond_0 = icmp ult i32 %a, 10
72cee313d2SEric Christopher  call void (i1, ...) @llvm.experimental.guard(i1 %cond_0) [ "deopt"() ]
73cee313d2SEric Christopher  %cond_1 = icmp ult i32 %b, 10
74cee313d2SEric Christopher  call void (i1, ...) @llvm.experimental.guard(i1 %cond_1) [ "deopt"() ]
754b53f866SMatt Arsenault  %cnd = load i1, ptr %c_p
76cee313d2SEric Christopher  br i1 %cnd, label %loop, label %leave.loopexit
77cee313d2SEric Christopher
78cee313d2SEric Christopherleave.loopexit:                                   ; preds = %loop
79cee313d2SEric Christopher  br label %leave
80cee313d2SEric Christopher
81cee313d2SEric Christopherleave:                                            ; preds = %leave.loopexit, %entry
82cee313d2SEric Christopher  ret void
83cee313d2SEric Christopher}
84cee313d2SEric Christopher
85