From 7398c774f636f881166a73ff32275354b505d852 Mon Sep 17 00:00:00 2001 From: Elena Demikhovsky Date: Tue, 6 Aug 2013 10:40:45 +0000 Subject: [PATCH] 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) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@187791 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../test-interp-vec-loadstore.ll | 189 +++++++++++++----- 1 file changed, 137 insertions(+), 52 deletions(-) diff --git a/test/ExecutionEngine/test-interp-vec-loadstore.ll b/test/ExecutionEngine/test-interp-vec-loadstore.ll index e5007114c07..ff08faf55a3 100644 --- a/test/ExecutionEngine/test-interp-vec-loadstore.ll +++ b/test/ExecutionEngine/test-interp-vec-loadstore.ll @@ -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 - -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" +; CHECK: int test passed +; CHECK: double test passed +; CHECK: float test passed + +@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 - + %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> , <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> , <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> , <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 + + %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: - ; 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 - - - 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 } -- 2.34.1