99 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -loop-reduce < %s | FileCheck %s3 4target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"5target triple = "x86_64-unknown-linux-gnu"6 7declare void @use(i8 zeroext)8declare void @use_p(ptr)9 10; nuw needs to be dropped when switching to post-inc comparison.11define i8 @drop_nuw() {12; CHECK-LABEL: @drop_nuw(13; CHECK-NEXT: entry:14; CHECK-NEXT: br label [[LOOP:%.*]]15; CHECK: loop:16; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]17; CHECK-NEXT: call void @use(i8 zeroext [[IV]])18; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 119; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[IV_NEXT]], 020; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]21; CHECK: exit:22; CHECK-NEXT: [[TMP0:%.*]] = add i8 [[IV_NEXT]], -123; CHECK-NEXT: ret i8 [[TMP0]]24;25entry:26 br label %loop27 28loop:29 %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop ]30 call void @use(i8 zeroext %iv)31 32 %iv.next = add nuw i8 %iv, 133 %cmp = icmp eq i8 %iv, -134 br i1 %cmp, label %exit, label %loop35 36exit:37 ret i8 %iv38}39 40; nsw needs to be dropped when switching to post-inc comparison.41define i8 @drop_nsw() {42; CHECK-LABEL: @drop_nsw(43; CHECK-NEXT: entry:44; CHECK-NEXT: br label [[LOOP:%.*]]45; CHECK: loop:46; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 127, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]47; CHECK-NEXT: call void @use(i8 zeroext [[IV]])48; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], -149; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[IV_NEXT]], 12750; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]51; CHECK: exit:52; CHECK-NEXT: [[TMP0:%.*]] = add i8 [[IV_NEXT]], 153; CHECK-NEXT: ret i8 [[TMP0]]54;55entry:56 br label %loop57 58loop:59 %iv = phi i8 [ 127, %entry ], [ %iv.next, %loop ]60 call void @use(i8 zeroext %iv)61 62 %iv.next = add nsw i8 %iv, -163 %cmp = icmp eq i8 %iv, -12864 br i1 %cmp, label %exit, label %loop65 66exit:67 ret i8 %iv68}69 70; Comparison already in post-inc form, no need to drop nuw.71define i8 @already_postinc() {72; CHECK-LABEL: @already_postinc(73; CHECK-NEXT: entry:74; CHECK-NEXT: br label [[LOOP:%.*]]75; CHECK: loop:76; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]77; CHECK-NEXT: call void @use(i8 zeroext [[IV]])78; CHECK-NEXT: [[IV_NEXT]] = add nuw i8 [[IV]], 179; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[IV_NEXT]], -180; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]81; CHECK: exit:82; CHECK-NEXT: [[TMP0:%.*]] = add i8 [[IV_NEXT]], -183; CHECK-NEXT: ret i8 [[TMP0]]84;85entry:86 br label %loop87 88loop:89 %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop ]90 call void @use(i8 zeroext %iv)91 92 %iv.next = add nuw i8 %iv, 193 %cmp = icmp eq i8 %iv.next, -194 br i1 %cmp, label %exit, label %loop95 96exit:97 ret i8 %iv98}99