brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.2 KiB · e5dd5b2 Raw
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