@@ -17,14 +17,82 @@ define i8 @t0(i8 %x, i8 %y, i8 %z) {
17
17
ret i8 %r
18
18
}
19
19
20
- ; No flags are propagated
20
+ ; NSW/NUW flags are propagated
21
21
define i8 @t1_flags (i8 %x , i8 %y , i8 %z ) {
22
22
; CHECK-LABEL: @t1_flags(
23
+ ; CHECK-NEXT: [[TMP1:%.*]] = add nuw nsw i8 [[Y:%.*]], [[Z:%.*]]
24
+ ; CHECK-NEXT: [[R:%.*]] = sub nuw nsw i8 [[X:%.*]], [[TMP1]]
25
+ ; CHECK-NEXT: ret i8 [[R]]
26
+ ;
27
+ %o0 = sub nuw nsw i8 %x , %y
28
+ %r = sub nuw nsw i8 %o0 , %z
29
+ ret i8 %r
30
+ }
31
+
32
+ ; NUW flags are propagated
33
+ define i8 @t1_flags_nuw_only (i8 %x , i8 %y , i8 %z ) {
34
+ ; CHECK-LABEL: @t1_flags_nuw_only(
35
+ ; CHECK-NEXT: [[TMP1:%.*]] = add nuw i8 [[Y:%.*]], [[Z:%.*]]
36
+ ; CHECK-NEXT: [[R:%.*]] = sub nuw i8 [[X:%.*]], [[TMP1]]
37
+ ; CHECK-NEXT: ret i8 [[R]]
38
+ ;
39
+ %o0 = sub nuw i8 %x , %y
40
+ %r = sub nuw i8 %o0 , %z
41
+ ret i8 %r
42
+ }
43
+
44
+ ; Negative tests
45
+ define i8 @t1_flags_sub_nsw_sub (i8 %x , i8 %y , i8 %z ) {
46
+ ; CHECK-LABEL: @t1_flags_sub_nsw_sub(
47
+ ; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[Y:%.*]], [[Z:%.*]]
48
+ ; CHECK-NEXT: [[R:%.*]] = sub i8 [[X:%.*]], [[TMP1]]
49
+ ; CHECK-NEXT: ret i8 [[R]]
50
+ ;
51
+ %o0 = sub nsw i8 %x , %y
52
+ %r = sub i8 %o0 , %z
53
+ ret i8 %r
54
+ }
55
+
56
+ define i8 @t1_flags_nuw_first (i8 %x , i8 %y , i8 %z ) {
57
+ ; CHECK-LABEL: @t1_flags_nuw_first(
58
+ ; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[Y:%.*]], [[Z:%.*]]
59
+ ; CHECK-NEXT: [[R:%.*]] = sub i8 [[X:%.*]], [[TMP1]]
60
+ ; CHECK-NEXT: ret i8 [[R]]
61
+ ;
62
+ %o0 = sub nuw i8 %x , %y
63
+ %r = sub i8 %o0 , %z
64
+ ret i8 %r
65
+ }
66
+
67
+ define i8 @t1_flags_nuw_second (i8 %x , i8 %y , i8 %z ) {
68
+ ; CHECK-LABEL: @t1_flags_nuw_second(
69
+ ; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[Y:%.*]], [[Z:%.*]]
70
+ ; CHECK-NEXT: [[R:%.*]] = sub i8 [[X:%.*]], [[TMP1]]
71
+ ; CHECK-NEXT: ret i8 [[R]]
72
+ ;
73
+ %o0 = sub i8 %x , %y
74
+ %r = sub nuw i8 %o0 , %z
75
+ ret i8 %r
76
+ }
77
+
78
+ define i8 @t1_flags_nuw_nsw_first (i8 %x , i8 %y , i8 %z ) {
79
+ ; CHECK-LABEL: @t1_flags_nuw_nsw_first(
23
80
; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[Y:%.*]], [[Z:%.*]]
24
81
; CHECK-NEXT: [[R:%.*]] = sub i8 [[X:%.*]], [[TMP1]]
25
82
; CHECK-NEXT: ret i8 [[R]]
26
83
;
27
84
%o0 = sub nuw nsw i8 %x , %y
85
+ %r = sub i8 %o0 , %z
86
+ ret i8 %r
87
+ }
88
+
89
+ define i8 @t1_flags_nuw_nsw_second (i8 %x , i8 %y , i8 %z ) {
90
+ ; CHECK-LABEL: @t1_flags_nuw_nsw_second(
91
+ ; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[Y:%.*]], [[Z:%.*]]
92
+ ; CHECK-NEXT: [[R:%.*]] = sub i8 [[X:%.*]], [[TMP1]]
93
+ ; CHECK-NEXT: ret i8 [[R]]
94
+ ;
95
+ %o0 = sub i8 %x , %y
28
96
%r = sub nuw nsw i8 %o0 , %z
29
97
ret i8 %r
30
98
}
0 commit comments