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