blob: 487c22bc83a7c564e4bfc36f615ae89262f0ae10 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt < %s -passes=ipsccp -S | FileCheck %s
define ptr @assume_pointers_equality_maybe_different_provenance_1(ptr %x) {
; CHECK-LABEL: define ptr @assume_pointers_equality_maybe_different_provenance_1(
; CHECK-SAME: ptr [[X:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[X]], inttoptr (i64 12345678 to ptr)
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
; CHECK-NEXT: ret ptr [[X]]
;
entry:
%cmp = icmp eq ptr %x, inttoptr (i64 12345678 to ptr)
call void @llvm.assume(i1 %cmp)
ret ptr %x
}
define ptr @assume_pointers_equality_maybe_different_provenance_2(ptr %x, i1 %cond) {
; CHECK-LABEL: define ptr @assume_pointers_equality_maybe_different_provenance_2(
; CHECK-SAME: ptr [[X:%.*]], i1 [[COND:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[X]], inttoptr (i64 12345678 to ptr)
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
; CHECK-NEXT: br i1 [[COND]], label %[[NEXT:.*]], label %[[EXIT:.*]]
; CHECK: [[NEXT]]:
; CHECK-NEXT: br label %[[EXIT]]
; CHECK: [[EXIT]]:
; CHECK-NEXT: [[PHI:%.*]] = phi ptr [ [[X]], %[[ENTRY]] ], [ inttoptr (i64 12345678 to ptr), %[[NEXT]] ]
; CHECK-NEXT: ret ptr [[PHI]]
;
entry:
%cmp = icmp eq ptr %x, inttoptr (i64 12345678 to ptr)
call void @llvm.assume(i1 %cmp)
br i1 %cond, label %next, label %exit
next:
br label %exit
exit:
%phi = phi ptr [ %x, %entry ], [ inttoptr (i64 12345678 to ptr), %next ]
ret ptr %phi
}
define internal ptr @callee(ptr returned %p) memory(none) {
; CHECK-LABEL: define internal ptr @callee(
; CHECK-SAME: ptr returned [[P:%.*]]) #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: ret ptr [[P]]
;
entry:
ret ptr %p
}
define ptr @assume_pointers_equality_maybe_different_provenance_3(ptr %x, i1 %cond) {
; CHECK-LABEL: define ptr @assume_pointers_equality_maybe_different_provenance_3(
; CHECK-SAME: ptr [[X:%.*]], i1 [[COND:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[X]], inttoptr (i64 12345678 to ptr)
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
; CHECK-NEXT: br i1 [[COND]], label %[[NEXT:.*]], label %[[EXIT:.*]]
; CHECK: [[NEXT]]:
; CHECK-NEXT: [[SEL:%.*]] = select i1 true, ptr [[X]], ptr inttoptr (i64 12345678 to ptr)
; CHECK-NEXT: br label %[[EXIT]]
; CHECK: [[EXIT]]:
; CHECK-NEXT: [[PHI:%.*]] = phi ptr [ [[X]], %[[ENTRY]] ], [ [[SEL]], %[[NEXT]] ]
; CHECK-NEXT: [[Q:%.*]] = call ptr @callee(ptr [[PHI]])
; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[COND]], ptr [[Q]], ptr [[X]]
; CHECK-NEXT: ret ptr [[SEL2]]
;
entry:
%cmp = icmp eq ptr %x, inttoptr (i64 12345678 to ptr)
call void @llvm.assume(i1 %cmp)
br i1 %cond, label %next, label %exit
next:
%sel = select i1 %cond, ptr %x, ptr inttoptr (i64 12345678 to ptr)
br label %exit
exit:
%phi = phi ptr [ %x, %entry ], [ %sel, %next ]
%q = call ptr @callee(ptr %phi)
%sel2 = select i1 %cond, ptr %q, ptr %x
ret ptr %sel2
}
define i32 @assume_pointers_equality_maybe_different_provenance_4(ptr %x, i1 %cond) {
; CHECK-LABEL: define i32 @assume_pointers_equality_maybe_different_provenance_4(
; CHECK-SAME: ptr [[X:%.*]], i1 [[COND:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[X]], inttoptr (i64 12345678 to ptr)
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
; CHECK-NEXT: br i1 [[COND]], label %[[BB_FIRST:.*]], label %[[BB_SECOND:.*]]
; CHECK: [[BB_FIRST]]:
; CHECK-NEXT: br label %[[MERGE:.*]]
; CHECK: [[BB_SECOND]]:
; CHECK-NEXT: br label %[[MERGE]]
; CHECK: [[MERGE]]:
; CHECK-NEXT: [[PHI:%.*]] = phi ptr [ inttoptr (i64 12345678 to ptr), %[[BB_SECOND]] ], [ [[X]], %[[BB_FIRST]] ]
; CHECK-NEXT: store i32 0, ptr [[PHI]], align 4
; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[PHI]], align 4
; CHECK-NEXT: ret i32 [[V]]
;
entry:
%cmp = icmp eq ptr %x, inttoptr (i64 12345678 to ptr)
call void @llvm.assume(i1 %cmp)
br i1 %cond, label %bb.first, label %bb.second
bb.first:
br label %merge
bb.second:
br label %merge
merge:
%phi = phi ptr [ inttoptr (i64 12345678 to ptr), %bb.second ], [ %x, %bb.first ]
store i32 0, ptr %phi
%v = load i32, ptr %phi
ret i32 %v
}
define ptr @assume_pointers_equality_maybe_different_provenance_5(ptr %x) {
; CHECK-LABEL: define ptr @assume_pointers_equality_maybe_different_provenance_5(
; CHECK-SAME: ptr [[X:%.*]]) {
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[X]], inttoptr (i64 12345678 to ptr)
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[X]], i64 8
; CHECK-NEXT: ret ptr [[GEP]]
;
%cmp = icmp eq ptr %x, inttoptr (i64 12345678 to ptr)
call void @llvm.assume(i1 %cmp)
%gep = getelementptr i8, ptr %x, i64 8
ret ptr %gep
}
define i1 @assume_pointers_equality_can_replace_valid(ptr %x, ptr %y) {
; CHECK-LABEL: define i1 @assume_pointers_equality_can_replace_valid(
; CHECK-SAME: ptr [[X:%.*]], ptr [[Y:%.*]]) {
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[X]], inttoptr (i64 12345678 to ptr)
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq ptr inttoptr (i64 12345678 to ptr), [[Y]]
; CHECK-NEXT: ret i1 [[CMP2]]
;
%cmp = icmp eq ptr %x, inttoptr (i64 12345678 to ptr)
call void @llvm.assume(i1 %cmp)
%cmp2 = icmp eq ptr %x, %y
ret i1 %cmp2
}
declare void @llvm.assume(i1)