Browse Source

initial commit: compiler and bf examples

master
Joshua Moerman 8 years ago
commit
331b3ffd20
  1. 2
      .gitignore
  2. 23
      CMakeLists.txt
  3. 44
      bf/99bot.bf
  4. 7210
      bf/99bot.bf.ll
  5. 1
      bf/ascii.bf
  6. 38
      bf/ascii.bf.ll
  7. 3
      bf/hello2.bf
  8. 539
      bf/hello2.bf.ll
  9. 1
      bf/helloworld.bf
  10. 324
      bf/helloworld.bf.ll
  11. 221
      bf/primes.bf
  12. 3590
      bf/primes.bf.ll
  13. 11
      bf/quine.bf
  14. 1853
      bf/quine.bf.ll
  15. 18
      bf/rot13.bf
  16. 2519
      bf/rot13.bf.ll
  17. 1
      bf/test.bf
  18. 109
      bf/test.bf.ll
  19. 0
      bf/test2.bf
  20. 19
      bf/test2.bf.ll
  21. 1
      bf/upper.bf
  22. 197
      bf/upper.bf.ll
  23. 145
      main.cpp
  24. 1
      optimize.sh
  25. 68
      output
  26. 2
      run.sh
  27. 5
      vanillabuild.sh

2
.gitignore

@ -0,0 +1,2 @@
build

23
CMakeLists.txt

@ -0,0 +1,23 @@
cmake_minimum_required(VERSION 2.8)
project(LLVMCompiler)
file(GLOB sources "*.cpp")
add_executable(LLVMCompiler ${sources})
include_directories("${PROJECT_SOURCE_DIR}")
# A convenience variable:
set(LLVM_ROOT "/Users/joshua/Documents/Code/build")
# Now set the header and library paths:
include_directories( SYSTEM ${LLVM_ROOT}/include )
link_directories( ${LLVM_ROOT}/Release/lib )
add_definitions( -DNDEBUG -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -O3 -stdlib=libc++ -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fno-common -Woverloaded-virtual -Wcast-qual)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++ -nostdinc++ -I ~/Documents/Code/libcxx/include/")
# Finally, we link the LLVM libraries to our executable:
# left out gtest_main gtest
target_link_libraries(LLVMCompiler pthread m
LLVMAsmParser LLVMInstrumentation LLVMLinker LLVMArchive LLVMBitReader LLVMDebugInfo LLVMOption LLVMipo LLVMVectorize LLVMBitWriter LLVMTableGen LLVMHexagonCodeGen LLVMHexagonDesc LLVMHexagonInfo LLVMHexagonAsmPrinter LLVMNVPTXCodeGen LLVMNVPTXDesc LLVMNVPTXInfo LLVMNVPTXAsmPrinter LLVMMBlazeDisassembler LLVMMBlazeCodeGen LLVMMBlazeDesc LLVMMBlazeAsmPrinter LLVMMBlazeAsmParser LLVMMBlazeInfo LLVMCppBackendCodeGen LLVMCppBackendInfo LLVMMSP430CodeGen LLVMMSP430Desc LLVMMSP430Info LLVMMSP430AsmPrinter LLVMXCoreDisassembler LLVMXCoreCodeGen LLVMXCoreDesc LLVMXCoreInfo LLVMXCoreAsmPrinter LLVMMipsDisassembler LLVMMipsCodeGen LLVMMipsAsmParser LLVMMipsDesc LLVMMipsInfo LLVMMipsAsmPrinter LLVMARMDisassembler LLVMARMCodeGen LLVMARMAsmParser LLVMARMDesc LLVMARMInfo LLVMARMAsmPrinter LLVMPowerPCCodeGen LLVMPowerPCDesc LLVMPowerPCInfo LLVMPowerPCAsmPrinter LLVMSparcCodeGen LLVMSparcDesc LLVMSparcInfo LLVMX86Disassembler LLVMX86AsmParser LLVMX86CodeGen LLVMSelectionDAG LLVMAsmPrinter LLVMX86Desc LLVMX86Info LLVMX86AsmPrinter LLVMX86Utils LLVMMCDisassembler LLVMMCParser LLVMInterpreter LLVMMCJIT LLVMJIT LLVMCodeGen LLVMScalarOpts LLVMInstCombine LLVMTransformUtils LLVMipa LLVMAnalysis LLVMRuntimeDyld LLVMExecutionEngine LLVMTarget LLVMMC LLVMObject LLVMCore LLVMSupport)

44
bf/99bot.bf

@ -0,0 +1,44 @@
>+++++++++[<+++++++++++>-]<[>[-]>[-]<<[>+>+<<-]>>[<<+>>-]>>>
[-]<<<+++++++++<[>>>+<<[>+>[-]<<-]>[<+>-]>[<<++++++++++>>>+<
-]<<-<-]+++++++++>[<->-]>>+>[<[-]<<+>>>-]>[-]+<<[>+>-<<-]<<<
[>>+>+<<<-]>>>[<<<+>>>-]>[<+>-]<<-[>[-]<[-]]>>+<[>[-]<-]<+++
+++++[<++++++<++++++>>-]>>>[>+>+<<-]>>[<<+>>-]<[<<<<<.>>>>>-
]<<<<<<.>>[-]>[-]++++[<++++++++>-]<.>++++[<++++++++>-]<++.>+
++++[<+++++++++>-]<.><+++++..--------.-------.>>[>>+>+<<<-]>
>>[<<<+>>>-]<[<<<<++++++++++++++.>>>>-]<<<<[-]>++++[<+++++++
+>-]<.>+++++++++[<+++++++++>-]<--.---------.>+++++++[<------
---->-]<.>++++++[<+++++++++++>-]<.+++..+++++++++++++.>++++++
++[<---------->-]<--.>+++++++++[<+++++++++>-]<--.-.>++++++++
[<---------->-]<++.>++++++++[<++++++++++>-]<++++.-----------
-.---.>+++++++[<---------->-]<+.>++++++++[<+++++++++++>-]<-.
>++[<----------->-]<.+++++++++++..>+++++++++[<---------->-]<
-----.---.>>>[>+>+<<-]>>[<<+>>-]<[<<<<<.>>>>>-]<<<<<<.>>>+++
+[<++++++>-]<--.>++++[<++++++++>-]<++.>+++++[<+++++++++>-]<.
><+++++..--------.-------.>>[>>+>+<<<-]>>>[<<<+>>>-]<[<<<<++
++++++++++++.>>>>-]<<<<[-]>++++[<++++++++>-]<.>+++++++++[<++
+++++++>-]<--.---------.>+++++++[<---------->-]<.>++++++[<++
+++++++++>-]<.+++..+++++++++++++.>++++++++++[<---------->-]<
-.---.>+++++++[<++++++++++>-]<++++.+++++++++++++.++++++++++.
------.>+++++++[<---------->-]<+.>++++++++[<++++++++++>-]<-.
-.---------.>+++++++[<---------->-]<+.>+++++++[<++++++++++>-
]<--.+++++++++++.++++++++.---------.>++++++++[<---------->-]
<++.>+++++[<+++++++++++++>-]<.+++++++++++++.----------.>++++
+++[<---------->-]<++.>++++++++[<++++++++++>-]<.>+++[<----->
-]<.>+++[<++++++>-]<..>+++++++++[<--------->-]<--.>+++++++[<
++++++++++>-]<+++.+++++++++++.>++++++++[<----------->-]<++++
.>+++++[<+++++++++++++>-]<.>+++[<++++++>-]<-.---.++++++.----
---.----------.>++++++++[<----------->-]<+.---.[-]<<<->[-]>[
-]<<[>+>+<<-]>>[<<+>>-]>>>[-]<<<+++++++++<[>>>+<<[>+>[-]<<-]
>[<+>-]>[<<++++++++++>>>+<-]<<-<-]+++++++++>[<->-]>>+>[<[-]<
<+>>>-]>[-]+<<[>+>-<<-]<<<[>>+>+<<<-]>>>[<<<+>>>-]<>>[<+>-]<
<-[>[-]<[-]]>>+<[>[-]<-]<++++++++[<++++++<++++++>>-]>>>[>+>+
<<-]>>[<<+>>-]<[<<<<<.>>>>>-]<<<<<<.>>[-]>[-]++++[<++++++++>
-]<.>++++[<++++++++>-]<++.>+++++[<+++++++++>-]<.><+++++..---
-----.-------.>>[>>+>+<<<-]>>>[<<<+>>>-]<[<<<<++++++++++++++
.>>>>-]<<<<[-]>++++[<++++++++>-]<.>+++++++++[<+++++++++>-]<-
-.---------.>+++++++[<---------->-]<.>++++++[<+++++++++++>-]
<.+++..+++++++++++++.>++++++++[<---------->-]<--.>+++++++++[
<+++++++++>-]<--.-.>++++++++[<---------->-]<++.>++++++++[<++
++++++++>-]<++++.------------.---.>+++++++[<---------->-]<+.
>++++++++[<+++++++++++>-]<-.>++[<----------->-]<.+++++++++++
..>+++++++++[<---------->-]<-----.---.+++.---.[-]<<<]

7210
bf/99bot.bf.ll

File diff suppressed because it is too large

1
bf/ascii.bf

@ -0,0 +1 @@
+[.+]

38
bf/ascii.bf.ll

@ -0,0 +1,38 @@
; ModuleID = 'asdf'
declare i32 @getchar()
declare i32 @putchar(i32)
define i32 @main() {
%malloccall = tail call i8* @malloc(i32 mul (i32 ptrtoint (i8* getelementptr (i8* null, i32 1) to i32), i32 100))
call void @llvm.memset.p0i8.i32(i8* %malloccall, i8 0, i32 100, i32 1, i1 false)
%1 = getelementptr i8* %malloccall, i32 50
%2 = load i8* %1
%3 = add i8 %2, 1
store i8 %3, i8* %1
%4 = load i8* %1
%5 = icmp ne i8 %4, 0
br i1 %5, label %6, label %14
; <label>:6 ; preds = %6, %0
%7 = load i8* %1
%8 = sext i8 %7 to i32
%9 = call i32 @putchar(i32 %8)
%10 = load i8* %1
%11 = add i8 %10, 1
store i8 %11, i8* %1
%12 = load i8* %1
%13 = icmp ne i8 %12, 0
br i1 %13, label %6, label %14
; <label>:14 ; preds = %6, %0
tail call void @free(i8* %malloccall)
ret i32 0
}
declare noalias i8* @malloc(i32)
declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind
declare void @free(i8*)

3
bf/hello2.bf

@ -0,0 +1,3 @@
>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++++>-]
<.>+++++++++++[<++++++++>-]<-.--------.+++.------.--------.[-]>++++++++[<++++>-
]<+.[-]++++++++++.

539
bf/hello2.bf.ll

@ -0,0 +1,539 @@
; ModuleID = 'asdf'
declare i32 @getchar()
declare i32 @putchar(i32)
define i32 @main() {
%malloccall = tail call i8* @malloc(i32 mul (i32 ptrtoint (i8* getelementptr (i8* null, i32 1) to i32), i32 100))
call void @llvm.memset.p0i8.i32(i8* %malloccall, i8 0, i32 100, i32 1, i1 false)
%1 = getelementptr i8* %malloccall, i32 50
%2 = getelementptr i8* %1, i32 1
%3 = load i8* %2
%4 = add i8 %3, 1
store i8 %4, i8* %2
%5 = load i8* %2
%6 = add i8 %5, 1
store i8 %6, i8* %2
%7 = load i8* %2
%8 = add i8 %7, 1
store i8 %8, i8* %2
%9 = load i8* %2
%10 = add i8 %9, 1
store i8 %10, i8* %2
%11 = load i8* %2
%12 = add i8 %11, 1
store i8 %12, i8* %2
%13 = load i8* %2
%14 = add i8 %13, 1
store i8 %14, i8* %2
%15 = load i8* %2
%16 = add i8 %15, 1
store i8 %16, i8* %2
%17 = load i8* %2
%18 = add i8 %17, 1
store i8 %18, i8* %2
%19 = load i8* %2
%20 = add i8 %19, 1
store i8 %20, i8* %2
%21 = load i8* %2
%22 = icmp ne i8 %21, 0
br i1 %22, label %23, label %46
; <label>:23 ; preds = %23, %0
%24 = getelementptr i8* %2, i32 -1
%25 = load i8* %24
%26 = add i8 %25, 1
store i8 %26, i8* %24
%27 = load i8* %24
%28 = add i8 %27, 1
store i8 %28, i8* %24
%29 = load i8* %24
%30 = add i8 %29, 1
store i8 %30, i8* %24
%31 = load i8* %24
%32 = add i8 %31, 1
store i8 %32, i8* %24
%33 = load i8* %24
%34 = add i8 %33, 1
store i8 %34, i8* %24
%35 = load i8* %24
%36 = add i8 %35, 1
store i8 %36, i8* %24
%37 = load i8* %24
%38 = add i8 %37, 1
store i8 %38, i8* %24
%39 = load i8* %24
%40 = add i8 %39, 1
store i8 %40, i8* %24
%41 = getelementptr i8* %24, i32 1
%42 = load i8* %41
%43 = sub i8 %42, 1
store i8 %43, i8* %41
%44 = load i8* %41
%45 = icmp ne i8 %44, 0
br i1 %45, label %23, label %46
; <label>:46 ; preds = %23, %0
%47 = getelementptr i8* %41, i32 -1
%48 = load i8* %47
%49 = sext i8 %48 to i32
%50 = call i32 @putchar(i32 %49)
%51 = getelementptr i8* %47, i32 1
%52 = load i8* %51
%53 = add i8 %52, 1
store i8 %53, i8* %51
%54 = load i8* %51
%55 = add i8 %54, 1
store i8 %55, i8* %51
%56 = load i8* %51
%57 = add i8 %56, 1
store i8 %57, i8* %51
%58 = load i8* %51
%59 = add i8 %58, 1
store i8 %59, i8* %51
%60 = load i8* %51
%61 = add i8 %60, 1
store i8 %61, i8* %51
%62 = load i8* %51
%63 = add i8 %62, 1
store i8 %63, i8* %51
%64 = load i8* %51
%65 = add i8 %64, 1
store i8 %65, i8* %51
%66 = load i8* %51
%67 = icmp ne i8 %66, 0
br i1 %67, label %68, label %83
; <label>:68 ; preds = %68, %46
%69 = getelementptr i8* %51, i32 -1
%70 = load i8* %69
%71 = add i8 %70, 1
store i8 %71, i8* %69
%72 = load i8* %69
%73 = add i8 %72, 1
store i8 %73, i8* %69
%74 = load i8* %69
%75 = add i8 %74, 1
store i8 %75, i8* %69
%76 = load i8* %69
%77 = add i8 %76, 1
store i8 %77, i8* %69
%78 = getelementptr i8* %69, i32 1
%79 = load i8* %78
%80 = sub i8 %79, 1
store i8 %80, i8* %78
%81 = load i8* %78
%82 = icmp ne i8 %81, 0
br i1 %82, label %68, label %83
; <label>:83 ; preds = %68, %46
%84 = getelementptr i8* %78, i32 -1
%85 = load i8* %84
%86 = add i8 %85, 1
store i8 %86, i8* %84
%87 = load i8* %84
%88 = sext i8 %87 to i32
%89 = call i32 @putchar(i32 %88)
%90 = load i8* %84
%91 = add i8 %90, 1
store i8 %91, i8* %84
%92 = load i8* %84
%93 = add i8 %92, 1
store i8 %93, i8* %84
%94 = load i8* %84
%95 = add i8 %94, 1
store i8 %95, i8* %84
%96 = load i8* %84
%97 = add i8 %96, 1
store i8 %97, i8* %84
%98 = load i8* %84
%99 = add i8 %98, 1
store i8 %99, i8* %84
%100 = load i8* %84
%101 = add i8 %100, 1
store i8 %101, i8* %84
%102 = load i8* %84
%103 = add i8 %102, 1
store i8 %103, i8* %84
%104 = load i8* %84
%105 = sext i8 %104 to i32
%106 = call i32 @putchar(i32 %105)
%107 = load i8* %84
%108 = sext i8 %107 to i32
%109 = call i32 @putchar(i32 %108)
%110 = load i8* %84
%111 = add i8 %110, 1
store i8 %111, i8* %84
%112 = load i8* %84
%113 = add i8 %112, 1
store i8 %113, i8* %84
%114 = load i8* %84
%115 = add i8 %114, 1
store i8 %115, i8* %84
%116 = load i8* %84
%117 = sext i8 %116 to i32
%118 = call i32 @putchar(i32 %117)
%119 = load i8* %84
%120 = icmp ne i8 %119, 0
br i1 %120, label %121, label %126
; <label>:121 ; preds = %121, %83
%122 = load i8* %84
%123 = sub i8 %122, 1
store i8 %123, i8* %84
%124 = load i8* %84
%125 = icmp ne i8 %124, 0
br i1 %125, label %121, label %126
; <label>:126 ; preds = %121, %83
%127 = getelementptr i8* %84, i32 1
%128 = load i8* %127
%129 = add i8 %128, 1
store i8 %129, i8* %127
%130 = load i8* %127
%131 = add i8 %130, 1
store i8 %131, i8* %127
%132 = load i8* %127
%133 = add i8 %132, 1
store i8 %133, i8* %127
%134 = load i8* %127
%135 = add i8 %134, 1
store i8 %135, i8* %127
%136 = load i8* %127
%137 = add i8 %136, 1
store i8 %137, i8* %127
%138 = load i8* %127
%139 = add i8 %138, 1
store i8 %139, i8* %127
%140 = load i8* %127
%141 = add i8 %140, 1
store i8 %141, i8* %127
%142 = load i8* %127
%143 = add i8 %142, 1
store i8 %143, i8* %127
%144 = load i8* %127
%145 = icmp ne i8 %144, 0
br i1 %145, label %146, label %161
; <label>:146 ; preds = %146, %126
%147 = getelementptr i8* %127, i32 -1
%148 = load i8* %147
%149 = add i8 %148, 1
store i8 %149, i8* %147
%150 = load i8* %147
%151 = add i8 %150, 1
store i8 %151, i8* %147
%152 = load i8* %147
%153 = add i8 %152, 1
store i8 %153, i8* %147
%154 = load i8* %147
%155 = add i8 %154, 1
store i8 %155, i8* %147
%156 = getelementptr i8* %147, i32 1
%157 = load i8* %156
%158 = sub i8 %157, 1
store i8 %158, i8* %156
%159 = load i8* %156
%160 = icmp ne i8 %159, 0
br i1 %160, label %146, label %161
; <label>:161 ; preds = %146, %126
%162 = getelementptr i8* %156, i32 -1
%163 = load i8* %162
%164 = sext i8 %163 to i32
%165 = call i32 @putchar(i32 %164)
%166 = getelementptr i8* %162, i32 1
%167 = load i8* %166
%168 = add i8 %167, 1
store i8 %168, i8* %166
%169 = load i8* %166
%170 = add i8 %169, 1
store i8 %170, i8* %166
%171 = load i8* %166
%172 = add i8 %171, 1
store i8 %172, i8* %166
%173 = load i8* %166
%174 = add i8 %173, 1
store i8 %174, i8* %166
%175 = load i8* %166
%176 = add i8 %175, 1
store i8 %176, i8* %166
%177 = load i8* %166
%178 = add i8 %177, 1
store i8 %178, i8* %166
%179 = load i8* %166
%180 = add i8 %179, 1
store i8 %180, i8* %166
%181 = load i8* %166
%182 = add i8 %181, 1
store i8 %182, i8* %166
%183 = load i8* %166
%184 = add i8 %183, 1
store i8 %184, i8* %166
%185 = load i8* %166
%186 = add i8 %185, 1
store i8 %186, i8* %166
%187 = load i8* %166
%188 = add i8 %187, 1
store i8 %188, i8* %166
%189 = load i8* %166
%190 = icmp ne i8 %189, 0
br i1 %190, label %191, label %214
; <label>:191 ; preds = %191, %161
%192 = getelementptr i8* %166, i32 -1
%193 = load i8* %192
%194 = add i8 %193, 1
store i8 %194, i8* %192
%195 = load i8* %192
%196 = add i8 %195, 1
store i8 %196, i8* %192
%197 = load i8* %192
%198 = add i8 %197, 1
store i8 %198, i8* %192
%199 = load i8* %192
%200 = add i8 %199, 1
store i8 %200, i8* %192
%201 = load i8* %192
%202 = add i8 %201, 1
store i8 %202, i8* %192
%203 = load i8* %192
%204 = add i8 %203, 1
store i8 %204, i8* %192
%205 = load i8* %192
%206 = add i8 %205, 1
store i8 %206, i8* %192
%207 = load i8* %192
%208 = add i8 %207, 1
store i8 %208, i8* %192
%209 = getelementptr i8* %192, i32 1
%210 = load i8* %209
%211 = sub i8 %210, 1
store i8 %211, i8* %209
%212 = load i8* %209
%213 = icmp ne i8 %212, 0
br i1 %213, label %191, label %214
; <label>:214 ; preds = %191, %161
%215 = getelementptr i8* %209, i32 -1
%216 = load i8* %215
%217 = sub i8 %216, 1
store i8 %217, i8* %215
%218 = load i8* %215
%219 = sext i8 %218 to i32
%220 = call i32 @putchar(i32 %219)
%221 = load i8* %215
%222 = sub i8 %221, 1
store i8 %222, i8* %215
%223 = load i8* %215
%224 = sub i8 %223, 1
store i8 %224, i8* %215
%225 = load i8* %215
%226 = sub i8 %225, 1
store i8 %226, i8* %215
%227 = load i8* %215
%228 = sub i8 %227, 1
store i8 %228, i8* %215
%229 = load i8* %215
%230 = sub i8 %229, 1
store i8 %230, i8* %215
%231 = load i8* %215
%232 = sub i8 %231, 1
store i8 %232, i8* %215
%233 = load i8* %215
%234 = sub i8 %233, 1
store i8 %234, i8* %215
%235 = load i8* %215
%236 = sub i8 %235, 1
store i8 %236, i8* %215
%237 = load i8* %215
%238 = sext i8 %237 to i32
%239 = call i32 @putchar(i32 %238)
%240 = load i8* %215
%241 = add i8 %240, 1
store i8 %241, i8* %215
%242 = load i8* %215
%243 = add i8 %242, 1
store i8 %243, i8* %215
%244 = load i8* %215
%245 = add i8 %244, 1
store i8 %245, i8* %215
%246 = load i8* %215
%247 = sext i8 %246 to i32
%248 = call i32 @putchar(i32 %247)
%249 = load i8* %215
%250 = sub i8 %249, 1
store i8 %250, i8* %215
%251 = load i8* %215
%252 = sub i8 %251, 1
store i8 %252, i8* %215
%253 = load i8* %215
%254 = sub i8 %253, 1
store i8 %254, i8* %215
%255 = load i8* %215
%256 = sub i8 %255, 1
store i8 %256, i8* %215
%257 = load i8* %215
%258 = sub i8 %257, 1
store i8 %258, i8* %215
%259 = load i8* %215
%260 = sub i8 %259, 1
store i8 %260, i8* %215
%261 = load i8* %215
%262 = sext i8 %261 to i32
%263 = call i32 @putchar(i32 %262)
%264 = load i8* %215
%265 = sub i8 %264, 1
store i8 %265, i8* %215
%266 = load i8* %215
%267 = sub i8 %266, 1
store i8 %267, i8* %215
%268 = load i8* %215
%269 = sub i8 %268, 1
store i8 %269, i8* %215
%270 = load i8* %215
%271 = sub i8 %270, 1
store i8 %271, i8* %215
%272 = load i8* %215
%273 = sub i8 %272, 1
store i8 %273, i8* %215
%274 = load i8* %215
%275 = sub i8 %274, 1
store i8 %275, i8* %215
%276 = load i8* %215
%277 = sub i8 %276, 1
store i8 %277, i8* %215
%278 = load i8* %215
%279 = sub i8 %278, 1
store i8 %279, i8* %215
%280 = load i8* %215
%281 = sext i8 %280 to i32
%282 = call i32 @putchar(i32 %281)
%283 = load i8* %215
%284 = icmp ne i8 %283, 0
br i1 %284, label %285, label %290
; <label>:285 ; preds = %285, %214
%286 = load i8* %215
%287 = sub i8 %286, 1
store i8 %287, i8* %215
%288 = load i8* %215
%289 = icmp ne i8 %288, 0
br i1 %289, label %285, label %290
; <label>:290 ; preds = %285, %214
%291 = getelementptr i8* %215, i32 1
%292 = load i8* %291
%293 = add i8 %292, 1
store i8 %293, i8* %291
%294 = load i8* %291
%295 = add i8 %294, 1
store i8 %295, i8* %291
%296 = load i8* %291
%297 = add i8 %296, 1
store i8 %297, i8* %291
%298 = load i8* %291
%299 = add i8 %298, 1
store i8 %299, i8* %291
%300 = load i8* %291
%301 = add i8 %300, 1
store i8 %301, i8* %291
%302 = load i8* %291
%303 = add i8 %302, 1
store i8 %303, i8* %291
%304 = load i8* %291
%305 = add i8 %304, 1
store i8 %305, i8* %291
%306 = load i8* %291
%307 = add i8 %306, 1
store i8 %307, i8* %291
%308 = load i8* %291
%309 = icmp ne i8 %308, 0
br i1 %309, label %310, label %325
; <label>:310 ; preds = %310, %290
%311 = getelementptr i8* %291, i32 -1
%312 = load i8* %311
%313 = add i8 %312, 1
store i8 %313, i8* %311
%314 = load i8* %311
%315 = add i8 %314, 1
store i8 %315, i8* %311
%316 = load i8* %311
%317 = add i8 %316, 1
store i8 %317, i8* %311
%318 = load i8* %311
%319 = add i8 %318, 1
store i8 %319, i8* %311
%320 = getelementptr i8* %311, i32 1
%321 = load i8* %320
%322 = sub i8 %321, 1
store i8 %322, i8* %320
%323 = load i8* %320
%324 = icmp ne i8 %323, 0
br i1 %324, label %310, label %325
; <label>:325 ; preds = %310, %290
%326 = getelementptr i8* %320, i32 -1
%327 = load i8* %326
%328 = add i8 %327, 1
store i8 %328, i8* %326
%329 = load i8* %326
%330 = sext i8 %329 to i32
%331 = call i32 @putchar(i32 %330)
%332 = load i8* %326
%333 = icmp ne i8 %332, 0
br i1 %333, label %334, label %339
; <label>:334 ; preds = %334, %325
%335 = load i8* %326
%336 = sub i8 %335, 1
store i8 %336, i8* %326
%337 = load i8* %326
%338 = icmp ne i8 %337, 0
br i1 %338, label %334, label %339
; <label>:339 ; preds = %334, %325
%340 = load i8* %326
%341 = add i8 %340, 1
store i8 %341, i8* %326
%342 = load i8* %326
%343 = add i8 %342, 1
store i8 %343, i8* %326
%344 = load i8* %326
%345 = add i8 %344, 1
store i8 %345, i8* %326
%346 = load i8* %326
%347 = add i8 %346, 1
store i8 %347, i8* %326
%348 = load i8* %326
%349 = add i8 %348, 1
store i8 %349, i8* %326
%350 = load i8* %326
%351 = add i8 %350, 1
store i8 %351, i8* %326
%352 = load i8* %326
%353 = add i8 %352, 1
store i8 %353, i8* %326
%354 = load i8* %326
%355 = add i8 %354, 1
store i8 %355, i8* %326
%356 = load i8* %326
%357 = add i8 %356, 1
store i8 %357, i8* %326
%358 = load i8* %326
%359 = add i8 %358, 1
store i8 %359, i8* %326
%360 = load i8* %326
%361 = sext i8 %360 to i32
%362 = call i32 @putchar(i32 %361)
tail call void @free(i8* %malloccall)
ret i32 0
}
declare noalias i8* @malloc(i32)
declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind
declare void @free(i8*)

1
bf/helloworld.bf

@ -0,0 +1 @@
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

324
bf/helloworld.bf.ll

@ -0,0 +1,324 @@
; ModuleID = 'asdf'
declare i32 @getchar()
declare i32 @putchar(i32)
define i32 @main() {
%malloccall = tail call i8* @malloc(i32 mul (i32 ptrtoint (i8* getelementptr (i8* null, i32 1) to i32), i32 100))
call void @llvm.memset.p0i8.i32(i8* %malloccall, i8 0, i32 100, i32 1, i1 false)
%1 = getelementptr i8* %malloccall, i32 50
%2 = load i8* %1
%3 = add i8 %2, 1
store i8 %3, i8* %1
%4 = load i8* %1
%5 = add i8 %4, 1
store i8 %5, i8* %1
%6 = load i8* %1
%7 = add i8 %6, 1
store i8 %7, i8* %1
%8 = load i8* %1
%9 = add i8 %8, 1
store i8 %9, i8* %1
%10 = load i8* %1
%11 = add i8 %10, 1
store i8 %11, i8* %1
%12 = load i8* %1
%13 = add i8 %12, 1
store i8 %13, i8* %1
%14 = load i8* %1
%15 = add i8 %14, 1
store i8 %15, i8* %1
%16 = load i8* %1
%17 = add i8 %16, 1
store i8 %17, i8* %1
%18 = load i8* %1
%19 = add i8 %18, 1
store i8 %19, i8* %1
%20 = load i8* %1
%21 = add i8 %20, 1
store i8 %21, i8* %1
%22 = load i8* %1
%23 = icmp ne i8 %22, 0
br i1 %23, label %24, label %79
; <label>:24 ; preds = %24, %0
%25 = getelementptr i8* %1, i32 1
%26 = load i8* %25
%27 = add i8 %26, 1
store i8 %27, i8* %25
%28 = load i8* %25
%29 = add i8 %28, 1
store i8 %29, i8* %25
%30 = load i8* %25
%31 = add i8 %30, 1
store i8 %31, i8* %25
%32 = load i8* %25
%33 = add i8 %32, 1
store i8 %33, i8* %25
%34 = load i8* %25
%35 = add i8 %34, 1
store i8 %35, i8* %25
%36 = load i8* %25
%37 = add i8 %36, 1
store i8 %37, i8* %25
%38 = load i8* %25
%39 = add i8 %38, 1
store i8 %39, i8* %25
%40 = getelementptr i8* %25, i32 1
%41 = load i8* %40
%42 = add i8 %41, 1
store i8 %42, i8* %40
%43 = load i8* %40
%44 = add i8 %43, 1
store i8 %44, i8* %40
%45 = load i8* %40
%46 = add i8 %45, 1
store i8 %46, i8* %40
%47 = load i8* %40
%48 = add i8 %47, 1
store i8 %48, i8* %40
%49 = load i8* %40
%50 = add i8 %49, 1
store i8 %50, i8* %40
%51 = load i8* %40
%52 = add i8 %51, 1
store i8 %52, i8* %40
%53 = load i8* %40
%54 = add i8 %53, 1
store i8 %54, i8* %40
%55 = load i8* %40
%56 = add i8 %55, 1
store i8 %56, i8* %40
%57 = load i8* %40
%58 = add i8 %57, 1
store i8 %58, i8* %40
%59 = load i8* %40
%60 = add i8 %59, 1
store i8 %60, i8* %40
%61 = getelementptr i8* %40, i32 1
%62 = load i8* %61
%63 = add i8 %62, 1
store i8 %63, i8* %61
%64 = load i8* %61
%65 = add i8 %64, 1
store i8 %65, i8* %61
%66 = load i8* %61
%67 = add i8 %66, 1
store i8 %67, i8* %61
%68 = getelementptr i8* %61, i32 1
%69 = load i8* %68
%70 = add i8 %69, 1
store i8 %70, i8* %68
%71 = getelementptr i8* %68, i32 -1
%72 = getelementptr i8* %71, i32 -1
%73 = getelementptr i8* %72, i32 -1
%74 = getelementptr i8* %73, i32 -1
%75 = load i8* %74
%76 = sub i8 %75, 1
store i8 %76, i8* %74
%77 = load i8* %74
%78 = icmp ne i8 %77, 0
br i1 %78, label %24, label %79
; <label>:79 ; preds = %24, %0
%80 = getelementptr i8* %74, i32 1
%81 = load i8* %80
%82 = add i8 %81, 1
store i8 %82, i8* %80
%83 = load i8* %80
%84 = add i8 %83, 1
store i8 %84, i8* %80
%85 = load i8* %80
%86 = sext i8 %85 to i32
%87 = call i32 @putchar(i32 %86)
%88 = getelementptr i8* %80, i32 1
%89 = load i8* %88
%90 = add i8 %89, 1
store i8 %90, i8* %88
%91 = load i8* %88
%92 = sext i8 %91 to i32
%93 = call i32 @putchar(i32 %92)
%94 = load i8* %88
%95 = add i8 %94, 1
store i8 %95, i8* %88
%96 = load i8* %88
%97 = add i8 %96, 1
store i8 %97, i8* %88
%98 = load i8* %88
%99 = add i8 %98, 1
store i8 %99, i8* %88
%100 = load i8* %88
%101 = add i8 %100, 1
store i8 %101, i8* %88
%102 = load i8* %88
%103 = add i8 %102, 1
store i8 %103, i8* %88
%104 = load i8* %88
%105 = add i8 %104, 1
store i8 %105, i8* %88
%106 = load i8* %88
%107 = add i8 %106, 1
store i8 %107, i8* %88
%108 = load i8* %88
%109 = sext i8 %108 to i32
%110 = call i32 @putchar(i32 %109)
%111 = load i8* %88
%112 = sext i8 %111 to i32
%113 = call i32 @putchar(i32 %112)
%114 = load i8* %88
%115 = add i8 %114, 1
store i8 %115, i8* %88
%116 = load i8* %88
%117 = add i8 %116, 1
store i8 %117, i8* %88
%118 = load i8* %88
%119 = add i8 %118, 1
store i8 %119, i8* %88
%120 = load i8* %88
%121 = sext i8 %120 to i32
%122 = call i32 @putchar(i32 %121)
%123 = getelementptr i8* %88, i32 1
%124 = load i8* %123
%125 = add i8 %124, 1
store i8 %125, i8* %123
%126 = load i8* %123
%127 = add i8 %126, 1
store i8 %127, i8* %123
%128 = load i8* %123
%129 = sext i8 %128 to i32
%130 = call i32 @putchar(i32 %129)
%131 = getelementptr i8* %123, i32 -1
%132 = getelementptr i8* %131, i32 -1
%133 = load i8* %132
%134 = add i8 %133, 1
store i8 %134, i8* %132
%135 = load i8* %132
%136 = add i8 %135, 1
store i8 %136, i8* %132
%137 = load i8* %132
%138 = add i8 %137, 1
store i8 %138, i8* %132
%139 = load i8* %132
%140 = add i8 %139, 1
store i8 %140, i8* %132
%141 = load i8* %132
%142 = add i8 %141, 1
store i8 %142, i8* %132
%143 = load i8* %132
%144 = add i8 %143, 1
store i8 %144, i8* %132
%145 = load i8* %132
%146 = add i8 %145, 1
store i8 %146, i8* %132
%147 = load i8* %132
%148 = add i8 %147, 1
store i8 %148, i8* %132
%149 = load i8* %132
%150 = add i8 %149, 1
store i8 %150, i8* %132
%151 = load i8* %132
%152 = add i8 %151, 1
store i8 %152, i8* %132
%153 = load i8* %132
%154 = add i8 %153, 1
store i8 %154, i8* %132
%155 = load i8* %132
%156 = add i8 %155, 1
store i8 %156, i8* %132
%157 = load i8* %132
%158 = add i8 %157, 1
store i8 %158, i8* %132
%159 = load i8* %132
%160 = add i8 %159, 1
store i8 %160, i8* %132
%161 = load i8* %132
%162 = add i8 %161, 1
store i8 %162, i8* %132
%163 = load i8* %132
%164 = sext i8 %163 to i32
%165 = call i32 @putchar(i32 %164)
%166 = getelementptr i8* %132, i32 1
%167 = load i8* %166
%168 = sext i8 %167 to i32
%169 = call i32 @putchar(i32 %168)
%170 = load i8* %166
%171 = add i8 %170, 1
store i8 %171, i8* %166
%172 = load i8* %166
%173 = add i8 %172, 1
store i8 %173, i8* %166
%174 = load i8* %166
%175 = add i8 %174, 1
store i8 %175, i8* %166
%176 = load i8* %166
%177 = sext i8 %176 to i32
%178 = call i32 @putchar(i32 %177)
%179 = load i8* %166
%180 = sub i8 %179, 1
store i8 %180, i8* %166
%181 = load i8* %166
%182 = sub i8 %181, 1
store i8 %182, i8* %166
%183 = load i8* %166
%184 = sub i8 %183, 1
store i8 %184, i8* %166
%185 = load i8* %166
%186 = sub i8 %185, 1
store i8 %186, i8* %166
%187 = load i8* %166
%188 = sub i8 %187, 1
store i8 %188, i8* %166
%189 = load i8* %166
%190 = sub i8 %189, 1
store i8 %190, i8* %166
%191 = load i8* %166
%192 = sext i8 %191 to i32
%193 = call i32 @putchar(i32 %192)
%194 = load i8* %166
%195 = sub i8 %194, 1
store i8 %195, i8* %166
%196 = load i8* %166
%197 = sub i8 %196, 1
store i8 %197, i8* %166
%198 = load i8* %166
%199 = sub i8 %198, 1
store i8 %199, i8* %166
%200 = load i8* %166
%201 = sub i8 %200, 1
store i8 %201, i8* %166
%202 = load i8* %166
%203 = sub i8 %202, 1
store i8 %203, i8* %166
%204 = load i8* %166
%205 = sub i8 %204, 1
store i8 %205, i8* %166
%206 = load i8* %166
%207 = sub i8 %206, 1
store i8 %207, i8* %166
%208 = load i8* %166
%209 = sub i8 %208, 1
store i8 %209, i8* %166
%210 = load i8* %166
%211 = sext i8 %210 to i32
%212 = call i32 @putchar(i32 %211)
%213 = getelementptr i8* %166, i32 1
%214 = load i8* %213
%215 = add i8 %214, 1
store i8 %215, i8* %213
%216 = load i8* %213
%217 = sext i8 %216 to i32
%218 = call i32 @putchar(i32 %217)
%219 = getelementptr i8* %213, i32 1
%220 = load i8* %219
%221 = sext i8 %220 to i32
%222 = call i32 @putchar(i32 %221)
tail call void @free(i8* %malloccall)
ret i32 0
}
declare noalias i8* @malloc(i32)
declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind
declare void @free(i8*)

221
bf/primes.bf

@ -0,0 +1,221 @@
===================================================================
======================== OUTPUT STRING ============================
===================================================================
>++++++++[<++++++++>-]<++++++++++++++++.[-]
>++++++++++[<++++++++++>-]<++++++++++++++.[-]
>++++++++++[<++++++++++>-]<+++++.[-]
>++++++++++[<++++++++++>-]<+++++++++.[-]
>++++++++++[<++++++++++>-]<+.[-]
>++++++++++[<++++++++++>-]<+++++++++++++++.[-]
>+++++[<+++++>-]<+++++++.[-]
>++++++++++[<++++++++++>-]<+++++++++++++++++.[-]
>++++++++++[<++++++++++>-]<++++++++++++.[-]
>+++++[<+++++>-]<+++++++.[-]
>++++++++++[<++++++++++>-]<++++++++++++++++.[-]
>++++++++++[<++++++++++>-]<+++++++++++.[-]
>+++++++[<+++++++>-]<+++++++++.[-]
>+++++[<+++++>-]<+++++++.[-]
===================================================================
======================== INPUT NUMBER ============================
===================================================================
+ cont=1
[
- cont=0
>,
======SUB10======
----------
[ not 10
<+> cont=1
=====SUB38======
----------
----------
----------
--------
>
=====MUL10=======
[>+>+<<-]>>[<<+>>-]< dup
>>>+++++++++
[
<<<
[>+>+<<-]>>[<<+>>-]< dup
[<<+>>-]
>>-
]
<<<[-]<
======RMOVE1======
<
[>+<-]
]
<
]
>>[<<+>>-]<<
===================================================================
======================= PROCESS NUMBER ===========================
===================================================================
==== ==== ==== ====
numd numu teid teiu
==== ==== ==== ====
>+<-
[
>+
======DUP======
[>+>+<<-]>>[<<+>>-]<
>+<--
>>>>>>>>+<<<<<<<< isprime=1
[
>+
<-
=====DUP3=====
<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<<<
=====DUP2=====
>[>>+>+<<<-]>>>[<<<+>>>-]<<< <
>>>
====DIVIDES=======
[>+>+<<-]>>[<<+>>-]< DUP i=div
<<
[
>>>>>+ bool=1
<<<
[>+>+<<-]>>[<<+>>-]< DUP
[>>[-]<<-] IF i THEN bool=0
>>
[ IF i=0
<<<<
[>+>+<<-]>>[<<+>>-]< i=div
>>>
- bool=0
]
<<<
- DEC i
<<
-
]
+>>[<<[-]>>-]<<
>[-]< CLR div
=====END DIVIDES====
[>>>>>>[-]<<<<<<-] if divides then isprime=0
<<
>>[-]>[-]<<<
]
>>>>>>>>
[
-
<<<<<<<[-]<<
[>>+>+<<<-]>>>[<<<+>>>-]<<<
>>
===================================================================
======================== OUTPUT NUMBER ===========================
===================================================================
[>+<-]>
[
======DUP======
[>+>+<<-]>>[<<+>>-]<
======MOD10====
>+++++++++<
[
>>>+<< bool= 1
[>+>[-]<<-] bool= ten==0
>[<+>-] ten = tmp
>[<<++++++++++>>-] if ten=0 ten=10
<<- dec ten
<- dec num
]
+++++++++ num=9
>[<->-]< dec num by ten
=======RROT======
[>+<-]
< [>+<-]
< [>+<-]
>>>[<<<+>>>-]
<
=======DIV10========
>+++++++++<
[
>>>+<< bool= 1
[>+>[-]<<-] bool= ten==0
>[<+>-] ten = tmp
>[<<++++++++++>>>+<-] if ten=0 ten=10 inc div
<<- dec ten
<- dec num
]
>>>>[<<<<+>>>>-]<<<< copy div to num
>[-]< clear ten
=======INC1=========
<+>
]
<
[
=======MOVER=========
[>+<-]
=======ADD48========
+++++++[<+++++++>-]<->
=======PUTC=======
<.[-]>
======MOVEL2========
>[<<+>>-]<
<-
]
>++++[<++++++++>-]<.[-]
===================================================================
=========================== END FOR ===============================
===================================================================
>>>>>>>
]
<<<<<<<<
>[-]<
[-]
<<-
]
======LF========
++++++++++.[-]

3590
bf/primes.bf.ll

File diff suppressed because it is too large

11
bf/quine.bf

@ -0,0 +1,11 @@
->+>+++>>+>++>+>+++>>+>++>>>+>+>+>++>+>>>>+++>+>>++>+>+++>>++>++>>+>>+>++>++>+
>>>>+++>+>>>>++>++>>>>+>>++>+>+++>>>++>>++++++>>+>>++>+>>>>+++>>+++++>>+>+++>>>
++>>++>>+>>++>+>+++>>>++>>+++++++++++++>>+>>++>+>+++>+>+++>>>++>>++++>>+>>++>+
>>>>+++>>+++++>>>>++>>>>+>+>++>>+++>+>>>>+++>+>>>>+++>+>>>>+++>>++>++>+>+++>+>++
>++>>>>>>++>+>+++>>>>>+++>>>++>+>+++>+>+>++>>>>>>++>>>+>>>++>+>>>>+++>+>>>+>>++>
+>++++++++++++++++++>>>>+>+>>>+>>++>+>+++>>>++>>++++++++>>+>>++>+>>>>+++>>++++++
>>>+>++>>+++>+>+>++>+>+++>>>>>+++>>>+>+>>++>+>+++>>>++>>++++++++>>+>>++>+>>>>+++
>>++++>>+>+++>>>>>>++>+>+++>>+>++>>>>+>+>++>+>>>>+++>>+++>>>+[[->>+<<]<+]+++++
[->+++++++++<]>.[+]>>[<<+++++++[->+++++++++<]>-.------------------->-[-<.<+>>]<
[+]<+>>>]<<<[-[-[-[>>+<++++++[->+++++<]]>++++++++++++++<]>+++<]++++++
[->+++++++<]>+<<<-[->>>++<<<]>[->>.<<]<<]

1853
bf/quine.bf.ll

File diff suppressed because it is too large

18
bf/rot13.bf

@ -0,0 +1,18 @@
,
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>++++++++++++++<-
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>>+++++[<----->-]<<-
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>++++++++++++++<-
[>+<-[>+<-[>+<-[>+<-[>+<-
[>++++++++++++++<-
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>>+++++[<----->-]<<-
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>++++++++++++++<-
[>+<-]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]>.[-]<,]

2519
bf/rot13.bf.ll

File diff suppressed because it is too large

1
bf/test.bf

@ -0,0 +1 @@
++++++++++++++++++++++++[><.-]

109
bf/test.bf.ll

@ -0,0 +1,109 @@
; ModuleID = 'asdf'
declare i32 @getchar()
declare i32 @putchar(i32)
define i32 @main() {
%malloccall = tail call i8* @malloc(i32 mul (i32 ptrtoint (i8* getelementptr (i8* null, i32 1) to i32), i32 100))
call void @llvm.memset.p0i8.i32(i8* %malloccall, i8 0, i32 100, i32 1, i1 false)
%1 = getelementptr i8* %malloccall, i32 50
%2 = load i8* %1
%3 = add i8 %2, 1
store i8 %3, i8* %1
%4 = load i8* %1
%5 = add i8 %4, 1
store i8 %5, i8* %1
%6 = load i8* %1
%7 = add i8 %6, 1
store i8 %7, i8* %1
%8 = load i8* %1
%9 = add i8 %8, 1
store i8 %9, i8* %1
%10 = load i8* %1
%11 = add i8 %10, 1
store i8 %11, i8* %1
%12 = load i8* %1
%13 = add i8 %12, 1
store i8 %13, i8* %1
%14 = load i8* %1
%15 = add i8 %14, 1
store i8 %15, i8* %1
%16 = load i8* %1
%17 = add i8 %16, 1
store i8 %17, i8* %1
%18 = load i8* %1
%19 = add i8 %18, 1
store i8 %19, i8* %1
%20 = load i8* %1
%21 = add i8 %20, 1
store i8 %21, i8* %1
%22 = load i8* %1
%23 = add i8 %22, 1
store i8 %23, i8* %1
%24 = load i8* %1
%25 = add i8 %24, 1
store i8 %25, i8* %1
%26 = load i8* %1
%27 = add i8 %26, 1
store i8 %27, i8* %1
%28 = load i8* %1
%29 = add i8 %28, 1
store i8 %29, i8* %1
%30 = load i8* %1
%31 = add i8 %30, 1
store i8 %31, i8* %1
%32 = load i8* %1
%33 = add i8 %32, 1
store i8 %33, i8* %1
%34 = load i8* %1
%35 = add i8 %34, 1
store i8 %35, i8* %1
%36 = load i8* %1
%37 = add i8 %36, 1
store i8 %37, i8* %1
%38 = load i8* %1
%39 = add i8 %38, 1
store i8 %39, i8* %1
%40 = load i8* %1
%41 = add i8 %40, 1
store i8 %41, i8* %1
%42 = load i8* %1
%43 = add i8 %42, 1
store i8 %43, i8* %1
%44 = load i8* %1
%45 = add i8 %44, 1
store i8 %45, i8* %1
%46 = load i8* %1
%47 = add i8 %46, 1
store i8 %47, i8* %1
%48 = load i8* %1
%49 = add i8 %48, 1
store i8 %49, i8* %1
%50 = load i8* %1
%51 = icmp ne i8 %50, 0
br i1 %51, label %52, label %62
; <label>:52 ; preds = %52, %0
%53 = getelementptr i8* %1, i32 1
%54 = getelementptr i8* %53, i32 -1
%55 = load i8* %54
%56 = sext i8 %55 to i32
%57 = call i32 @putchar(i32 %56)
%58 = load i8* %54
%59 = sub i8 %58, 1
store i8 %59, i8* %54
%60 = load i8* %54
%61 = icmp ne i8 %60, 0
br i1 %61, label %52, label %62
; <label>:62 ; preds = %52, %0
tail call void @free(i8* %malloccall)
ret i32 0
}
declare noalias i8* @malloc(i32)
declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind
declare void @free(i8*)

0
bf/test2.bf

19
bf/test2.bf.ll

@ -0,0 +1,19 @@
; ModuleID = 'asdf'
declare i32 @getchar()
declare i32 @putchar(i32)
define i32 @main() {
%malloccall = tail call i8* @malloc(i32 mul (i32 ptrtoint (i8* getelementptr (i8* null, i32 1) to i32), i32 100))
call void @llvm.memset.p0i8.i32(i8* %malloccall, i8 0, i32 100, i32 1, i1 false)
%1 = getelementptr i8* %malloccall, i32 50
tail call void @free(i8* %malloccall)
ret i32 0
}
declare noalias i8* @malloc(i32)
declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind
declare void @free(i8*)

1
bf/upper.bf

@ -0,0 +1 @@
,----------[----------------------.,----------]++++++++++.

197
bf/upper.bf.ll

@ -0,0 +1,197 @@
; ModuleID = 'asdf'
declare i32 @getchar()
declare i32 @putchar(i32)
define i32 @main() {
%malloccall = tail call i8* @malloc(i32 mul (i32 ptrtoint (i8* getelementptr (i8* null, i32 1) to i32), i32 100))
call void @llvm.memset.p0i8.i32(i8* %malloccall, i8 0, i32 100, i32 1, i1 false)
%1 = getelementptr i8* %malloccall, i32 50
%2 = call i32 @getchar()
%3 = trunc i32 %2 to i8
store i8 %3, i8* %1
%4 = load i8* %1
%5 = sub i8 %4, 1
store i8 %5, i8* %1
%6 = load i8* %1
%7 = sub i8 %6, 1
store i8 %7, i8* %1
%8 = load i8* %1
%9 = sub i8 %8, 1
store i8 %9, i8* %1
%10 = load i8* %1
%11 = sub i8 %10, 1
store i8 %11, i8* %1
%12 = load i8* %1
%13 = sub i8 %12, 1
store i8 %13, i8* %1
%14 = load i8* %1
%15 = sub i8 %14, 1
store i8 %15, i8* %1
%16 = load i8* %1
%17 = sub i8 %16, 1
store i8 %17, i8* %1
%18 = load i8* %1
%19 = sub i8 %18, 1
store i8 %19, i8* %1
%20 = load i8* %1
%21 = sub i8 %20, 1
store i8 %21, i8* %1
%22 = load i8* %1
%23 = sub i8 %22, 1
store i8 %23, i8* %1
%24 = load i8* %1
%25 = icmp ne i8 %24, 0
br i1 %25, label %26, label %98
; <label>:26 ; preds = %26, %0
%27 = load i8* %1
%28 = sub i8 %27, 1
store i8 %28, i8* %1
%29 = load i8* %1
%30 = sub i8 %29, 1
store i8 %30, i8* %1
%31 = load i8* %1
%32 = sub i8 %31, 1
store i8 %32, i8* %1
%33 = load i8* %1
%34 = sub i8 %33, 1
store i8 %34, i8* %1
%35 = load i8* %1
%36 = sub i8 %35, 1
store i8 %36, i8* %1
%37 = load i8* %1
%38 = sub i8 %37, 1
store i8 %38, i8* %1
%39 = load i8* %1
%40 = sub i8 %39, 1
store i8 %40, i8* %1
%41 = load i8* %1
%42 = sub i8 %41, 1
store i8 %42, i8* %1
%43 = load i8* %1
%44 = sub i8 %43, 1
store i8 %44, i8* %1
%45 = load i8* %1
%46 = sub i8 %45, 1
store i8 %46, i8* %1
%47 = load i8* %1
%48 = sub i8 %47, 1
store i8 %48, i8* %1
%49 = load i8* %1
%50 = sub i8 %49, 1
store i8 %50, i8* %1
%51 = load i8* %1
%52 = sub i8 %51, 1
store i8 %52, i8* %1
%53 = load i8* %1
%54 = sub i8 %53, 1
store i8 %54, i8* %1
%55 = load i8* %1
%56 = sub i8 %55, 1
store i8 %56, i8* %1
%57 = load i8* %1
%58 = sub i8 %57, 1
store i8 %58, i8* %1
%59 = load i8* %1
%60 = sub i8 %59, 1
store i8 %60, i8* %1
%61 = load i8* %1
%62 = sub i8 %61, 1
store i8 %62, i8* %1
%63 = load i8* %1
%64 = sub i8 %63, 1
store i8 %64, i8* %1
%65 = load i8* %1
%66 = sub i8 %65, 1
store i8 %66, i8* %1
%67 = load i8* %1
%68 = sub i8 %67, 1
store i8 %68, i8* %1
%69 = load i8* %1
%70 = sub i8 %69, 1
store i8 %70, i8* %1
%71 = load i8* %1
%72 = sext i8 %71 to i32
%73 = call i32 @putchar(i32 %72)
%74 = call i32 @getchar()
%75 = trunc i32 %74 to i8
store i8 %75, i8* %1
%76 = load i8* %1
%77 = sub i8 %76, 1
store i8 %77, i8* %1
%78 = load i8* %1
%79 = sub i8 %78, 1
store i8 %79, i8* %1
%80 = load i8* %1
%81 = sub i8 %80, 1
store i8 %81, i8* %1
%82 = load i8* %1
%83 = sub i8 %82, 1
store i8 %83, i8* %1
%84 = load i8* %1
%85 = sub i8 %84, 1
store i8 %85, i8* %1
%86 = load i8* %1
%87 = sub i8 %86, 1
store i8 %87, i8* %1
%88 = load i8* %1
%89 = sub i8 %88, 1
store i8 %89, i8* %1
%90 = load i8* %1
%91 = sub i8 %90, 1
store i8 %91, i8* %1
%92 = load i8* %1
%93 = sub i8 %92, 1
store i8 %93, i8* %1
%94 = load i8* %1
%95 = sub i8 %94, 1
store i8 %95, i8* %1
%96 = load i8* %1
%97 = icmp ne i8 %96, 0
br i1 %97, label %26, label %98
; <label>:98 ; preds = %26, %0
%99 = load i8* %1
%100 = add i8 %99, 1
store i8 %100, i8* %1
%101 = load i8* %1
%102 = add i8 %101, 1
store i8 %102, i8* %1
%103 = load i8* %1
%104 = add i8 %103, 1
store i8 %104, i8* %1
%105 = load i8* %1
%106 = add i8 %105, 1
store i8 %106, i8* %1
%107 = load i8* %1
%108 = add i8 %107, 1
store i8 %108, i8* %1
%109 = load i8* %1
%110 = add i8 %109, 1
store i8 %110, i8* %1
%111 = load i8* %1
%112 = add i8 %111, 1
store i8 %112, i8* %1
%113 = load i8* %1
%114 = add i8 %113, 1
store i8 %114, i8* %1
%115 = load i8* %1
%116 = add i8 %115, 1
store i8 %116, i8* %1
%117 = load i8* %1
%118 = add i8 %117, 1
store i8 %118, i8* %1
%119 = load i8* %1
%120 = sext i8 %119 to i32
%121 = call i32 @putchar(i32 %120)
tail call void @free(i8* %malloccall)
ret i32 0
}
declare noalias i8* @malloc(i32)
declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind
declare void @free(i8*)

145
main.cpp

@ -0,0 +1,145 @@
#include <llvm/ADT/ArrayRef.h>
#include <llvm/LLVMContext.h>
#include <llvm/Module.h>
#include <llvm/Function.h>
#include <llvm/BasicBlock.h>
#include <llvm/IRBuilder.h>
#include <llvm/Support/raw_ostream.h>
#include <memory>
#include <vector>
#include <string>
#include <fstream>
using namespace llvm;
class Brainfuck{
// Create a module
LLVMContext & context {getGlobalContext()};
Module module {"asdf", context};
// Get some basic types and sizes
Type* bool_type {IntegerType::getInt1Ty(context)};
Type* char_type {IntegerType::getInt8Ty(context)};
Type* int32_type {IntegerType::getInt32Ty(context)};
Value* char_size {ConstantExpr::getTruncOrBitCast(ConstantExpr::getSizeOf(char_type), int32_type)};
// Get some basic functions
Function* getchar_func {cast<Function>(module.getOrInsertFunction("getchar", IntegerType::getInt32Ty(context), nullptr))};
Function* putchar_func {cast<Function>(module.getOrInsertFunction("putchar", IntegerType::getInt32Ty(context), IntegerType::getInt32Ty(context), nullptr))};
Function* main_function {cast<Function>(module.getOrInsertFunction("main", Type::getInt32Ty(context), nullptr))};
// Builder for the main function
BasicBlock* entry {BasicBlock::Create(context, "", main_function)};
IRBuilder<> builder {entry};
// Malloc memory
const int memtotal = 100;
Value* total_memory {ConstantInt::get(int32_type, memtotal)};
Value* ptr_arr {CallInst::CreateMalloc(entry, int32_type, char_type, char_size, total_memory)};
Value* curhead {nullptr};
public:
Brainfuck(){
// Do the malloc thing and memset it
entry->getInstList().push_back(cast<Instruction>(ptr_arr));
builder.CreateMemSet(ptr_arr, ConstantInt::get(char_type, 0), total_memory, 1);
// Get head in the middle
curhead = builder.CreateGEP(ptr_arr, ConstantInt::get(int32_type, memtotal/2));
}
void fuck_it(std::string const & program){
// Parse brainfuck program
fuck_it_rec(program, program.begin());
// free and return 0
entry->getInstList().push_back(CallInst::CreateFree(ptr_arr, entry));
builder.CreateRet(ConstantInt::get(int32_type, 0));
}
void print(raw_ostream& os){
module.print(os, nullptr);
}
private:
void dec(){
auto tape_0 = builder.CreateLoad(curhead);
auto tape_1 = builder.CreateSub(tape_0, ConstantInt::get(char_type, 1));
builder.CreateStore(tape_1, curhead);
}
void inc(){
auto tape_0 = builder.CreateLoad(curhead);
auto tape_1 = builder.CreateAdd(tape_0, ConstantInt::get(char_type, 1));
builder.CreateStore(tape_1, curhead);
}
void put_it(){
auto tape_0 = builder.CreateLoad(curhead);
auto tape_1 = builder.CreateSExt(tape_0, int32_type);
builder.CreateCall(putchar_func, tape_1);
}
void get_it(){
auto tape_0 = builder.CreateCall(getchar_func);
auto tape_1 = builder.CreateTrunc(tape_0, char_type);
builder.CreateStore(tape_1, curhead);
}
std::string::const_iterator loop_it(std::string const & program, std::string::const_iterator it){
// I should merge some bits here... to inside the first label.
auto tape_0 = builder.CreateLoad(curhead);
auto cond = builder.CreateICmpNE(tape_0, ConstantInt::get(char_type, 0));
auto true_bb = BasicBlock::Create(context, "", main_function);
auto false_bb = BasicBlock::Create(context, "", main_function);
builder.CreateCondBr(cond, true_bb, false_bb);
builder.SetInsertPoint(true_bb);
it = fuck_it_rec(program, it);
tape_0 = builder.CreateLoad(curhead);
cond = builder.CreateICmpNE(tape_0, ConstantInt::get(char_type, 0));
builder.CreateCondBr(cond, true_bb, false_bb);
entry = false_bb;
builder.SetInsertPoint(false_bb);
return it;
}
std::string::const_iterator fuck_it_rec(std::string const & program, std::string::const_iterator it){
for(; it != program.end();){
auto c = *it++;
switch(c){
case ']' : return it;
case '>' : curhead = builder.CreateGEP(curhead, ConstantInt::get(int32_type, 1)); break;
case '<' : curhead = builder.CreateGEP(curhead, ConstantInt::get(int32_type, -1)); break;
case '+' : inc(); break;
case '-' : dec(); break;
case '.' : put_it(); break;
case ',' : get_it(); break;
case '[' : it = loop_it(program, it); break;
default : break;
}
}
return program.end();
}
};
int main(int argc, char ** argv){
assert(argc == 2);
std::string filename = argv[1];
std::ifstream file{filename, std::ios::binary};
std::string source{std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>()};
// Initialise compiler
Brainfuck brain;
// Compile!
brain.fuck_it(source);
std::string error_info;
raw_fd_ostream os{(filename + ".ll").c_str(), error_info};
brain.print(os);
}

1
optimize.sh

@ -0,0 +1 @@
echo '*** BEFORE OPTIMIZING ***' && ./build/LLVMCompiler && echo '*** AFTER OPTIMIZING: ***' && ./build/LLVMCompiler 2>&1 | opt -Oz -S

68
output

@ -0,0 +1,68 @@
; ModuleID = 'asdf'
declare i32 @getchar()
declare i32 @putchar(i32)
define i32 @main() {
%malloccall = tail call i8* @malloc(i32 mul (i32 ptrtoint (i8* getelementptr (i8* null, i32 1) to i32), i32 100))
call void @llvm.memset.p0i8.i32(i8* %malloccall, i8 0, i32 100, i32 1, i1 false)
%1 = getelementptr i8* %malloccall, i32 50
%2 = load i8* %1
%3 = add i8 %2, 1
store i8 %3, i8* %1
%4 = load i8* %1
%5 = add i8 %4, 1
store i8 %5, i8* %1
%6 = load i8* %1
%7 = add i8 %6, 1
store i8 %7, i8* %1
%8 = load i8* %1
%9 = add i8 %8, 1
store i8 %9, i8* %1
%10 = load i8* %1
%11 = add i8 %10, 1
store i8 %11, i8* %1
%12 = load i8* %1
%13 = add i8 %12, 1
store i8 %13, i8* %1
%14 = load i8* %1
%15 = add i8 %14, 1
store i8 %15, i8* %1
%16 = load i8* %1
%17 = add i8 %16, 1
store i8 %17, i8* %1
%18 = load i8* %1
%19 = add i8 %18, 1
store i8 %19, i8* %1
%20 = load i8* %1
%21 = add i8 %20, 1
store i8 %21, i8* %1
%22 = load i8* %1
%23 = add i8 %22, 1
store i8 %23, i8* %1
%24 = load i8* %1
%25 = icmp ne i8 %24, 0
br i1 %25, label %26, label %34
; <label>:26 ; preds = %26, %0
%27 = load i8* %1
%28 = sext i8 %27 to i32
%29 = call i32 @putchar(i32 %28)
%30 = load i8* %1
%31 = sub i8 %30, 1
store i8 %31, i8* %1
%32 = load i8* %1
%33 = icmp ne i8 %32, 0
br i1 %33, label %26, label %34
; <label>:34 ; preds = %26, %0
tail call void @free(i8* %malloccall)
ret i32 0
}
declare noalias i8* @malloc(i32)
declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind
declare void @free(i8*)

2
run.sh

@ -0,0 +1,2 @@
#./vanillabuild.sh && ./build/bfc.sh $1 && ./a.out | hexdump -C
./build/LLVMCompiler $1 && ~/Documents/Code/build/Release/bin/lli $1.ll | hexdump -C

5
vanillabuild.sh

@ -0,0 +1,5 @@
mkdir -p build
cd build
cmake ..
make -j8
cd ..