MLIR 언어 레퍼런스 — 텍스트 형식의 문법
MLIR 언어 레퍼런스 — 텍스트 형식의 문법
MLIR은 디버깅할 때 눈으로 읽고, 변환할 때 프로그램으로 다루고, 저장·전송할 때 압축된 형태로 써요. 이 페이지는 그중 사람이 읽는 텍스트 형식의 문법을 정의하는 레퍼런스예요.
MLIR 문법은 EBNF(Extended Backus-Naur Form)로 엄밀하게 정의돼 있고, 텍스트 형식이 왔다 갔다 반올림(round-trip)돼도 동일하게 재현되는 걸 목표로 해요. 이는 변환 과정의 상태를 이해하고 테스트 케이스를 쓰는 데 아주 중요해요.
식별자는 시길(sigil)로 키워드와 충돌을 회피해요. 값은 %, 심볼은 @, 속성·타입 별칭은 # 를 접두어로 써요. 그래서 앞으로 키워드가 추가돼도 기존 식별자와 부딪히지 않아요.
// 두 memref를 곱해 결과를 반환하는 함수
func.func @multiply(%A: memref<100x?xf32>, %B: memref<?x50xf32>) -> memref<100x50xf32> {
%C = memref.alloc() : memref<100x50xf32>
affine.for %i = 0 to 100 {
affine.for %j = 0 to 50 {
affine.for %k = 0 to %n {
%a_v = memref.load %A[%i, %k] : memref<100x?xf32>
%b_v = memref.load %B[%k, %j] : memref<?x50xf32>
%prod = arith.mulf %a_v, %b_v : f32
%c_v = memref.load %C[%i, %j] : memref<100x50xf32>
%sum = arith.addf %c_v, %prod : f32
memref.store %sum, %C[%i, %j] : memref<100x50xf32>
}
}
}
return %C : memref<100x50xf32>
}
값 식별자는 정의된 영역 안에서만 유효해요. SSA 제어 흐름을 가진 영역은 표준 SSA 도미넌스 규칙을 따르고, IsolatedFromAbove 같은 trait은 바깥 영역에서 정의된 값을 직접 참조하지 못하게 제한해요.
속성 값은 사전(dictionary) 형태로 연산에 붙고, #map = affine_map<(d0) -> (d0 + 10)> 처럼 별칭을 정의해 재사용할 수 있어요. 다이얼렉트마다 고유한 속성 값도 정의할 수 있어서 pretty 형식으로 간결하게 표현해요.