@@ -17,7 +17,7 @@ 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
23
; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[Y:%.*]], [[Z:%.*]]
@@ -29,6 +29,74 @@ define i8 @t1_flags(i8 %x, i8 %y, i8 %z) {
29
29
ret i8 %r
30
30
}
31
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 i8 [[Y:%.*]], [[Z:%.*]]
36
+ ; CHECK-NEXT: [[R:%.*]] = sub 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(
80
+ ; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[Y:%.*]], [[Z:%.*]]
81
+ ; CHECK-NEXT: [[R:%.*]] = sub i8 [[X:%.*]], [[TMP1]]
82
+ ; CHECK-NEXT: ret i8 [[R]]
83
+ ;
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
96
+ %r = sub nuw nsw i8 %o0 , %z
97
+ ret i8 %r
98
+ }
99
+
32
100
; The inner sub must have single use.
33
101
define i8 @n2 (i8 %x , i8 %y , i8 %z ) {
34
102
; CHECK-LABEL: @n2(
0 commit comments