brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.4 KiB · e6b53f2 Raw
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