1*3e60d216SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*3e60d216SFlorian Hahn; RUN: opt -aa-pipeline=basic-aa -passes='loop-distribute' -enable-loop-distribute -S %s | FileCheck %s 3*3e60d216SFlorian Hahn 4*3e60d216SFlorian Hahn; Testcases inspired by PR50296, PR50288. 5*3e60d216SFlorian Hahn 6*3e60d216SFlorian Hahndefine void @phi_load_store_distribute(i1 %c, i16* %A, i16* %B, i16* %C) { 7*3e60d216SFlorian Hahn; CHECK-LABEL: @phi_load_store_distribute( 8*3e60d216SFlorian Hahn; CHECK-NEXT: entry: 9*3e60d216SFlorian Hahn; CHECK-NEXT: br label [[FOR_BODY:%.*]] 10*3e60d216SFlorian Hahn; CHECK: for.body: 11*3e60d216SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i16 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[IF_END:%.*]] ] 12*3e60d216SFlorian Hahn; CHECK-NEXT: [[LV:%.*]] = load i16, i16* [[A:%.*]], align 1 13*3e60d216SFlorian Hahn; CHECK-NEXT: store i16 [[LV]], i16* [[A]], align 1 14*3e60d216SFlorian Hahn; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_END]] 15*3e60d216SFlorian Hahn; CHECK: if.then: 16*3e60d216SFlorian Hahn; CHECK-NEXT: [[LV2:%.*]] = load i16, i16* [[A]], align 1 17*3e60d216SFlorian Hahn; CHECK-NEXT: br label [[IF_END]] 18*3e60d216SFlorian Hahn; CHECK: if.end: 19*3e60d216SFlorian Hahn; CHECK-NEXT: [[C_SINK:%.*]] = phi i16* [ [[B:%.*]], [[IF_THEN]] ], [ [[C:%.*]], [[FOR_BODY]] ] 20*3e60d216SFlorian Hahn; CHECK-NEXT: [[LV3:%.*]] = load i16, i16* [[C_SINK]], align 2 21*3e60d216SFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add i16 [[LV3]], 10 22*3e60d216SFlorian Hahn; CHECK-NEXT: store i16 [[ADD]], i16* [[C_SINK]], align 1 23*3e60d216SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i16 [[IV]], 1 24*3e60d216SFlorian Hahn; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i16 [[IV_NEXT]], 1000 25*3e60d216SFlorian Hahn; CHECK-NEXT: br i1 [[TOBOOL_NOT]], label [[FOR_END_LOOPEXIT:%.*]], label [[FOR_BODY]] 26*3e60d216SFlorian Hahn; CHECK: for.end.loopexit: 27*3e60d216SFlorian Hahn; CHECK-NEXT: ret void 28*3e60d216SFlorian Hahn; 29*3e60d216SFlorian Hahnentry: 30*3e60d216SFlorian Hahn br label %for.body 31*3e60d216SFlorian Hahn 32*3e60d216SFlorian Hahnfor.body: ; preds = %if.end, %entry 33*3e60d216SFlorian Hahn %iv = phi i16 [ 0, %entry ], [ %iv.next, %if.end ] 34*3e60d216SFlorian Hahn %lv = load i16, i16* %A, align 1 35*3e60d216SFlorian Hahn store i16 %lv, i16* %A, align 1 36*3e60d216SFlorian Hahn br i1 %c, label %if.then, label %if.end 37*3e60d216SFlorian Hahn 38*3e60d216SFlorian Hahnif.then: ; preds = %for.body 39*3e60d216SFlorian Hahn %lv2 = load i16, i16* %A, align 1 40*3e60d216SFlorian Hahn br label %if.end 41*3e60d216SFlorian Hahn 42*3e60d216SFlorian Hahnif.end: ; preds = %if.then, %for.body 43*3e60d216SFlorian Hahn %c.sink = phi i16* [ %B, %if.then ], [ %C, %for.body ] 44*3e60d216SFlorian Hahn %lv3 = load i16, i16* %c.sink 45*3e60d216SFlorian Hahn %add = add i16 %lv3, 10 46*3e60d216SFlorian Hahn store i16 %add, i16* %c.sink, align 1 47*3e60d216SFlorian Hahn %iv.next = add nuw nsw i16 %iv, 1 48*3e60d216SFlorian Hahn %tobool.not = icmp eq i16 %iv.next, 1000 49*3e60d216SFlorian Hahn br i1 %tobool.not, label %for.end.loopexit, label %for.body 50*3e60d216SFlorian Hahn 51*3e60d216SFlorian Hahnfor.end.loopexit: ; preds = %if.end 52*3e60d216SFlorian Hahn ret void 53*3e60d216SFlorian Hahn} 54*3e60d216SFlorian Hahn 55*3e60d216SFlorian Hahndefine void @phi_load_distribute(i1 %c, i16* %A, i16* %B, i16* %C) { 56*3e60d216SFlorian Hahn; CHECK-LABEL: @phi_load_distribute( 57*3e60d216SFlorian Hahn; CHECK-NEXT: entry: 58*3e60d216SFlorian Hahn; CHECK: for.end.loopexit: 59*3e60d216SFlorian Hahn; CHECK-NEXT: ret void 60*3e60d216SFlorian Hahn; 61*3e60d216SFlorian Hahnentry: 62*3e60d216SFlorian Hahn br label %for.body 63*3e60d216SFlorian Hahn 64*3e60d216SFlorian Hahnfor.body: ; preds = %if.end, %entry 65*3e60d216SFlorian Hahn %iv = phi i16 [ 0, %entry ], [ %iv.next, %if.end ] 66*3e60d216SFlorian Hahn %lv = load i16, i16* %A, align 1 67*3e60d216SFlorian Hahn store i16 %lv, i16* %A, align 1 68*3e60d216SFlorian Hahn br i1 %c, label %if.then, label %if.end 69*3e60d216SFlorian Hahn 70*3e60d216SFlorian Hahnif.then: ; preds = %for.body 71*3e60d216SFlorian Hahn %lv2 = load i16, i16* %A, align 1 72*3e60d216SFlorian Hahn br label %if.end 73*3e60d216SFlorian Hahn 74*3e60d216SFlorian Hahnif.end: ; preds = %if.then, %for.body 75*3e60d216SFlorian Hahn %c.sink = phi i16* [ %B, %if.then ], [ %C, %for.body ] 76*3e60d216SFlorian Hahn %lv3 = load i16, i16* %c.sink 77*3e60d216SFlorian Hahn %iv.next = add nuw nsw i16 %iv, 1 78*3e60d216SFlorian Hahn %tobool.not = icmp eq i16 %iv.next, 1000 79*3e60d216SFlorian Hahn br i1 %tobool.not, label %for.end.loopexit, label %for.body 80*3e60d216SFlorian Hahn 81*3e60d216SFlorian Hahnfor.end.loopexit: ; preds = %if.end 82*3e60d216SFlorian Hahn ret void 83*3e60d216SFlorian Hahn} 84*3e60d216SFlorian Hahn 85*3e60d216SFlorian Hahn 86