Created
November 17, 2021 16:10
-
-
Save luc-tielen/86903f7666c750ed6594916678777eb6 to your computer and use it in GitHub Desktop.
Demo of "Generating fast and expressive code using LLVM & Haskell" talk, extras
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; ModuleID = 'bf' | |
source_filename = "<string>" | |
declare i8* @malloc(i32) | |
declare void @free(i8*) | |
declare void @llvm.memset.p0i8.i64(i8*, i8, i64, i1) | |
declare i32 @putchar(i32) | |
declare i32 @getchar() | |
define i32 @main(i32 %argc_0, i8** %argv_0) { | |
%1 = call i8* @malloc(i32 120000) | |
call void @llvm.memset.p0i8.i64(i8* %1, i8 0, i64 120000, i1 false) | |
%2 = bitcast i8* %1 to i32* | |
%3 = alloca i32 | |
store i32 0, i32* %3 | |
%4 = load i32, i32* %3 | |
%5 = getelementptr i32, i32* %2, i32 %4 | |
%6 = load i32, i32* %5 | |
%7 = add i32 1, %6 | |
store i32 %7, i32* %5 | |
%8 = load i32, i32* %3 | |
%9 = getelementptr i32, i32* %2, i32 %8 | |
%10 = load i32, i32* %9 | |
%11 = add i32 1, %10 | |
store i32 %11, i32* %9 | |
%12 = load i32, i32* %3 | |
%13 = getelementptr i32, i32* %2, i32 %12 | |
%14 = load i32, i32* %13 | |
%15 = add i32 1, %14 | |
store i32 %15, i32* %13 | |
%16 = load i32, i32* %3 | |
%17 = getelementptr i32, i32* %2, i32 %16 | |
%18 = load i32, i32* %17 | |
%19 = add i32 1, %18 | |
store i32 %19, i32* %17 | |
%20 = load i32, i32* %3 | |
%21 = getelementptr i32, i32* %2, i32 %20 | |
%22 = load i32, i32* %21 | |
%23 = add i32 1, %22 | |
store i32 %23, i32* %21 | |
%24 = load i32, i32* %3 | |
%25 = getelementptr i32, i32* %2, i32 %24 | |
%26 = load i32, i32* %25 | |
%27 = add i32 1, %26 | |
store i32 %27, i32* %25 | |
%28 = load i32, i32* %3 | |
%29 = getelementptr i32, i32* %2, i32 %28 | |
%30 = load i32, i32* %29 | |
%31 = add i32 1, %30 | |
store i32 %31, i32* %29 | |
%32 = load i32, i32* %3 | |
%33 = getelementptr i32, i32* %2, i32 %32 | |
%34 = load i32, i32* %33 | |
%35 = add i32 1, %34 | |
store i32 %35, i32* %33 | |
br label %while.begin_0 | |
while.begin_0: ; preds = %while.end_1, %0 | |
%36 = load i32, i32* %3 | |
%37 = getelementptr i32, i32* %2, i32 %36 | |
%38 = load i32, i32* %37 | |
%39 = icmp ne i32 %38, 0 | |
br i1 %39, label %while.body_0, label %while.end_2 | |
while.body_0: ; preds = %while.begin_0 | |
%40 = load i32, i32* %3 | |
%41 = add i32 1, %40 | |
store i32 %41, i32* %3 | |
%42 = load i32, i32* %3 | |
%43 = getelementptr i32, i32* %2, i32 %42 | |
%44 = load i32, i32* %43 | |
%45 = add i32 1, %44 | |
store i32 %45, i32* %43 | |
%46 = load i32, i32* %3 | |
%47 = getelementptr i32, i32* %2, i32 %46 | |
%48 = load i32, i32* %47 | |
%49 = add i32 1, %48 | |
store i32 %49, i32* %47 | |
%50 = load i32, i32* %3 | |
%51 = getelementptr i32, i32* %2, i32 %50 | |
%52 = load i32, i32* %51 | |
%53 = add i32 1, %52 | |
store i32 %53, i32* %51 | |
%54 = load i32, i32* %3 | |
%55 = getelementptr i32, i32* %2, i32 %54 | |
%56 = load i32, i32* %55 | |
%57 = add i32 1, %56 | |
store i32 %57, i32* %55 | |
br label %while.begin_1 | |
while.begin_1: ; preds = %while.body_1, %while.body_0 | |
%58 = load i32, i32* %3 | |
%59 = getelementptr i32, i32* %2, i32 %58 | |
%60 = load i32, i32* %59 | |
%61 = icmp ne i32 %60, 0 | |
br i1 %61, label %while.body_1, label %while.end_0 | |
while.body_1: ; preds = %while.begin_1 | |
%62 = load i32, i32* %3 | |
%63 = add i32 1, %62 | |
store i32 %63, i32* %3 | |
%64 = load i32, i32* %3 | |
%65 = getelementptr i32, i32* %2, i32 %64 | |
%66 = load i32, i32* %65 | |
%67 = add i32 1, %66 | |
store i32 %67, i32* %65 | |
%68 = load i32, i32* %3 | |
%69 = getelementptr i32, i32* %2, i32 %68 | |
%70 = load i32, i32* %69 | |
%71 = add i32 1, %70 | |
store i32 %71, i32* %69 | |
%72 = load i32, i32* %3 | |
%73 = add i32 1, %72 | |
store i32 %73, i32* %3 | |
%74 = load i32, i32* %3 | |
%75 = getelementptr i32, i32* %2, i32 %74 | |
%76 = load i32, i32* %75 | |
%77 = add i32 1, %76 | |
store i32 %77, i32* %75 | |
%78 = load i32, i32* %3 | |
%79 = getelementptr i32, i32* %2, i32 %78 | |
%80 = load i32, i32* %79 | |
%81 = add i32 1, %80 | |
store i32 %81, i32* %79 | |
%82 = load i32, i32* %3 | |
%83 = getelementptr i32, i32* %2, i32 %82 | |
%84 = load i32, i32* %83 | |
%85 = add i32 1, %84 | |
store i32 %85, i32* %83 | |
%86 = load i32, i32* %3 | |
%87 = add i32 1, %86 | |
store i32 %87, i32* %3 | |
%88 = load i32, i32* %3 | |
%89 = getelementptr i32, i32* %2, i32 %88 | |
%90 = load i32, i32* %89 | |
%91 = add i32 1, %90 | |
store i32 %91, i32* %89 | |
%92 = load i32, i32* %3 | |
%93 = getelementptr i32, i32* %2, i32 %92 | |
%94 = load i32, i32* %93 | |
%95 = add i32 1, %94 | |
store i32 %95, i32* %93 | |
%96 = load i32, i32* %3 | |
%97 = getelementptr i32, i32* %2, i32 %96 | |
%98 = load i32, i32* %97 | |
%99 = add i32 1, %98 | |
store i32 %99, i32* %97 | |
%100 = load i32, i32* %3 | |
%101 = add i32 1, %100 | |
store i32 %101, i32* %3 | |
%102 = load i32, i32* %3 | |
%103 = getelementptr i32, i32* %2, i32 %102 | |
%104 = load i32, i32* %103 | |
%105 = add i32 1, %104 | |
store i32 %105, i32* %103 | |
%106 = load i32, i32* %3 | |
%107 = sub i32 %106, 1 | |
store i32 %107, i32* %3 | |
%108 = load i32, i32* %3 | |
%109 = sub i32 %108, 1 | |
store i32 %109, i32* %3 | |
%110 = load i32, i32* %3 | |
%111 = sub i32 %110, 1 | |
store i32 %111, i32* %3 | |
%112 = load i32, i32* %3 | |
%113 = sub i32 %112, 1 | |
store i32 %113, i32* %3 | |
%114 = load i32, i32* %3 | |
%115 = getelementptr i32, i32* %2, i32 %114 | |
%116 = load i32, i32* %115 | |
%117 = sub i32 %116, 1 | |
store i32 %117, i32* %115 | |
br label %while.begin_1 | |
while.end_0: ; preds = %while.begin_1 | |
%118 = load i32, i32* %3 | |
%119 = add i32 1, %118 | |
store i32 %119, i32* %3 | |
%120 = load i32, i32* %3 | |
%121 = getelementptr i32, i32* %2, i32 %120 | |
%122 = load i32, i32* %121 | |
%123 = add i32 1, %122 | |
store i32 %123, i32* %121 | |
%124 = load i32, i32* %3 | |
%125 = add i32 1, %124 | |
store i32 %125, i32* %3 | |
%126 = load i32, i32* %3 | |
%127 = getelementptr i32, i32* %2, i32 %126 | |
%128 = load i32, i32* %127 | |
%129 = add i32 1, %128 | |
store i32 %129, i32* %127 | |
%130 = load i32, i32* %3 | |
%131 = add i32 1, %130 | |
store i32 %131, i32* %3 | |
%132 = load i32, i32* %3 | |
%133 = getelementptr i32, i32* %2, i32 %132 | |
%134 = load i32, i32* %133 | |
%135 = sub i32 %134, 1 | |
store i32 %135, i32* %133 | |
%136 = load i32, i32* %3 | |
%137 = add i32 1, %136 | |
store i32 %137, i32* %3 | |
%138 = load i32, i32* %3 | |
%139 = add i32 1, %138 | |
store i32 %139, i32* %3 | |
%140 = load i32, i32* %3 | |
%141 = getelementptr i32, i32* %2, i32 %140 | |
%142 = load i32, i32* %141 | |
%143 = add i32 1, %142 | |
store i32 %143, i32* %141 | |
br label %while.begin_2 | |
while.begin_2: ; preds = %while.body_2, %while.end_0 | |
%144 = load i32, i32* %3 | |
%145 = getelementptr i32, i32* %2, i32 %144 | |
%146 = load i32, i32* %145 | |
%147 = icmp ne i32 %146, 0 | |
br i1 %147, label %while.body_2, label %while.end_1 | |
while.body_2: ; preds = %while.begin_2 | |
%148 = load i32, i32* %3 | |
%149 = sub i32 %148, 1 | |
store i32 %149, i32* %3 | |
br label %while.begin_2 | |
while.end_1: ; preds = %while.begin_2 | |
%150 = load i32, i32* %3 | |
%151 = sub i32 %150, 1 | |
store i32 %151, i32* %3 | |
%152 = load i32, i32* %3 | |
%153 = getelementptr i32, i32* %2, i32 %152 | |
%154 = load i32, i32* %153 | |
%155 = sub i32 %154, 1 | |
store i32 %155, i32* %153 | |
br label %while.begin_0 | |
while.end_2: ; preds = %while.begin_0 | |
%156 = load i32, i32* %3 | |
%157 = add i32 1, %156 | |
store i32 %157, i32* %3 | |
%158 = load i32, i32* %3 | |
%159 = add i32 1, %158 | |
store i32 %159, i32* %3 | |
%160 = load i32, i32* %3 | |
%161 = getelementptr i32, i32* %2, i32 %160 | |
%162 = load i32, i32* %161 | |
%163 = call i32 @putchar(i32 %162) | |
%164 = load i32, i32* %3 | |
%165 = add i32 1, %164 | |
store i32 %165, i32* %3 | |
%166 = load i32, i32* %3 | |
%167 = getelementptr i32, i32* %2, i32 %166 | |
%168 = load i32, i32* %167 | |
%169 = sub i32 %168, 1 | |
store i32 %169, i32* %167 | |
%170 = load i32, i32* %3 | |
%171 = getelementptr i32, i32* %2, i32 %170 | |
%172 = load i32, i32* %171 | |
%173 = sub i32 %172, 1 | |
store i32 %173, i32* %171 | |
%174 = load i32, i32* %3 | |
%175 = getelementptr i32, i32* %2, i32 %174 | |
%176 = load i32, i32* %175 | |
%177 = sub i32 %176, 1 | |
store i32 %177, i32* %175 | |
%178 = load i32, i32* %3 | |
%179 = getelementptr i32, i32* %2, i32 %178 | |
%180 = load i32, i32* %179 | |
%181 = call i32 @putchar(i32 %180) | |
%182 = load i32, i32* %3 | |
%183 = getelementptr i32, i32* %2, i32 %182 | |
%184 = load i32, i32* %183 | |
%185 = add i32 1, %184 | |
store i32 %185, i32* %183 | |
%186 = load i32, i32* %3 | |
%187 = getelementptr i32, i32* %2, i32 %186 | |
%188 = load i32, i32* %187 | |
%189 = add i32 1, %188 | |
store i32 %189, i32* %187 | |
%190 = load i32, i32* %3 | |
%191 = getelementptr i32, i32* %2, i32 %190 | |
%192 = load i32, i32* %191 | |
%193 = add i32 1, %192 | |
store i32 %193, i32* %191 | |
%194 = load i32, i32* %3 | |
%195 = getelementptr i32, i32* %2, i32 %194 | |
%196 = load i32, i32* %195 | |
%197 = add i32 1, %196 | |
store i32 %197, i32* %195 | |
%198 = load i32, i32* %3 | |
%199 = getelementptr i32, i32* %2, i32 %198 | |
%200 = load i32, i32* %199 | |
%201 = add i32 1, %200 | |
store i32 %201, i32* %199 | |
%202 = load i32, i32* %3 | |
%203 = getelementptr i32, i32* %2, i32 %202 | |
%204 = load i32, i32* %203 | |
%205 = add i32 1, %204 | |
store i32 %205, i32* %203 | |
%206 = load i32, i32* %3 | |
%207 = getelementptr i32, i32* %2, i32 %206 | |
%208 = load i32, i32* %207 | |
%209 = add i32 1, %208 | |
store i32 %209, i32* %207 | |
%210 = load i32, i32* %3 | |
%211 = getelementptr i32, i32* %2, i32 %210 | |
%212 = load i32, i32* %211 | |
%213 = call i32 @putchar(i32 %212) | |
%214 = load i32, i32* %3 | |
%215 = getelementptr i32, i32* %2, i32 %214 | |
%216 = load i32, i32* %215 | |
%217 = call i32 @putchar(i32 %216) | |
%218 = load i32, i32* %3 | |
%219 = getelementptr i32, i32* %2, i32 %218 | |
%220 = load i32, i32* %219 | |
%221 = add i32 1, %220 | |
store i32 %221, i32* %219 | |
%222 = load i32, i32* %3 | |
%223 = getelementptr i32, i32* %2, i32 %222 | |
%224 = load i32, i32* %223 | |
%225 = add i32 1, %224 | |
store i32 %225, i32* %223 | |
%226 = load i32, i32* %3 | |
%227 = getelementptr i32, i32* %2, i32 %226 | |
%228 = load i32, i32* %227 | |
%229 = add i32 1, %228 | |
store i32 %229, i32* %227 | |
%230 = load i32, i32* %3 | |
%231 = getelementptr i32, i32* %2, i32 %230 | |
%232 = load i32, i32* %231 | |
%233 = call i32 @putchar(i32 %232) | |
%234 = load i32, i32* %3 | |
%235 = add i32 1, %234 | |
store i32 %235, i32* %3 | |
%236 = load i32, i32* %3 | |
%237 = add i32 1, %236 | |
store i32 %237, i32* %3 | |
%238 = load i32, i32* %3 | |
%239 = getelementptr i32, i32* %2, i32 %238 | |
%240 = load i32, i32* %239 | |
%241 = call i32 @putchar(i32 %240) | |
%242 = load i32, i32* %3 | |
%243 = sub i32 %242, 1 | |
store i32 %243, i32* %3 | |
%244 = load i32, i32* %3 | |
%245 = getelementptr i32, i32* %2, i32 %244 | |
%246 = load i32, i32* %245 | |
%247 = sub i32 %246, 1 | |
store i32 %247, i32* %245 | |
%248 = load i32, i32* %3 | |
%249 = getelementptr i32, i32* %2, i32 %248 | |
%250 = load i32, i32* %249 | |
%251 = call i32 @putchar(i32 %250) | |
%252 = load i32, i32* %3 | |
%253 = sub i32 %252, 1 | |
store i32 %253, i32* %3 | |
%254 = load i32, i32* %3 | |
%255 = getelementptr i32, i32* %2, i32 %254 | |
%256 = load i32, i32* %255 | |
%257 = call i32 @putchar(i32 %256) | |
%258 = load i32, i32* %3 | |
%259 = getelementptr i32, i32* %2, i32 %258 | |
%260 = load i32, i32* %259 | |
%261 = add i32 1, %260 | |
store i32 %261, i32* %259 | |
%262 = load i32, i32* %3 | |
%263 = getelementptr i32, i32* %2, i32 %262 | |
%264 = load i32, i32* %263 | |
%265 = add i32 1, %264 | |
store i32 %265, i32* %263 | |
%266 = load i32, i32* %3 | |
%267 = getelementptr i32, i32* %2, i32 %266 | |
%268 = load i32, i32* %267 | |
%269 = add i32 1, %268 | |
store i32 %269, i32* %267 | |
%270 = load i32, i32* %3 | |
%271 = getelementptr i32, i32* %2, i32 %270 | |
%272 = load i32, i32* %271 | |
%273 = call i32 @putchar(i32 %272) | |
%274 = load i32, i32* %3 | |
%275 = getelementptr i32, i32* %2, i32 %274 | |
%276 = load i32, i32* %275 | |
%277 = sub i32 %276, 1 | |
store i32 %277, i32* %275 | |
%278 = load i32, i32* %3 | |
%279 = getelementptr i32, i32* %2, i32 %278 | |
%280 = load i32, i32* %279 | |
%281 = sub i32 %280, 1 | |
store i32 %281, i32* %279 | |
%282 = load i32, i32* %3 | |
%283 = getelementptr i32, i32* %2, i32 %282 | |
%284 = load i32, i32* %283 | |
%285 = sub i32 %284, 1 | |
store i32 %285, i32* %283 | |
%286 = load i32, i32* %3 | |
%287 = getelementptr i32, i32* %2, i32 %286 | |
%288 = load i32, i32* %287 | |
%289 = sub i32 %288, 1 | |
store i32 %289, i32* %287 | |
%290 = load i32, i32* %3 | |
%291 = getelementptr i32, i32* %2, i32 %290 | |
%292 = load i32, i32* %291 | |
%293 = sub i32 %292, 1 | |
store i32 %293, i32* %291 | |
%294 = load i32, i32* %3 | |
%295 = getelementptr i32, i32* %2, i32 %294 | |
%296 = load i32, i32* %295 | |
%297 = sub i32 %296, 1 | |
store i32 %297, i32* %295 | |
%298 = load i32, i32* %3 | |
%299 = getelementptr i32, i32* %2, i32 %298 | |
%300 = load i32, i32* %299 | |
%301 = call i32 @putchar(i32 %300) | |
%302 = load i32, i32* %3 | |
%303 = getelementptr i32, i32* %2, i32 %302 | |
%304 = load i32, i32* %303 | |
%305 = sub i32 %304, 1 | |
store i32 %305, i32* %303 | |
%306 = load i32, i32* %3 | |
%307 = getelementptr i32, i32* %2, i32 %306 | |
%308 = load i32, i32* %307 | |
%309 = sub i32 %308, 1 | |
store i32 %309, i32* %307 | |
%310 = load i32, i32* %3 | |
%311 = getelementptr i32, i32* %2, i32 %310 | |
%312 = load i32, i32* %311 | |
%313 = sub i32 %312, 1 | |
store i32 %313, i32* %311 | |
%314 = load i32, i32* %3 | |
%315 = getelementptr i32, i32* %2, i32 %314 | |
%316 = load i32, i32* %315 | |
%317 = sub i32 %316, 1 | |
store i32 %317, i32* %315 | |
%318 = load i32, i32* %3 | |
%319 = getelementptr i32, i32* %2, i32 %318 | |
%320 = load i32, i32* %319 | |
%321 = sub i32 %320, 1 | |
store i32 %321, i32* %319 | |
%322 = load i32, i32* %3 | |
%323 = getelementptr i32, i32* %2, i32 %322 | |
%324 = load i32, i32* %323 | |
%325 = sub i32 %324, 1 | |
store i32 %325, i32* %323 | |
%326 = load i32, i32* %3 | |
%327 = getelementptr i32, i32* %2, i32 %326 | |
%328 = load i32, i32* %327 | |
%329 = sub i32 %328, 1 | |
store i32 %329, i32* %327 | |
%330 = load i32, i32* %3 | |
%331 = getelementptr i32, i32* %2, i32 %330 | |
%332 = load i32, i32* %331 | |
%333 = sub i32 %332, 1 | |
store i32 %333, i32* %331 | |
%334 = load i32, i32* %3 | |
%335 = getelementptr i32, i32* %2, i32 %334 | |
%336 = load i32, i32* %335 | |
%337 = call i32 @putchar(i32 %336) | |
%338 = load i32, i32* %3 | |
%339 = add i32 1, %338 | |
store i32 %339, i32* %3 | |
%340 = load i32, i32* %3 | |
%341 = add i32 1, %340 | |
store i32 %341, i32* %3 | |
%342 = load i32, i32* %3 | |
%343 = getelementptr i32, i32* %2, i32 %342 | |
%344 = load i32, i32* %343 | |
%345 = add i32 1, %344 | |
store i32 %345, i32* %343 | |
%346 = load i32, i32* %3 | |
%347 = getelementptr i32, i32* %2, i32 %346 | |
%348 = load i32, i32* %347 | |
%349 = call i32 @putchar(i32 %348) | |
%350 = load i32, i32* %3 | |
%351 = add i32 1, %350 | |
store i32 %351, i32* %3 | |
%352 = load i32, i32* %3 | |
%353 = getelementptr i32, i32* %2, i32 %352 | |
%354 = load i32, i32* %353 | |
%355 = add i32 1, %354 | |
store i32 %355, i32* %353 | |
%356 = load i32, i32* %3 | |
%357 = getelementptr i32, i32* %2, i32 %356 | |
%358 = load i32, i32* %357 | |
%359 = add i32 1, %358 | |
store i32 %359, i32* %357 | |
%360 = load i32, i32* %3 | |
%361 = getelementptr i32, i32* %2, i32 %360 | |
%362 = load i32, i32* %361 | |
%363 = call i32 @putchar(i32 %362) | |
call void @free(i8* %1) | |
ret i32 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This is the raw LLVM IR that the BF compiler generates.
Here's also 2 images what that looks like in a control flow graph before and after optimizing with LLVM (You get all this for free using LLVM!).
Before:

After:
