-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals
; RUN: opt < %s -passes=instcombine -instcombine-infinite-loop-threshold=2 -S | FileCheck %s
define i32 @fold(i32 %x) {
define i32 @freeze_callbr_use_after_phi(i1 %c) {
; CHECK-LABEL: @freeze_callbr_use_after_phi(
; CHECK-NEXT: entry:
-; CHECK-NEXT: [[X:%.*]] = callbr i32 asm sideeffect "", "=r"() #[[ATTR0:[0-9]+]]
+; CHECK-NEXT: [[X:%.*]] = callbr i32 asm sideeffect "", "=r"() #[[ATTR1:[0-9]+]]
; CHECK-NEXT: to label [[CALLBR_CONT:%.*]] []
; CHECK: callbr.cont:
; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[X]], [[ENTRY:%.*]] ], [ 0, [[CALLBR_CONT]] ]
; CHECK-LABEL: @combine_and_after_freezing_uses(
; CHECK-NEXT: [[X_FR:%.*]] = freeze i32 [[X:%.*]]
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X_FR]], 15
-; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 15
-; CHECK-NEXT: ret i1 [[TMP2]]
+; CHECK-NEXT: [[AND:%.*]] = icmp eq i32 [[TMP1]], 15
+; CHECK-NEXT: ret i1 [[AND]]
;
%and1 = and i32 %x, 4
%cmp1 = icmp ne i32 %and1, 0
ret i32 %x.fr
}
+declare i32 @llvm.ctpop.i32(i32)
+
+define i32 @freeze_ctpop(i32 %x) {
+; CHECK-LABEL: @freeze_ctpop(
+; CHECK-NEXT: [[Y:%.*]] = lshr i32 2047, [[X:%.*]]
+; CHECK-NEXT: [[Y_FR:%.*]] = freeze i32 [[Y]]
+; CHECK-NEXT: [[CTPOP:%.*]] = call i32 @llvm.ctpop.i32(i32 [[Y_FR]]), !range [[RNG3:![0-9]+]]
+; CHECK-NEXT: ret i32 [[CTPOP]]
+;
+ %y = lshr i32 2047, %x
+ %ctpop = call i32 @llvm.ctpop.i32(i32 %y)
+ %fr = freeze i32 %ctpop
+ ret i32 %fr
+}
+
+declare ptr @llvm.ptrmask.p0.i64(ptr, i64)
+
+define ptr @freeze_ptrmask_align(ptr %p, i64 noundef %m) {
+; CHECK-LABEL: @freeze_ptrmask_align(
+; CHECK-NEXT: [[P_FR:%.*]] = freeze ptr [[P:%.*]]
+; CHECK-NEXT: [[MASK:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P_FR]], i64 [[M:%.*]]), !aligned !1
+; CHECK-NEXT: ret ptr [[MASK]]
+;
+ %mask = call ptr @llvm.ptrmask.p0.i64(ptr %p, i64 %m), !aligned !{i64 4}
+ %fr = freeze ptr %mask
+ ret ptr %fr
+}
+
!0 = !{}
!1 = !{i64 4}
!2 = !{i32 0, i32 100}
+;.
+; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
+; CHECK: attributes #[[ATTR1]] = { nounwind }
+;.
+; CHECK: [[META0:![0-9]+]] = !{}
+; CHECK: [[META1:![0-9]+]] = !{i64 4}
+; CHECK: [[RNG2]] = !{i32 0, i32 100}
+; CHECK: [[RNG3]] = !{i32 0, i32 12}
+;.