@@ -29,28 +29,41 @@ define i8 @test_or(i8 %a, i8 %b) sanitize_memory {
29
29
}
30
30
31
31
define i8 @test_disjoint_or (i8 %a , i8 %b ) sanitize_memory {
32
- ; CHECK-LABEL: define i8 @test_disjoint_or(
33
- ; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {
34
- ; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr @__msan_param_tls, align 8
35
- ; CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
36
- ; CHECK-NEXT: call void @llvm.donothing()
37
- ; CHECK-NEXT: [[TMP3:%.*]] = xor i8 [[A]], -1
38
- ; CHECK-NEXT: [[TMP4:%.*]] = xor i8 [[B]], -1
39
- ; CHECK-NEXT: [[TMP5:%.*]] = and i8 [[TMP1]], [[TMP2]]
40
- ; CHECK-NEXT: [[TMP6:%.*]] = and i8 [[TMP3]], [[TMP2]]
41
- ; CHECK-NEXT: [[TMP7:%.*]] = and i8 [[TMP1]], [[TMP4]]
42
- ; CHECK-NEXT: [[TMP8:%.*]] = or i8 [[TMP5]], [[TMP6]]
43
- ; CHECK-NEXT: [[TMP11:%.*]] = or i8 [[TMP8]], [[TMP7]]
32
+ ; CHECK-IMPRECISE-LABEL: define i8 @test_disjoint_or(
33
+ ; CHECK-IMPRECISE-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {
34
+ ; CHECK-IMPRECISE-NEXT: [[TMP1:%.*]] = load i8, ptr @__msan_param_tls, align 8
35
+ ; CHECK-IMPRECISE-NEXT: [[TMP2:%.*]] = load i8, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
36
+ ; CHECK-IMPRECISE-NEXT: call void @llvm.donothing()
37
+ ; CHECK-IMPRECISE-NEXT: [[TMP3:%.*]] = xor i8 [[A]], -1
38
+ ; CHECK-IMPRECISE-NEXT: [[TMP4:%.*]] = xor i8 [[B]], -1
39
+ ; CHECK-IMPRECISE-NEXT: [[TMP5:%.*]] = and i8 [[TMP1]], [[TMP2]]
40
+ ; CHECK-IMPRECISE-NEXT: [[TMP6:%.*]] = and i8 [[TMP3]], [[TMP2]]
41
+ ; CHECK-IMPRECISE-NEXT: [[TMP7:%.*]] = and i8 [[TMP1]], [[TMP4]]
42
+ ; CHECK-IMPRECISE-NEXT: [[TMP8:%.*]] = or i8 [[TMP5]], [[TMP6]]
43
+ ; CHECK-IMPRECISE-NEXT: [[TMP9:%.*]] = or i8 [[TMP8]], [[TMP7]]
44
+ ; CHECK-IMPRECISE-NEXT: [[C:%.*]] = or disjoint i8 [[A]], [[B]]
45
+ ; CHECK-IMPRECISE-NEXT: store i8 [[TMP9]], ptr @__msan_retval_tls, align 8
46
+ ; CHECK-IMPRECISE-NEXT: ret i8 [[C]]
44
47
;
45
- ; CHECK-IMPRECISE: [[C:%.*]] = or disjoint i8 [[A]], [[B]]
46
- ; CHECK-IMPRECISE-NEXT: store i8 [[TMP11]], ptr @__msan_retval_tls, align 8
47
- ;
48
- ; CHECK-PRECISE: [[TMP10:%.*]] = and i8 [[A]], [[B]]
49
- ; CHECK-PRECISE-NEXT: [[TMP12:%.*]] = or i8 [[TMP11]], [[TMP10]]
48
+ ; CHECK-PRECISE-LABEL: define i8 @test_disjoint_or(
49
+ ; CHECK-PRECISE-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {
50
+ ; CHECK-PRECISE-NEXT: [[TMP1:%.*]] = load i8, ptr @__msan_param_tls, align 8
51
+ ; CHECK-PRECISE-NEXT: [[TMP2:%.*]] = load i8, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
52
+ ; CHECK-PRECISE-NEXT: call void @llvm.donothing()
53
+ ; CHECK-PRECISE-NEXT: [[TMP3:%.*]] = xor i8 [[A]], -1
54
+ ; CHECK-PRECISE-NEXT: [[TMP4:%.*]] = xor i8 [[B]], -1
55
+ ; CHECK-PRECISE-NEXT: [[TMP5:%.*]] = and i8 [[TMP1]], [[TMP2]]
56
+ ; CHECK-PRECISE-NEXT: [[TMP6:%.*]] = and i8 [[TMP3]], [[TMP2]]
57
+ ; CHECK-PRECISE-NEXT: [[TMP7:%.*]] = and i8 [[TMP1]], [[TMP4]]
58
+ ; CHECK-PRECISE-NEXT: [[TMP8:%.*]] = or i8 [[TMP5]], [[TMP6]]
59
+ ; CHECK-PRECISE-NEXT: [[TMP9:%.*]] = or i8 [[TMP8]], [[TMP7]]
60
+ ; CHECK-PRECISE-NEXT: [[TMP10:%.*]] = and i8 [[A]], [[B]]
61
+ ; CHECK-PRECISE-NEXT: [[TMP11:%.*]] = icmp ne i8 [[TMP10]], 0
62
+ ; CHECK-PRECISE-NEXT: [[TMP12:%.*]] = sext i1 [[TMP11]] to i8
63
+ ; CHECK-PRECISE-NEXT: [[_MS_DISJOINT:%.*]] = or i8 [[TMP9]], [[TMP12]]
50
64
; CHECK-PRECISE-NEXT: [[C:%.*]] = or disjoint i8 [[A]], [[B]]
51
- ; CHECK-PRECISE-NEXT: store i8 [[TMP12]], ptr @__msan_retval_tls, align 8
52
- ;
53
- ; CHECK-NEXT: ret i8 [[C]]
65
+ ; CHECK-PRECISE-NEXT: store i8 [[_MS_DISJOINT]], ptr @__msan_retval_tls, align 8
66
+ ; CHECK-PRECISE-NEXT: ret i8 [[C]]
54
67
;
55
68
%c = or disjoint i8 %a , %b
56
69
ret i8 %c
0 commit comments