1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -verify -iroutliner -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: [[LT_CAST:%.*]] = bitcast i1* [[DL_LOC]] to i8* 16; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST]]) 17; CHECK-NEXT: call void @outlined_ir_func_3(i1 true, i1* [[D]], i1* [[DL_LOC]]) 18; CHECK-NEXT: [[DL_RELOAD:%.*]] = load i1, i1* [[DL_LOC]], align 1 19; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 -1, i8* [[LT_CAST]]) 20; CHECK-NEXT: [[SPLIT_INST:%.*]] = sub i1 [[DL_RELOAD]], [[DL_RELOAD]] 21; CHECK-NEXT: call void @outlined_ir_func_0(i32* [[A]], i32* [[B]], i32* [[C]]) 22; CHECK-NEXT: call void @llvm.assume(i1 [[DL_RELOAD]]) 23; CHECK-NEXT: call void @outlined_ir_func_1(i32* [[A]], i32* [[B]], i32* [[C]]) 24; CHECK-NEXT: ret void 25; 26entry: 27 %a = alloca i32, align 4 28 %b = alloca i32, align 4 29 %c = alloca i32, align 4 30 %d = alloca i1, align 4 31 store i1 1, i1* %d, align 4 32 %dl = load i1, i1* %d 33 %split_inst = sub i1 %dl, %dl 34 store i32 2, i32* %a, align 4 35 store i32 3, i32* %b, align 4 36 store i32 4, i32* %c, align 4 37 call void @llvm.assume(i1 %dl) 38 %al = load i32, i32* %a 39 %bl = load i32, i32* %b 40 %cl = load i32, i32* %c 41 ret void 42} 43 44define void @outline_assumes2() { 45; CHECK-LABEL: @outline_assumes2( 46; CHECK-NEXT: entry: 47; CHECK-NEXT: [[DL_LOC:%.*]] = alloca i1, align 1 48; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 49; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 50; CHECK-NEXT: [[C:%.*]] = alloca i32, align 4 51; CHECK-NEXT: [[D:%.*]] = alloca i1, align 4 52; CHECK-NEXT: [[LT_CAST:%.*]] = bitcast i1* [[DL_LOC]] to i8* 53; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST]]) 54; CHECK-NEXT: call void @outlined_ir_func_3(i1 false, i1* [[D]], i1* [[DL_LOC]]) 55; CHECK-NEXT: [[DL_RELOAD:%.*]] = load i1, i1* [[DL_LOC]], align 1 56; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 -1, i8* [[LT_CAST]]) 57; CHECK-NEXT: call void @outlined_ir_func_0(i32* [[A]], i32* [[B]], i32* [[C]]) 58; CHECK-NEXT: call void @llvm.assume(i1 [[DL_RELOAD]]) 59; CHECK-NEXT: call void @outlined_ir_func_1(i32* [[A]], i32* [[B]], i32* [[C]]) 60; CHECK-NEXT: ret void 61; 62entry: 63 %a = alloca i32, align 4 64 %b = alloca i32, align 4 65 %c = alloca i32, align 4 66 %d = alloca i1, align 4 67 store i1 0, i1* %d, align 4 68 %dl = load i1, i1* %d 69 store i32 2, i32* %a, align 4 70 store i32 3, i32* %b, align 4 71 store i32 4, i32* %c, align 4 72 call void @llvm.assume(i1 %dl) 73 %al = load i32, i32* %a 74 %bl = load i32, i32* %b 75 %cl = load i32, i32* %c 76 ret void 77} 78 79define void @outline_assumes3() { 80; CHECK-LABEL: @outline_assumes3( 81; CHECK-NEXT: entry: 82; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 83; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 84; CHECK-NEXT: [[C:%.*]] = alloca i32, align 4 85; CHECK-NEXT: [[D:%.*]] = alloca i1, align 4 86; CHECK-NEXT: store i1 true, i1* [[D]], align 4 87; CHECK-NEXT: [[DL:%.*]] = load i1, i1* [[D]], align 1 88; CHECK-NEXT: [[SPLIT_INST:%.*]] = add i1 [[DL]], [[DL]] 89; CHECK-NEXT: call void @outlined_ir_func_0(i32* [[A]], i32* [[B]], i32* [[C]]) 90; CHECK-NEXT: call void @llvm.assume(i1 [[DL]]) 91; CHECK-NEXT: call void @outlined_ir_func_2(i32* [[A]]) 92; CHECK-NEXT: ret void 93; 94entry: 95 %a = alloca i32, align 4 96 %b = alloca i32, align 4 97 %c = alloca i32, align 4 98 %d = alloca i1, align 4 99 store i1 1, i1* %d, align 4 100 %dl = load i1, i1* %d 101 %split_inst = add i1 %dl, %dl 102 store i32 2, i32* %a, align 4 103 store i32 3, i32* %b, align 4 104 store i32 4, i32* %c, align 4 105 call void @llvm.assume(i1 %dl) 106 %al = load i32, i32* %a 107 %bl = add i32 %al, %al 108 ret void 109} 110 111define void @outline_assumes4() { 112; CHECK-LABEL: @outline_assumes4( 113; CHECK-NEXT: entry: 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: store i1 false, i1* [[D]], align 4 119; CHECK-NEXT: [[DL:%.*]] = load i1, i1* [[D]], align 1 120; CHECK-NEXT: [[SPLIT_INST:%.*]] = add i1 [[DL]], [[DL]] 121; CHECK-NEXT: call void @outlined_ir_func_0(i32* [[A]], i32* [[B]], i32* [[C]]) 122; CHECK-NEXT: call void @llvm.assume(i1 [[DL]]) 123; CHECK-NEXT: call void @outlined_ir_func_2(i32* [[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, i1* %d, align 4 132 %dl = load i1, i1* %d 133 %split_inst = add i1 %dl, %dl 134 store i32 2, i32* %a, align 4 135 store i32 3, i32* %b, align 4 136 store i32 4, i32* %c, align 4 137 call void @llvm.assume(i1 %dl) 138 %al = load i32, i32* %a 139 %bl = add i32 %al, %al 140 ret void 141} 142 143declare void @llvm.assume(i1) 144