@@ -65,6 +65,93 @@ body: |
65
65
%4:_(s32) = G_ANYEXT %3(s1)
66
66
$w0 = COPY %4(s32)
67
67
68
+ ...
69
+ ---
70
+ name : test_smul_overflow_s32
71
+ body : |
72
+ bb.0:
73
+ ; CHECK-LABEL: name: test_smul_overflow_s32
74
+ ; CHECK: %lhs:_(s32) = COPY $w0
75
+ ; CHECK: %rhs:_(s32) = COPY $w1
76
+ ; CHECK: [[SMULH:%[0-9]+]]:_(s32) = G_SMULH %lhs, %rhs
77
+ ; CHECK: %mul:_(s32) = G_MUL %lhs, %rhs
78
+ ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 31
79
+ ; CHECK: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR %mul, [[C]](s64)
80
+ ; CHECK: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ne), [[SMULH]](s32), [[ASHR]]
81
+ ; CHECK: $w0 = COPY %mul(s32)
82
+ ; CHECK: %ext_overflow:_(s32) = COPY [[ICMP]](s32)
83
+ ; CHECK: $w0 = COPY %ext_overflow(s32)
84
+ ; CHECK: RET_ReallyLR implicit $w0
85
+ %lhs:_(s32) = COPY $w0
86
+ %rhs:_(s32) = COPY $w1
87
+ %mul:_(s32), %overflow:_(s1) = G_SMULO %lhs, %rhs
88
+ $w0 = COPY %mul(s32)
89
+ %ext_overflow:_(s32) = G_ANYEXT %overflow(s1)
90
+ $w0 = COPY %ext_overflow(s32)
91
+ RET_ReallyLR implicit $w0
92
+
93
+ ...
94
+ ---
95
+ name : test_umul_overflow_s32
96
+ body : |
97
+ bb.0:
98
+ ; CHECK-LABEL: name: test_umul_overflow_s32
99
+ ; CHECK: %lhs:_(s32) = COPY $w0
100
+ ; CHECK: %rhs:_(s32) = COPY $w1
101
+ ; CHECK: [[UMULH:%[0-9]+]]:_(s32) = G_UMULH %lhs, %rhs
102
+ ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
103
+ ; CHECK: %mul:_(s32) = G_MUL %lhs, %rhs
104
+ ; CHECK: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ne), [[UMULH]](s32), [[C]]
105
+ ; CHECK: $w0 = COPY %mul(s32)
106
+ ; CHECK: %ext_overflow:_(s32) = COPY [[ICMP]](s32)
107
+ ; CHECK: $w0 = COPY %ext_overflow(s32)
108
+ ; CHECK: RET_ReallyLR implicit $w0
109
+ %lhs:_(s32) = COPY $w0
110
+ %rhs:_(s32) = COPY $w1
111
+ %mul:_(s32), %overflow:_(s1) = G_UMULO %lhs, %rhs
112
+ $w0 = COPY %mul(s32)
113
+ %ext_overflow:_(s32) = G_ANYEXT %overflow(s1)
114
+ $w0 = COPY %ext_overflow(s32)
115
+ RET_ReallyLR implicit $w0
116
+
117
+ ...
118
+ ---
119
+ name : test_umul_overflow_s24
120
+ body : |
121
+ bb.0:
122
+ ; CHECK-LABEL: name: test_umul_overflow_s24
123
+ ; CHECK: %lhs_wide:_(s32) = COPY $w0
124
+ ; CHECK: %rhs_wide:_(s32) = COPY $w1
125
+ ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16777215
126
+ ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY %lhs_wide(s32)
127
+ ; CHECK: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[C]]
128
+ ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY %rhs_wide(s32)
129
+ ; CHECK: [[AND1:%[0-9]+]]:_(s32) = G_AND [[COPY1]], [[C]]
130
+ ; CHECK: [[UMULH:%[0-9]+]]:_(s32) = G_UMULH [[AND]], [[AND1]]
131
+ ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
132
+ ; CHECK: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[AND]], [[AND1]]
133
+ ; CHECK: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ne), [[UMULH]](s32), [[C1]]
134
+ ; CHECK: [[AND2:%[0-9]+]]:_(s32) = G_AND [[MUL]], [[C]]
135
+ ; CHECK: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(ne), [[MUL]](s32), [[AND2]]
136
+ ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY [[ICMP]](s32)
137
+ ; CHECK: [[COPY3:%[0-9]+]]:_(s32) = COPY [[ICMP1]](s32)
138
+ ; CHECK: [[OR:%[0-9]+]]:_(s32) = G_OR [[COPY2]], [[COPY3]]
139
+ ; CHECK: %ext_mul:_(s32) = COPY [[MUL]](s32)
140
+ ; CHECK: $w0 = COPY %ext_mul(s32)
141
+ ; CHECK: %ext_overflow:_(s32) = COPY [[OR]](s32)
142
+ ; CHECK: $w0 = COPY %ext_overflow(s32)
143
+ ; CHECK: RET_ReallyLR implicit $w0
144
+ %lhs_wide:_(s32) = COPY $w0
145
+ %rhs_wide:_(s32) = COPY $w1
146
+ %lhs:_(s24) = G_TRUNC %lhs_wide
147
+ %rhs:_(s24) = G_TRUNC %rhs_wide
148
+ %mul:_(s24), %overflow:_(s1) = G_UMULO %lhs, %rhs
149
+ %ext_mul:_(s32) = G_ANYEXT %mul
150
+ $w0 = COPY %ext_mul(s32)
151
+ %ext_overflow:_(s32) = G_ANYEXT %overflow(s1)
152
+ $w0 = COPY %ext_overflow(s32)
153
+ RET_ReallyLR implicit $w0
154
+
68
155
...
69
156
---
70
157
name : vector_mul_scalarize
0 commit comments