vector_cvt.ll 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. ; RUN: opt < %s -msan -msan-check-access-address=0 -S | FileCheck %s
  2. target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
  3. target triple = "x86_64-unknown-linux-gnu"
  4. declare i32 @llvm.x86.sse2.cvtsd2si(<2 x double>) nounwind readnone
  5. declare <2 x double> @llvm.x86.sse2.cvtsi2sd(<2 x double>, i32) nounwind readnone
  6. declare x86_mmx @llvm.x86.sse.cvtps2pi(<4 x float>) nounwind readnone
  7. ; Single argument vector conversion.
  8. define i32 @test_cvtsd2si(<2 x double> %value) sanitize_memory {
  9. entry:
  10. %0 = tail call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> %value)
  11. ret i32 %0
  12. }
  13. ; CHECK: @test_cvtsd2si
  14. ; CHECK: [[S:%[_01-9a-z]+]] = extractelement <2 x i64> {{.*}}, i32 0
  15. ; CHECK: icmp ne {{.*}}[[S]], 0
  16. ; CHECK: br
  17. ; CHECK: call void @__msan_warning_noreturn
  18. ; CHECK: call i32 @llvm.x86.sse2.cvtsd2si
  19. ; CHECK: store i32 0, {{.*}} @__msan_retval_tls
  20. ; CHECK: ret i32
  21. ; Two-argument vector conversion.
  22. define <2 x double> @test_cvtsi2sd(i32 %a, double %b) sanitize_memory {
  23. entry:
  24. %vec = insertelement <2 x double> undef, double %b, i32 1
  25. %0 = tail call <2 x double> @llvm.x86.sse2.cvtsi2sd(<2 x double> %vec, i32 %a)
  26. ret <2 x double> %0
  27. }
  28. ; CHECK: @test_cvtsi2sd
  29. ; CHECK: [[Sa:%[_01-9a-z]+]] = load i32, i32* {{.*}} @__msan_param_tls
  30. ; CHECK: [[Sout0:%[_01-9a-z]+]] = insertelement <2 x i64> <i64 -1, i64 -1>, i64 {{.*}}, i32 1
  31. ; Clear low half of result shadow
  32. ; CHECK: [[Sout:%[_01-9a-z]+]] = insertelement <2 x i64> {{.*}}[[Sout0]], i64 0, i32 0
  33. ; Trap on %a shadow.
  34. ; CHECK: icmp ne {{.*}}[[Sa]], 0
  35. ; CHECK: br
  36. ; CHECK: call void @__msan_warning_noreturn
  37. ; CHECK: call <2 x double> @llvm.x86.sse2.cvtsi2sd
  38. ; CHECK: store <2 x i64> {{.*}}[[Sout]], {{.*}} @__msan_retval_tls
  39. ; CHECK: ret <2 x double>
  40. ; x86_mmx packed vector conversion.
  41. define x86_mmx @test_cvtps2pi(<4 x float> %value) sanitize_memory {
  42. entry:
  43. %0 = tail call x86_mmx @llvm.x86.sse.cvtps2pi(<4 x float> %value)
  44. ret x86_mmx %0
  45. }
  46. ; CHECK: @test_cvtps2pi
  47. ; CHECK: extractelement <4 x i32> {{.*}}, i32 0
  48. ; CHECK: extractelement <4 x i32> {{.*}}, i32 1
  49. ; CHECK: [[S:%[_01-9a-z]+]] = or i32
  50. ; CHECK: icmp ne {{.*}}[[S]], 0
  51. ; CHECK: br
  52. ; CHECK: call void @__msan_warning_noreturn
  53. ; CHECK: call x86_mmx @llvm.x86.sse.cvtps2pi
  54. ; CHECK: store i64 0, {{.*}} @__msan_retval_tls
  55. ; CHECK: ret x86_mmx