| ; RUN: opt < %s -passes='print<func-properties>' -disable-output 2>&1 | FileCheck %s |
| |
| define i32 @main() { |
| ; CHECK-DAG: Printing analysis results of CFA for function 'main': |
| |
| entry: |
| %retval = alloca i32, align 4 |
| %mat1 = alloca [2 x [2 x i32]], align 16 |
| %mat2 = alloca [2 x [2 x i32]], align 16 |
| %res = alloca [2 x [2 x i32]], align 16 |
| %i = alloca i32, align 4 |
| %j = alloca i32, align 4 |
| store i32 0, i32* %retval, align 4 |
| %arraydecay = getelementptr inbounds [2 x [2 x i32]], [2 x [2 x i32]]* %mat1, i64 0, i64 0 |
| %arraydecay1 = getelementptr inbounds [2 x [2 x i32]], [2 x [2 x i32]]* %mat2, i64 0, i64 0 |
| %arraydecay2 = getelementptr inbounds [2 x [2 x i32]], [2 x [2 x i32]]* %res, i64 0, i64 0 |
| call void @multiply([2 x i32]* %arraydecay, [2 x i32]* %arraydecay1, [2 x i32]* %arraydecay2) |
| ret i32 0 |
| } |
| ; CHECK-DAG: BasicBlockCount: 1 |
| ; CHECK-DAG: BlocksReachedFromConditionalInstruction: 0 |
| ; CHECK-DAG: Uses: 1 |
| ; CHECK-DAG: DirectCallsToDefinedFunctions: 1 |
| ; CHECK-DAG: LoadInstCount: 0 |
| ; CHECK-DAG: StoreInstCount: 1 |
| ; CHECK-DAG: MaxLoopDepth: 0 |
| ; CHECK-DAG: TopLevelLoopCount: 0 |
| |
| define void @multiply([2 x i32]* %mat1, [2 x i32]* %mat2, [2 x i32]* %res) { |
| ; CHECK-DAG: Printing analysis results of CFA for function 'multiply': |
| entry: |
| %mat1.addr = alloca [2 x i32]*, align 8 |
| %mat2.addr = alloca [2 x i32]*, align 8 |
| %res.addr = alloca [2 x i32]*, align 8 |
| %i = alloca i32, align 4 |
| %j = alloca i32, align 4 |
| %k = alloca i32, align 4 |
| store [2 x i32]* %mat1, [2 x i32]** %mat1.addr, align 8 |
| store [2 x i32]* %mat2, [2 x i32]** %mat2.addr, align 8 |
| store [2 x i32]* %res, [2 x i32]** %res.addr, align 8 |
| store i32 0, i32* %i, align 4 |
| br label %for.cond |
| |
| for.cond: ; preds = %for.inc24, %entry |
| %0 = load i32, i32* %i, align 4 |
| %cmp = icmp slt i32 %0, 2 |
| br i1 %cmp, label %for.body, label %for.end26 |
| |
| for.body: ; preds = %for.cond |
| store i32 0, i32* %j, align 4 |
| br label %for.cond1 |
| |
| for.cond1: ; preds = %for.inc21, %for.body |
| %1 = load i32, i32* %j, align 4 |
| %cmp2 = icmp slt i32 %1, 2 |
| br i1 %cmp2, label %for.body3, label %for.end23 |
| |
| for.body3: ; preds = %for.cond1 |
| %2 = load [2 x i32]*, [2 x i32]** %res.addr, align 8 |
| %3 = load i32, i32* %i, align 4 |
| %idxprom = sext i32 %3 to i64 |
| %arrayidx = getelementptr inbounds [2 x i32], [2 x i32]* %2, i64 %idxprom |
| %4 = load i32, i32* %j, align 4 |
| %idxprom4 = sext i32 %4 to i64 |
| %arrayidx5 = getelementptr inbounds [2 x i32], [2 x i32]* %arrayidx, i64 0, i64 %idxprom4 |
| store i32 0, i32* %arrayidx5, align 4 |
| store i32 0, i32* %k, align 4 |
| br label %for.cond6 |
| |
| for.cond6: ; preds = %for.inc, %for.body3 |
| %5 = load i32, i32* %k, align 4 |
| %cmp7 = icmp slt i32 %5, 2 |
| br i1 %cmp7, label %for.body8, label %for.end |
| |
| for.body8: ; preds = %for.cond6 |
| %6 = load [2 x i32]*, [2 x i32]** %mat1.addr, align 8 |
| %7 = load i32, i32* %i, align 4 |
| %idxprom9 = sext i32 %7 to i64 |
| %arrayidx10 = getelementptr inbounds [2 x i32], [2 x i32]* %6, i64 %idxprom9 |
| %8 = load i32, i32* %k, align 4 |
| %idxprom11 = sext i32 %8 to i64 |
| %arrayidx12 = getelementptr inbounds [2 x i32], [2 x i32]* %arrayidx10, i64 0, i64 %idxprom11 |
| %9 = load i32, i32* %arrayidx12, align 4 |
| %10 = load [2 x i32]*, [2 x i32]** %mat2.addr, align 8 |
| %11 = load i32, i32* %k, align 4 |
| %idxprom13 = sext i32 %11 to i64 |
| %arrayidx14 = getelementptr inbounds [2 x i32], [2 x i32]* %10, i64 %idxprom13 |
| %12 = load i32, i32* %j, align 4 |
| %idxprom15 = sext i32 %12 to i64 |
| %arrayidx16 = getelementptr inbounds [2 x i32], [2 x i32]* %arrayidx14, i64 0, i64 %idxprom15 |
| %13 = load i32, i32* %arrayidx16, align 4 |
| %mul = mul nsw i32 %9, %13 |
| %14 = load [2 x i32]*, [2 x i32]** %res.addr, align 8 |
| %15 = load i32, i32* %i, align 4 |
| %idxprom17 = sext i32 %15 to i64 |
| %arrayidx18 = getelementptr inbounds [2 x i32], [2 x i32]* %14, i64 %idxprom17 |
| %16 = load i32, i32* %j, align 4 |
| %idxprom19 = sext i32 %16 to i64 |
| %arrayidx20 = getelementptr inbounds [2 x i32], [2 x i32]* %arrayidx18, i64 0, i64 %idxprom19 |
| %17 = load i32, i32* %arrayidx20, align 4 |
| %add = add nsw i32 %17, %mul |
| store i32 %add, i32* %arrayidx20, align 4 |
| br label %for.inc |
| |
| for.inc: ; preds = %for.body8 |
| %18 = load i32, i32* %k, align 4 |
| %inc = add nsw i32 %18, 1 |
| store i32 %inc, i32* %k, align 4 |
| br label %for.cond6 |
| |
| for.end: ; preds = %for.cond6 |
| br label %for.inc21 |
| |
| for.inc21: ; preds = %for.end |
| %19 = load i32, i32* %j, align 4 |
| %inc22 = add nsw i32 %19, 1 |
| store i32 %inc22, i32* %j, align 4 |
| br label %for.cond1 |
| |
| for.end23: ; preds = %for.cond1 |
| br label %for.inc24 |
| |
| for.inc24: ; preds = %for.end23 |
| %20 = load i32, i32* %i, align 4 |
| %inc25 = add nsw i32 %20, 1 |
| store i32 %inc25, i32* %i, align 4 |
| br label %for.cond |
| |
| for.end26: ; preds = %for.cond |
| ret void |
| } |
| |
| ; CHECK-DAG: BasicBlockCount: 13 |
| ; CHECK-DAG: BlocksReachedFromConditionalInstruction: 6 |
| ; CHECK-DAG: Uses: 2 |
| ; CHECK-DAG: DirectCallsToDefinedFunctions: 0 |
| ; CHECK-DAG: LoadInstCount: 21 |
| ; CHECK-DAG: StoreInstCount: 11 |
| ; CHECK-DAG: MaxLoopDepth: 3 |
| ; CHECK-DAG: TopLevelLoopCount: 1 |