216 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-linux | 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: # %bb.0: # %entry8; CHECK-NEXT: addq $-4, %rdi9; CHECK-NEXT: .p2align 410; CHECK-NEXT: .LBB0_1: # %loop11; CHECK-NEXT: # =>This Inner Loop Header: Depth=112; CHECK-NEXT: subq $1, %rsi13; CHECK-NEXT: jb .LBB0_414; CHECK-NEXT: # %bb.2: # %backedge15; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=116; CHECK-NEXT: cmpl %edx, (%rdi)17; CHECK-NEXT: leaq 4(%rdi), %rdi18; CHECK-NEXT: jne .LBB0_119; CHECK-NEXT: # %bb.3: # %failure20; CHECK-NEXT: .LBB0_4: # %exit21; CHECK-NEXT: movl $-1, %eax22; CHECK-NEXT: retq23entry:24 %scevgep = getelementptr i32, ptr %p, i64 -125 br label %loop26 27loop: ; preds = %backedge, %entry28 %iv = phi i64 [ %iv.next, %backedge ], [ 0, %entry ]29 %iv.next = add i64 %iv, 130 %cond_1 = icmp eq i64 %iv, %len31 br i1 %cond_1, label %exit, label %backedge32 33backedge: ; preds = %loop34 %scevgep1 = getelementptr i32, ptr %scevgep, i64 %iv35 %loaded = load atomic i32, ptr %scevgep1 unordered, align 436 %cond_2 = icmp eq i32 %loaded, %x37 br i1 %cond_2, label %failure, label %loop38 39exit: ; preds = %loop40 ret i32 -141 42failure: ; preds = %backedge43 unreachable44}45 46; nsw flag, same type width.47define i32 @test_02(ptr %p, i64 %len, i32 %x) {48; CHECK-LABEL: test_02:49; CHECK: # %bb.0: # %entry50; CHECK-NEXT: addq $-4, %rdi51; CHECK-NEXT: .p2align 452; CHECK-NEXT: .LBB1_1: # %loop53; CHECK-NEXT: # =>This Inner Loop Header: Depth=154; CHECK-NEXT: subq $1, %rsi55; CHECK-NEXT: jb .LBB1_456; CHECK-NEXT: # %bb.2: # %backedge57; CHECK-NEXT: # in Loop: Header=BB1_1 Depth=158; CHECK-NEXT: cmpl %edx, (%rdi)59; CHECK-NEXT: leaq 4(%rdi), %rdi60; CHECK-NEXT: jne .LBB1_161; CHECK-NEXT: # %bb.3: # %failure62; CHECK-NEXT: .LBB1_4: # %exit63; CHECK-NEXT: movl $-1, %eax64; CHECK-NEXT: retq65entry:66 %scevgep = getelementptr i32, ptr %p, i64 -167 br label %loop68 69loop: ; preds = %backedge, %entry70 %iv = phi i64 [ %iv.next, %backedge ], [ 0, %entry ]71 %iv.next = add nsw i64 %iv, 172 %cond_1 = icmp eq i64 %iv, %len73 br i1 %cond_1, label %exit, label %backedge74 75backedge: ; preds = %loop76 %scevgep1 = getelementptr i32, ptr %scevgep, i64 %iv77 %loaded = load atomic i32, ptr %scevgep1 unordered, align 478 %cond_2 = icmp eq i32 %loaded, %x79 br i1 %cond_2, label %failure, label %loop80 81exit: ; preds = %loop82 ret i32 -183 84failure: ; preds = %backedge85 unreachable86}87 88; nsw flag, optimization is possible because memory instruction is dominated by loop-exiting check against iv.next.89define i32 @test_02_nopoison(ptr %p, i64 %len, i32 %x) {90; CHECK-LABEL: test_02_nopoison:91; CHECK: # %bb.0: # %entry92; CHECK-NEXT: addq $-4, %rdi93; CHECK-NEXT: .p2align 494; CHECK-NEXT: .LBB2_1: # %loop95; CHECK-NEXT: # =>This Inner Loop Header: Depth=196; CHECK-NEXT: subq $1, %rsi97; CHECK-NEXT: jb .LBB2_498; CHECK-NEXT: # %bb.2: # %backedge99; CHECK-NEXT: # in Loop: Header=BB2_1 Depth=1100; CHECK-NEXT: cmpl %edx, (%rdi)101; CHECK-NEXT: leaq 4(%rdi), %rdi102; CHECK-NEXT: jne .LBB2_1103; CHECK-NEXT: # %bb.3: # %failure104; CHECK-NEXT: .LBB2_4: # %exit105; CHECK-NEXT: movl $-1, %eax106; CHECK-NEXT: retq107entry:108 %len.plus.1 = add i64 %len, 1109 %scevgep = getelementptr i32, ptr %p, i64 -1110 br label %loop111 112loop: ; preds = %backedge, %entry113 %iv = phi i64 [ %iv.next, %backedge ], [ 0, %entry ]114 %iv.next = add nsw i64 %iv, 1115 %cond_1 = icmp eq i64 %iv.next, %len.plus.1116 br i1 %cond_1, label %exit, label %backedge117 118backedge: ; preds = %loop119 %scevgep1 = getelementptr i32, ptr %scevgep, i64 %iv120 %loaded = load atomic i32, ptr %scevgep1 unordered, align 4121 %cond_2 = icmp eq i32 %loaded, %x122 br i1 %cond_2, label %failure, label %loop123 124exit: ; preds = %loop125 ret i32 -1126 127failure: ; preds = %backedge128 unreachable129}130 131 132; nuw flag, same type width.133define i32 @test_03(ptr %p, i64 %len, i32 %x) {134; CHECK-LABEL: test_03:135; CHECK: # %bb.0: # %entry136; CHECK-NEXT: addq $-4, %rdi137; CHECK-NEXT: .p2align 4138; CHECK-NEXT: .LBB3_1: # %loop139; CHECK-NEXT: # =>This Inner Loop Header: Depth=1140; CHECK-NEXT: subq $1, %rsi141; CHECK-NEXT: jb .LBB3_4142; CHECK-NEXT: # %bb.2: # %backedge143; CHECK-NEXT: # in Loop: Header=BB3_1 Depth=1144; CHECK-NEXT: cmpl %edx, (%rdi)145; CHECK-NEXT: leaq 4(%rdi), %rdi146; CHECK-NEXT: jne .LBB3_1147; CHECK-NEXT: # %bb.3: # %failure148; CHECK-NEXT: .LBB3_4: # %exit149; CHECK-NEXT: movl $-1, %eax150; CHECK-NEXT: retq151entry:152 %scevgep = getelementptr i32, ptr %p, i64 -1153 br label %loop154 155loop: ; preds = %backedge, %entry156 %iv = phi i64 [ %iv.next, %backedge ], [ 0, %entry ]157 %iv.next = add nuw i64 %iv, 1158 %cond_1 = icmp eq i64 %iv, %len159 br i1 %cond_1, label %exit, label %backedge160 161backedge: ; preds = %loop162 %scevgep1 = getelementptr i32, ptr %scevgep, i64 %iv163 %loaded = load atomic i32, ptr %scevgep1 unordered, align 4164 %cond_2 = icmp eq i32 %loaded, %x165 br i1 %cond_2, label %failure, label %loop166 167exit: ; preds = %loop168 ret i32 -1169 170failure: ; preds = %backedge171 unreachable172}173 174; nuw flag, optimization is possible because memory instruction is dominated by loop-exiting check against iv.next.175define i32 @test_03_nopoison(ptr %p, i64 %len, i32 %x) {176; CHECK-LABEL: test_03_nopoison:177; CHECK: # %bb.0: # %entry178; CHECK-NEXT: addq $-4, %rdi179; CHECK-NEXT: .p2align 4180; CHECK-NEXT: .LBB4_1: # %loop181; CHECK-NEXT: # =>This Inner Loop Header: Depth=1182; CHECK-NEXT: subq $1, %rsi183; CHECK-NEXT: jb .LBB4_4184; CHECK-NEXT: # %bb.2: # %backedge185; CHECK-NEXT: # in Loop: Header=BB4_1 Depth=1186; CHECK-NEXT: cmpl %edx, (%rdi)187; CHECK-NEXT: leaq 4(%rdi), %rdi188; CHECK-NEXT: jne .LBB4_1189; CHECK-NEXT: # %bb.3: # %failure190; CHECK-NEXT: .LBB4_4: # %exit191; CHECK-NEXT: movl $-1, %eax192; CHECK-NEXT: retq193entry:194 %len.plus.1 = add i64 %len, 1195 %scevgep = getelementptr i32, ptr %p, i64 -1196 br label %loop197 198loop: ; preds = %backedge, %entry199 %iv = phi i64 [ %iv.next, %backedge ], [ 0, %entry ]200 %iv.next = add nuw i64 %iv, 1201 %cond_1 = icmp eq i64 %iv.next, %len.plus.1202 br i1 %cond_1, label %exit, label %backedge203 204backedge: ; preds = %loop205 %scevgep1 = getelementptr i32, ptr %scevgep, i64 %iv206 %loaded = load atomic i32, ptr %scevgep1 unordered, align 4207 %cond_2 = icmp eq i32 %loaded, %x208 br i1 %cond_2, label %failure, label %loop209 210exit: ; preds = %loop211 ret i32 -1212 213failure: ; preds = %backedge214 unreachable215}216