74 lines
2.8 KiB
Bash
Executable File
74 lines
2.8 KiB
Bash
Executable File
#!/bin/sh
|
|
# Reproduce the bit-address spike. Throwaway: build artefacts are not
|
|
# interesting beyond the numbers in REPORT.md / REPORT-23.md.
|
|
set -eu
|
|
ROOT=$(cd "$(dirname "$0")/.." && pwd)
|
|
cd "$ROOT/spike"
|
|
|
|
CC=${CLANG:-clang-19}
|
|
CXX=${CXX:-clang++-19}
|
|
OPT=${OPT:-opt-19}
|
|
LLVMCONFIG=${LLVMCONFIG:-llvm-config-19}
|
|
TMS_BITADDR=${TMS_BITADDR:-}
|
|
|
|
if [ -n "$TMS_BITADDR" ]; then
|
|
SCALE="$TMS_BITADDR --scale"
|
|
else
|
|
echo "== build bitscale"
|
|
$CXX -std=c++17 $($LLVMCONFIG --cxxflags) bitscale.cpp \
|
|
$($LLVMCONFIG --ldflags --libs core irreader support --system-libs) \
|
|
-o bitscale
|
|
SCALE=./bitscale
|
|
fi
|
|
|
|
COMMON="-target i386-unknown-none -ffreestanding -nostdinc -fno-builtin -fno-discard-value-names"
|
|
|
|
echo "== Xlib client"
|
|
$CC $COMMON -fpack-struct=1 -O2 -S -emit-llvm xclient.c -o xclient.packed.O2.ll
|
|
$SCALE xclient.packed.O2.ll xclient.packed.O2.bits.ll
|
|
$OPT -passes=verify -disable-output xclient.packed.O2.bits.ll
|
|
$OPT -passes='default<O2>' -S xclient.packed.O2.bits.ll -o /tmp/xclient.bits.O2.ll
|
|
printf 'GEPs after scaling+O2: '
|
|
grep -c getelementptr /tmp/xclient.bits.O2.ll || true
|
|
printf 'memcpy count: '
|
|
grep -c 'llvm.memcpy' /tmp/xclient.bits.O2.ll || true
|
|
|
|
echo "== early scaling is required for pointer arithmetic (i386 historical view)"
|
|
$CC $COMMON -Xclang -disable-O0-optnone -O0 -S -emit-llvm ptrdiff.c -o ptrdiff.O0.ll
|
|
$SCALE ptrdiff.O0.ll ptrdiff.O0.bits.ll
|
|
$OPT -passes='default<O2>' -S ptrdiff.O0.bits.ll -o /tmp/ptrdiff.bits.O2.ll
|
|
grep -A2 'define.*@int_diff(' /tmp/ptrdiff.bits.O2.ll
|
|
grep -A2 'define.*@int_diff4' /tmp/ptrdiff.bits.O2.ll
|
|
echo "-- i386 pointer difference is still in bit units:"
|
|
grep -A6 'define.*@ptr_diff' /tmp/ptrdiff.bits.O2.ll
|
|
|
|
echo "== TMS target pointer difference (23.1.5, patched clang)"
|
|
TMS_CLANG=${TMS_CLANG:-$CC}
|
|
TMS_OPT=${TMS_OPT:-$OPT}
|
|
export TMS_CLANG TMS_OPT
|
|
"$ROOT/scripts/tms-clang" -O2 -o /tmp/tms-m0.ll "$ROOT/scripts/tests/m0/ptrdiff.c"
|
|
grep -A2 'define.*@int_diff(' /tmp/tms-m0.ll
|
|
grep -A2 'define.*@int_diff4' /tmp/tms-m0.ll
|
|
echo "-- TMS pointer difference is divided back to bytes:"
|
|
grep -A6 'define.*@pd_char' /tmp/tms-m0.ll
|
|
grep -A6 'define.*@pd_int' /tmp/tms-m0.ll
|
|
|
|
echo "== constant GEP, byval, varargs, VLA"
|
|
$CC $COMMON -O2 -S -emit-llvm stress.c -o stress.O2.ll 2>/dev/null
|
|
$SCALE stress.O2.ll stress.O2.bits.ll
|
|
$OPT -passes=verify -disable-output stress.O2.bits.ll
|
|
|
|
echo "== TI struct layout"
|
|
$CC $COMMON -O2 -S -emit-llvm layout.c -o layout.O2.ll
|
|
$CC $COMMON -fpack-struct=1 -O2 -S -emit-llvm layout.c -o layout.packed.O2.ll
|
|
echo "-- default:"
|
|
grep -A2 'define.*@size_S' layout.O2.ll | tail -1
|
|
grep -A2 'define.*@off_i' layout.O2.ll | tail -1
|
|
grep -A2 'define.*@stride' layout.O2.ll | tail -1
|
|
echo "-- packed:"
|
|
grep -A2 'define.*@size_S' layout.packed.O2.ll | tail -1
|
|
grep -A2 'define.*@off_i' layout.packed.O2.ll | tail -1
|
|
grep -A2 'define.*@stride' layout.packed.O2.ll | tail -1
|
|
|
|
echo "done"
|