104 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt < %s -S -passes='msan' -msan-poison-undef-vectors=true 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-PRECISE3; RUN: opt < %s -S -passes='msan' -msan-poison-undef-vectors=false 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-IMPRECISE4;5; Regression test case for computing shadows of partially poisoned vectors.6; Partially poisoned structs and arrays are not correctly implemented.7 8target 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"9target triple = "x86_64-unknown-linux-gnu"10 11define <2 x i64> @left_poison(ptr %add.ptr) sanitize_memory {12; CHECK-LABEL: define <2 x i64> @left_poison(13; CHECK-SAME: ptr [[ADD_PTR:%.*]]) #[[ATTR0:[0-9]+]] {14; CHECK-NEXT: call void @llvm.donothing()15; CHECK-PRECISE: store <2 x i64> <i64 -1, i64 0>, ptr @__msan_retval_tls, align 816; CHECK-IMPRECISE: store <2 x i64> zeroinitializer, ptr @__msan_retval_tls, align 817; CHECK-NEXT: ret <2 x i64> <i64 poison, i64 42>18;19 ret <2 x i64> <i64 poison, i64 42>20}21 22define <2 x i64> @right_poison(ptr %add.ptr) sanitize_memory {23; CHECK-LABEL: define <2 x i64> @right_poison(24; CHECK-SAME: ptr [[ADD_PTR:%.*]]) #[[ATTR0]] {25; CHECK-NEXT: call void @llvm.donothing()26; CHECK-PRECISE: store <2 x i64> <i64 0, i64 -1>, ptr @__msan_retval_tls, align 827; CHECK-IMPRECISE: store <2 x i64> zeroinitializer, ptr @__msan_retval_tls, align 828; CHECK-NEXT: ret <2 x i64> <i64 42, i64 poison>29;30 ret <2 x i64> <i64 42, i64 poison>31}32 33define <2 x i64> @full_poison(ptr %add.ptr) sanitize_memory {34; CHECK-LABEL: define <2 x i64> @full_poison(35; CHECK-SAME: ptr [[ADD_PTR:%.*]]) #[[ATTR0]] {36; CHECK-NEXT: call void @llvm.donothing()37; CHECK-NEXT: store <2 x i64> splat (i64 -1), ptr @__msan_retval_tls, align 838; CHECK-NEXT: ret <2 x i64> poison39;40 ret <2 x i64> <i64 poison, i64 poison>41}42 43define <2 x i64> @no_poison_or_undef(ptr %add.ptr) sanitize_memory {44; CHECK-LABEL: define <2 x i64> @no_poison_or_undef(45; CHECK-SAME: ptr [[ADD_PTR:%.*]]) #[[ATTR0]] {46; CHECK-NEXT: call void @llvm.donothing()47; CHECK-NEXT: store <2 x i64> zeroinitializer, ptr @__msan_retval_tls, align 848; CHECK-NEXT: ret <2 x i64> splat (i64 42)49;50 ret <2 x i64> <i64 42, i64 42>51}52 53define <2 x i64> @left_undef(ptr %add.ptr) sanitize_memory {54; CHECK-LABEL: define <2 x i64> @left_undef(55; CHECK-SAME: ptr [[ADD_PTR:%.*]]) #[[ATTR0]] {56; CHECK-NEXT: call void @llvm.donothing()57; CHECK-PRECISE: store <2 x i64> <i64 -1, i64 0>, ptr @__msan_retval_tls, align 858; CHECK-IMPRECISE: store <2 x i64> zeroinitializer, ptr @__msan_retval_tls, align 859; CHECK-NEXT: ret <2 x i64> <i64 undef, i64 42>60;61 ret <2 x i64> <i64 undef, i64 42>62}63 64define <2 x i64> @right_undef(ptr %add.ptr) sanitize_memory {65; CHECK-LABEL: define <2 x i64> @right_undef(66; CHECK-SAME: ptr [[ADD_PTR:%.*]]) #[[ATTR0]] {67; CHECK-NEXT: call void @llvm.donothing()68; CHECK-PRECISE: store <2 x i64> <i64 0, i64 -1>, ptr @__msan_retval_tls, align 869; CHECK-IMPRECISE: store <2 x i64> zeroinitializer, ptr @__msan_retval_tls, align 870; CHECK-NEXT: ret <2 x i64> <i64 42, i64 undef>71;72 ret <2 x i64> <i64 42, i64 undef>73}74 75define <2 x i64> @full_undef(ptr %add.ptr) sanitize_memory {76; CHECK-LABEL: define <2 x i64> @full_undef(77; CHECK-SAME: ptr [[ADD_PTR:%.*]]) #[[ATTR0]] {78; CHECK-NEXT: call void @llvm.donothing()79; CHECK-NEXT: store <2 x i64> splat (i64 -1), ptr @__msan_retval_tls, align 880; CHECK-NEXT: ret <2 x i64> undef81;82 ret <2 x i64> <i64 undef, i64 undef>83}84 85define {i64, i64} @struct_left_undef() sanitize_memory {86; CHECK-LABEL: define { i64, i64 } @struct_left_undef(87; CHECK-SAME: ) #[[ATTR0]] {88; CHECK-NEXT: call void @llvm.donothing()89; CHECK-NEXT: store { i64, i64 } zeroinitializer, ptr @__msan_retval_tls, align 890; CHECK-NEXT: ret { i64, i64 } { i64 undef, i64 42 }91;92 ret {i64, i64} { i64 undef, i64 42 }93}94 95define [2x i64] @array_right_undef() sanitize_memory {96; CHECK-LABEL: define [2 x i64] @array_right_undef(97; CHECK-SAME: ) #[[ATTR0]] {98; CHECK-NEXT: call void @llvm.donothing()99; CHECK-NEXT: store [2 x i64] zeroinitializer, ptr @__msan_retval_tls, align 8100; CHECK-NEXT: ret [2 x i64] [i64 42, i64 undef]101; 102 ret [2x i64] [ i64 42, i64 undef ]103}104