Skip to content

Instantly share code, notes, and snippets.

View minjang's full-sized avatar

Minjang Kim minjang

  • Facebook
  • Menlo Park, CA
View GitHub Profile
@minjang
minjang / swap-mem2reg-gvn.ll
Last active November 28, 2016 23:03
Applied mem2reg and gvn pass
define linkonce_odr void @void temp_swap<int>(int&, int&)(i32* %a, i32* %b) #2 {
entry: ; %0
%0 = load i32, i32* %a, align 4 ; W %1
%1 = load i32, i32* %b, align 4 ; | W
store i32 %1, i32* %a, align 4 ; R |
store i32 %0, i32* %b, align 4 ; R
ret void
}
define linkonce_odr void @void xor_swap<int>(int&, int&)(i32* %a, i32* %b) #2 {
@minjang
minjang / swap-mem2reg-gvn-inline.ll
Last active November 29, 2016 01:00
After mem2reg, gvn, and inline optimizations
define i32 @_Z4testv() #0 {
entry:
%a = alloca i32, align 4
%b = alloca i32, align 4
%call = call i32 @_Z3getv() ; int a = get();
store i32 %call, i32* %a, align 4
%call1 = call i32 @_Z3getv() ; int b = get();
store i32 %call1, i32* %b, align 4
%0 = load i32, i32* %a, align 4 ; temp_swap(a, b);
%1 = load i32, i32* %b, align 4
@minjang
minjang / gist:89ee4cd6a040dfda0d7dc23603b3c8c3
Created November 28, 2016 10:41
LLVM -O3 optimization passes
$ ./opt -O3 -debug-pass=Structure -o swap.opt.bc swap.bc
Pass Arguments: -tti -tbaa -scoped-noalias -assumption-cache-tracker -targetlibinfo -verify -simplifycfg -domtree -sroa -early-cse -basicaa -aa -memdep -memoryssa -gvn-hoist -lower-expect
Target Transform Information
Type-Based Alias Analysis
Scoped NoAlias Alias Analysis
Assumption Cache Tracker
Target Library Information
FunctionPass Manager
Module Verifier
Simplify the CFG
@minjang
minjang / swap-only-mem2reg.ll
Last active November 28, 2016 19:42
Applied only mem2reg pass
define linkonce_odr void @void temp_swap<int>(int&, int&)(i32* %a, i32* %b) #2 {
entry: ; %0
%0 = load i32, i32* %a, align 4 ; W %1
%1 = load i32, i32* %b, align 4 ; | W
store i32 %1, i32* %a, align 4 ; R |
store i32 %0, i32* %b, align 4 ; R
ret void
}
define linkonce_odr void @void xor_swap<int>(int&, int&)(i32* %a, i32* %b) #2 {
@minjang
minjang / swap-unoptimized.ll
Last active November 28, 2016 19:36
Unoptimized LLVM bitcode of the swap example
; ModuleID = 'swap.bc'
source_filename = "swap.cpp"
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.12.0"
; Function Attrs: ssp uwtable
define i32 @_Z4testv() #0 {
entry:
%a = alloca i32, align 4
%b = alloca i32, align 4
bool NStrideDetector::IsMergable(int64_t ea, int32_t /*size*/, const TRAINING& t) const
{
//
// Note: be careful of the sign for % operation
//
int64_t abs_stride = (t.distance > 0 ? t.distance : -t.distance);
int64_t lb = (t.low - abs_stride < t.low ? t.low - abs_stride : t.low/*0*/);
int64_t ub = (t.high + abs_stride > t.high ? t.high + abs_stride : t.high/*-1*/);
if (/*(t.size == size) &&*/ (((t.low - ea) % abs_stride) == 0) &&
// 6. 초기화 리스트
cout << "[TEST 6] initializer list\n";
for (auto &&p : enumerate({"foo", "bar", "baz"}))
cout << p.first << ": " << p.second << '\n';
// 4. 앞서 구현한 range 사용 예
cout << "[TEST 4] range\n";
auto &&D = range(100, 103);
// decltype(p) == pair<size_t, int>&&
for (auto &&p : enumerate(D))
cout << p.first << ": " << p.second << '\n';
@minjang
minjang / python-like-test2.cpp
Created December 23, 2015 16:36
Python's enumerate implementation in C++
// 2. 일반 배열 예
cout << "[TEST 2] array\n";
string C[] = {"foo", "bar", "baz"};
// auto&&로 받는 것이 범위 기반 for 문에서 일반적이고 효율적인 방법
// p 타입: pair<size_t, string&>&&, 원소 타입이 string&로 추론
for (auto &&p : enumerate(C, 100))
cout << p.first << ": " << (p.second += p.second) << '\n';
for (auto &&p : enumerate(C, 100))
cout << p.first << ": " << p.second << '\n';
@minjang
minjang / python_like_range.cpp
Last active December 8, 2015 06:16
Python-like range implementation with C++11
#include <iostream>
template<typename T>
class range_iterator {
T cur_;
const T step_ = 1;
public:
range_iterator(T init) : cur_{init} {}