FILECHECK(1) LLVM FILECHECK(1) (NAME) FileCheck - (SYNOPSIS) FileCheck match-filename [--check-prefix=XXX] [--strict-whitespace] (DESCRIPTION) FileCheck ( ) . ( llc) ( movsd esp ). grep . match-filename . --input-file . (OPTIONS) FILECHECK_OPTS . -help . --check-prefix prefix FileCheck match-filename . "CHECK:" . ( ) --check-prefix ( ":" ) . . FileCheck ( --comment-prefixes ). --check-prefixes prefix1,prefix2,... --check-prefix . --comment-prefixes prefix1,prefix2,... FileCheck match-filename "COM:" "RUN:" . "COM:" . --comment-prefixes . LIT LLVM . . --allow-unused-prefixes ( --check-prefix --check-prefixes) . true false FileCheck . false . --input-file filename ( stdin ). --match-full-lines FileCheck . . --strict-whitespace . (: CHECK-NOT !) {{^ *}} {{^}} {{ *$}} {{$}} . --strict-whitespace FileCheck ( ) (canonicalize) ( ). --strict-whitespace . \n . --ignore-case FileCheck . FileCheck . --implicit-check-not check-pattern . CHECK-NOT . "--implicit-check-not warning:" clang -verify . FileCheck CHECK: . --dump-input (dump) stderr . . fail . o help - o always - o fail - o never - --dump-input-context --dump-input --dump-input-filter . . . --dump-input-filter --dump-input --dump-input-context . . --dump-input=fail error --dump-input=always all . o all - o annotation-full - o annotation - o error - --enable-var-scope (scope) (regex) . $ (global) . CHECK-LABEL . -D filecheck VAR VALUE CHECK: . -D#,= filecheck NUMVAR FMT CHECK: . FileCheck Numeric Variables and Expressions . -version . -v . -dump-input=fail -dump-input=always . -vv FileCheck CHECK-DAG: EOF CHECK-NOT: . -v . -dump-input=fail -dump-input=always . --allow-deprecated-dag-overlap CHECK-DAG: . CHECK-DAG: . --allow-empty . . --color ( ). (EXIT STATUS) FileCheck 0 . . (TUTORIAL) FileCheck LLVM RUN . FileCheck RUN : ; RUN: llvm-as < %s | llc -march=x86-64 | FileCheck %s ("%s") llvm-as (pipe) llc llc FileCheck . FileCheck ( llc) ( .ll "%s" ) . .ll ( RUN) : define void @sub1(i32* %p, i32 %v) { entry: ; CHECK: sub1: ; CHECK: subl %0 = tail call i32 @llvm.atomic.load.sub.i32.p0i32(i32* %p, i32 %v) ret void } define void @inc4(i64* %p) { entry: ; CHECK: inc4: ; CHECK: incq %0 = tail call i64 @llvm.atomic.load.add.i64.p0i64(i64* %p, i64 1) ret void } "CHECK:" . llvm-as llc . FileCheck "CHECK:" . "CHECK:" : . FileCheck ( ) "CHECK:" . FileCheck ( grep) . "sub1:" "inc4:" "subl" . "grep subl" "subl" . -check-prefix FileCheck -check-prefix FileCheck .ll . llc. : ; RUN: llvm-as < %s | llc -mtriple=i686-apple-darwin9 -mattr=sse41 \ ; RUN: | FileCheck %s -check-prefix=X32 ; RUN: llvm-as < %s | llc -mtriple=x86_64-apple-darwin9 -mattr=sse41 \ ; RUN: | FileCheck %s -check-prefix=X64 define <4 x i32> @pinsrd_1(i32 %s, <4 x i32> %tmp) nounwind { %tmp1 = insertelement <4 x i32>; %tmp, i32 %s, i32 1 ret <4 x i32> %tmp1 ; X32: pinsrd_1: ; X32: pinsrd $1, 4(%esp), %xmm0 ; X64: pinsrd_1: ; X64: pinsrd $1, %edi, %xmm0 } ..SS "COM:" FileCheck . "COM:" . : ; X32: pinsrd_1: ; X32: pinsrd $1, 4(%esp), %xmm0 ; COM: FIXME: X64 isn't working correctly yet for this part of codegen, but ; COM: X64 will have something similar to X32: ; COM: ; COM: X64: pinsrd_1: ; COM: X64: pinsrd $1, %edi, %xmm0 "COM:" "X32:" "X64:" FileCheck . FileCheck "X64" ":" . . "COM:" . : o "COM:" . : ; X32: pinsrd $1, 4(%esp), %xmm0 COM: This is part of the X32 pattern! . FileCheck "COM:" : . o LIT FileCheck "RUN:" "COM:" . --comment-prefixes . o FileCheck "COM" "RUN" "-NEXT:" "-NOT:" ( ) . FileCheck . --comment-prefixes . "CHECK-NEXT:" . "CHECK:" "CHECK-NEXT:" . "-NEXT:" . : define void @t2(<2 x double>* %r, <2 x double>* %A, double %B) { %tmp3 = load <2 x double>* %A, align 16 %tmp7 = insertelement <2 x double> undef, double %B, i32 0 %tmp9 = shufflevector <2 x double> %tmp3, <2 x double> %tmp7, <2 x i32> < i32 0, i32 2 > store <2 x double> %tmp9, <2 x double>* %r, align 16 ret void ; CHECK: t2: ; CHECK: movl 8(%esp), %eax ; CHECK-NEXT: movapd (%eax), %xmm0 ; CHECK-NEXT: movhpd 12(%esp), %xmm0 ; CHECK-NEXT: movl 4(%esp), %eax ; CHECK-NEXT: movapd %xmm0, (%eax) ; CHECK-NEXT: ret } "CHECK-NEXT:" . "CHECK-NEXT:" . "CHECK-SAME:" . "CHECK:" "CHECK-SAME:" . "-SAME:" . "CHECK-SAME:" "CHECK-NOT:" ( ) . : !0 = !DILocation(line: 5, scope: !1, inlinedAt: !2) ; CHECK: !DILocation(line: 5, ; CHECK-NOT: column: ; CHECK-SAME: scope: ![[SCOPE:[0-9]+]] "CHECK-SAME:" . "CHECK-SAME:" . : Name: foo Field1: ... Field2: ... Field3: ... Value: 1 Name: bar Field1: ... Field2: ... Field3: ... Value: 2 Name: baz Field1: ... Field2: ... Field3: ... Value: 1 foo 1 : CHECK: Name: foo CHECK: Value: 1{{$}} : foo "CHECK: Value: 1" baz . CHECK-NEXT FieldN: Field4 . "CHECK-SAME:" : CHECK: Name: foo CHECK: Value: CHECK-SAME: {{ 1$}} "Value:" 1 . : "CHECK-SAME:" ..SS "CHECK-EMPTY:" (whitespace) "CHECK-EMPTY:" . declare void @foo() declare void @bar() ; CHECK: foo ; CHECK-EMPTY: ; CHECK-NEXT: bar "CHECK-NEXT:" . "CHECK-NOT:" "CHECK-NOT:" ( ) . (load) : define i8 @coerce_offset0(i32 %V, i32* %P) { store i32 %V, i32* %P %P2 = bitcast i32* %P to i8* %P3 = getelementptr i8* %P2, i32 2 %A = load i8* %P3 ret i8 %A ; CHECK: @coerce_offset0 ; CHECK-NOT: load ; CHECK: ret i8 } "CHECK-COUNT:" CHECK: . "CHECK-COUNT-:" . . "-COUNT-:" . : Loop at depth 1 Loop at depth 1 Loop at depth 1 Loop at depth 1 Loop at depth 2 Loop at depth 3 ; CHECK-COUNT-6: Loop at depth {{[0-9]+}} ; CHECK-NOT: Loop at depth {{[0-9]+}} "CHECK-DAG:" "CHECK-DAG:" ( ) . clang vtable . CHECK-DAG: : // RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s struct Foo { virtual void method(); }; Foo f; // emit vtable // CHECK-DAG: @_ZTV3Foo = struct Bar { virtual void method(); }; Bar b; // CHECK-DAG: @_ZTV3Bar = CHECK-NOT: CHECK-DAG: CHECK-DAG: . CHECK-DAG: CHECK-DAG: CHECK-NOT: CHECK-DAG: CHECK-NOT: . ; CHECK-DAG: BEFORE ; CHECK-NOT: NOT ; CHECK-DAG: AFTER BEFORE AFTER . CHECK-DAG: DAG . (instruction scheduler) . ; CHECK-DAG: add [[REG1:r[0-9]+]], r1, r2 ; CHECK-DAG: add [[REG2:r[0-9]+]], r3, r4 ; CHECK: mul r5, [[REG1]], [[REG2]] add . CHECK-DAG: . : ; CHECK-DAG: vmov.32 [[REG2:d[0-9]+]][0] ; CHECK-DAG: vmov.32 [[REG2]][1] vmov.32 d0[1] vmov.32 d0[0] : ; CHECK-DAG: vmov.32 [[REG2:d[0-9]+]][0] ; CHECK-DAG: vmov.32 [[REG2]][1] vmov.32 d1[1] vmov.32 d0[0] ( ). ( ) . DAG DAG . CHECK-DAG: CHECK-DAG: CHECK-DAG: . . OpenMP : // CHECK-DAG: [[THREAD_ID:[0-9]+]]: task_begin // CHECK-DAG: [[THREAD_ID]]: task_end // // CHECK-DAG: [[THREAD_ID:[0-9]+]]: task_begin // CHECK-DAG: [[THREAD_ID]]: task_end thread ..SS "CHECK-LABEL:" CHECK: . . "CHECK-LABEL:" . CHECK FileCheck match-filename . CHECK-LABEL CHECK: . --enable-var-scope . define %struct.C* @C_ctor_base(%struct.C* %this, i32 %x) { entry: ; CHECK-LABEL: C_ctor_base: ; CHECK: mov [[SAVETHIS:r[0-9]+]], r0 ; CHECK: bl A_ctor_base ; CHECK: mov r0, [[SAVETHIS]] %0 = bitcast %struct.C* %this to %struct.A* %call = tail call %struct.A* @A_ctor_base(%struct.A* %0) %1 = bitcast %struct.C* %this to %struct.B* %call2 = tail call %struct.B* @B_ctor_base(%struct.B* %1, i32 %x) ret %struct.C* %this } define %struct.D* @D_ctor_base(%struct.D* %this, i32 %x) { entry: ; CHECK-LABEL: D_ctor_base: CHECK-LABEL: CHECK: @C_ctor_base . CHECK: FileCheck . CHECK-LABEL: : . CHECK-LABEL: . {} LITERAL . LITERAL (literal) . (regex) . (escaping) . : Input: [[[10, 20]], [[30, 40]]] Output %r10: [[10, 20]] Output %r10: [[30, 40]] ; CHECK{LITERAL}: [[[10, 20]], [[30, 40]]] ; CHECK-DAG{LITERAL}: [[30, 40]] ; CHECK-DAG{LITERAL}: [[10, 20]] FileCheck FileCheck . FileCheck . . FileCheck : {{yourregex}}. FileCheck POSIX POSIX (ERE) . FileCheck . : ; CHECK: movhpd {{[0-9]+}}(%esp), {{%xmm[0-7]}} ESP xmm . C . {{[}][}]}} . [[:xdigit:]]{8} : {{([[:xdigit:]]{8})}} FileCheck . FileCheck . (codegen) . FileCheck . : ; CHECK: test5: ; CHECK: notw [[REGISTER:%[a-z]+]] ; CHECK: andw {{.*}}[[REGISTER]] %[a-z]+ REGISTER . REGISTER "andw" . FileCheck [[ ]] \$[a-zA-Z_][a-zA-Z0-9_]* . . FileCheck . . : ; CHECK: op [[REG:r[0-9]+]], [[REG]] op . --enable-var-scope $ (global) . (local) . CHECK-LABEL (undefined) . CHECK-LABEL . ..SS FileCheck FileCheck . CHECK: . [[#%,:]] : o %, . o : . #. : o # (hex) ( ) 0x . o . printf . o scanf ( ). %u %d %x %X . %u . : ; CHECK: mov r[[#REG:]], 0x[[#%.8X,ADDR:]] mov r5, 0x0000FEFE REG 5 ADDR 0xFEFE . mov r5, 0xFEFE . . : ; CHECK-NOT: mov r0, r[[#]] () . [[#%, ]] : o . () ( ) %u . . o . == . . o . : o o . . . . . . : o + - . o - - . () : o name . : o add - . o div - . o max - . o min - . o mul - . o sub - . o . : ; CHECK: load r[[#REG:]], [r0] ; CHECK: load r[[#REG+1]], [r1] ; CHECK: Loading from 0x[[#%x,ADDR:]] ; CHECK-SAME: to 0x[[#ADDR + 7]] : load r5, [r0] load r6, [r1] Loading from 0xa0463440 to 0xa0463447 : load r5, [r0] load r7, [r1] Loading from 0xa0463440 to 0xa0463443 7 5 + 1 a0463443 a0463440 + 7 . . [[#%,: ]] . (testcase) : ; CHECK: mov r[[#REG_OFFSET:]], 0x[[#%X,FIELD_OFFSET:12]] ; CHECK-NEXT: load r[[#]], [r[[#REG_BASE:]], r[[#REG_OFFSET]]] : mov r4, 0xC load r6, [r5, r4] --enable-var-scope . : CHECK ..SS FileCheck (compiler diagnostics). "CHECK:" . FileCheck @LINE CHECK . : // CHECK: test.cpp:[[# @LINE + 4]]:6: error: expected ';' after top level declarator // CHECK-NEXT: {{^int a}} // CHECK-NEXT: {{^ \^}} // CHECK-NEXT: {{^ ;}} int a @LINE FileCheck @LINE : [[@LINE]] [[@LINE+]] [[@LINE-]] offset . [[:space:]] . : // CHECK: DW_AT_location [DW_FORM_sec_offset] ([[DLOC:0x[0-9a-f]+]]){{[[:space:]].*}}"intd" ( llvm-dwarfdump) : DW_AT_location [DW_FORM_sec_offset] (0x00000233) DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000c9] = "intd") DLOC FileCheck 0x00000233 "intd" . (AUTHORS) LLVM (https://llvm.org). (COPYRIGHT) 2003-2026, LLVM Project 22 2026-07-15 FILECHECK(1)