1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -p iroutliner,verify -ir-outlining-no-cost < %s | FileCheck %s 3 4; This test ensures that we do not include llvm.assumes. There are exceptions 5; 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 1 11; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 12; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 13; CHECK-NEXT: [[C:%.*]] = alloca i32, align 4 14; CHECK-NEXT: [[D:%.*]] = alloca i1, align 4 15; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, 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 1 18; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, 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 void 24; 25entry: 26 %a = alloca i32, align 4 27 %b = alloca i32, align 4 28 %c = alloca i32, align 4 29 %d = alloca i1, align 4 30 store i1 1, ptr %d, align 4 31 %dl = load i1, ptr %d 32 %split_inst = sub i1 %dl, %dl 33 store i32 2, ptr %a, align 4 34 store i32 3, ptr %b, align 4 35 store i32 4, ptr %c, align 4 36 call void @llvm.assume(i1 %dl) 37 %al = load i32, ptr %a 38 %bl = load i32, ptr %b 39 %cl = load i32, ptr %c 40 ret void 41} 42 43define void @outline_assumes2() { 44; CHECK-LABEL: @outline_assumes2( 45; CHECK-NEXT: entry: 46; CHECK-NEXT: [[DL_LOC:%.*]] = alloca i1, align 1 47; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 48; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 49; CHECK-NEXT: [[C:%.*]] = alloca i32, align 4 50; CHECK-NEXT: [[D:%.*]] = alloca i1, align 4 51; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, 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 1 54; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, 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 void 59; 60entry: 61 %a = alloca i32, align 4 62 %b = alloca i32, align 4 63 %c = alloca i32, align 4 64 %d = alloca i1, align 4 65 store i1 0, ptr %d, align 4 66 %dl = load i1, ptr %d 67 store i32 2, ptr %a, align 4 68 store i32 3, ptr %b, align 4 69 store i32 4, ptr %c, align 4 70 call void @llvm.assume(i1 %dl) 71 %al = load i32, ptr %a 72 %bl = load i32, ptr %b 73 %cl = load i32, ptr %c 74 ret void 75} 76 77define void @outline_assumes3() { 78; CHECK-LABEL: @outline_assumes3( 79; CHECK-NEXT: entry: 80; CHECK-NEXT: [[DL_LOC:%.*]] = alloca i1, align 1 81; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 82; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 83; CHECK-NEXT: [[C:%.*]] = alloca i32, align 4 84; CHECK-NEXT: [[D:%.*]] = alloca i1, align 4 85; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, 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 1 88; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, 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 void 92; 93entry: 94 %a = alloca i32, align 4 95 %b = alloca i32, align 4 96 %c = alloca i32, align 4 97 %d = alloca i1, align 4 98 store i1 1, ptr %d, align 4 99 %dl = load i1, ptr %d 100 %split_inst = add i1 %dl, %dl 101 store i32 2, ptr %a, align 4 102 store i32 3, ptr %b, align 4 103 store i32 4, ptr %c, align 4 104 call void @llvm.assume(i1 %dl) 105 %al = load i32, ptr %a 106 %bl = add i32 %al, %al 107 ret void 108} 109 110define void @outline_assumes4() { 111; CHECK-LABEL: @outline_assumes4( 112; CHECK-NEXT: entry: 113; CHECK-NEXT: [[DL_LOC:%.*]] = alloca i1, align 1 114; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 115; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 116; CHECK-NEXT: [[C:%.*]] = alloca i32, align 4 117; CHECK-NEXT: [[D:%.*]] = alloca i1, align 4 118; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, 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 1 121; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, 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 void 125; 126entry: 127 %a = alloca i32, align 4 128 %b = alloca i32, align 4 129 %c = alloca i32, align 4 130 %d = alloca i1, align 4 131 store i1 0, ptr %d, align 4 132 %dl = load i1, ptr %d 133 %split_inst = add i1 %dl, %dl 134 store i32 2, ptr %a, align 4 135 store i32 3, ptr %b, align 4 136 store i32 4, ptr %c, align 4 137 call void @llvm.assume(i1 %dl) 138 %al = load i32, ptr %a 139 %bl = add i32 %al, %al 140 ret void 141} 142 143declare void @llvm.assume(i1) 144