LLVM Interpreter: fixed bug 16694

fix for: Bug 16694 - ExecutionEngine/test-interp-vec-loadstore.ll failing on powerpc-darwin8 (http://llvm.org/bugs/show_bug.cgi?id=16694)
The ExecutionEngine/test-interp-vec-loadstore.ll test has been failing on powerpc-darwin8 (on other platforms it passed)

the reason of fail was wrong output by printf. this output is checked by FileCheck, but on little-endian powerpc the output numeric data were printed inside out and FileCheck reported fail.
the printfs have been replaced by checking data inside test and numeric output has been replaced by the text output like : "int test passed, float test passed". The text output is checked by FileCheck.
the dependency on data layout has been removed.

done by Yuri Veselov (Intel)

llvm-svn: 187791
This commit is contained in:
Elena Demikhovsky 2013-08-06 10:40:45 +00:00
parent c51801370f
commit 3b1766cc40

View File

@ -1,22 +1,12 @@
; RUN: %lli -force-interpreter=true %s | FileCheck %s
; XFAIL: mips
; CHECK: 1
; CHECK: 2
; CHECK: 3
; CHECK: 4
; CHECK: 5.{{[0]+}}e+{{[0]+}}
; CHECK: 6.{{[0]+}}e+{{[0]+}}
; CHECK: 7.{{[0]+}}e+{{[0]+}}
; CHECK: 8.{{[0]+}}e+{{[0]+}}
; CHECK: 9.{{[0]+}}e+{{[0]+}}
; CHECK: 1.{{[0]+}}e+{{[0]+}}1
; CHECK: 1.1{{[0]+}}e+{{[0]+}}1
; CHECK: 1.2{{[0]+}}e+{{[0]+}}1
; CHECK: int test passed
; CHECK: double test passed
; CHECK: float test passed
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32"
@format_i32 = internal global [4 x i8] c"%d\0A\00"
@format_float = internal global [4 x i8] c"%e\0A\00"
@msg_int = internal global [17 x i8] c"int test passed\0A\00"
@msg_double = internal global [20 x i8] c"double test passed\0A\00"
@msg_float = internal global [19 x i8] c"float test passed\0A\00"
declare i32 @printf(i8*, ...)
@ -24,62 +14,157 @@ define i32 @main() {
%a = alloca <4 x i32>, align 16
%b = alloca <4 x double>, align 16
%c = alloca <4 x float>, align 16
store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, <4 x i32>* %a, align 16
%pint_0 = alloca i32
%pint_1 = alloca i32
%pint_2 = alloca i32
%pint_3 = alloca i32
%pdouble_0 = alloca double
%pdouble_1 = alloca double
%pdouble_2 = alloca double
%pdouble_3 = alloca double
%pfloat_0 = alloca float
%pfloat_1 = alloca float
%pfloat_2 = alloca float
%pfloat_3 = alloca float
; store constants 1,2,3,4 as vector
store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, <4 x i32>* %a, align 16
; store constants 1,2,3,4 as scalars
store i32 1, i32* %pint_0
store i32 2, i32* %pint_1
store i32 3, i32* %pint_2
store i32 4, i32* %pint_3
; load stored scalars
%val_int0 = load i32* %pint_0
%val_int1 = load i32* %pint_1
%val_int2 = load i32* %pint_2
%val_int3 = load i32* %pint_3
; load stored vector
%val0 = load <4 x i32> *%a, align 16
; extract integers from the loaded vector
%res_i32_0 = extractelement <4 x i32> %val0, i32 0
%res_i32_1 = extractelement <4 x i32> %val0, i32 1
%res_i32_2 = extractelement <4 x i32> %val0, i32 2
%res_i32_3 = extractelement <4 x i32> %val0, i32 3
%ptr0 = getelementptr [4 x i8]* @format_i32, i32 0, i32 0
call i32 (i8*,...)* @printf(i8* %ptr0, i32 %res_i32_0)
call i32 (i8*,...)* @printf(i8* %ptr0, i32 %res_i32_1)
call i32 (i8*,...)* @printf(i8* %ptr0, i32 %res_i32_2)
call i32 (i8*,...)* @printf(i8* %ptr0, i32 %res_i32_3)
; compare extracted data with stored constants
%test_result_int_0 = icmp eq i32 %res_i32_0, %val_int0
%test_result_int_1 = icmp eq i32 %res_i32_1, %val_int1
%test_result_int_2 = icmp eq i32 %res_i32_2, %val_int2
%test_result_int_3 = icmp eq i32 %res_i32_3, %val_int3
%test_result_int_4 = icmp eq i32 %res_i32_0, %val_int3
%test_result_int_5 = icmp eq i32 %res_i32_1, %val_int2
%test_result_int_6 = icmp eq i32 %res_i32_2, %val_int1
%test_result_int_7 = icmp eq i32 %res_i32_3, %val_int0
; it should be TRUE
%A_i = or i1 %test_result_int_0, %test_result_int_4
%B_i = or i1 %test_result_int_1, %test_result_int_5
%C_i = or i1 %test_result_int_2, %test_result_int_6
%D_i = or i1 %test_result_int_3, %test_result_int_7
%E_i = and i1 %A_i, %B_i
%F_i = and i1 %C_i, %D_i
%res_i = and i1 %E_i, %F_i
; if TRUE print message
br i1 %res_i, label %Print_int, label %Double
Print_int:
%ptr0 = getelementptr [17 x i8]* @msg_int, i32 0, i32 0
call i32 (i8*,...)* @printf(i8* %ptr0)
br label %Double
Double:
store <4 x double> <double 5.0, double 6.0, double 7.0, double 8.0>, <4 x double>* %b, align 16
; store constants as scalars
store double 5.0, double* %pdouble_0
store double 6.0, double* %pdouble_1
store double 7.0, double* %pdouble_2
store double 8.0, double* %pdouble_3
; load stored vector
%val1 = load <4 x double> *%b, align 16
; load stored scalars
%val_double0 = load double* %pdouble_0
%val_double1 = load double* %pdouble_1
%val_double2 = load double* %pdouble_2
%val_double3 = load double* %pdouble_3
%res_double_0 = extractelement <4 x double> %val1, i32 0
%res_double_1 = extractelement <4 x double> %val1, i32 1
%res_double_2 = extractelement <4 x double> %val1, i32 2
%res_double_3 = extractelement <4 x double> %val1, i32 3
%ptr1 = getelementptr [4 x i8]* @format_float, i32 0, i32 0
call i32 (i8*,...)* @printf(i8* %ptr1, double %res_double_0)
call i32 (i8*,...)* @printf(i8* %ptr1, double %res_double_1)
call i32 (i8*,...)* @printf(i8* %ptr1, double %res_double_2)
call i32 (i8*,...)* @printf(i8* %ptr1, double %res_double_3)
%test_result_double_0 = fcmp oeq double %res_double_0, %val_double0
%test_result_double_1 = fcmp oeq double %res_double_1, %val_double1
%test_result_double_2 = fcmp oeq double %res_double_2, %val_double2
%test_result_double_3 = fcmp oeq double %res_double_3, %val_double3
%test_result_double_4 = fcmp oeq double %res_double_0, %val_double3
%test_result_double_5 = fcmp oeq double %res_double_1, %val_double2
%test_result_double_6 = fcmp oeq double %res_double_2, %val_double1
%test_result_double_7 = fcmp oeq double %res_double_3, %val_double0
%A_double = or i1 %test_result_double_0, %test_result_double_4
%B_double = or i1 %test_result_double_1, %test_result_double_5
%C_double = or i1 %test_result_double_2, %test_result_double_6
%D_double = or i1 %test_result_double_3, %test_result_double_7
%E_double = and i1 %A_double, %B_double
%F_double = and i1 %C_double, %D_double
%res_double = and i1 %E_double, %F_double
br i1 %res_double, label %Print_double, label %Float
Print_double:
%ptr1 = getelementptr [20 x i8]* @msg_double, i32 0, i32 0
call i32 (i8*,...)* @printf(i8* %ptr1)
br label %Float
Float:
store <4 x float> <float 9.0, float 10.0, float 11.0, float 12.0>, <4 x float>* %c, align 16
store float 9.0, float* %pfloat_0
store float 10.0, float* %pfloat_1
store float 11.0, float* %pfloat_2
store float 12.0, float* %pfloat_3
; load stored vector
%val2 = load <4 x float> *%c, align 16
%ptr2 = getelementptr [4 x i8]* @format_float, i32 0, i32 0
; load stored scalars
%val_float0 = load float* %pfloat_0
%val_float1 = load float* %pfloat_1
%val_float2 = load float* %pfloat_2
%val_float3 = load float* %pfloat_3
; by some reason printf doesn't print float correctly, so
; floats are casted to doubles and are printed as doubles
%res_serv_0 = extractelement <4 x float> %val2, i32 0
%res_float_0 = fpext float %res_serv_0 to double
%res_serv_1 = extractelement <4 x float> %val2, i32 1
%res_float_1 = fpext float %res_serv_1 to double
%res_serv_2 = extractelement <4 x float> %val2, i32 2
%res_float_2 = fpext float %res_serv_2 to double
%res_serv_3 = extractelement <4 x float> %val2, i32 3
%res_float_3 = fpext float %res_serv_3 to double
%res_float_0 = extractelement <4 x float> %val2, i32 0
%res_float_1 = extractelement <4 x float> %val2, i32 1
%res_float_2 = extractelement <4 x float> %val2, i32 2
%res_float_3 = extractelement <4 x float> %val2, i32 3
%test_result_float_0 = fcmp oeq float %res_float_0, %val_float0
%test_result_float_1 = fcmp oeq float %res_float_1, %val_float1
%test_result_float_2 = fcmp oeq float %res_float_2, %val_float2
%test_result_float_3 = fcmp oeq float %res_float_3, %val_float3
%test_result_float_4 = fcmp oeq float %res_float_0, %val_float3
%test_result_float_5 = fcmp oeq float %res_float_1, %val_float2
%test_result_float_6 = fcmp oeq float %res_float_2, %val_float1
%test_result_float_7 = fcmp oeq float %res_float_3, %val_float0
%A_float = or i1 %test_result_float_0, %test_result_float_4
%B_float = or i1 %test_result_float_1, %test_result_float_5
%C_float = or i1 %test_result_float_2, %test_result_float_6
%D_float = or i1 %test_result_float_3, %test_result_float_7
%E_float = and i1 %A_float, %B_float
%F_float = and i1 %C_float, %D_float
%res_float = and i1 %E_float, %F_float
br i1 %res_float, label %Print_float, label %Exit
Print_float:
%ptr2 = getelementptr [19 x i8]* @msg_float, i32 0, i32 0
call i32 (i8*,...)* @printf(i8* %ptr2)
br label %Exit
Exit:
call i32 (i8*,...)* @printf(i8* %ptr1, double %res_float_0)
call i32 (i8*,...)* @printf(i8* %ptr1, double %res_float_1)
call i32 (i8*,...)* @printf(i8* %ptr1, double %res_float_2)
call i32 (i8*,...)* @printf(i8* %ptr1, double %res_float_3)
ret i32 0
}