233 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -mtriple=x86_64-linux -codegenprepare -S | FileCheck %s3 4; No overflow flags, same type width.5define i32 @test_01(ptr %p, i64 %len, i32 %x) {6; CHECK-LABEL: @test_01(7; CHECK-NEXT: entry:8; CHECK-NEXT: br label [[LOOP:%.*]]9; CHECK: loop:10; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ 0, [[ENTRY:%.*]] ]11; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 112; CHECK-NEXT: [[COND_1:%.*]] = icmp eq i64 [[IV]], [[LEN:%.*]]13; CHECK-NEXT: br i1 [[COND_1]], label [[EXIT:%.*]], label [[BACKEDGE]]14; CHECK: backedge:15; CHECK-NEXT: [[SUNKADDR:%.*]] = mul i64 [[IV_NEXT]], 416; CHECK-NEXT: [[SUNKADDR1:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[SUNKADDR]]17; CHECK-NEXT: [[SUNKADDR2:%.*]] = getelementptr i8, ptr [[SUNKADDR1]], i64 -818; CHECK-NEXT: [[LOADED:%.*]] = load atomic i32, ptr [[SUNKADDR2]] unordered, align 419; CHECK-NEXT: [[COND_2:%.*]] = icmp eq i32 [[LOADED]], [[X:%.*]]20; CHECK-NEXT: br i1 [[COND_2]], label [[FAILURE:%.*]], label [[LOOP]]21; CHECK: exit:22; CHECK-NEXT: ret i32 -123; CHECK: failure:24; CHECK-NEXT: unreachable25;26entry:27 %scevgep = getelementptr i32, ptr %p, i64 -128 br label %loop29 30loop: ; preds = %backedge, %entry31 %iv = phi i64 [ %iv.next, %backedge ], [ 0, %entry ]32 %iv.next = add i64 %iv, 133 %cond_1 = icmp eq i64 %iv, %len34 br i1 %cond_1, label %exit, label %backedge35 36backedge: ; preds = %loop37 %scevgep1 = getelementptr i32, ptr %scevgep, i64 %iv38 %loaded = load atomic i32, ptr %scevgep1 unordered, align 439 %cond_2 = icmp eq i32 %loaded, %x40 br i1 %cond_2, label %failure, label %loop41 42exit: ; preds = %loop43 ret i32 -144 45failure: ; preds = %backedge46 unreachable47}48 49; nsw flag, same type width.50define i32 @test_02(ptr %p, i64 %len, i32 %x) {51; CHECK-LABEL: @test_02(52; CHECK-NEXT: entry:53; CHECK-NEXT: br label [[LOOP:%.*]]54; CHECK: loop:55; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ 0, [[ENTRY:%.*]] ]56; CHECK-NEXT: [[IV_NEXT]] = add nsw i64 [[IV]], 157; CHECK-NEXT: [[COND_1:%.*]] = icmp eq i64 [[IV]], [[LEN:%.*]]58; CHECK-NEXT: br i1 [[COND_1]], label [[EXIT:%.*]], label [[BACKEDGE]]59; CHECK: backedge:60; CHECK-NEXT: [[SUNKADDR:%.*]] = mul i64 [[IV]], 461; CHECK-NEXT: [[SUNKADDR1:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[SUNKADDR]]62; CHECK-NEXT: [[SUNKADDR2:%.*]] = getelementptr i8, ptr [[SUNKADDR1]], i64 -463; CHECK-NEXT: [[LOADED:%.*]] = load atomic i32, ptr [[SUNKADDR2]] unordered, align 464; CHECK-NEXT: [[COND_2:%.*]] = icmp eq i32 [[LOADED]], [[X:%.*]]65; CHECK-NEXT: br i1 [[COND_2]], label [[FAILURE:%.*]], label [[LOOP]]66; CHECK: exit:67; CHECK-NEXT: ret i32 -168; CHECK: failure:69; CHECK-NEXT: unreachable70;71entry:72 %scevgep = getelementptr i32, ptr %p, i64 -173 br label %loop74 75loop: ; preds = %backedge, %entry76 %iv = phi i64 [ %iv.next, %backedge ], [ 0, %entry ]77 %iv.next = add nsw i64 %iv, 178 %cond_1 = icmp eq i64 %iv, %len79 br i1 %cond_1, label %exit, label %backedge80 81backedge: ; preds = %loop82 %scevgep1 = getelementptr i32, ptr %scevgep, i64 %iv83 %loaded = load atomic i32, ptr %scevgep1 unordered, align 484 %cond_2 = icmp eq i32 %loaded, %x85 br i1 %cond_2, label %failure, label %loop86 87exit: ; preds = %loop88 ret i32 -189 90failure: ; preds = %backedge91 unreachable92}93 94; nsw flag, optimization is possible because memory instruction is dominated by loop-exiting check against iv.next.95define i32 @test_02_nopoison(ptr %p, i64 %len, i32 %x) {96; CHECK-LABEL: @test_02_nopoison(97; CHECK-NEXT: entry:98; CHECK-NEXT: [[LEN_PLUS_1:%.*]] = add i64 [[LEN:%.*]], 199; CHECK-NEXT: br label [[LOOP:%.*]]100; CHECK: loop:101; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ 0, [[ENTRY:%.*]] ]102; CHECK-NEXT: [[IV_NEXT]] = add nsw i64 [[IV]], 1103; CHECK-NEXT: [[COND_1:%.*]] = icmp eq i64 [[IV_NEXT]], [[LEN_PLUS_1]]104; CHECK-NEXT: br i1 [[COND_1]], label [[EXIT:%.*]], label [[BACKEDGE]]105; CHECK: backedge:106; CHECK-NEXT: [[SUNKADDR:%.*]] = mul i64 [[IV]], 4107; CHECK-NEXT: [[SUNKADDR1:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[SUNKADDR]]108; CHECK-NEXT: [[SUNKADDR2:%.*]] = getelementptr i8, ptr [[SUNKADDR1]], i64 -4109; CHECK-NEXT: [[LOADED:%.*]] = load atomic i32, ptr [[SUNKADDR2]] unordered, align 4110; CHECK-NEXT: [[COND_2:%.*]] = icmp eq i32 [[LOADED]], [[X:%.*]]111; CHECK-NEXT: br i1 [[COND_2]], label [[FAILURE:%.*]], label [[LOOP]]112; CHECK: exit:113; CHECK-NEXT: ret i32 -1114; CHECK: failure:115; CHECK-NEXT: unreachable116;117entry:118 %len.plus.1 = add i64 %len, 1119 %scevgep = getelementptr i32, ptr %p, i64 -1120 br label %loop121 122loop: ; preds = %backedge, %entry123 %iv = phi i64 [ %iv.next, %backedge ], [ 0, %entry ]124 %iv.next = add nsw i64 %iv, 1125 %cond_1 = icmp eq i64 %iv.next, %len.plus.1126 br i1 %cond_1, label %exit, label %backedge127 128backedge: ; preds = %loop129 %scevgep1 = getelementptr i32, ptr %scevgep, i64 %iv130 %loaded = load atomic i32, ptr %scevgep1 unordered, align 4131 %cond_2 = icmp eq i32 %loaded, %x132 br i1 %cond_2, label %failure, label %loop133 134exit: ; preds = %loop135 ret i32 -1136 137failure: ; preds = %backedge138 unreachable139}140 141 142; nuw flag, same type width.143define i32 @test_03(ptr %p, i64 %len, i32 %x) {144; CHECK-LABEL: @test_03(145; CHECK-NEXT: entry:146; CHECK-NEXT: br label [[LOOP:%.*]]147; CHECK: loop:148; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ 0, [[ENTRY:%.*]] ]149; CHECK-NEXT: [[IV_NEXT]] = add nuw i64 [[IV]], 1150; CHECK-NEXT: [[COND_1:%.*]] = icmp eq i64 [[IV]], [[LEN:%.*]]151; CHECK-NEXT: br i1 [[COND_1]], label [[EXIT:%.*]], label [[BACKEDGE]]152; CHECK: backedge:153; CHECK-NEXT: [[SUNKADDR:%.*]] = mul i64 [[IV]], 4154; CHECK-NEXT: [[SUNKADDR1:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[SUNKADDR]]155; CHECK-NEXT: [[SUNKADDR2:%.*]] = getelementptr i8, ptr [[SUNKADDR1]], i64 -4156; CHECK-NEXT: [[LOADED:%.*]] = load atomic i32, ptr [[SUNKADDR2]] unordered, align 4157; CHECK-NEXT: [[COND_2:%.*]] = icmp eq i32 [[LOADED]], [[X:%.*]]158; CHECK-NEXT: br i1 [[COND_2]], label [[FAILURE:%.*]], label [[LOOP]]159; CHECK: exit:160; CHECK-NEXT: ret i32 -1161; CHECK: failure:162; CHECK-NEXT: unreachable163;164entry:165 %scevgep = getelementptr i32, ptr %p, i64 -1166 br label %loop167 168loop: ; preds = %backedge, %entry169 %iv = phi i64 [ %iv.next, %backedge ], [ 0, %entry ]170 %iv.next = add nuw i64 %iv, 1171 %cond_1 = icmp eq i64 %iv, %len172 br i1 %cond_1, label %exit, label %backedge173 174backedge: ; preds = %loop175 %scevgep1 = getelementptr i32, ptr %scevgep, i64 %iv176 %loaded = load atomic i32, ptr %scevgep1 unordered, align 4177 %cond_2 = icmp eq i32 %loaded, %x178 br i1 %cond_2, label %failure, label %loop179 180exit: ; preds = %loop181 ret i32 -1182 183failure: ; preds = %backedge184 unreachable185}186 187; nuw flag, optimization is possible because memory instruction is dominated by loop-exiting check against iv.next.188define i32 @test_03_nopoison(ptr %p, i64 %len, i32 %x) {189; CHECK-LABEL: @test_03_nopoison(190; CHECK-NEXT: entry:191; CHECK-NEXT: [[LEN_PLUS_1:%.*]] = add i64 [[LEN:%.*]], 1192; CHECK-NEXT: br label [[LOOP:%.*]]193; CHECK: loop:194; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ 0, [[ENTRY:%.*]] ]195; CHECK-NEXT: [[IV_NEXT]] = add nuw i64 [[IV]], 1196; CHECK-NEXT: [[COND_1:%.*]] = icmp eq i64 [[IV_NEXT]], [[LEN_PLUS_1]]197; CHECK-NEXT: br i1 [[COND_1]], label [[EXIT:%.*]], label [[BACKEDGE]]198; CHECK: backedge:199; CHECK-NEXT: [[SUNKADDR:%.*]] = mul i64 [[IV]], 4200; CHECK-NEXT: [[SUNKADDR1:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[SUNKADDR]]201; CHECK-NEXT: [[SUNKADDR2:%.*]] = getelementptr i8, ptr [[SUNKADDR1]], i64 -4202; CHECK-NEXT: [[LOADED:%.*]] = load atomic i32, ptr [[SUNKADDR2]] unordered, align 4203; CHECK-NEXT: [[COND_2:%.*]] = icmp eq i32 [[LOADED]], [[X:%.*]]204; CHECK-NEXT: br i1 [[COND_2]], label [[FAILURE:%.*]], label [[LOOP]]205; CHECK: exit:206; CHECK-NEXT: ret i32 -1207; CHECK: failure:208; CHECK-NEXT: unreachable209;210entry:211 %len.plus.1 = add i64 %len, 1212 %scevgep = getelementptr i32, ptr %p, i64 -1213 br label %loop214 215loop: ; preds = %backedge, %entry216 %iv = phi i64 [ %iv.next, %backedge ], [ 0, %entry ]217 %iv.next = add nuw i64 %iv, 1218 %cond_1 = icmp eq i64 %iv.next, %len.plus.1219 br i1 %cond_1, label %exit, label %backedge220 221backedge: ; preds = %loop222 %scevgep1 = getelementptr i32, ptr %scevgep, i64 %iv223 %loaded = load atomic i32, ptr %scevgep1 unordered, align 4224 %cond_2 = icmp eq i32 %loaded, %x225 br i1 %cond_2, label %failure, label %loop226 227exit: ; preds = %loop228 ret i32 -1229 230failure: ; preds = %backedge231 unreachable232}233