144 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -p iroutliner,verify -ir-outlining-no-cost < %s | FileCheck %s3 4; This test ensures that we do not include llvm.assumes. There are exceptions5; in the CodeExtractor's algorithm for llvm.assumes, so we ignore it for now.6 7define void @outline_assumes() {8; CHECK-LABEL: @outline_assumes(9; CHECK-NEXT: entry:10; CHECK-NEXT: [[DL_LOC:%.*]] = alloca i1, align 111; CHECK-NEXT: [[A:%.*]] = alloca i32, align 412; CHECK-NEXT: [[B:%.*]] = alloca i32, align 413; CHECK-NEXT: [[C:%.*]] = alloca i32, align 414; CHECK-NEXT: [[D:%.*]] = alloca i1, align 415; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[DL_LOC]])16; CHECK-NEXT: call void @outlined_ir_func_4(i1 true, ptr [[D]], ptr [[DL_LOC]])17; CHECK-NEXT: [[DL_RELOAD:%.*]] = load i1, ptr [[DL_LOC]], align 118; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[DL_LOC]])19; CHECK-NEXT: [[SPLIT_INST:%.*]] = sub i1 [[DL_RELOAD]], [[DL_RELOAD]]20; CHECK-NEXT: call void @outlined_ir_func_1(ptr [[A]], ptr [[B]], ptr [[C]])21; CHECK-NEXT: call void @llvm.assume(i1 [[DL_RELOAD]])22; CHECK-NEXT: call void @outlined_ir_func_2(ptr [[A]], ptr [[B]], ptr [[C]])23; CHECK-NEXT: ret void24;25entry:26 %a = alloca i32, align 427 %b = alloca i32, align 428 %c = alloca i32, align 429 %d = alloca i1, align 430 store i1 1, ptr %d, align 431 %dl = load i1, ptr %d32 %split_inst = sub i1 %dl, %dl33 store i32 2, ptr %a, align 434 store i32 3, ptr %b, align 435 store i32 4, ptr %c, align 436 call void @llvm.assume(i1 %dl)37 %al = load i32, ptr %a38 %bl = load i32, ptr %b39 %cl = load i32, ptr %c40 ret void41}42 43define void @outline_assumes2() {44; CHECK-LABEL: @outline_assumes2(45; CHECK-NEXT: entry:46; CHECK-NEXT: [[DL_LOC:%.*]] = alloca i1, align 147; CHECK-NEXT: [[A:%.*]] = alloca i32, align 448; CHECK-NEXT: [[B:%.*]] = alloca i32, align 449; CHECK-NEXT: [[C:%.*]] = alloca i32, align 450; CHECK-NEXT: [[D:%.*]] = alloca i1, align 451; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[DL_LOC]])52; CHECK-NEXT: call void @outlined_ir_func_4(i1 false, ptr [[D]], ptr [[DL_LOC]])53; CHECK-NEXT: [[DL_RELOAD:%.*]] = load i1, ptr [[DL_LOC]], align 154; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[DL_LOC]])55; CHECK-NEXT: call void @outlined_ir_func_1(ptr [[A]], ptr [[B]], ptr [[C]])56; CHECK-NEXT: call void @llvm.assume(i1 [[DL_RELOAD]])57; CHECK-NEXT: call void @outlined_ir_func_2(ptr [[A]], ptr [[B]], ptr [[C]])58; CHECK-NEXT: ret void59;60entry:61 %a = alloca i32, align 462 %b = alloca i32, align 463 %c = alloca i32, align 464 %d = alloca i1, align 465 store i1 0, ptr %d, align 466 %dl = load i1, ptr %d67 store i32 2, ptr %a, align 468 store i32 3, ptr %b, align 469 store i32 4, ptr %c, align 470 call void @llvm.assume(i1 %dl)71 %al = load i32, ptr %a72 %bl = load i32, ptr %b73 %cl = load i32, ptr %c74 ret void75}76 77define void @outline_assumes3() {78; CHECK-LABEL: @outline_assumes3(79; CHECK-NEXT: entry:80; CHECK-NEXT: [[DL_LOC:%.*]] = alloca i1, align 181; CHECK-NEXT: [[A:%.*]] = alloca i32, align 482; CHECK-NEXT: [[B:%.*]] = alloca i32, align 483; CHECK-NEXT: [[C:%.*]] = alloca i32, align 484; CHECK-NEXT: [[D:%.*]] = alloca i1, align 485; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[DL_LOC]])86; CHECK-NEXT: call void @outlined_ir_func_0(i1 true, ptr [[D]], ptr [[A]], ptr [[B]], ptr [[C]], ptr [[DL_LOC]])87; CHECK-NEXT: [[DL_RELOAD:%.*]] = load i1, ptr [[DL_LOC]], align 188; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[DL_LOC]])89; CHECK-NEXT: call void @llvm.assume(i1 [[DL_RELOAD]])90; CHECK-NEXT: call void @outlined_ir_func_3(ptr [[A]])91; CHECK-NEXT: ret void92;93entry:94 %a = alloca i32, align 495 %b = alloca i32, align 496 %c = alloca i32, align 497 %d = alloca i1, align 498 store i1 1, ptr %d, align 499 %dl = load i1, ptr %d100 %split_inst = add i1 %dl, %dl101 store i32 2, ptr %a, align 4102 store i32 3, ptr %b, align 4103 store i32 4, ptr %c, align 4104 call void @llvm.assume(i1 %dl)105 %al = load i32, ptr %a106 %bl = add i32 %al, %al107 ret void108}109 110define void @outline_assumes4() {111; CHECK-LABEL: @outline_assumes4(112; CHECK-NEXT: entry:113; CHECK-NEXT: [[DL_LOC:%.*]] = alloca i1, align 1114; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4115; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4116; CHECK-NEXT: [[C:%.*]] = alloca i32, align 4117; CHECK-NEXT: [[D:%.*]] = alloca i1, align 4118; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[DL_LOC]])119; CHECK-NEXT: call void @outlined_ir_func_0(i1 false, ptr [[D]], ptr [[A]], ptr [[B]], ptr [[C]], ptr [[DL_LOC]])120; CHECK-NEXT: [[DL_RELOAD:%.*]] = load i1, ptr [[DL_LOC]], align 1121; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[DL_LOC]])122; CHECK-NEXT: call void @llvm.assume(i1 [[DL_RELOAD]])123; CHECK-NEXT: call void @outlined_ir_func_3(ptr [[A]])124; CHECK-NEXT: ret void125;126entry:127 %a = alloca i32, align 4128 %b = alloca i32, align 4129 %c = alloca i32, align 4130 %d = alloca i1, align 4131 store i1 0, ptr %d, align 4132 %dl = load i1, ptr %d133 %split_inst = add i1 %dl, %dl134 store i32 2, ptr %a, align 4135 store i32 3, ptr %b, align 4136 store i32 4, ptr %c, align 4137 call void @llvm.assume(i1 %dl)138 %al = load i32, ptr %a139 %bl = add i32 %al, %al140 ret void141}142 143declare void @llvm.assume(i1)144