aboutsummaryrefslogtreecommitdiffstats
path: root/test/ExecutionEngine
diff options
context:
space:
mode:
authorElena Demikhovsky <elena.demikhovsky@intel.com>2013-08-06 10:40:45 +0000
committerElena Demikhovsky <elena.demikhovsky@intel.com>2013-08-06 10:40:45 +0000
commit7398c774f636f881166a73ff32275354b505d852 (patch)
tree6e80bbc6b055870459fbdec9cd6e9733db04a032 /test/ExecutionEngine
parent749d35c593eb3238c5dcb7284f1e3aee60d57b9e (diff)
downloadexternal_llvm-7398c774f636f881166a73ff32275354b505d852.zip
external_llvm-7398c774f636f881166a73ff32275354b505d852.tar.gz
external_llvm-7398c774f636f881166a73ff32275354b505d852.tar.bz2
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
Diffstat (limited to 'test/ExecutionEngine')
-rw-r--r--test/ExecutionEngine/test-interp-vec-loadstore.ll189
1 files changed, 137 insertions, 52 deletions
diff --git a/test/ExecutionEngine/test-interp-vec-loadstore.ll b/test/ExecutionEngine/test-interp-vec-loadstore.ll
index e500711..ff08faf 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> <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
+
+ %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
}