1; RUN: opt < %s -passes='print<func-properties>' -disable-output 2>&1 | FileCheck %s 2; RUN: opt < %s -passes='print<func-properties>' -disable-output 2>&1 -enable-detailed-function-properties | FileCheck %s --check-prefix=DETAILED-PROPERTIES 3 4define i32 @main() { 5; CHECK-DAG: Printing analysis results of CFA for function 'main': 6; DETAILED-PROPERTIES-DAG: Printing analysis results of CFA for function 'main': 7 8entry: 9 %retval = alloca i32, align 4 10 %mat1 = alloca [2 x [2 x i32]], align 16 11 %mat2 = alloca [2 x [2 x i32]], align 16 12 %res = alloca [2 x [2 x i32]], align 16 13 %i = alloca i32, align 4 14 %j = alloca i32, align 4 15 store i32 0, ptr %retval, align 4 16 %arraydecay = getelementptr inbounds [2 x [2 x i32]], ptr %mat1, i64 0, i64 0 17 %arraydecay1 = getelementptr inbounds [2 x [2 x i32]], ptr %mat2, i64 0, i64 0 18 %arraydecay2 = getelementptr inbounds [2 x [2 x i32]], ptr %res, i64 0, i64 0 19 call void @multiply(ptr %arraydecay, ptr %arraydecay1, ptr %arraydecay2) 20 ret i32 0 21} 22; CHECK-DAG: BasicBlockCount: 1 23; CHECK-DAG: BlocksReachedFromConditionalInstruction: 0 24; CHECK-DAG: Uses: 1 25; CHECK-DAG: DirectCallsToDefinedFunctions: 1 26; CHECK-DAG: LoadInstCount: 0 27; CHECK-DAG: StoreInstCount: 1 28; CHECK-DAG: MaxLoopDepth: 0 29; CHECK-DAG: TopLevelLoopCount: 0 30 31; DETAILED-PROPERTIES-DAG: BasicBlockCount: 1 32; DETAILED-PROPERTIES-DAG: BlocksReachedFromConditionalInstruction: 0 33; DETAILED-PROPERTIES-DAG: Uses: 1 34; DETAILED-PROPERTIES-DAG: DirectCallsToDefinedFunctions: 1 35; DETAILED-PROPERTIES-DAG: LoadInstCount: 0 36; DETAILED-PROPERTIES-DAG: StoreInstCount: 1 37; DETAILED-PROPERTIES-DAG: MaxLoopDepth: 0 38; DETAILED-PROPERTIES-DAG: TopLevelLoopCount: 0 39; DETAILED-PROPERTIES-DAG: BasicBlocksWithSingleSuccessor: 0 40; DETAILED-PROPERTIES-DAG: BasicBlocksWithTwoSuccessors: 0 41; DETAILED-PROPERTIES-DAG: BasicBlocksWithMoreThanTwoSuccessors: 0 42; DETAILED-PROPERTIES-DAG: BasicBlocksWithSinglePredecessor: 0 43; DETAILED-PROPERTIES-DAG: BasicBlocksWithTwoPredecessors: 0 44; DETAILED-PROPERTIES-DAG: BasicBlocksWithMoreThanTwoPredecessors: 0 45; DETAILED-PROPERTIES-DAG: BigBasicBlocks: 0 46; DETAILED-PROPERTIES-DAG: MediumBasicBlocks: 0 47; DETAILED-PROPERTIES-DAG: SmallBasicBlocks: 1 48; DETAILED-PROPERTIES-DAG: CastInstructionCount: 0 49; DETAILED-PROPERTIES-DAG: FloatingPointInstructionCount: 0 50; DETAILED-PROPERTIES-DAG: IntegerInstructionCount: 0 51; DETAILED-PROPERTIES-DAG: ConstantIntOperandCount: 14 52; DETAILED-PROPERTIES-DAG: ConstantFPOperandCount: 0 53; DETAILED-PROPERTIES-DAG: ConstantOperandCount: 0 54; DETAILED-PROPERTIES-DAG: InstructionOperandCount: 7 55; DETAILED-PROPERTIES-DAG: BasicBlockOperandCount: 0 56; DETAILED-PROPERTIES-DAG: GlobalValueOperandCount: 1 57; DETAILED-PROPERTIES-DAG: InlineAsmOperandCount: 0 58; DETAILED-PROPERTIES-DAG: ArgumentOperandCount: 0 59; DETAILED-PROPERTIES-DAG: UnknownOperandCount: 0 60; DETAILED-PROPERTIES-DAG: CriticalEdgeCount: 0 61; DETAILED-PROPERTIES-DAG: ControlFlowEdgeCount: 0 62; DETAILED-PROPERTIES-DAG: UnconditionalBranchCount: 0 63; DETAILED-PROPERTIES-DAG: DirectCallCount: 1 64; DETAILED-PROPERTIES-DAG: IndirectCallCount: 0 65; DETAILED-PROPERTIES-DAG: CallReturnsIntegerCount: 0 66; DETAILED-PROPERTIES-DAG: CallReturnsFloatCount: 0 67; DETAILED-PROPERTIES-DAG: CallReturnsPointerCount: 0 68; DETAILED-PROPERTIES-DAG: CallReturnsVectorIntCount: 0 69; DETAILED-PROPERTIES-DAG: CallReturnsVectorFloatCount: 0 70; DETAILED-PROPERTIES-DAG: CallReturnsVectorPointerCount: 0 71; DETAILED-PROPERTIES-DAG: CallWithManyArgumentsCount: 0 72; DETAILED-PROPERTIES-DAG: CallWithPointerArgumentCount: 1 73 74define void @multiply(ptr %mat1, ptr %mat2, ptr %res) { 75; CHECK-DAG: Printing analysis results of CFA for function 'multiply': 76; DETAILED-PROPERTIES-DAG: Printing analysis results of CFA for function 'multiply': 77entry: 78 %mat1.addr = alloca ptr, align 8 79 %mat2.addr = alloca ptr, align 8 80 %res.addr = alloca ptr, align 8 81 %i = alloca i32, align 4 82 %j = alloca i32, align 4 83 %k = alloca i32, align 4 84 store ptr %mat1, ptr %mat1.addr, align 8 85 store ptr %mat2, ptr %mat2.addr, align 8 86 store ptr %res, ptr %res.addr, align 8 87 store i32 0, ptr %i, align 4 88 br label %for.cond 89 90for.cond: ; preds = %for.inc24, %entry 91 %0 = load i32, ptr %i, align 4 92 %cmp = icmp slt i32 %0, 2 93 br i1 %cmp, label %for.body, label %for.end26 94 95for.body: ; preds = %for.cond 96 store i32 0, ptr %j, align 4 97 br label %for.cond1 98 99for.cond1: ; preds = %for.inc21, %for.body 100 %1 = load i32, ptr %j, align 4 101 %cmp2 = icmp slt i32 %1, 2 102 br i1 %cmp2, label %for.body3, label %for.end23 103 104for.body3: ; preds = %for.cond1 105 %2 = load ptr, ptr %res.addr, align 8 106 %3 = load i32, ptr %i, align 4 107 %idxprom = sext i32 %3 to i64 108 %arrayidx = getelementptr inbounds [2 x i32], ptr %2, i64 %idxprom 109 %4 = load i32, ptr %j, align 4 110 %idxprom4 = sext i32 %4 to i64 111 %arrayidx5 = getelementptr inbounds [2 x i32], ptr %arrayidx, i64 0, i64 %idxprom4 112 store i32 0, ptr %arrayidx5, align 4 113 store i32 0, ptr %k, align 4 114 br label %for.cond6 115 116for.cond6: ; preds = %for.inc, %for.body3 117 %5 = load i32, ptr %k, align 4 118 %cmp7 = icmp slt i32 %5, 2 119 br i1 %cmp7, label %for.body8, label %for.end 120 121for.body8: ; preds = %for.cond6 122 %6 = load ptr, ptr %mat1.addr, align 8 123 %7 = load i32, ptr %i, align 4 124 %idxprom9 = sext i32 %7 to i64 125 %arrayidx10 = getelementptr inbounds [2 x i32], ptr %6, i64 %idxprom9 126 %8 = load i32, ptr %k, align 4 127 %idxprom11 = sext i32 %8 to i64 128 %arrayidx12 = getelementptr inbounds [2 x i32], ptr %arrayidx10, i64 0, i64 %idxprom11 129 %9 = load i32, ptr %arrayidx12, align 4 130 %10 = load ptr, ptr %mat2.addr, align 8 131 %11 = load i32, ptr %k, align 4 132 %idxprom13 = sext i32 %11 to i64 133 %arrayidx14 = getelementptr inbounds [2 x i32], ptr %10, i64 %idxprom13 134 %12 = load i32, ptr %j, align 4 135 %idxprom15 = sext i32 %12 to i64 136 %arrayidx16 = getelementptr inbounds [2 x i32], ptr %arrayidx14, i64 0, i64 %idxprom15 137 %13 = load i32, ptr %arrayidx16, align 4 138 %mul = mul nsw i32 %9, %13 139 %14 = load ptr, ptr %res.addr, align 8 140 %15 = load i32, ptr %i, align 4 141 %idxprom17 = sext i32 %15 to i64 142 %arrayidx18 = getelementptr inbounds [2 x i32], ptr %14, i64 %idxprom17 143 %16 = load i32, ptr %j, align 4 144 %idxprom19 = sext i32 %16 to i64 145 %arrayidx20 = getelementptr inbounds [2 x i32], ptr %arrayidx18, i64 0, i64 %idxprom19 146 %17 = load i32, ptr %arrayidx20, align 4 147 %add = add nsw i32 %17, %mul 148 store i32 %add, ptr %arrayidx20, align 4 149 br label %for.inc 150 151for.inc: ; preds = %for.body8 152 %18 = load i32, ptr %k, align 4 153 %inc = add nsw i32 %18, 1 154 store i32 %inc, ptr %k, align 4 155 br label %for.cond6 156 157for.end: ; preds = %for.cond6 158 br label %for.inc21 159 160for.inc21: ; preds = %for.end 161 %19 = load i32, ptr %j, align 4 162 %inc22 = add nsw i32 %19, 1 163 store i32 %inc22, ptr %j, align 4 164 br label %for.cond1 165 166for.end23: ; preds = %for.cond1 167 br label %for.inc24 168 169for.inc24: ; preds = %for.end23 170 %20 = load i32, ptr %i, align 4 171 %inc25 = add nsw i32 %20, 1 172 store i32 %inc25, ptr %i, align 4 173 br label %for.cond 174 175for.end26: ; preds = %for.cond 176 ret void 177} 178 179; CHECK-DAG: BasicBlockCount: 13 180; CHECK-DAG: BlocksReachedFromConditionalInstruction: 6 181; CHECK-DAG: Uses: 2 182; CHECK-DAG: DirectCallsToDefinedFunctions: 0 183; CHECK-DAG: LoadInstCount: 21 184; CHECK-DAG: StoreInstCount: 11 185; CHECK-DAG: MaxLoopDepth: 3 186; CHECK-DAG: TopLevelLoopCount: 1 187 188; DETAILED-PROPERTIES-DAG: BasicBlockCount: 13 189; DETAILED-PROPERTIES-DAG: BlocksReachedFromConditionalInstruction: 6 190; DETAILED-PROPERTIES-DAG: Uses: 2 191; DETAILED-PROPERTIES-DAG: DirectCallsToDefinedFunctions: 0 192; DETAILED-PROPERTIES-DAG: LoadInstCount: 21 193; DETAILED-PROPERTIES-DAG: StoreInstCount: 11 194; DETAILED-PROPERTIES-DAG: MaxLoopDepth: 3 195; DETAILED-PROPERTIES-DAG: TopLevelLoopCount: 1 196; DETAILED-PROPERTIES-DAG: BasicBlocksWithSingleSuccessor: 9 197; DETAILED-PROPERTIES-DAG: BasicBlocksWithTwoSuccessors: 3 198; DETAILED-PROPERTIES-DAG: BasicBlocksWithMoreThanTwoSuccessors: 0 199; DETAILED-PROPERTIES-DAG: BasicBlocksWithSinglePredecessor: 9 200; DETAILED-PROPERTIES-DAG: BasicBlocksWithTwoPredecessors: 3 201; DETAILED-PROPERTIES-DAG: BasicBlocksWithMoreThanTwoPredecessors: 0 202; DETAILED-PROPERTIES-DAG: BigBasicBlocks: 0 203; DETAILED-PROPERTIES-DAG: MediumBasicBlocks: 11 204; DETAILED-PROPERTIES-DAG: SmallBasicBlocks: 2 205; DETAILED-PROPERTIES-DAG: CastInstructionCount: 8 206; DETAILED-PROPERTIES-DAG: FloatingPointInstructionCount: 0 207; DETAILED-PROPERTIES-DAG: IntegerInstructionCount: 33 208; DETAILED-PROPERTIES-DAG: ConstantIntOperandCount: 20 209; DETAILED-PROPERTIES-DAG: ConstantFPOperandCount: 0 210; DETAILED-PROPERTIES-DAG: ConstantOperandCount: 0 211; DETAILED-PROPERTIES-DAG: InstructionOperandCount: 73 212; DETAILED-PROPERTIES-DAG: BasicBlockOperandCount: 15 213; DETAILED-PROPERTIES-DAG: GlobalValueOperandCount: 0 214; DETAILED-PROPERTIES-DAG: InlineAsmOperandCount: 0 215; DETAILED-PROPERTIES-DAG: ArgumentOperandCount: 3 216; DETAILED-PROPERTIES-DAG: UnknownOperandCount: 0 217; DETAILED-PROPERTIES-DAG: DirectCallCount: 0 218; DETAILED-PROPERTIES-DAG: IndirectCallCount: 0 219; DETAILED-PROPERTIES-DAG: CriticalEdgeCount: 0 220; DETAILED-PROPERTIES-DAG: ControlFlowEdgeCount: 15 221; DETAILED-PROPERTIES-DAG: UnconditionalBranchCount: 9 222; DETAILED-PROPERTIES-DAG: CallReturnsIntegerCount: 0 223; DETAILED-PROPERTIES-DAG: CallReturnsFloatCount: 0 224; DETAILED-PROPERTIES-DAG: CallReturnsPointerCount: 0 225; DETAILED-PROPERTIES-DAG: CallReturnsVectorIntCount: 0 226; DETAILED-PROPERTIES-DAG: CallReturnsVectorFloatCount: 0 227; DETAILED-PROPERTIES-DAG: CallReturnsVectorPointerCount: 0 228; DETAILED-PROPERTIES-DAG: CallWithManyArgumentsCount: 0 229; DETAILED-PROPERTIES-DAG: CallWithPointerArgumentCount: 0 230 231