llvm/test/Bitcode/function-encoding-rel-operands.ll
Jan Wen Voung d9a3bad448 Change encoding of instruction operands in bitcode binaries to be relative
to the instruction position.  The old encoding would give an absolute
ID which counts up within a function, and only resets at the next function.

I.e., Instead of having:

... = icmp eq i32 n-1, n-2
br i1 ..., label %bb1, label %bb2

it will now be roughly:

... = icmp eq i32 1, 2
br i1 1, label %bb1, label %bb2

This makes it so that ids remain relatively small and can be encoded
in fewer bits.

With this encoding, forward reference operands will be given
negative-valued IDs.  Use signed VBRs for the most common case
of forward references, which is phi instructions.

To retain backward compatibility we bump the bitcode version
from 0 to 1 to distinguish between the different encodings.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@165739 91177308-0d34-0410-b5e6-96231b3b80d8
2012-10-11 20:20:40 +00:00

50 lines
1.3 KiB
LLVM

; Basic sanity test to check that instruction operands are encoded with
; relative IDs.
; RUN: llvm-as < %s | llvm-bcanalyzer -dump | FileCheck %s
; CHECK: FUNCTION_BLOCK
; CHECK: INST_BINOP {{.*}}op0=1 op1=1
; CHECK: INST_BINOP {{.*}}op0=1 op1=1
; CHECK: INST_BINOP {{.*}}op0=1 op1=1
; CHECK: INST_RET {{.*}}op0=1
define i32 @test_int_binops(i32 %a) nounwind {
entry:
%0 = add i32 %a, %a
%1 = sub i32 %0, %0
%2 = mul i32 %1, %1
ret i32 %2
}
; CHECK: FUNCTION_BLOCK
; CHECK: INST_CAST {{.*}}op0=1
; CHECK: INST_BINOP {{.*}}op0=1 op1=1
; CHECK: INST_BINOP {{.*}}op0=1 op1=1
; CHECK: INST_BINOP {{.*}}op0=1 op1=1
; CHECK: INST_BINOP {{.*}}op0=1 op1=1
; CHECK: INST_RET {{.*}}op0=1
define double @test_float_binops(i32 %a) nounwind {
%1 = sitofp i32 %a to double
%2 = fadd double %1, %1
%3 = fsub double %2, %2
%4 = fmul double %3, %3
%5 = fdiv double %4, %4
ret double %5
}
; CHECK: FUNCTION_BLOCK
; skip checking operands of INST_INBOUNDS_GEP since that depends on ordering
; between literals and the formal parameters.
; CHECK: INST_INBOUNDS_GEP {{.*}}
; CHECK: INST_LOAD {{.*}}op0=1 {{.*}}
; CHECK: INST_CMP2 op0=1 {{.*}}
; CHECK: INST_RET {{.*}}op0=1
define i1 @test_load(i32 %a, {i32, i32}* %ptr) nounwind {
entry:
%0 = getelementptr inbounds {i32, i32}* %ptr, i32 %a, i32 0
%1 = load i32* %0
%2 = icmp eq i32 %1, %a
ret i1 %2
}