1e399dd60SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2eb975caeSFlorian Hahn; RUN: opt -passes="loop-mssa(indvars,simple-loop-unswitch<nontrivial>)" -verify-scev -S %s | FileCheck %s 3e399dd60SFlorian Hahntarget datalayout = "n16:32" 4e399dd60SFlorian Hahn 5e399dd60SFlorian Hahn@glob = external global i16, align 1 6e399dd60SFlorian Hahn 7e399dd60SFlorian Hahn; Test case for PR58136. 8eb975caeSFlorian Hahndefine void @test_pr58136(i1 %c.1, i1 %c.2) { 9eb975caeSFlorian Hahn; CHECK-LABEL: @test_pr58136( 10e399dd60SFlorian Hahn; CHECK-NEXT: entry: 11eb975caeSFlorian Hahn; CHECK-NEXT: [[SRC1:%.*]] = alloca i16, align 2 12eb975caeSFlorian Hahn; CHECK-NEXT: [[L_3:%.*]] = load i16, ptr [[SRC1]], align 2 13eb975caeSFlorian Hahn; CHECK-NEXT: [[GLOB_PROMOTED:%.*]] = load i16, ptr @glob, align 2 14eb975caeSFlorian Hahn; CHECK-NEXT: [[C_1_FR:%.*]] = freeze i1 [[C_1:%.*]] 15eb975caeSFlorian Hahn; CHECK-NEXT: br i1 [[C_1_FR]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]] 16e399dd60SFlorian Hahn; CHECK: entry.split.us: 17eb975caeSFlorian Hahn; CHECK-NEXT: [[C_2_FR:%.*]] = freeze i1 [[C_2:%.*]] 18eb975caeSFlorian Hahn; CHECK-NEXT: br i1 [[C_2_FR]], label [[ENTRY_SPLIT_US_SPLIT_US:%.*]], label [[ENTRY_SPLIT_US_SPLIT:%.*]] 19e399dd60SFlorian Hahn; CHECK: entry.split.us.split.us: 20e399dd60SFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER_US_US:%.*]] 21e399dd60SFlorian Hahn; CHECK: loop.header.us.us: 22eb975caeSFlorian Hahn; CHECK-NEXT: [[MUL1_US_US:%.*]] = phi i16 [ [[MUL_US_US:%.*]], [[LOOP_LATCH_US_US:%.*]] ], [ [[GLOB_PROMOTED]], [[ENTRY_SPLIT_US_SPLIT_US]] ] 23eb975caeSFlorian Hahn; CHECK-NEXT: [[CALL2_US_US:%.*]] = call i16 @foo() 24eb975caeSFlorian Hahn; CHECK-NEXT: br label [[THEN_BB_US_US:%.*]] 25eb975caeSFlorian Hahn; CHECK: then.bb.us.us: 26eb975caeSFlorian Hahn; CHECK-NEXT: br label [[LOOP_LATCH_US_US]] 27eb975caeSFlorian Hahn; CHECK: loop.latch.us.us: 28e399dd60SFlorian Hahn; CHECK-NEXT: [[MUL_US_US]] = mul nsw i16 [[MUL1_US_US]], [[L_3]] 29eb975caeSFlorian Hahn; CHECK-NEXT: store i16 [[MUL_US_US]], ptr @glob, align 2 30e399dd60SFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER_US_US]] 31e399dd60SFlorian Hahn; CHECK: entry.split.us.split: 32e399dd60SFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER_US:%.*]] 33e399dd60SFlorian Hahn; CHECK: loop.header.us: 34eb975caeSFlorian Hahn; CHECK-NEXT: [[CALL2_US:%.*]] = call i16 @foo() 35eb975caeSFlorian Hahn; CHECK-NEXT: br label [[THEN_BB_US:%.*]] 36eb975caeSFlorian Hahn; CHECK: then.bb.us: 37e399dd60SFlorian Hahn; CHECK-NEXT: br label [[EXIT_SPLIT_US:%.*]] 38e399dd60SFlorian Hahn; CHECK: exit.split.us: 39e399dd60SFlorian Hahn; CHECK-NEXT: br label [[EXIT:%.*]] 40e399dd60SFlorian Hahn; CHECK: entry.split: 41e399dd60SFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER:%.*]] 42e399dd60SFlorian Hahn; CHECK: loop.header: 43eb975caeSFlorian Hahn; CHECK-NEXT: [[CALL2:%.*]] = call i16 @foo() 44eb975caeSFlorian Hahn; CHECK-NEXT: br label [[EXIT_SPLIT:%.*]] 45e399dd60SFlorian Hahn; CHECK: exit.split: 46e399dd60SFlorian Hahn; CHECK-NEXT: br label [[EXIT]] 47e399dd60SFlorian Hahn; CHECK: exit: 48e399dd60SFlorian Hahn; CHECK-NEXT: ret void 49e399dd60SFlorian Hahn; 50e399dd60SFlorian Hahnentry: 51eb975caeSFlorian Hahn %src1 = alloca i16, align 2 52eb975caeSFlorian Hahn %l.3 = load i16, ptr %src1, align 2 53eb975caeSFlorian Hahn %glob.promoted = load i16, ptr @glob, align 2 54e399dd60SFlorian Hahn br label %loop.header 55e399dd60SFlorian Hahn 56eb975caeSFlorian Hahnloop.header: ; preds = %loop.latch, %entry 57eb975caeSFlorian Hahn %mul1 = phi i16 [ %mul, %loop.latch ], [ %glob.promoted, %entry ] 58eb975caeSFlorian Hahn %call2 = call i16 @foo() 59eb975caeSFlorian Hahn br i1 %c.1, label %then.bb, label %exit 60e399dd60SFlorian Hahn 61eb975caeSFlorian Hahnthen.bb: ; preds = %loop.header 62eb975caeSFlorian Hahn br i1 %c.2, label %loop.latch, label %exit 63e399dd60SFlorian Hahn 64eb975caeSFlorian Hahnloop.latch: ; preds = %then.bb 65eb975caeSFlorian Hahn %mul = mul nsw i16 %mul1, %l.3 66eb975caeSFlorian Hahn store i16 %mul, ptr @glob, align 2 67e399dd60SFlorian Hahn br label %loop.header 68e399dd60SFlorian Hahn 69eb975caeSFlorian Hahnexit: ; preds = %then.bb, %loop.header 70e399dd60SFlorian Hahn ret void 71e399dd60SFlorian Hahn} 72e399dd60SFlorian Hahn 73e399dd60SFlorian Hahndeclare i16 @foo() nounwind readnone 74469f0fc6SFlorian Hahn 75469f0fc6SFlorian Hahndefine void @test_pr58158(i1 %c.1) { 76469f0fc6SFlorian Hahn; CHECK-LABEL: @test_pr58158( 77469f0fc6SFlorian Hahn; CHECK-NEXT: entry: 78469f0fc6SFlorian Hahn; CHECK-NEXT: [[CALL:%.*]] = tail call i16 @bar() 79469f0fc6SFlorian Hahn; CHECK-NEXT: br i1 [[C_1:%.*]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]] 80469f0fc6SFlorian Hahn; CHECK: entry.split.us: 81469f0fc6SFlorian Hahn; CHECK-NEXT: br label [[OUTER_US:%.*]] 82469f0fc6SFlorian Hahn; CHECK: outer.us: 83469f0fc6SFlorian Hahn; CHECK-NEXT: br label [[INNER_PREHEADER_US:%.*]] 84469f0fc6SFlorian Hahn; CHECK: inner.us: 85469f0fc6SFlorian Hahn; CHECK-NEXT: [[C_2_US:%.*]] = icmp eq i16 0, [[CALL]] 86469f0fc6SFlorian Hahn; CHECK-NEXT: br i1 [[C_2_US]], label [[OUTER_LOOPEXIT_US:%.*]], label [[INNER_US:%.*]] 87469f0fc6SFlorian Hahn; CHECK: inner.preheader.us: 88469f0fc6SFlorian Hahn; CHECK-NEXT: br label [[INNER_US]] 89469f0fc6SFlorian Hahn; CHECK: outer.loopexit.us: 90469f0fc6SFlorian Hahn; CHECK-NEXT: br label [[OUTER_BACKEDGE_US:%.*]] 91469f0fc6SFlorian Hahn; CHECK: outer.backedge.us: 92469f0fc6SFlorian Hahn; CHECK-NEXT: br label [[OUTER_US]] 93469f0fc6SFlorian Hahn; CHECK: entry.split: 94469f0fc6SFlorian Hahn; CHECK-NEXT: br label [[OUTER:%.*]] 95469f0fc6SFlorian Hahn; CHECK: outer: 96469f0fc6SFlorian Hahn; CHECK-NEXT: br label [[OUTER_BACKEDGE:%.*]] 97469f0fc6SFlorian Hahn; CHECK: outer.backedge: 98469f0fc6SFlorian Hahn; CHECK-NEXT: br label [[OUTER]] 99469f0fc6SFlorian Hahn; 100469f0fc6SFlorian Hahnentry: 101469f0fc6SFlorian Hahn %call = tail call i16 @bar() 102469f0fc6SFlorian Hahn br label %outer 103469f0fc6SFlorian Hahn 104469f0fc6SFlorian Hahnouter: 105469f0fc6SFlorian Hahn br i1 %c.1, label %inner, label %outer 106469f0fc6SFlorian Hahn 107469f0fc6SFlorian Hahninner: 108469f0fc6SFlorian Hahn %c.2 = icmp eq i16 0, %call 109469f0fc6SFlorian Hahn br i1 %c.2, label %outer, label %inner 110469f0fc6SFlorian Hahn} 111469f0fc6SFlorian Hahn 112469f0fc6SFlorian Hahndeclare i16 @bar() 113*a41cb8bfSFlorian Hahn 114*a41cb8bfSFlorian Hahndefine void @pr58751(i16 %a, ptr %dst) { 115*a41cb8bfSFlorian Hahnentry: 116*a41cb8bfSFlorian Hahn %c.1 = icmp eq i16 %a, 0 117*a41cb8bfSFlorian Hahn br label %outer.header 118*a41cb8bfSFlorian Hahn 119*a41cb8bfSFlorian Hahnouter.header: 120*a41cb8bfSFlorian Hahn %outer.iv = phi i16 [ %a, %entry ], [ %outer.iv.next, %outer.latch ] 121*a41cb8bfSFlorian Hahn br label %inner.header 122*a41cb8bfSFlorian Hahn 123*a41cb8bfSFlorian Hahninner.header: 124*a41cb8bfSFlorian Hahn %inner.iv = phi i16 [ %outer.iv, %outer.header ], [ %inner.iv.next, %inner.latch ] 125*a41cb8bfSFlorian Hahn br i1 %c.1, label %outer.latch, label %inner.latch 126*a41cb8bfSFlorian Hahn 127*a41cb8bfSFlorian Hahninner.latch: 128*a41cb8bfSFlorian Hahn %inner.iv.next = add nsw i16 %inner.iv, 1 129*a41cb8bfSFlorian Hahn store i16 %inner.iv.next, ptr %dst, align 1 130*a41cb8bfSFlorian Hahn %c.2 = icmp eq i16 %inner.iv.next, 0 131*a41cb8bfSFlorian Hahn br i1 %c.2, label %exit, label %inner.header 132*a41cb8bfSFlorian Hahn 133*a41cb8bfSFlorian Hahnouter.latch: 134*a41cb8bfSFlorian Hahn %outer.iv.next = add nsw i16 %outer.iv, 1 135*a41cb8bfSFlorian Hahn br label %outer.header 136*a41cb8bfSFlorian Hahn 137*a41cb8bfSFlorian Hahnexit: 138*a41cb8bfSFlorian Hahn ret void 139*a41cb8bfSFlorian Hahn} 140*a41cb8bfSFlorian Hahn 141