@@ -221,21 +221,22 @@ define i32 @_Z1ii(i32 %p) {
221221; CHECK-NEXT: [[ENTRY:.*:]]
222222; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[P]], 42
223223; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
224- ; CHECK-NEXT: br i1 true, label %[[BB2 :.*]], label %[[BB2 ]]
225- ; CHECK: [[BB2 ]]:
226- ; CHECK-NEXT: br i1 true, label %[[BB2 ]], label %[[BB2 ]]
227- ; CHECK: [[BB0 :.*:]]
224+ ; CHECK-NEXT: br i1 true, label %[[COMMON :.*]], label %[[COMMON ]]
225+ ; CHECK: [[COMMON ]]:
226+ ; CHECK-NEXT: br i1 true, label %[[COMMON ]], label %[[COMMON ]]
227+ ; CHECK: [[EXIT :.*:]]
228228; CHECK-NEXT: ret i32 42
229229;
230230entry:
231231 %cmp = icmp eq i32 %p , 42
232232 call void @llvm.assume (i1 %cmp )
233233
234- br i1 %cmp , label %bb2 , label %bb2
235- bb2 :
234+ br i1 %cmp , label %common , label %common
235+ common :
236236 call void @llvm.assume (i1 true )
237- br i1 %cmp , label %bb2 , label %bb2
237+ br i1 %cmp , label %common , label %common
238238
239+ exit:
239240 ret i32 %p
240241}
241242
@@ -357,8 +358,8 @@ define i8 @assume_ptr_eq_different_prov_matters(ptr %p, ptr %p2) {
357358 ret i8 %v
358359}
359360
360- define i1 @assume_ptr_eq_different_prov_does_not_matter (ptr %p , ptr %p2 ) {
361- ; CHECK-LABEL: define i1 @assume_ptr_eq_different_prov_does_not_matter (
361+ define i1 @assume_ptr_eq_different_prov_does_not_matter_icmp (ptr %p , ptr %p2 ) {
362+ ; CHECK-LABEL: define i1 @assume_ptr_eq_different_prov_does_not_matter_icmp (
362363; CHECK-SAME: ptr [[P:%.*]], ptr [[P2:%.*]]) {
363364; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[P]], [[P2]]
364365; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
@@ -371,6 +372,36 @@ define i1 @assume_ptr_eq_different_prov_does_not_matter(ptr %p, ptr %p2) {
371372 ret i1 %c
372373}
373374
375+ ; This is not correct, as it may change the provenance exposed by ptrtoint.
376+ ; We still allow it for now.
377+ define i64 @assume_ptr_eq_different_prov_does_not_matter_ptrtoint (ptr %p , ptr %p2 ) {
378+ ; CHECK-LABEL: define i64 @assume_ptr_eq_different_prov_does_not_matter_ptrtoint(
379+ ; CHECK-SAME: ptr [[P:%.*]], ptr [[P2:%.*]]) {
380+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[P]], [[P2]]
381+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
382+ ; CHECK-NEXT: [[INT:%.*]] = ptrtoint ptr [[P]] to i64
383+ ; CHECK-NEXT: ret i64 [[INT]]
384+ ;
385+ %cmp = icmp eq ptr %p , %p2
386+ call void @llvm.assume (i1 %cmp )
387+ %int = ptrtoint ptr %p2 to i64
388+ ret i64 %int
389+ }
390+
391+ define i64 @assume_ptr_eq_different_prov_does_not_matter_ptrtoaddr (ptr %p , ptr %p2 ) {
392+ ; CHECK-LABEL: define i64 @assume_ptr_eq_different_prov_does_not_matter_ptrtoaddr(
393+ ; CHECK-SAME: ptr [[P:%.*]], ptr [[P2:%.*]]) {
394+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[P]], [[P2]]
395+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
396+ ; CHECK-NEXT: [[INT:%.*]] = ptrtoaddr ptr [[P2]] to i64
397+ ; CHECK-NEXT: ret i64 [[INT]]
398+ ;
399+ %cmp = icmp eq ptr %p , %p2
400+ call void @llvm.assume (i1 %cmp )
401+ %int = ptr toaddr ptr %p2 to i64
402+ ret i64 %int
403+ }
404+
374405define i8 @assume_ptr_eq_same_prov (ptr %p , i64 %x ) {
375406; CHECK-LABEL: define i8 @assume_ptr_eq_same_prov(
376407; CHECK-SAME: ptr [[P:%.*]], i64 [[X:%.*]]) {
0 commit comments