brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.0 KiB · 1de13eb Raw
201 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs2; RUN: opt -S -passes=verify,iroutliner -ir-outlining-no-cost < %s | FileCheck %s3 4; Here we have multiple exits, but the different sources, same outputs are5; needed, this checks that they are compressed, and moved into the appropriate6; output blocks.7 8define void @outline_outputs1() #0 {9entry:10  %output = alloca i32, align 411  %result = alloca i32, align 412  %output2 = alloca i32, align 413  %result2 = alloca i32, align 414  %a = alloca i32, align 415  %b = alloca i32, align 416  br label %block_217block_1:18  %a2 = alloca i32, align 419  %b2 = alloca i32, align 420  br label %block_221block_2:22  %a2val = load i32, ptr %a23  %b2val = load i32, ptr %b24  %add2 = add i32 2, %a2val25  %mul2 = mul i32 2, %b2val26  br label %block_527block_3:28  %aval = load i32, ptr %a29  %bval = load i32, ptr %b30  %add = add i32 2, %aval31  %mul = mul i32 2, %bval32  br label %block_433block_4:34  store i32 %add, ptr %output, align 435  store i32 %mul, ptr %result, align 436  br label %block_637block_5:38  store i32 %add2, ptr %output, align 439  store i32 %mul2, ptr %result, align 440  br label %block_741block_6:42  %div = udiv i32 %aval, %bval43  ret void44block_7:45  %sub = sub i32 %a2val, %b2val46  ret void47}48 49define void @outline_outputs2() #0 {50entry:51  %output = alloca i32, align 452  %result = alloca i32, align 453  %output2 = alloca i32, align 454  %result2 = alloca i32, align 455  %a = alloca i32, align 456  %b = alloca i32, align 457  br label %block_258block_1:59  %a2 = alloca i32, align 460  %b2 = alloca i32, align 461  br label %block_262block_2:63  %a2val = load i32, ptr %a64  %b2val = load i32, ptr %b65  %add2 = add i32 2, %a2val66  %mul2 = mul i32 2, %b2val67  br label %block_568block_3:69  %aval = load i32, ptr %a70  %bval = load i32, ptr %b71  %add = add i32 2, %aval72  %mul = mul i32 2, %bval73  br label %block_474block_4:75  store i32 %add, ptr %output, align 476  store i32 %mul, ptr %result, align 477  br label %block_778block_5:79  store i32 %add2, ptr %output, align 480  store i32 %mul2, ptr %result, align 481  br label %block_682block_6:83  %diff = sub i32 %a2val, %b2val84  ret void85block_7:86  %quot = udiv i32 %aval, %bval87  ret void88}89; CHECK-LABEL: @outline_outputs1(90; CHECK-NEXT:  entry:91; CHECK-NEXT:    [[BVAL_LOC:%.*]] = alloca i32, align 492; CHECK-NEXT:    [[AVAL_LOC:%.*]] = alloca i32, align 493; CHECK-NEXT:    [[B2VAL_LOC:%.*]] = alloca i32, align 494; CHECK-NEXT:    [[A2VAL_LOC:%.*]] = alloca i32, align 495; CHECK-NEXT:    [[OUTPUT:%.*]] = alloca i32, align 496; CHECK-NEXT:    [[RESULT:%.*]] = alloca i32, align 497; CHECK-NEXT:    [[OUTPUT2:%.*]] = alloca i32, align 498; CHECK-NEXT:    [[RESULT2:%.*]] = alloca i32, align 499; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4100; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4101; CHECK-NEXT:    br label [[BLOCK_2:%.*]]102; CHECK:       block_1:103; CHECK-NEXT:    [[A2:%.*]] = alloca i32, align 4104; CHECK-NEXT:    [[B2:%.*]] = alloca i32, align 4105; CHECK-NEXT:    br label [[BLOCK_2]]106; CHECK:       block_2:107; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[A2VAL_LOC]])108; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[B2VAL_LOC]])109; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[AVAL_LOC]])110; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[BVAL_LOC]])111; CHECK-NEXT:    [[TARGETBLOCK:%.*]] = call i1 @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[OUTPUT]], ptr [[RESULT]], ptr [[A2VAL_LOC]], ptr [[B2VAL_LOC]], ptr [[AVAL_LOC]], ptr [[BVAL_LOC]])112; CHECK-NEXT:    [[A2VAL_RELOAD:%.*]] = load i32, ptr [[A2VAL_LOC]], align 4113; CHECK-NEXT:    [[B2VAL_RELOAD:%.*]] = load i32, ptr [[B2VAL_LOC]], align 4114; CHECK-NEXT:    [[AVAL_RELOAD:%.*]] = load i32, ptr [[AVAL_LOC]], align 4115; CHECK-NEXT:    [[BVAL_RELOAD:%.*]] = load i32, ptr [[BVAL_LOC]], align 4116; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[A2VAL_LOC]])117; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[B2VAL_LOC]])118; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[AVAL_LOC]])119; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[BVAL_LOC]])120; CHECK-NEXT:    br i1 [[TARGETBLOCK]], label [[BLOCK_6:%.*]], label [[BLOCK_7:%.*]]121; CHECK:       block_6:122; CHECK-NEXT:    [[DIV:%.*]] = udiv i32 [[AVAL_RELOAD]], [[BVAL_RELOAD]]123; CHECK-NEXT:    ret void124; CHECK:       block_7:125; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[A2VAL_RELOAD]], [[B2VAL_RELOAD]]126; CHECK-NEXT:    ret void127;128;129; CHECK-LABEL: @outline_outputs2(130; CHECK-NEXT:  entry:131; CHECK-NEXT:    [[BVAL_LOC:%.*]] = alloca i32, align 4132; CHECK-NEXT:    [[AVAL_LOC:%.*]] = alloca i32, align 4133; CHECK-NEXT:    [[B2VAL_LOC:%.*]] = alloca i32, align 4134; CHECK-NEXT:    [[A2VAL_LOC:%.*]] = alloca i32, align 4135; CHECK-NEXT:    [[OUTPUT:%.*]] = alloca i32, align 4136; CHECK-NEXT:    [[RESULT:%.*]] = alloca i32, align 4137; CHECK-NEXT:    [[OUTPUT2:%.*]] = alloca i32, align 4138; CHECK-NEXT:    [[RESULT2:%.*]] = alloca i32, align 4139; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4140; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4141; CHECK-NEXT:    br label [[BLOCK_2:%.*]]142; CHECK:       block_1:143; CHECK-NEXT:    [[A2:%.*]] = alloca i32, align 4144; CHECK-NEXT:    [[B2:%.*]] = alloca i32, align 4145; CHECK-NEXT:    br label [[BLOCK_2]]146; CHECK:       block_2:147; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[A2VAL_LOC]])148; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[B2VAL_LOC]])149; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[AVAL_LOC]])150; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[BVAL_LOC]])151; CHECK-NEXT:    [[TARGETBLOCK:%.*]] = call i1 @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[OUTPUT]], ptr [[RESULT]], ptr [[A2VAL_LOC]], ptr [[B2VAL_LOC]], ptr [[AVAL_LOC]], ptr [[BVAL_LOC]])152; CHECK-NEXT:    [[A2VAL_RELOAD:%.*]] = load i32, ptr [[A2VAL_LOC]], align 4153; CHECK-NEXT:    [[B2VAL_RELOAD:%.*]] = load i32, ptr [[B2VAL_LOC]], align 4154; CHECK-NEXT:    [[AVAL_RELOAD:%.*]] = load i32, ptr [[AVAL_LOC]], align 4155; CHECK-NEXT:    [[BVAL_RELOAD:%.*]] = load i32, ptr [[BVAL_LOC]], align 4156; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[A2VAL_LOC]])157; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[B2VAL_LOC]])158; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[AVAL_LOC]])159; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[BVAL_LOC]])160; CHECK-NEXT:    br i1 [[TARGETBLOCK]], label [[BLOCK_7:%.*]], label [[BLOCK_6:%.*]]161; CHECK:       block_6:162; CHECK-NEXT:    [[DIFF:%.*]] = sub i32 [[A2VAL_RELOAD]], [[B2VAL_RELOAD]]163; CHECK-NEXT:    ret void164; CHECK:       block_7:165; CHECK-NEXT:    [[QUOT:%.*]] = udiv i32 [[AVAL_RELOAD]], [[BVAL_RELOAD]]166; CHECK-NEXT:    ret void167;168;169; CHECK: define internal i1 @outlined_ir_func_0(170; CHECK-NEXT:  newFuncRoot:171; CHECK-NEXT:    br label [[BLOCK_2_TO_OUTLINE:%.*]]172; CHECK:       block_2_to_outline:173; CHECK-NEXT:    [[A2VAL:%.*]] = load i32, ptr [[TMP0:%.*]], align 4174; CHECK-NEXT:    [[B2VAL:%.*]] = load i32, ptr [[TMP1:%.*]], align 4175; CHECK-NEXT:    [[ADD2:%.*]] = add i32 2, [[A2VAL]]176; CHECK-NEXT:    [[MUL2:%.*]] = mul i32 2, [[B2VAL]]177; CHECK-NEXT:    br label [[BLOCK_5:%.*]]178; CHECK:       block_3:179; CHECK-NEXT:    [[AVAL:%.*]] = load i32, ptr [[TMP0]], align 4180; CHECK-NEXT:    [[BVAL:%.*]] = load i32, ptr [[TMP1]], align 4181; CHECK-NEXT:    [[ADD:%.*]] = add i32 2, [[AVAL]]182; CHECK-NEXT:    [[MUL:%.*]] = mul i32 2, [[BVAL]]183; CHECK-NEXT:    br label [[BLOCK_4:%.*]]184; CHECK:       block_4:185; CHECK-NEXT:    store i32 [[ADD]], ptr [[TMP2:%.*]], align 4186; CHECK-NEXT:    store i32 [[MUL]], ptr [[TMP3:%.*]], align 4187; CHECK-NEXT:    br label [[BLOCK_6_EXITSTUB:%.*]]188; CHECK:       block_5:189; CHECK-NEXT:    store i32 [[ADD2]], ptr [[TMP2]], align 4190; CHECK-NEXT:    store i32 [[MUL2]], ptr [[TMP3]], align 4191; CHECK-NEXT:    br label [[BLOCK_7_EXITSTUB:%.*]]192; CHECK:       block_6.exitStub:193; CHECK-NEXT:    store i32 [[AVAL]], ptr [[TMP6:%.*]], align 4194; CHECK-NEXT:    store i32 [[BVAL]], ptr [[TMP7:%.*]], align 4195; CHECK-NEXT:    ret i1 true196; CHECK:       block_7.exitStub:197; CHECK-NEXT:    store i32 [[A2VAL]], ptr [[TMP4:%.*]], align 4198; CHECK-NEXT:    store i32 [[B2VAL]], ptr [[TMP5:%.*]], align 4199; CHECK-NEXT:    ret i1 false200;201