@@ -81,6 +81,97 @@ define void @may_overflow_mul_sub_i64([16 x i8]* %ptr, i64 %idx) {
81
81
ret void
82
82
}
83
83
84
+ define void @nuw_nsw_mul_sub_i64 ([16 x i8 ]* %ptr , i64 %idx ) {
85
+ ; CHECK-LABEL: Function: nuw_nsw_mul_sub_i64: 3 pointers, 0 call sites
86
+ ; CHECK-NEXT: MayAlias: [16 x i8]* %ptr, i8* %gep.idx
87
+ ; CHECK-NEXT: PartialAlias: [16 x i8]* %ptr, i8* %gep.3
88
+ ; CHECK-NEXT: NoAlias: i8* %gep.3, i8* %gep.idx
89
+ ;
90
+ %mul = mul nuw nsw i64 %idx , 5
91
+ %sub = sub nuw nsw i64 %mul , 1
92
+ %gep.idx = getelementptr [16 x i8 ], [16 x i8 ]* %ptr , i32 0 , i64 %sub
93
+ store i8 0 , i8* %gep.idx , align 1
94
+ %gep.3 = getelementptr [16 x i8 ], [16 x i8 ]* %ptr , i32 0 , i64 3
95
+ store i8 1 , i8* %gep.3 , align 1
96
+ ret void
97
+ }
98
+
99
+ define void @only_nsw_mul_sub_i64 ([16 x i8 ]* %ptr , i64 %idx ) {
100
+ ; CHECK-LABEL: Function: only_nsw_mul_sub_i64: 3 pointers, 0 call sites
101
+ ; CHECK-NEXT: MayAlias: [16 x i8]* %ptr, i8* %gep.idx
102
+ ; CHECK-NEXT: PartialAlias: [16 x i8]* %ptr, i8* %gep.3
103
+ ; CHECK-NEXT: NoAlias: i8* %gep.3, i8* %gep.idx
104
+ ;
105
+ %mul = mul nsw i64 %idx , 5
106
+ %sub = sub nsw i64 %mul , 1
107
+ %gep.idx = getelementptr [16 x i8 ], [16 x i8 ]* %ptr , i32 0 , i64 %sub
108
+ store i8 0 , i8* %gep.idx , align 1
109
+ %gep.3 = getelementptr [16 x i8 ], [16 x i8 ]* %ptr , i32 0 , i64 3
110
+ store i8 1 , i8* %gep.3 , align 1
111
+ ret void
112
+ }
113
+
114
+ define void @only_nuw_mul_sub_i64 ([16 x i8 ]* %ptr , i64 %idx ) {
115
+ ; CHECK-LABEL: Function: only_nuw_mul_sub_i64: 3 pointers, 0 call sites
116
+ ; CHECK-NEXT: MayAlias: [16 x i8]* %ptr, i8* %gep.idx
117
+ ; CHECK-NEXT: PartialAlias: [16 x i8]* %ptr, i8* %gep.3
118
+ ; CHECK-NEXT: NoAlias: i8* %gep.3, i8* %gep.idx
119
+ ;
120
+ %mul = mul nuw i64 %idx , 5
121
+ %sub = sub nuw i64 %mul , 1
122
+ %gep.idx = getelementptr [16 x i8 ], [16 x i8 ]* %ptr , i32 0 , i64 %sub
123
+ store i8 0 , i8* %gep.idx , align 1
124
+ %gep.3 = getelementptr [16 x i8 ], [16 x i8 ]* %ptr , i32 0 , i64 3
125
+ store i8 1 , i8* %gep.3 , align 1
126
+ ret void
127
+ }
128
+
129
+ define void @may_overflow_mul_pow2_sub_i64 ([16 x i8 ]* %ptr , i64 %idx ) {
130
+ ; CHECK-LABEL: Function: may_overflow_mul_pow2_sub_i64: 3 pointers, 0 call sites
131
+ ; CHECK-NEXT: MayAlias: [16 x i8]* %ptr, i8* %gep.idx
132
+ ; CHECK-NEXT: PartialAlias: [16 x i8]* %ptr, i8* %gep.3
133
+ ; CHECK-NEXT: NoAlias: i8* %gep.3, i8* %gep.idx
134
+ ;
135
+ %mul = mul i64 %idx , 8
136
+ %sub = sub i64 %mul , 1
137
+ %gep.idx = getelementptr [16 x i8 ], [16 x i8 ]* %ptr , i32 0 , i64 %sub
138
+ store i8 0 , i8* %gep.idx , align 1
139
+ %gep.3 = getelementptr [16 x i8 ], [16 x i8 ]* %ptr , i32 0 , i64 3
140
+ store i8 1 , i8* %gep.3 , align 1
141
+ ret void
142
+ }
143
+
144
+ ; Multiplies by power-of-2 preserves modulo and the sub does not wrap.
145
+ define void @mul_pow2_sub_nsw_nuw_i64 ([16 x i8 ]* %ptr , i64 %idx ) {
146
+ ; CHECK-LABEL: Function: mul_pow2_sub_nsw_nuw_i64: 3 pointers, 0 call sites
147
+ ; CHECK-NEXT: MayAlias: [16 x i8]* %ptr, i8* %gep.idx
148
+ ; CHECK-NEXT: PartialAlias: [16 x i8]* %ptr, i8* %gep.3
149
+ ; CHECK-NEXT: NoAlias: i8* %gep.3, i8* %gep.idx
150
+ ;
151
+ %mul = mul i64 %idx , 8
152
+ %sub = sub nuw nsw i64 %mul , 1
153
+ %gep.idx = getelementptr [16 x i8 ], [16 x i8 ]* %ptr , i32 0 , i64 %sub
154
+ store i8 0 , i8* %gep.idx , align 1
155
+ %gep.3 = getelementptr [16 x i8 ], [16 x i8 ]* %ptr , i32 0 , i64 3
156
+ store i8 1 , i8* %gep.3 , align 1
157
+ ret void
158
+ }
159
+
160
+ define void @may_overflow_shl_sub_i64 ([16 x i8 ]* %ptr , i64 %idx ) {
161
+ ; CHECK-LABEL: Function: may_overflow_shl_sub_i64: 3 pointers, 0 call sites
162
+ ; CHECK-NEXT: MayAlias: [16 x i8]* %ptr, i8* %gep.idx
163
+ ; CHECK-NEXT: PartialAlias: [16 x i8]* %ptr, i8* %gep.3
164
+ ; CHECK-NEXT: MayAlias: i8* %gep.3, i8* %gep.idx
165
+ ;
166
+ %mul = shl i64 %idx , 2
167
+ %sub = sub i64 %mul , 1
168
+ %gep.idx = getelementptr [16 x i8 ], [16 x i8 ]* %ptr , i32 0 , i64 %sub
169
+ store i8 0 , i8* %gep.idx , align 1
170
+ %gep.3 = getelementptr [16 x i8 ], [16 x i8 ]* %ptr , i32 0 , i64 3
171
+ store i8 1 , i8* %gep.3 , align 1
172
+ ret void
173
+ }
174
+
84
175
; %gep.idx and %gep.3 must-alias if %mul overflows (e.g. %idx == 110).
85
176
define void @may_overflow_i32_sext ([16 x i8 ]* %ptr , i32 %idx ) {
86
177
; CHECK-LABEL: Function: may_overflow_i32_sext: 3 pointers, 0 call sites
0 commit comments