16c097f73SMax Kazantsev; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*e7f4ad13SNikita Popov; RUN: opt < %s -loop-reduce -S | FileCheck %s 338f28f46SYvan Roux; REQUIRES: x86-registered-target 46c097f73SMax Kazantsev 56c097f73SMax Kazantsevtarget datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128-ni:1-p2:32:8:8:32-ni:2" 66c097f73SMax Kazantsevtarget triple = "x86_64-unknown-linux-gnu" 76c097f73SMax Kazantsev 86c097f73SMax Kazantsev; FIXME: iv.next is supposed to be inserted in the backedge. 9*e7f4ad13SNikita Popovdefine i32 @test_01(ptr %p, i64 %len, i32 %x) { 106c097f73SMax Kazantsev; CHECK-LABEL: @test_01( 116c097f73SMax Kazantsev; CHECK-NEXT: entry: 12*e7f4ad13SNikita Popov; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 -4 136c097f73SMax Kazantsev; CHECK-NEXT: br label [[LOOP:%.*]] 146c097f73SMax Kazantsev; CHECK: loop: 156c097f73SMax Kazantsev; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ [[LEN:%.*]], [[ENTRY:%.*]] ] 166c097f73SMax Kazantsev; CHECK-NEXT: [[COND_1:%.*]] = icmp eq i64 [[IV]], 0 176c097f73SMax Kazantsev; CHECK-NEXT: br i1 [[COND_1]], label [[EXIT:%.*]], label [[BACKEDGE]] 186c097f73SMax Kazantsev; CHECK: backedge: 19*e7f4ad13SNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = shl i64 [[IV]], 2 20*e7f4ad13SNikita Popov; CHECK-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[SCEVGEP]], i64 [[TMP0]] 21*e7f4ad13SNikita Popov; CHECK-NEXT: [[LOADED:%.*]] = load atomic i32, ptr [[SCEVGEP1]] unordered, align 4 226c097f73SMax Kazantsev; CHECK-NEXT: [[COND_2:%.*]] = icmp eq i32 [[LOADED]], [[X:%.*]] 2380511565SPhilip Reames; CHECK-NEXT: [[IV_NEXT]] = add nsw i64 [[IV]], -1 246c097f73SMax Kazantsev; CHECK-NEXT: br i1 [[COND_2]], label [[FAILURE:%.*]], label [[LOOP]] 256c097f73SMax Kazantsev; CHECK: exit: 266c097f73SMax Kazantsev; CHECK-NEXT: ret i32 -1 276c097f73SMax Kazantsev; CHECK: failure: 286c097f73SMax Kazantsev; CHECK-NEXT: unreachable 296c097f73SMax Kazantsev; 306c097f73SMax Kazantseventry: 316c097f73SMax Kazantsev br label %loop 326c097f73SMax Kazantsev 336c097f73SMax Kazantsevloop: ; preds = %backedge, %entry 346c097f73SMax Kazantsev %iv = phi i64 [ %iv.next, %backedge ], [ %len, %entry ] 356c097f73SMax Kazantsev %iv.next = add nsw i64 %iv, -1 366c097f73SMax Kazantsev %cond_1 = icmp eq i64 %iv, 0 376c097f73SMax Kazantsev br i1 %cond_1, label %exit, label %backedge 386c097f73SMax Kazantsev 396c097f73SMax Kazantsevbackedge: ; preds = %loop 40*e7f4ad13SNikita Popov %addr = getelementptr inbounds i32, ptr %p, i64 %iv.next 41*e7f4ad13SNikita Popov %loaded = load atomic i32, ptr %addr unordered, align 4 426c097f73SMax Kazantsev %cond_2 = icmp eq i32 %loaded, %x 436c097f73SMax Kazantsev br i1 %cond_2, label %failure, label %loop 446c097f73SMax Kazantsev 456c097f73SMax Kazantsevexit: ; preds = %loop 466c097f73SMax Kazantsev ret i32 -1 476c097f73SMax Kazantsev 486c097f73SMax Kazantsevfailure: ; preds = %backedge 496c097f73SMax Kazantsev unreachable 506c097f73SMax Kazantsev} 516c097f73SMax Kazantsev 52*e7f4ad13SNikita Popovdefine i32 @test_02(ptr %p, i64 %len, i32 %x) { 536c097f73SMax Kazantsev; CHECK-LABEL: @test_02( 546c097f73SMax Kazantsev; CHECK-NEXT: entry: 55*e7f4ad13SNikita Popov; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 -4 566c097f73SMax Kazantsev; CHECK-NEXT: br label [[LOOP:%.*]] 576c097f73SMax Kazantsev; CHECK: loop: 586c097f73SMax Kazantsev; CHECK-NEXT: [[LSR_IV:%.*]] = phi i64 [ [[LSR_IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ [[LEN:%.*]], [[ENTRY:%.*]] ] 596c097f73SMax Kazantsev; CHECK-NEXT: [[COND_1:%.*]] = icmp eq i64 [[LSR_IV]], 0 606c097f73SMax Kazantsev; CHECK-NEXT: br i1 [[COND_1]], label [[EXIT:%.*]], label [[BACKEDGE]] 616c097f73SMax Kazantsev; CHECK: backedge: 62*e7f4ad13SNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = shl i64 [[LSR_IV]], 2 63*e7f4ad13SNikita Popov; CHECK-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[SCEVGEP]], i64 [[TMP0]] 64*e7f4ad13SNikita Popov; CHECK-NEXT: [[LOADED:%.*]] = load atomic i32, ptr [[SCEVGEP1]] unordered, align 4 656c097f73SMax Kazantsev; CHECK-NEXT: [[COND_2:%.*]] = icmp eq i32 [[LOADED]], [[X:%.*]] 666c097f73SMax Kazantsev; CHECK-NEXT: [[LSR_IV_NEXT]] = add i64 [[LSR_IV]], -1 676c097f73SMax Kazantsev; CHECK-NEXT: br i1 [[COND_2]], label [[FAILURE:%.*]], label [[LOOP]] 686c097f73SMax Kazantsev; CHECK: exit: 696c097f73SMax Kazantsev; CHECK-NEXT: ret i32 -1 706c097f73SMax Kazantsev; CHECK: failure: 716c097f73SMax Kazantsev; CHECK-NEXT: unreachable 726c097f73SMax Kazantsev; 736c097f73SMax Kazantseventry: 746c097f73SMax Kazantsev %start = add i64 %len, -1 756c097f73SMax Kazantsev br label %loop 766c097f73SMax Kazantsev 776c097f73SMax Kazantsevloop: ; preds = %backedge, %entry 786c097f73SMax Kazantsev %iv = phi i64 [ %iv.next, %backedge ], [ %start, %entry ] 796c097f73SMax Kazantsev %iv.next = add nsw i64 %iv, -1 806c097f73SMax Kazantsev %iv.offset = add i64 %iv, 1 816c097f73SMax Kazantsev %iv.next.offset = add i64 %iv.next, 1 826c097f73SMax Kazantsev %cond_1 = icmp eq i64 %iv.offset, 0 836c097f73SMax Kazantsev br i1 %cond_1, label %exit, label %backedge 846c097f73SMax Kazantsev 856c097f73SMax Kazantsevbackedge: ; preds = %loop 86*e7f4ad13SNikita Popov %addr = getelementptr inbounds i32, ptr %p, i64 %iv.next.offset 87*e7f4ad13SNikita Popov %loaded = load atomic i32, ptr %addr unordered, align 4 886c097f73SMax Kazantsev %cond_2 = icmp eq i32 %loaded, %x 896c097f73SMax Kazantsev br i1 %cond_2, label %failure, label %loop 906c097f73SMax Kazantsev 916c097f73SMax Kazantsevexit: ; preds = %loop 926c097f73SMax Kazantsev ret i32 -1 936c097f73SMax Kazantsev 946c097f73SMax Kazantsevfailure: ; preds = %backedge 956c097f73SMax Kazantsev unreachable 966c097f73SMax Kazantsev} 976c097f73SMax Kazantsev 98*e7f4ad13SNikita Popovdefine i32 @test_03(ptr %p, i64 %len, i32 %x) { 996c097f73SMax Kazantsev; CHECK-LABEL: @test_03( 1006c097f73SMax Kazantsev; CHECK-NEXT: entry: 101*e7f4ad13SNikita Popov; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 -4 1026c097f73SMax Kazantsev; CHECK-NEXT: br label [[LOOP:%.*]] 1036c097f73SMax Kazantsev; CHECK: loop: 1046c097f73SMax Kazantsev; CHECK-NEXT: [[LSR_IV:%.*]] = phi i64 [ [[LSR_IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ [[LEN:%.*]], [[ENTRY:%.*]] ] 1056c097f73SMax Kazantsev; CHECK-NEXT: [[COND_1:%.*]] = icmp eq i64 [[LSR_IV]], 0 1066c097f73SMax Kazantsev; CHECK-NEXT: br i1 [[COND_1]], label [[EXIT:%.*]], label [[BACKEDGE]] 1076c097f73SMax Kazantsev; CHECK: backedge: 108*e7f4ad13SNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = shl i64 [[LSR_IV]], 2 109*e7f4ad13SNikita Popov; CHECK-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[SCEVGEP]], i64 [[TMP0]] 110*e7f4ad13SNikita Popov; CHECK-NEXT: [[LOADED:%.*]] = load atomic i32, ptr [[SCEVGEP1]] unordered, align 4 1116c097f73SMax Kazantsev; CHECK-NEXT: [[COND_2:%.*]] = icmp eq i32 [[LOADED]], [[X:%.*]] 1126c097f73SMax Kazantsev; CHECK-NEXT: [[LSR_IV_NEXT]] = add i64 [[LSR_IV]], -1 1136c097f73SMax Kazantsev; CHECK-NEXT: br i1 [[COND_2]], label [[FAILURE:%.*]], label [[LOOP]] 1146c097f73SMax Kazantsev; CHECK: exit: 1156c097f73SMax Kazantsev; CHECK-NEXT: ret i32 -1 1166c097f73SMax Kazantsev; CHECK: failure: 1176c097f73SMax Kazantsev; CHECK-NEXT: unreachable 1186c097f73SMax Kazantsev; 1196c097f73SMax Kazantseventry: 1206c097f73SMax Kazantsev %start = add i64 %len, -100 1216c097f73SMax Kazantsev br label %loop 1226c097f73SMax Kazantsev 1236c097f73SMax Kazantsevloop: ; preds = %backedge, %entry 1246c097f73SMax Kazantsev %iv = phi i64 [ %iv.next, %backedge ], [ %start, %entry ] 1256c097f73SMax Kazantsev %iv.next = add nsw i64 %iv, -1 1266c097f73SMax Kazantsev %iv.offset = add i64 %iv, 100 1276c097f73SMax Kazantsev %iv.next.offset = add i64 %iv.next, 100 1286c097f73SMax Kazantsev %cond_1 = icmp eq i64 %iv.offset, 0 1296c097f73SMax Kazantsev br i1 %cond_1, label %exit, label %backedge 1306c097f73SMax Kazantsev 1316c097f73SMax Kazantsevbackedge: ; preds = %loop 132*e7f4ad13SNikita Popov %addr = getelementptr inbounds i32, ptr %p, i64 %iv.next.offset 133*e7f4ad13SNikita Popov %loaded = load atomic i32, ptr %addr unordered, align 4 1346c097f73SMax Kazantsev %cond_2 = icmp eq i32 %loaded, %x 1356c097f73SMax Kazantsev br i1 %cond_2, label %failure, label %loop 1366c097f73SMax Kazantsev 1376c097f73SMax Kazantsevexit: ; preds = %loop 1386c097f73SMax Kazantsev ret i32 -1 1396c097f73SMax Kazantsev 1406c097f73SMax Kazantsevfailure: ; preds = %backedge 1416c097f73SMax Kazantsev unreachable 1426c097f73SMax Kazantsev} 14352745e4dSPhilip Reames 144*e7f4ad13SNikita Popovdefine i32 @test_04(ptr %p, i64 %len, i32 %x) { 14552745e4dSPhilip Reames; CHECK-LABEL: @test_04( 14652745e4dSPhilip Reames; CHECK-NEXT: entry: 147*e7f4ad13SNikita Popov; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 -4 14852745e4dSPhilip Reames; CHECK-NEXT: br label [[LOOP:%.*]] 14952745e4dSPhilip Reames; CHECK: loop: 15052745e4dSPhilip Reames; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ [[LEN:%.*]], [[ENTRY:%.*]] ] 15152745e4dSPhilip Reames; CHECK-NEXT: [[COND_1:%.*]] = icmp eq i64 [[IV]], 0 15252745e4dSPhilip Reames; CHECK-NEXT: br i1 [[COND_1]], label [[EXIT:%.*]], label [[BACKEDGE]] 15352745e4dSPhilip Reames; CHECK: backedge: 154*e7f4ad13SNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = shl i64 [[IV]], 2 155*e7f4ad13SNikita Popov; CHECK-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[SCEVGEP]], i64 [[TMP0]] 156*e7f4ad13SNikita Popov; CHECK-NEXT: [[LOADED:%.*]] = load atomic i32, ptr [[SCEVGEP1]] unordered, align 4 15752745e4dSPhilip Reames; CHECK-NEXT: [[COND_2:%.*]] = icmp eq i32 [[LOADED]], [[X:%.*]] 15880511565SPhilip Reames; CHECK-NEXT: [[IV_NEXT]] = sub i64 [[IV]], 1 15952745e4dSPhilip Reames; CHECK-NEXT: br i1 [[COND_2]], label [[FAILURE:%.*]], label [[LOOP]] 16052745e4dSPhilip Reames; CHECK: exit: 16152745e4dSPhilip Reames; CHECK-NEXT: ret i32 -1 16252745e4dSPhilip Reames; CHECK: failure: 16352745e4dSPhilip Reames; CHECK-NEXT: unreachable 16452745e4dSPhilip Reames; 16552745e4dSPhilip Reamesentry: 16652745e4dSPhilip Reames br label %loop 16752745e4dSPhilip Reames 16852745e4dSPhilip Reamesloop: ; preds = %backedge, %entry 16952745e4dSPhilip Reames %iv = phi i64 [ %iv.next, %backedge ], [ %len, %entry ] 17052745e4dSPhilip Reames %iv.next = sub i64 %iv, 1 17152745e4dSPhilip Reames %cond_1 = icmp eq i64 %iv, 0 17252745e4dSPhilip Reames br i1 %cond_1, label %exit, label %backedge 17352745e4dSPhilip Reames 17452745e4dSPhilip Reamesbackedge: ; preds = %loop 175*e7f4ad13SNikita Popov %addr = getelementptr inbounds i32, ptr %p, i64 %iv.next 176*e7f4ad13SNikita Popov %loaded = load atomic i32, ptr %addr unordered, align 4 17752745e4dSPhilip Reames %cond_2 = icmp eq i32 %loaded, %x 17852745e4dSPhilip Reames br i1 %cond_2, label %failure, label %loop 17952745e4dSPhilip Reames 18052745e4dSPhilip Reamesexit: ; preds = %loop 18152745e4dSPhilip Reames ret i32 -1 18252745e4dSPhilip Reames 18352745e4dSPhilip Reamesfailure: ; preds = %backedge 18452745e4dSPhilip Reames unreachable 18552745e4dSPhilip Reames} 18652745e4dSPhilip Reames 187*e7f4ad13SNikita Popovdefine i32 @test_05(ptr %p, i64 %len, i32 %x) { 18852745e4dSPhilip Reames; CHECK-LABEL: @test_05( 18952745e4dSPhilip Reames; CHECK-NEXT: entry: 19052745e4dSPhilip Reames; CHECK-NEXT: br label [[LOOP:%.*]] 19152745e4dSPhilip Reames; CHECK: loop: 19252745e4dSPhilip Reames; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ [[LEN:%.*]], [[ENTRY:%.*]] ] 19352745e4dSPhilip Reames; CHECK-NEXT: [[IV_NEXT]] = mul i64 [[IV]], 2 19452745e4dSPhilip Reames; CHECK-NEXT: [[COND_1:%.*]] = icmp eq i64 [[IV]], 0 19552745e4dSPhilip Reames; CHECK-NEXT: br i1 [[COND_1]], label [[EXIT:%.*]], label [[BACKEDGE]] 19652745e4dSPhilip Reames; CHECK: backedge: 197*e7f4ad13SNikita Popov; CHECK-NEXT: [[ADDR:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 [[IV_NEXT]] 198*e7f4ad13SNikita Popov; CHECK-NEXT: [[LOADED:%.*]] = load atomic i32, ptr [[ADDR]] unordered, align 4 19952745e4dSPhilip Reames; CHECK-NEXT: [[COND_2:%.*]] = icmp eq i32 [[LOADED]], [[X:%.*]] 20052745e4dSPhilip Reames; CHECK-NEXT: br i1 [[COND_2]], label [[FAILURE:%.*]], label [[LOOP]] 20152745e4dSPhilip Reames; CHECK: exit: 20252745e4dSPhilip Reames; CHECK-NEXT: ret i32 -1 20352745e4dSPhilip Reames; CHECK: failure: 20452745e4dSPhilip Reames; CHECK-NEXT: unreachable 20552745e4dSPhilip Reames; 20652745e4dSPhilip Reamesentry: 20752745e4dSPhilip Reames br label %loop 20852745e4dSPhilip Reames 20952745e4dSPhilip Reamesloop: ; preds = %backedge, %entry 21052745e4dSPhilip Reames %iv = phi i64 [ %iv.next, %backedge ], [ %len, %entry ] 21152745e4dSPhilip Reames %iv.next = mul i64 %iv, 2 21252745e4dSPhilip Reames %cond_1 = icmp eq i64 %iv, 0 21352745e4dSPhilip Reames br i1 %cond_1, label %exit, label %backedge 21452745e4dSPhilip Reames 21552745e4dSPhilip Reamesbackedge: ; preds = %loop 216*e7f4ad13SNikita Popov %addr = getelementptr inbounds i32, ptr %p, i64 %iv.next 217*e7f4ad13SNikita Popov %loaded = load atomic i32, ptr %addr unordered, align 4 21852745e4dSPhilip Reames %cond_2 = icmp eq i32 %loaded, %x 21952745e4dSPhilip Reames br i1 %cond_2, label %failure, label %loop 22052745e4dSPhilip Reames 22152745e4dSPhilip Reamesexit: ; preds = %loop 22252745e4dSPhilip Reames ret i32 -1 22352745e4dSPhilip Reames 22452745e4dSPhilip Reamesfailure: ; preds = %backedge 22552745e4dSPhilip Reames unreachable 22652745e4dSPhilip Reames} 22752745e4dSPhilip Reames 228*e7f4ad13SNikita Popovdefine i32 @test_06(ptr %p, i64 %len, i32 %x, i64 %step) { 22952745e4dSPhilip Reames; CHECK-LABEL: @test_06( 23052745e4dSPhilip Reames; CHECK-NEXT: entry: 231*e7f4ad13SNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = shl i64 [[STEP:%.*]], 2 232*e7f4ad13SNikita Popov; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[TMP0]] 23352745e4dSPhilip Reames; CHECK-NEXT: br label [[LOOP:%.*]] 23452745e4dSPhilip Reames; CHECK: loop: 23552745e4dSPhilip Reames; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ [[LEN:%.*]], [[ENTRY:%.*]] ] 23652745e4dSPhilip Reames; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], [[STEP]] 23752745e4dSPhilip Reames; CHECK-NEXT: [[COND_1:%.*]] = icmp eq i64 [[STEP]], [[IV_NEXT]] 23852745e4dSPhilip Reames; CHECK-NEXT: br i1 [[COND_1]], label [[EXIT:%.*]], label [[BACKEDGE]] 23952745e4dSPhilip Reames; CHECK: backedge: 240*e7f4ad13SNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = shl i64 [[IV]], 2 241*e7f4ad13SNikita Popov; CHECK-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[SCEVGEP]], i64 [[TMP1]] 242*e7f4ad13SNikita Popov; CHECK-NEXT: [[LOADED:%.*]] = load atomic i32, ptr [[SCEVGEP1]] unordered, align 4 24352745e4dSPhilip Reames; CHECK-NEXT: [[COND_2:%.*]] = icmp eq i32 [[LOADED]], [[X:%.*]] 24452745e4dSPhilip Reames; CHECK-NEXT: br i1 [[COND_2]], label [[FAILURE:%.*]], label [[LOOP]] 24552745e4dSPhilip Reames; CHECK: exit: 24652745e4dSPhilip Reames; CHECK-NEXT: ret i32 -1 24752745e4dSPhilip Reames; CHECK: failure: 24852745e4dSPhilip Reames; CHECK-NEXT: unreachable 24952745e4dSPhilip Reames; 25052745e4dSPhilip Reamesentry: 25152745e4dSPhilip Reames br label %loop 25252745e4dSPhilip Reames 25352745e4dSPhilip Reamesloop: ; preds = %backedge, %entry 25452745e4dSPhilip Reames %iv = phi i64 [ %iv.next, %backedge ], [ %len, %entry ] 25552745e4dSPhilip Reames %iv.next = add nsw i64 %iv, %step 25652745e4dSPhilip Reames %cond_1 = icmp eq i64 %iv, 0 25752745e4dSPhilip Reames br i1 %cond_1, label %exit, label %backedge 25852745e4dSPhilip Reames 25952745e4dSPhilip Reamesbackedge: ; preds = %loop 260*e7f4ad13SNikita Popov %addr = getelementptr inbounds i32, ptr %p, i64 %iv.next 261*e7f4ad13SNikita Popov %loaded = load atomic i32, ptr %addr unordered, align 4 26252745e4dSPhilip Reames %cond_2 = icmp eq i32 %loaded, %x 26352745e4dSPhilip Reames br i1 %cond_2, label %failure, label %loop 26452745e4dSPhilip Reames 26552745e4dSPhilip Reamesexit: ; preds = %loop 26652745e4dSPhilip Reames ret i32 -1 26752745e4dSPhilip Reames 26852745e4dSPhilip Reamesfailure: ; preds = %backedge 26952745e4dSPhilip Reames unreachable 27052745e4dSPhilip Reames} 271