Test source: git
Comments: LLVM bug: memcmp -> load i32 lowering
Source: <stdin> ---------------------------------------- @charbuf = constant 4 bytes, align 1 define i1 @memcmp_4bytes_unaligned_constant_i8(* align(4) %x) { #init: store [4 x i8] { 0, 0, 0, 1 }, * @charbuf, align 1 br label %0 %0: %__constexpr_0 = gep inbounds * @charbuf, 4 x i64 0, 1 x i64 0 %call = memcmp * align(4) %x, * %__constexpr_0, i64 4 %cmpeq0 = icmp eq i32 %call, 0 ret i1 %cmpeq0 } => @charbuf = constant 4 bytes, align 1 define i1 @memcmp_4bytes_unaligned_constant_i8(* align(4) %x) { #init: store [4 x i8] { 0, 0, 0, 1 }, * @charbuf, align 1 br label %0 %0: %1 = bitcast * align(4) %x to * %lhsv = load i32, * %1, align 4 %.not = icmp eq i32 %lhsv, 16777216 ret i1 %.not } Transformation doesn't verify! ERROR: Target is more poisonous than source Example: * align(4) %x = pointer(non-local, block_id=2, offset=0) Source: * %__constexpr_0 = pointer(non-local, block_id=1, offset=0) i32 %call = #x00000000 (0) i1 %cmpeq0 = #x1 (1) SOURCE MEMORY STATE =================== NON-LOCAL BLOCKS: Block 0 > size: 0 align: 1 alloc type: 0 Block 1 > size: 4 align: 1 alloc type: 0 Block 2 > size: 8 align: 65536 alloc type: 0 Target: * %1 = pointer(non-local, block_id=2, offset=0) i32 %lhsv = poison i1 %.not = poison Source value: #x1 (1) Target value: poison ------------------- SMT STATS ------------------- Num queries: 4 Num invalid: 0 Num skips: 0 Num trivial: 1 (20.0%) Num timeout: 0 (0.0%) Num errors: 0 (0.0%) Num SAT: 3 (75.0%) Num UNSAT: 1 (25.0%)
+ : 'RUN: at line 2' + /home/nlopes/alive2/build/opt-alive.sh -instcombine -S -data-layout=e-n32 + /home/nlopes/llvm/build/bin/FileCheck /home/nlopes/llvm/llvm/test/Transforms/InstCombine/memcmp-constant-fold.ll --check-prefix=ALL --check-prefix=LE Alive2: Transform doesn't verify; aborting! FileCheck error: '<stdin>' is empty. FileCheck command line: /home/nlopes/llvm/build/bin/FileCheck /home/nlopes/llvm/llvm/test/Transforms/InstCombine/memcmp-constant-fold.ll --check-prefix=ALL --check-prefix=LE