%vec = type [2 x i64] %mat = type [2 x %vec] @mat1 = global %mat [ %vec [ i64 1, i64 2 ], %vec [ i64 3, i64 4 ] ] @mat2 = global %mat [ %vec [ i64 5, i64 6 ], %vec [ i64 7, i64 8 ] ] @mat3 = global %mat [ %vec [ i64 19, i64 22 ], %vec [ i64 43, i64 50 ] ] @matr = global %mat [ %vec [ i64 0, i64 0 ], %vec [ i64 0, i64 0 ] ] define i64 @main(i64 %argc, i8** %argv) { %cnt = alloca i64 store i64 10000000, i64* %cnt br label %loop loop: %tmp = load i64, i64* %cnt %b = icmp eq i64 %tmp, 0 br i1 %b, label %exit, label %body body: call void @matmul(%mat* @mat1, %mat* @mat2, %mat* @matr) %ans = call i64 @mateq(%mat* @mat3, %mat* @matr) %tmp2 = load i64, i64* %cnt %tmp3 = sub i64 %tmp2, 1 store i64 %tmp3, i64* %cnt br label %loop exit: ret i64 0 } define void @matmul(%mat* %a, %mat* %b, %mat* %c) { %i = alloca i64 %j = alloca i64 store i64 0, i64* %i br label %starti starti: %iv = load i64, i64* %i %ic = icmp slt i64 %iv, 2 br i1 %ic, label %theni, label %endi theni: store i64 0, i64* %j br label %startj startj: %jv = load i64, i64* %j %jc = icmp slt i64 %jv, 2 br i1 %jc, label %thenj, label %endj thenj: %r = getelementptr %mat, %mat* %c, i32 0, i64 %iv, i64 %jv %a1 = getelementptr %mat, %mat* %a, i32 0, i64 %iv, i32 0 %b1 = getelementptr %mat, %mat* %b, i32 0, i32 0, i64 %jv %a2 = getelementptr %mat, %mat* %a, i32 0, i64 %iv, i32 1 %b2 = getelementptr %mat, %mat* %b, i32 0, i32 1, i64 %jv %a1v = load i64, i64* %a1 %b1v = load i64, i64* %b1 %a2v = load i64, i64* %a2 %b2v = load i64, i64* %b2 %ab1 = mul i64 %a1v, %b1v %ab2 = mul i64 %a2v, %b2v %ab = add i64 %ab1, %ab2 store i64 %ab, i64* %r %jinc = add i64 %jv, 1 store i64 %jinc, i64* %j br label %startj endj: %iinc = add i64 %iv, 1 store i64 %iinc, i64* %i br label %starti endi: ret void } define i64 @mateq(%mat* %ma, %mat* %mb) { %r = alloca i64 store i64 0, i64* %r %i = alloca i64 %j = alloca i64 store i64 0, i64* %i br label %starti1 starti1: %iv = load i64, i64* %i %ic = icmp slt i64 %iv, 2 br i1 %ic, label %theni1, label %endi1 theni1: store i64 0, i64* %j br label %startj1 startj1: %jv = load i64, i64* %j %jc = icmp slt i64 %jv, 2 br i1 %jc, label %thenj1, label %endj1 thenj1: %a = getelementptr %mat, %mat* %ma, i32 0, i64 %iv, i64 %jv %b = getelementptr %mat, %mat* %mb, i32 0, i64 %iv, i64 %jv %av = load i64, i64* %a %bv = load i64, i64* %b %cmp = xor i64 %av, %bv %rv = load i64, i64* %r %tmp = or i64 %cmp, %rv store i64 %tmp, i64* %r %jinc = add i64 %jv, 1 store i64 %jinc, i64* %j br label %startj1 endj1: %iinc = add i64 %iv, 1 store i64 %iinc, i64* %i br label %starti1 endi1: %rv1 = load i64, i64* %r ret i64 %rv1 }