brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.7 KiB · eda54d9 Raw
225 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 42; RUN: opt -passes='default<O2>' -S %s | FileCheck %s3 4target triple = "arm64-apple-macosx"5 6; A set of test cases where early sinking prevents if-conversion.7 8%struct.Tree = type { ptr, ptr, i32 }9%struct.Node = type { i32, i32, i32 }10 11define void @test_find_min(ptr noundef nonnull align 8 dereferenceable(24) %this) {12; CHECK-LABEL: define void @test_find_min(13; CHECK-SAME: ptr noundef nonnull align 8 captures(none) dereferenceable(24) [[THIS:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {14; CHECK-NEXT:  entry:15; CHECK-NEXT:    [[NUM_:%.*]] = getelementptr inbounds nuw i8, ptr [[THIS]], i64 1616; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[NUM_]], align 817; CHECK-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[THIS]], align 818; CHECK-NEXT:    [[CMP8:%.*]] = icmp sgt i32 [[TMP0]], 019; CHECK-NEXT:    br i1 [[CMP8]], label [[FOR_BODY_LR_PH:%.*]], label [[FOR_END:%.*]]20; CHECK:       for.body.lr.ph:21; CHECK-NEXT:    [[ARRAY_:%.*]] = getelementptr inbounds nuw i8, ptr [[THIS]], i64 822; CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[ARRAY_]], align 823; CHECK-NEXT:    [[WIDE_TRIP_COUNT:%.*]] = zext nneg i32 [[TMP0]] to i6424; CHECK-NEXT:    br label [[FOR_BODY:%.*]]25; CHECK:       for.body:26; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[FOR_BODY_LR_PH]] ], [ [[INDVARS_IV_NEXT:%.*]], [[COND_END7:%.*]] ]27; CHECK-NEXT:    [[MIN_010:%.*]] = phi ptr [ [[TMP1]], [[FOR_BODY_LR_PH]] ], [ [[COND8:%.*]], [[COND_END7]] ]28; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds nuw ptr, ptr [[TMP2]], i64 [[INDVARS_IV]]29; CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[ARRAYIDX]], align 830; CHECK-NEXT:    [[CMP3:%.*]] = icmp eq ptr [[MIN_010]], null31; CHECK-NEXT:    br i1 [[CMP3]], label [[COND_END7]], label [[COND_FALSE:%.*]]32; CHECK:       cond.false:33; CHECK-NEXT:    [[KEY2:%.*]] = getelementptr inbounds nuw i8, ptr [[MIN_010]], i64 434; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr [[KEY2]], align 435; CHECK-NEXT:    [[KEY:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP3]], i64 436; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[KEY]], align 437; CHECK-NEXT:    [[CMP4:%.*]] = icmp slt i32 [[TMP5]], [[TMP4]]38; CHECK-NEXT:    [[COND:%.*]] = select i1 [[CMP4]], ptr [[TMP3]], ptr [[MIN_010]]39; CHECK-NEXT:    br label [[COND_END7]]40; CHECK:       cond.end7:41; CHECK-NEXT:    [[COND8]] = phi ptr [ [[COND]], [[COND_FALSE]] ], [ [[TMP3]], [[FOR_BODY]] ]42; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 143; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[WIDE_TRIP_COUNT]]44; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_END]], label [[FOR_BODY]]45; CHECK:       for.end:46; CHECK-NEXT:    [[MIN_0_LCSSA:%.*]] = phi ptr [ [[TMP1]], [[ENTRY:%.*]] ], [ [[COND8]], [[COND_END7]] ]47; CHECK-NEXT:    store ptr [[MIN_0_LCSSA]], ptr [[THIS]], align 848; CHECK-NEXT:    ret void49;50entry:51  %this.addr = alloca ptr, align 852  %num = alloca i32, align 453  %min = alloca ptr, align 854  %i = alloca i32, align 455  %x = alloca ptr, align 856  %xkey = alloca i32, align 457  %minkey = alloca i32, align 458  store ptr %this, ptr %this.addr, align 859  %this1 = load ptr, ptr %this.addr, align 860  %num_ = getelementptr inbounds %struct.Tree, ptr %this1, i32 0, i32 261  %0 = load i32, ptr %num_, align 862  store i32 %0, ptr %num, align 463  %min_ = getelementptr inbounds %struct.Tree, ptr %this1, i32 0, i32 064  %1 = load ptr, ptr %min_, align 865  store ptr %1, ptr %min, align 866  store i32 0, ptr %i, align 467  br label %for.cond68 69for.cond:                                         ; preds = %for.inc, %entry70  %2 = load i32, ptr %i, align 471  %3 = load i32, ptr %num, align 472  %cmp = icmp slt i32 %2, %373  br i1 %cmp, label %for.body, label %for.cond.cleanup74 75for.cond.cleanup:                                 ; preds = %for.cond76  br label %for.end77 78for.body:                                         ; preds = %for.cond79  %array_ = getelementptr inbounds %struct.Tree, ptr %this1, i32 0, i32 180  %4 = load ptr, ptr %array_, align 881  %5 = load i32, ptr %i, align 482  %idxprom = sext i32 %5 to i6483  %arrayidx = getelementptr inbounds ptr, ptr %4, i64 %idxprom84  %6 = load ptr, ptr %arrayidx, align 885  store ptr %6, ptr %x, align 886  %7 = load ptr, ptr %x, align 887  %key = getelementptr inbounds %struct.Node, ptr %7, i32 0, i32 188  %8 = load i32, ptr %key, align 489  store i32 %8, ptr %xkey, align 490  %9 = load ptr, ptr %min, align 891  %key2 = getelementptr inbounds %struct.Node, ptr %9, i32 0, i32 192  %10 = load i32, ptr %key2, align 493  store i32 %10, ptr %minkey, align 494  %11 = load ptr, ptr %min, align 895  %cmp3 = icmp eq ptr %11, null96  br i1 %cmp3, label %cond.true, label %cond.false97 98cond.true:                                        ; preds = %for.body99  %12 = load ptr, ptr %x, align 8100  br label %cond.end7101 102cond.false:                                       ; preds = %for.body103  %13 = load i32, ptr %xkey, align 4104  %14 = load i32, ptr %minkey, align 4105  %cmp4 = icmp slt i32 %13, %14106  br i1 %cmp4, label %cond.true5, label %cond.false6107 108cond.true5:                                       ; preds = %cond.false109  %15 = load ptr, ptr %x, align 8110  br label %cond.end111 112cond.false6:                                      ; preds = %cond.false113  %16 = load ptr, ptr %min, align 8114  br label %cond.end115 116cond.end:                                         ; preds = %cond.false6, %cond.true5117  %cond = phi ptr [ %15, %cond.true5 ], [ %16, %cond.false6 ]118  br label %cond.end7119 120cond.end7:                                        ; preds = %cond.end, %cond.true121  %cond8 = phi ptr [ %12, %cond.true ], [ %cond, %cond.end ]122  store ptr %cond8, ptr %min, align 8123  br label %for.inc124 125for.inc:                                          ; preds = %cond.end7126  %17 = load i32, ptr %i, align 4127  %inc = add nsw i32 %17, 1128  store i32 %inc, ptr %i, align 4129  br label %for.cond130 131for.end:                                          ; preds = %for.cond.cleanup132  %18 = load ptr, ptr %min, align 8133  %min_9 = getelementptr inbounds %struct.Tree, ptr %this1, i32 0, i32 0134  store ptr %18, ptr %min_9, align 8135  ret void136}137 138 139define void @cond_select_loop(ptr noalias nocapture noundef readonly %a, ptr noalias nocapture noundef readonly %b, ptr noalias nocapture noundef writeonly %c) {140; CHECK-LABEL: define void @cond_select_loop(141; CHECK-SAME: ptr noalias noundef readonly captures(none) [[A:%.*]], ptr noalias noundef readonly captures(none) [[B:%.*]], ptr noalias noundef writeonly captures(none) [[C:%.*]]) local_unnamed_addr #[[ATTR1:[0-9]+]] {142; CHECK-NEXT:  entry:143; CHECK-NEXT:    br label [[FOR_BODY:%.*]]144; CHECK:       for.body:145; CHECK-NEXT:    [[I_07:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[COND_END:%.*]] ]146; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds nuw float, ptr [[A]], i64 [[I_07]]147; CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[ARRAYIDX1]], align 4148; CHECK-NEXT:    [[CMP2:%.*]] = fcmp ogt float [[TMP0]], 0.000000e+00149; CHECK-NEXT:    br i1 [[CMP2]], label [[COND_END]], label [[COND_FALSE:%.*]]150; CHECK:       cond.false:151; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds nuw float, ptr [[B]], i64 [[I_07]]152; CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[ARRAYIDX]], align 4153; CHECK-NEXT:    br label [[COND_END]]154; CHECK:       cond.end:155; CHECK-NEXT:    [[COND:%.*]] = phi float [ [[TMP1]], [[COND_FALSE]] ], [ [[TMP0]], [[FOR_BODY]] ]156; CHECK-NEXT:    [[ARRAYIDX4:%.*]] = getelementptr inbounds nuw float, ptr [[C]], i64 [[I_07]]157; CHECK-NEXT:    store float [[COND]], ptr [[ARRAYIDX4]], align 4158; CHECK-NEXT:    [[INC]] = add nuw nsw i64 [[I_07]], 1159; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INC]], 1000160; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_END:%.*]], label [[FOR_BODY]]161; CHECK:       for.end:162; CHECK-NEXT:    ret void163;164entry:165  %a.addr = alloca ptr, align 8166  %b.addr = alloca ptr, align 8167  %c.addr = alloca ptr, align 8168  %i = alloca i64, align 8169  %_b = alloca float, align 4170  store ptr %a, ptr %a.addr, align 8171  store ptr %b, ptr %b.addr, align 8172  store ptr %c, ptr %c.addr, align 8173  store i64 0, ptr %i, align 8174  br label %for.cond175 176for.cond:                                         ; preds = %for.inc, %entry177  %0 = load i64, ptr %i, align 8178  %cmp = icmp ult i64 %0, 1000179  br i1 %cmp, label %for.body, label %for.cond.cleanup180 181for.cond.cleanup:                                 ; preds = %for.cond182  br label %for.end183 184for.body:                                         ; preds = %for.cond185  %1 = load ptr, ptr %b.addr, align 8186  %2 = load i64, ptr %i, align 8187  %arrayidx = getelementptr inbounds float, ptr %1, i64 %2188  %3 = load float, ptr %arrayidx, align 4189  store float %3, ptr %_b, align 4190  %4 = load ptr, ptr %a.addr, align 8191  %5 = load i64, ptr %i, align 8192  %arrayidx1 = getelementptr inbounds float, ptr %4, i64 %5193  %6 = load float, ptr %arrayidx1, align 4194  %cmp2 = fcmp ogt float %6, 0.000000e+00195  br i1 %cmp2, label %cond.true, label %cond.false196 197cond.true:                                        ; preds = %for.body198  %7 = load ptr, ptr %a.addr, align 8199  %8 = load i64, ptr %i, align 8200  %arrayidx3 = getelementptr inbounds float, ptr %7, i64 %8201  %9 = load float, ptr %arrayidx3, align 4202  br label %cond.end203 204cond.false:                                       ; preds = %for.body205  %10 = load float, ptr %_b, align 4206  br label %cond.end207 208cond.end:                                         ; preds = %cond.false, %cond.true209  %cond = phi float [ %9, %cond.true ], [ %10, %cond.false ]210  %11 = load ptr, ptr %c.addr, align 8211  %12 = load i64, ptr %i, align 8212  %arrayidx4 = getelementptr inbounds float, ptr %11, i64 %12213  store float %cond, ptr %arrayidx4, align 4214  br label %for.inc215 216for.inc:                                          ; preds = %cond.end217  %13 = load i64, ptr %i, align 8218  %inc = add i64 %13, 1219  store i64 %inc, ptr %i, align 8220  br label %for.cond221 222for.end:223  ret void224}225