This program: ``` @useFlag = private global <4 x i1> <i1 true, i1 true, i1 true, i1 true> define i32 @get(i32 %arg) { %ld = load <4 x i1>, <4 x i1>* @useFlag %zx = zext <4 x i1> %ld to <4 x i32> %ee = extractelement <4 x i32> %zx, i32 %arg ret i32 %ee } define i32 @main() { %g = call i32 @get(i32 2) ret i32 %g } ``` will return 0. I'd expect it to return 1 since it should load i1 true and then zext that to i32 1. Note that if you `get(i32 0)` then it returns 1 as expected. Also, with -O3 this returns 1 correctly since the load is optimized out. Tested with: ``` $ clang-10 --version clang version 10.0.0 Target: x86_64-pc-linux-gnu Thread model: posix InstalledDir: /usr/bin ``` Sorry if this is a duplicate! I found some related notes on lists.llvm.org, but not a bug report.