Files
clang-p2996/llvm/test/Transforms/Attributor/value-simplify-assume.ll
Johannes Doerfert e87f10a771 [Attributor] CGSCC pass should not recompute results outside the SCC (reapply)
When we run the CGSCC pass we should only invest time on the SCC. We can
initialize AAs with information from the module slice but we should not
update those AAs. We make an exception for are call site of the SCC as
they are helpful providing information for the SCC.

Minor modifications to pointer privatization allow us to perform it even
in the CGSCC pass, similar to ArgumentPromotion.
2022-04-17 12:48:49 -05:00

1383 lines
60 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
declare void @llvm.assume(i1)
declare void @useI1p(i1*)
declare void @unknown()
define i1 @readI1p(i1* %p) {
; CHECK: Function Attrs: argmemonly nofree norecurse nosync nounwind readonly willreturn
; CHECK-LABEL: define {{[^@]+}}@readI1p
; CHECK-SAME: (i1* nocapture nofree noundef nonnull readonly dereferenceable(1) [[P:%.*]]) #[[ATTR1:[0-9]+]] {
; CHECK-NEXT: [[L:%.*]] = load i1, i1* [[P]], align 1
; CHECK-NEXT: ret i1 [[L]]
;
%l = load i1, i1* %p
ret i1 %l
}
define i1 @keep_assume_1c_nr() norecurse {
; CHECK: Function Attrs: norecurse
; CHECK-LABEL: define {{[^@]+}}@keep_assume_1c_nr
; CHECK-SAME: () #[[ATTR2:[0-9]+]] {
; CHECK-NEXT: [[STACK:%.*]] = alloca i1, align 1
; CHECK-NEXT: store i1 true, i1* [[STACK]], align 1
; CHECK-NEXT: call void @useI1p(i1* noundef nonnull dereferenceable(1) [[STACK]])
; CHECK-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[L]])
; CHECK-NEXT: ret i1 [[L]]
;
%stack = alloca i1
store i1 true, i1* %stack
call void @useI1p(i1* %stack)
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
ret i1 %l
}
define i1 @drop_assume_1c_nr() norecurse {
; IS__TUNIT____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__TUNIT____-LABEL: define {{[^@]+}}@drop_assume_1c_nr
; IS__TUNIT____-SAME: () #[[ATTR3:[0-9]+]] {
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR4:[0-9]+]]
; IS__TUNIT____-NEXT: ret i1 true
;
; IS__CGSCC____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__CGSCC____-LABEL: define {{[^@]+}}@drop_assume_1c_nr
; IS__CGSCC____-SAME: () #[[ATTR3:[0-9]+]] {
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR5:[0-9]+]]
; IS__CGSCC____-NEXT: ret i1 true
;
%stack = alloca i1
store i1 true, i1* %stack
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
ret i1 %l
}
define i1 @keep_assume_2c_nr() norecurse {
; CHECK: Function Attrs: norecurse
; CHECK-LABEL: define {{[^@]+}}@keep_assume_2c_nr
; CHECK-SAME: () #[[ATTR2]] {
; CHECK-NEXT: [[STACK:%.*]] = alloca i1, align 1
; CHECK-NEXT: store i1 true, i1* [[STACK]], align 1
; CHECK-NEXT: call void @useI1p(i1* noundef nonnull dereferenceable(1) [[STACK]])
; CHECK-NEXT: [[L1:%.*]] = load i1, i1* [[STACK]], align 1
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[L1]])
; CHECK-NEXT: call void @unknown()
; CHECK-NEXT: [[L2:%.*]] = load i1, i1* [[STACK]], align 1
; CHECK-NEXT: ret i1 [[L2]]
;
%stack = alloca i1
store i1 true, i1* %stack
call void @useI1p(i1* %stack)
%l1 = load i1, i1* %stack
call void @llvm.assume(i1 %l1)
call void @unknown()
%l2 = load i1, i1* %stack
ret i1 %l2
}
define i1 @keep_assume_3c_nr() norecurse {
; IS__TUNIT____: Function Attrs: norecurse
; IS__TUNIT____-LABEL: define {{[^@]+}}@keep_assume_3c_nr
; IS__TUNIT____-SAME: () #[[ATTR2]] {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: call void @useI1p(i1* noundef nonnull dereferenceable(1) [[STACK]])
; IS__TUNIT____-NEXT: ret i1 [[L]]
;
; IS__CGSCC____: Function Attrs: norecurse
; IS__CGSCC____-LABEL: define {{[^@]+}}@keep_assume_3c_nr
; IS__CGSCC____-SAME: () #[[ATTR2]] {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: call void @useI1p(i1* noundef nonnull dereferenceable(1) [[STACK]])
; IS__CGSCC____-NEXT: ret i1 [[L]]
;
%stack = alloca i1
store i1 true, i1* %stack
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
call void @useI1p(i1* %stack)
ret i1 %l
}
define i1 @keep_assume_4c_nr() norecurse {
; IS__TUNIT____: Function Attrs: norecurse
; IS__TUNIT____-LABEL: define {{[^@]+}}@keep_assume_4c_nr
; IS__TUNIT____-SAME: () #[[ATTR2]] {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L4:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L4]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: call void @useI1p(i1* noalias nocapture noundef nonnull dereferenceable(1) [[STACK]])
; IS__TUNIT____-NEXT: ret i1 [[L4]]
;
; IS__CGSCC____: Function Attrs: norecurse
; IS__CGSCC____-LABEL: define {{[^@]+}}@keep_assume_4c_nr
; IS__CGSCC____-SAME: () #[[ATTR2]] {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L4:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L4]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: call void @useI1p(i1* noalias nocapture noundef nonnull dereferenceable(1) [[STACK]])
; IS__CGSCC____-NEXT: ret i1 [[L4]]
;
%stack = alloca i1
store i1 true, i1* %stack
%l4 = load i1, i1* %stack
call void @llvm.assume(i1 %l4)
call void @useI1p(i1* nocapture %stack)
ret i1 %l4
}
define i1 @keep_assume_1_nr(i1 %arg) norecurse {
; CHECK: Function Attrs: norecurse
; CHECK-LABEL: define {{[^@]+}}@keep_assume_1_nr
; CHECK-SAME: (i1 [[ARG:%.*]]) #[[ATTR2]] {
; CHECK-NEXT: [[STACK:%.*]] = alloca i1, align 1
; CHECK-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; CHECK-NEXT: call void @useI1p(i1* noundef nonnull dereferenceable(1) [[STACK]])
; CHECK-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[L]])
; CHECK-NEXT: ret i1 [[L]]
;
%stack = alloca i1
store i1 %arg, i1* %stack
call void @useI1p(i1* %stack)
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
ret i1 %l
}
define i1 @drop_assume_1_nr(i1 %arg) norecurse {
; IS__TUNIT____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__TUNIT____-LABEL: define {{[^@]+}}@drop_assume_1_nr
; IS__TUNIT____-SAME: (i1 returned [[ARG:%.*]]) #[[ATTR3]] {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[ARG]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: ret i1 [[ARG]]
;
; IS__CGSCC____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__CGSCC____-LABEL: define {{[^@]+}}@drop_assume_1_nr
; IS__CGSCC____-SAME: (i1 returned [[ARG:%.*]]) #[[ATTR3]] {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[ARG]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: ret i1 [[ARG]]
;
%stack = alloca i1
store i1 %arg, i1* %stack
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
ret i1 %l
}
define i1 @keep_assume_2_nr(i1 %arg) norecurse {
; CHECK: Function Attrs: norecurse
; CHECK-LABEL: define {{[^@]+}}@keep_assume_2_nr
; CHECK-SAME: (i1 [[ARG:%.*]]) #[[ATTR2]] {
; CHECK-NEXT: [[STACK:%.*]] = alloca i1, align 1
; CHECK-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; CHECK-NEXT: call void @useI1p(i1* noundef nonnull dereferenceable(1) [[STACK]])
; CHECK-NEXT: [[L1:%.*]] = load i1, i1* [[STACK]], align 1
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[L1]])
; CHECK-NEXT: call void @unknown()
; CHECK-NEXT: [[L2:%.*]] = load i1, i1* [[STACK]], align 1
; CHECK-NEXT: ret i1 [[L2]]
;
%stack = alloca i1
store i1 %arg, i1* %stack
call void @useI1p(i1* %stack)
%l1 = load i1, i1* %stack
call void @llvm.assume(i1 %l1)
call void @unknown()
%l2 = load i1, i1* %stack
ret i1 %l2
}
define i1 @keep_assume_3_nr(i1 %arg) norecurse {
; IS__TUNIT____: Function Attrs: norecurse
; IS__TUNIT____-LABEL: define {{[^@]+}}@keep_assume_3_nr
; IS__TUNIT____-SAME: (i1 [[ARG:%.*]]) #[[ATTR2]] {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: call void @useI1p(i1* noundef nonnull dereferenceable(1) [[STACK]])
; IS__TUNIT____-NEXT: ret i1 [[L]]
;
; IS__CGSCC____: Function Attrs: norecurse
; IS__CGSCC____-LABEL: define {{[^@]+}}@keep_assume_3_nr
; IS__CGSCC____-SAME: (i1 [[ARG:%.*]]) #[[ATTR2]] {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: call void @useI1p(i1* noundef nonnull dereferenceable(1) [[STACK]])
; IS__CGSCC____-NEXT: ret i1 [[L]]
;
%stack = alloca i1
store i1 %arg, i1* %stack
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
call void @useI1p(i1* %stack)
ret i1 %l
}
define i1 @keep_assume_4_nr(i1 %arg) norecurse {
; IS__TUNIT____: Function Attrs: norecurse
; IS__TUNIT____-LABEL: define {{[^@]+}}@keep_assume_4_nr
; IS__TUNIT____-SAME: (i1 [[ARG:%.*]]) #[[ATTR2]] {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: call void @useI1p(i1* noalias nocapture noundef nonnull dereferenceable(1) [[STACK]])
; IS__TUNIT____-NEXT: ret i1 [[L]]
;
; IS__CGSCC____: Function Attrs: norecurse
; IS__CGSCC____-LABEL: define {{[^@]+}}@keep_assume_4_nr
; IS__CGSCC____-SAME: (i1 [[ARG:%.*]]) #[[ATTR2]] {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: call void @useI1p(i1* noalias nocapture noundef nonnull dereferenceable(1) [[STACK]])
; IS__CGSCC____-NEXT: ret i1 [[L]]
;
%stack = alloca i1
store i1 %arg, i1* %stack
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
call void @useI1p(i1* nocapture %stack)
ret i1 %l
}
define i1 @assume_1_nr(i1 %arg, i1 %cond) norecurse {
; IS__TUNIT____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__TUNIT____-LABEL: define {{[^@]+}}@assume_1_nr
; IS__TUNIT____-SAME: (i1 returned [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[ARG]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__TUNIT____: t:
; IS__TUNIT____-NEXT: br label [[M:%.*]]
; IS__TUNIT____: f:
; IS__TUNIT____-NEXT: br label [[M]]
; IS__TUNIT____: m:
; IS__TUNIT____-NEXT: ret i1 [[ARG]]
;
; IS__CGSCC____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__CGSCC____-LABEL: define {{[^@]+}}@assume_1_nr
; IS__CGSCC____-SAME: (i1 returned [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[ARG]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__CGSCC____: t:
; IS__CGSCC____-NEXT: br label [[M:%.*]]
; IS__CGSCC____: f:
; IS__CGSCC____-NEXT: br label [[M]]
; IS__CGSCC____: m:
; IS__CGSCC____-NEXT: ret i1 [[ARG]]
;
%stack = alloca i1
store i1 %arg, i1* %stack
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
br i1 %cond, label %t, label %f
t:
store i1 true, i1* %stack
br label %m
f:
store i1 false, i1* %stack
br label %m
m:
ret i1 %l
}
define void @assume_1b_nr(i1 %arg, i1 %cond) norecurse {
; IS__TUNIT____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__TUNIT____-LABEL: define {{[^@]+}}@assume_1b_nr
; IS__TUNIT____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__TUNIT____: t:
; IS__TUNIT____-NEXT: br label [[M:%.*]]
; IS__TUNIT____: f:
; IS__TUNIT____-NEXT: br label [[M]]
; IS__TUNIT____: m:
; IS__TUNIT____-NEXT: ret void
;
; IS__CGSCC____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__CGSCC____-LABEL: define {{[^@]+}}@assume_1b_nr
; IS__CGSCC____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__CGSCC____: t:
; IS__CGSCC____-NEXT: br label [[M:%.*]]
; IS__CGSCC____: f:
; IS__CGSCC____-NEXT: br label [[M]]
; IS__CGSCC____: m:
; IS__CGSCC____-NEXT: ret void
;
%stack = alloca i1
store i1 %arg, i1* %stack
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
br i1 %cond, label %t, label %f
t:
store i1 true, i1* %stack
br label %m
f:
store i1 false, i1* %stack
br label %m
m:
ret void
}
define i1 @assume_2_nr(i1 %arg, i1 %cond) norecurse {
; IS__TUNIT____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__TUNIT____-LABEL: define {{[^@]+}}@assume_2_nr
; IS__TUNIT____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__TUNIT____: t:
; IS__TUNIT____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: br label [[M:%.*]]
; IS__TUNIT____: f:
; IS__TUNIT____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: br label [[M]]
; IS__TUNIT____: m:
; IS__TUNIT____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: ret i1 [[L]]
;
; IS__CGSCC____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__CGSCC____-LABEL: define {{[^@]+}}@assume_2_nr
; IS__CGSCC____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__CGSCC____: t:
; IS__CGSCC____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: br label [[M:%.*]]
; IS__CGSCC____: f:
; IS__CGSCC____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: br label [[M]]
; IS__CGSCC____: m:
; IS__CGSCC____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: ret i1 [[L]]
;
%stack = alloca i1
store i1 %arg, i1* %stack
br i1 %cond, label %t, label %f
t:
store i1 true, i1* %stack
br label %m
f:
store i1 false, i1* %stack
br label %m
m:
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
ret i1 %l
}
define void @assume_2b_nr(i1 %arg, i1 %cond) norecurse {
; IS__TUNIT____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__TUNIT____-LABEL: define {{[^@]+}}@assume_2b_nr
; IS__TUNIT____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__TUNIT____: t:
; IS__TUNIT____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: br label [[M:%.*]]
; IS__TUNIT____: f:
; IS__TUNIT____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: br label [[M]]
; IS__TUNIT____: m:
; IS__TUNIT____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: ret void
;
; IS__CGSCC____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__CGSCC____-LABEL: define {{[^@]+}}@assume_2b_nr
; IS__CGSCC____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__CGSCC____: t:
; IS__CGSCC____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: br label [[M:%.*]]
; IS__CGSCC____: f:
; IS__CGSCC____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: br label [[M]]
; IS__CGSCC____: m:
; IS__CGSCC____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: ret void
;
%stack = alloca i1
store i1 %arg, i1* %stack
br i1 %cond, label %t, label %f
t:
store i1 true, i1* %stack
br label %m
f:
store i1 false, i1* %stack
br label %m
m:
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
ret void
}
define i1 @assume_3_nr(i1 %arg, i1 %cond) norecurse {
; IS__TUNIT____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__TUNIT____-LABEL: define {{[^@]+}}@assume_3_nr
; IS__TUNIT____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__TUNIT____: t:
; IS__TUNIT____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: br label [[M:%.*]]
; IS__TUNIT____: f:
; IS__TUNIT____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: br label [[M]]
; IS__TUNIT____: m:
; IS__TUNIT____-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR5:[0-9]+]]
; IS__TUNIT____-NEXT: ret i1 [[R]]
;
; IS__CGSCC____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__CGSCC____-LABEL: define {{[^@]+}}@assume_3_nr
; IS__CGSCC____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__CGSCC____: t:
; IS__CGSCC____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: br label [[M:%.*]]
; IS__CGSCC____: f:
; IS__CGSCC____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: br label [[M]]
; IS__CGSCC____: m:
; IS__CGSCC____-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR6:[0-9]+]]
; IS__CGSCC____-NEXT: ret i1 [[R]]
;
%stack = alloca i1
store i1 %arg, i1* %stack
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
br i1 %cond, label %t, label %f
t:
store i1 true, i1* %stack
br label %m
f:
store i1 false, i1* %stack
br label %m
m:
%r = call i1 @readI1p(i1* %stack)
ret i1 %r
}
define i1 @assume_4_nr(i1 %arg, i1 %cond) norecurse {
; IS__TUNIT____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__TUNIT____-LABEL: define {{[^@]+}}@assume_4_nr
; IS__TUNIT____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__TUNIT____: t:
; IS__TUNIT____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: br label [[M:%.*]]
; IS__TUNIT____: f:
; IS__TUNIT____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: br label [[M]]
; IS__TUNIT____: m:
; IS__TUNIT____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR5]]
; IS__TUNIT____-NEXT: ret i1 [[R]]
;
; IS__CGSCC____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__CGSCC____-LABEL: define {{[^@]+}}@assume_4_nr
; IS__CGSCC____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__CGSCC____: t:
; IS__CGSCC____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: br label [[M:%.*]]
; IS__CGSCC____: f:
; IS__CGSCC____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: br label [[M]]
; IS__CGSCC____: m:
; IS__CGSCC____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR6]]
; IS__CGSCC____-NEXT: ret i1 [[R]]
;
%stack = alloca i1
store i1 %arg, i1* %stack
br i1 %cond, label %t, label %f
t:
store i1 true, i1* %stack
br label %m
f:
store i1 false, i1* %stack
br label %m
m:
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
%r = call i1 @readI1p(i1* %stack)
ret i1 %r
}
define i1 @assume_5_nr(i1 %arg, i1 %cond) norecurse {
; IS__TUNIT____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__TUNIT____-LABEL: define {{[^@]+}}@assume_5_nr
; IS__TUNIT____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L1:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L1]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__TUNIT____: t:
; IS__TUNIT____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L2:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L2]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: br label [[M:%.*]]
; IS__TUNIT____: f:
; IS__TUNIT____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L3:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L3]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: br label [[M]]
; IS__TUNIT____: m:
; IS__TUNIT____-NEXT: [[L4:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L4]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR5]]
; IS__TUNIT____-NEXT: ret i1 [[R]]
;
; IS__CGSCC____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__CGSCC____-LABEL: define {{[^@]+}}@assume_5_nr
; IS__CGSCC____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L1:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L1]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__CGSCC____: t:
; IS__CGSCC____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L2:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L2]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: br label [[M:%.*]]
; IS__CGSCC____: f:
; IS__CGSCC____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L3:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L3]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: br label [[M]]
; IS__CGSCC____: m:
; IS__CGSCC____-NEXT: [[L4:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L4]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR6]]
; IS__CGSCC____-NEXT: ret i1 [[R]]
;
%stack = alloca i1
store i1 %arg, i1* %stack
%l1 = load i1, i1* %stack
call void @llvm.assume(i1 %l1)
br i1 %cond, label %t, label %f
t:
store i1 true, i1* %stack
%l2 = load i1, i1* %stack
call void @llvm.assume(i1 %l2)
br label %m
f:
store i1 false, i1* %stack
%l3 = load i1, i1* %stack
call void @llvm.assume(i1 %l3)
br label %m
m:
%l4 = load i1, i1* %stack
call void @llvm.assume(i1 %l4)
%r = call i1 @readI1p(i1* %stack)
ret i1 %r
}
define i1 @assume_5c_nr(i1 %cond) norecurse {
; IS__TUNIT____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__TUNIT____-LABEL: define {{[^@]+}}@assume_5c_nr
; IS__TUNIT____-SAME: (i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L1:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L1]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__TUNIT____: t:
; IS__TUNIT____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L2:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L2]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: br label [[M:%.*]]
; IS__TUNIT____: f:
; IS__TUNIT____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L3:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L3]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: br label [[M]]
; IS__TUNIT____: m:
; IS__TUNIT____-NEXT: [[L4:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L4]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR5]]
; IS__TUNIT____-NEXT: ret i1 [[R]]
;
; IS__CGSCC____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__CGSCC____-LABEL: define {{[^@]+}}@assume_5c_nr
; IS__CGSCC____-SAME: (i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L1:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L1]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__CGSCC____: t:
; IS__CGSCC____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L2:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L2]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: br label [[M:%.*]]
; IS__CGSCC____: f:
; IS__CGSCC____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L3:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L3]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: br label [[M]]
; IS__CGSCC____: m:
; IS__CGSCC____-NEXT: [[L4:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L4]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR6]]
; IS__CGSCC____-NEXT: ret i1 [[R]]
;
%stack = alloca i1
store i1 true, i1* %stack
%l1 = load i1, i1* %stack
call void @llvm.assume(i1 %l1)
br i1 %cond, label %t, label %f
t:
store i1 true, i1* %stack
%l2 = load i1, i1* %stack
call void @llvm.assume(i1 %l2)
br label %m
f:
store i1 false, i1* %stack
%l3 = load i1, i1* %stack
call void @llvm.assume(i1 %l3)
br label %m
m:
%l4 = load i1, i1* %stack
call void @llvm.assume(i1 %l4)
%r = call i1 @readI1p(i1* %stack)
ret i1 %r
}
define i1 @keep_assume_1c() {
; CHECK-LABEL: define {{[^@]+}}@keep_assume_1c() {
; CHECK-NEXT: [[STACK:%.*]] = alloca i1, align 1
; CHECK-NEXT: store i1 true, i1* [[STACK]], align 1
; CHECK-NEXT: call void @useI1p(i1* noundef nonnull dereferenceable(1) [[STACK]])
; CHECK-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[L]])
; CHECK-NEXT: ret i1 [[L]]
;
%stack = alloca i1
store i1 true, i1* %stack
call void @useI1p(i1* %stack)
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
ret i1 %l
}
define i1 @drop_assume_1c() {
; IS__TUNIT____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__TUNIT____-LABEL: define {{[^@]+}}@drop_assume_1c
; IS__TUNIT____-SAME: () #[[ATTR3]] {
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR4]]
; IS__TUNIT____-NEXT: ret i1 true
;
; IS__CGSCC____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__CGSCC____-LABEL: define {{[^@]+}}@drop_assume_1c
; IS__CGSCC____-SAME: () #[[ATTR3]] {
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR5]]
; IS__CGSCC____-NEXT: ret i1 true
;
%stack = alloca i1
store i1 true, i1* %stack
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
ret i1 %l
}
define i1 @keep_assume_2c() {
; CHECK-LABEL: define {{[^@]+}}@keep_assume_2c() {
; CHECK-NEXT: [[STACK:%.*]] = alloca i1, align 1
; CHECK-NEXT: store i1 true, i1* [[STACK]], align 1
; CHECK-NEXT: call void @useI1p(i1* noundef nonnull dereferenceable(1) [[STACK]])
; CHECK-NEXT: [[L1:%.*]] = load i1, i1* [[STACK]], align 1
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[L1]])
; CHECK-NEXT: call void @unknown()
; CHECK-NEXT: [[L2:%.*]] = load i1, i1* [[STACK]], align 1
; CHECK-NEXT: ret i1 [[L2]]
;
%stack = alloca i1
store i1 true, i1* %stack
call void @useI1p(i1* %stack)
%l1 = load i1, i1* %stack
call void @llvm.assume(i1 %l1)
call void @unknown()
%l2 = load i1, i1* %stack
ret i1 %l2
}
define i1 @keep_assume_3c() {
; IS__TUNIT____-LABEL: define {{[^@]+}}@keep_assume_3c() {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: call void @useI1p(i1* noundef nonnull dereferenceable(1) [[STACK]])
; IS__TUNIT____-NEXT: ret i1 [[L]]
;
; IS__CGSCC____-LABEL: define {{[^@]+}}@keep_assume_3c() {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: call void @useI1p(i1* noundef nonnull dereferenceable(1) [[STACK]])
; IS__CGSCC____-NEXT: ret i1 [[L]]
;
%stack = alloca i1
store i1 true, i1* %stack
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
call void @useI1p(i1* %stack)
ret i1 %l
}
define i1 @keep_assume_4c() {
; IS__TUNIT____-LABEL: define {{[^@]+}}@keep_assume_4c() {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L4:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L4]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: call void @useI1p(i1* noalias nocapture noundef nonnull dereferenceable(1) [[STACK]])
; IS__TUNIT____-NEXT: ret i1 [[L4]]
;
; IS__CGSCC____-LABEL: define {{[^@]+}}@keep_assume_4c() {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L4:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L4]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: call void @useI1p(i1* noalias nocapture noundef nonnull dereferenceable(1) [[STACK]])
; IS__CGSCC____-NEXT: ret i1 [[L4]]
;
%stack = alloca i1
store i1 true, i1* %stack
%l4 = load i1, i1* %stack
call void @llvm.assume(i1 %l4)
call void @useI1p(i1* nocapture %stack)
ret i1 %l4
}
define i1 @keep_assume_1(i1 %arg) {
; CHECK-LABEL: define {{[^@]+}}@keep_assume_1
; CHECK-SAME: (i1 [[ARG:%.*]]) {
; CHECK-NEXT: [[STACK:%.*]] = alloca i1, align 1
; CHECK-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; CHECK-NEXT: call void @useI1p(i1* noundef nonnull dereferenceable(1) [[STACK]])
; CHECK-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[L]])
; CHECK-NEXT: ret i1 [[L]]
;
%stack = alloca i1
store i1 %arg, i1* %stack
call void @useI1p(i1* %stack)
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
ret i1 %l
}
define i1 @drop_assume_1(i1 %arg) {
; IS__TUNIT____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__TUNIT____-LABEL: define {{[^@]+}}@drop_assume_1
; IS__TUNIT____-SAME: (i1 returned [[ARG:%.*]]) #[[ATTR3]] {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[ARG]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: ret i1 [[ARG]]
;
; IS__CGSCC____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__CGSCC____-LABEL: define {{[^@]+}}@drop_assume_1
; IS__CGSCC____-SAME: (i1 returned [[ARG:%.*]]) #[[ATTR3]] {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[ARG]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: ret i1 [[ARG]]
;
%stack = alloca i1
store i1 %arg, i1* %stack
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
ret i1 %l
}
define i1 @keep_assume_2(i1 %arg) {
; CHECK-LABEL: define {{[^@]+}}@keep_assume_2
; CHECK-SAME: (i1 [[ARG:%.*]]) {
; CHECK-NEXT: [[STACK:%.*]] = alloca i1, align 1
; CHECK-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; CHECK-NEXT: call void @useI1p(i1* noundef nonnull dereferenceable(1) [[STACK]])
; CHECK-NEXT: [[L1:%.*]] = load i1, i1* [[STACK]], align 1
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[L1]])
; CHECK-NEXT: call void @unknown()
; CHECK-NEXT: [[L2:%.*]] = load i1, i1* [[STACK]], align 1
; CHECK-NEXT: ret i1 [[L2]]
;
%stack = alloca i1
store i1 %arg, i1* %stack
call void @useI1p(i1* %stack)
%l1 = load i1, i1* %stack
call void @llvm.assume(i1 %l1)
call void @unknown()
%l2 = load i1, i1* %stack
ret i1 %l2
}
define i1 @keep_assume_3(i1 %arg) {
; IS__TUNIT____-LABEL: define {{[^@]+}}@keep_assume_3
; IS__TUNIT____-SAME: (i1 [[ARG:%.*]]) {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: call void @useI1p(i1* noundef nonnull dereferenceable(1) [[STACK]])
; IS__TUNIT____-NEXT: ret i1 [[L]]
;
; IS__CGSCC____-LABEL: define {{[^@]+}}@keep_assume_3
; IS__CGSCC____-SAME: (i1 [[ARG:%.*]]) {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: call void @useI1p(i1* noundef nonnull dereferenceable(1) [[STACK]])
; IS__CGSCC____-NEXT: ret i1 [[L]]
;
%stack = alloca i1
store i1 %arg, i1* %stack
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
call void @useI1p(i1* %stack)
ret i1 %l
}
define i1 @keep_assume_4(i1 %arg) {
; IS__TUNIT____-LABEL: define {{[^@]+}}@keep_assume_4
; IS__TUNIT____-SAME: (i1 [[ARG:%.*]]) {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: call void @useI1p(i1* noalias nocapture noundef nonnull dereferenceable(1) [[STACK]])
; IS__TUNIT____-NEXT: ret i1 [[L]]
;
; IS__CGSCC____-LABEL: define {{[^@]+}}@keep_assume_4
; IS__CGSCC____-SAME: (i1 [[ARG:%.*]]) {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: call void @useI1p(i1* noalias nocapture noundef nonnull dereferenceable(1) [[STACK]])
; IS__CGSCC____-NEXT: ret i1 [[L]]
;
%stack = alloca i1
store i1 %arg, i1* %stack
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
call void @useI1p(i1* nocapture %stack)
ret i1 %l
}
define i1 @assume_1(i1 %arg, i1 %cond) {
; IS__TUNIT____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__TUNIT____-LABEL: define {{[^@]+}}@assume_1
; IS__TUNIT____-SAME: (i1 returned [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[ARG]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__TUNIT____: t:
; IS__TUNIT____-NEXT: br label [[M:%.*]]
; IS__TUNIT____: f:
; IS__TUNIT____-NEXT: br label [[M]]
; IS__TUNIT____: m:
; IS__TUNIT____-NEXT: ret i1 [[ARG]]
;
; IS__CGSCC____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__CGSCC____-LABEL: define {{[^@]+}}@assume_1
; IS__CGSCC____-SAME: (i1 returned [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[ARG]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__CGSCC____: t:
; IS__CGSCC____-NEXT: br label [[M:%.*]]
; IS__CGSCC____: f:
; IS__CGSCC____-NEXT: br label [[M]]
; IS__CGSCC____: m:
; IS__CGSCC____-NEXT: ret i1 [[ARG]]
;
%stack = alloca i1
store i1 %arg, i1* %stack
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
br i1 %cond, label %t, label %f
t:
store i1 true, i1* %stack
br label %m
f:
store i1 false, i1* %stack
br label %m
m:
ret i1 %l
}
define void @assume_1b(i1 %arg, i1 %cond) {
; IS__TUNIT____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__TUNIT____-LABEL: define {{[^@]+}}@assume_1b
; IS__TUNIT____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__TUNIT____: t:
; IS__TUNIT____-NEXT: br label [[M:%.*]]
; IS__TUNIT____: f:
; IS__TUNIT____-NEXT: br label [[M]]
; IS__TUNIT____: m:
; IS__TUNIT____-NEXT: ret void
;
; IS__CGSCC____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__CGSCC____-LABEL: define {{[^@]+}}@assume_1b
; IS__CGSCC____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__CGSCC____: t:
; IS__CGSCC____-NEXT: br label [[M:%.*]]
; IS__CGSCC____: f:
; IS__CGSCC____-NEXT: br label [[M]]
; IS__CGSCC____: m:
; IS__CGSCC____-NEXT: ret void
;
%stack = alloca i1
store i1 %arg, i1* %stack
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
br i1 %cond, label %t, label %f
t:
store i1 true, i1* %stack
br label %m
f:
store i1 false, i1* %stack
br label %m
m:
ret void
}
define i1 @assume_2(i1 %arg, i1 %cond) {
; IS__TUNIT____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__TUNIT____-LABEL: define {{[^@]+}}@assume_2
; IS__TUNIT____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__TUNIT____: t:
; IS__TUNIT____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: br label [[M:%.*]]
; IS__TUNIT____: f:
; IS__TUNIT____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: br label [[M]]
; IS__TUNIT____: m:
; IS__TUNIT____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: ret i1 [[L]]
;
; IS__CGSCC____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__CGSCC____-LABEL: define {{[^@]+}}@assume_2
; IS__CGSCC____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__CGSCC____: t:
; IS__CGSCC____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: br label [[M:%.*]]
; IS__CGSCC____: f:
; IS__CGSCC____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: br label [[M]]
; IS__CGSCC____: m:
; IS__CGSCC____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: ret i1 [[L]]
;
%stack = alloca i1
store i1 %arg, i1* %stack
br i1 %cond, label %t, label %f
t:
store i1 true, i1* %stack
br label %m
f:
store i1 false, i1* %stack
br label %m
m:
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
ret i1 %l
}
define void @assume_2b(i1 %arg, i1 %cond) {
; IS__TUNIT____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__TUNIT____-LABEL: define {{[^@]+}}@assume_2b
; IS__TUNIT____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__TUNIT____: t:
; IS__TUNIT____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: br label [[M:%.*]]
; IS__TUNIT____: f:
; IS__TUNIT____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: br label [[M]]
; IS__TUNIT____: m:
; IS__TUNIT____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: ret void
;
; IS__CGSCC____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__CGSCC____-LABEL: define {{[^@]+}}@assume_2b
; IS__CGSCC____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__CGSCC____: t:
; IS__CGSCC____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: br label [[M:%.*]]
; IS__CGSCC____: f:
; IS__CGSCC____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: br label [[M]]
; IS__CGSCC____: m:
; IS__CGSCC____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: ret void
;
%stack = alloca i1
store i1 %arg, i1* %stack
br i1 %cond, label %t, label %f
t:
store i1 true, i1* %stack
br label %m
f:
store i1 false, i1* %stack
br label %m
m:
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
ret void
}
define i1 @assume_3(i1 %arg, i1 %cond) {
; IS__TUNIT____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__TUNIT____-LABEL: define {{[^@]+}}@assume_3
; IS__TUNIT____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__TUNIT____: t:
; IS__TUNIT____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: br label [[M:%.*]]
; IS__TUNIT____: f:
; IS__TUNIT____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: br label [[M]]
; IS__TUNIT____: m:
; IS__TUNIT____-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR5]]
; IS__TUNIT____-NEXT: ret i1 [[R]]
;
; IS__CGSCC____: Function Attrs: inaccessiblememonly nofree nosync nounwind willreturn
; IS__CGSCC____-LABEL: define {{[^@]+}}@assume_3
; IS__CGSCC____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR4:[0-9]+]] {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__CGSCC____: t:
; IS__CGSCC____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: br label [[M:%.*]]
; IS__CGSCC____: f:
; IS__CGSCC____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: br label [[M]]
; IS__CGSCC____: m:
; IS__CGSCC____-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR6]]
; IS__CGSCC____-NEXT: ret i1 [[R]]
;
%stack = alloca i1
store i1 %arg, i1* %stack
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
br i1 %cond, label %t, label %f
t:
store i1 true, i1* %stack
br label %m
f:
store i1 false, i1* %stack
br label %m
m:
%r = call i1 @readI1p(i1* %stack)
ret i1 %r
}
define i1 @assume_4(i1 %arg, i1 %cond) {
; IS__TUNIT____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__TUNIT____-LABEL: define {{[^@]+}}@assume_4
; IS__TUNIT____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__TUNIT____: t:
; IS__TUNIT____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: br label [[M:%.*]]
; IS__TUNIT____: f:
; IS__TUNIT____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: br label [[M]]
; IS__TUNIT____: m:
; IS__TUNIT____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR5]]
; IS__TUNIT____-NEXT: ret i1 [[R]]
;
; IS__CGSCC____: Function Attrs: inaccessiblememonly nofree nosync nounwind willreturn
; IS__CGSCC____-LABEL: define {{[^@]+}}@assume_4
; IS__CGSCC____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR4]] {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__CGSCC____: t:
; IS__CGSCC____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: br label [[M:%.*]]
; IS__CGSCC____: f:
; IS__CGSCC____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: br label [[M]]
; IS__CGSCC____: m:
; IS__CGSCC____-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR6]]
; IS__CGSCC____-NEXT: ret i1 [[R]]
;
%stack = alloca i1
store i1 %arg, i1* %stack
br i1 %cond, label %t, label %f
t:
store i1 true, i1* %stack
br label %m
f:
store i1 false, i1* %stack
br label %m
m:
%l = load i1, i1* %stack
call void @llvm.assume(i1 %l)
%r = call i1 @readI1p(i1* %stack)
ret i1 %r
}
define i1 @assume_5(i1 %arg, i1 %cond) {
; IS__TUNIT____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__TUNIT____-LABEL: define {{[^@]+}}@assume_5
; IS__TUNIT____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L1:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L1]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__TUNIT____: t:
; IS__TUNIT____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L2:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L2]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: br label [[M:%.*]]
; IS__TUNIT____: f:
; IS__TUNIT____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L3:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L3]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: br label [[M]]
; IS__TUNIT____: m:
; IS__TUNIT____-NEXT: [[L4:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L4]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR5]]
; IS__TUNIT____-NEXT: ret i1 [[R]]
;
; IS__CGSCC____: Function Attrs: inaccessiblememonly nofree nosync nounwind willreturn
; IS__CGSCC____-LABEL: define {{[^@]+}}@assume_5
; IS__CGSCC____-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR4]] {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L1:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L1]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__CGSCC____: t:
; IS__CGSCC____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L2:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L2]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: br label [[M:%.*]]
; IS__CGSCC____: f:
; IS__CGSCC____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L3:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L3]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: br label [[M]]
; IS__CGSCC____: m:
; IS__CGSCC____-NEXT: [[L4:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L4]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR6]]
; IS__CGSCC____-NEXT: ret i1 [[R]]
;
%stack = alloca i1
store i1 %arg, i1* %stack
%l1 = load i1, i1* %stack
call void @llvm.assume(i1 %l1)
br i1 %cond, label %t, label %f
t:
store i1 true, i1* %stack
%l2 = load i1, i1* %stack
call void @llvm.assume(i1 %l2)
br label %m
f:
store i1 false, i1* %stack
%l3 = load i1, i1* %stack
call void @llvm.assume(i1 %l3)
br label %m
m:
%l4 = load i1, i1* %stack
call void @llvm.assume(i1 %l4)
%r = call i1 @readI1p(i1* %stack)
ret i1 %r
}
define i1 @assume_5c(i1 %cond) {
; IS__TUNIT____: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
; IS__TUNIT____-LABEL: define {{[^@]+}}@assume_5c
; IS__TUNIT____-SAME: (i1 [[COND:%.*]]) #[[ATTR3]] {
; IS__TUNIT____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__TUNIT____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L1:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L1]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__TUNIT____: t:
; IS__TUNIT____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L2:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L2]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: br label [[M:%.*]]
; IS__TUNIT____: f:
; IS__TUNIT____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: [[L3:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L3]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: br label [[M]]
; IS__TUNIT____: m:
; IS__TUNIT____-NEXT: [[L4:%.*]] = load i1, i1* [[STACK]], align 1
; IS__TUNIT____-NEXT: call void @llvm.assume(i1 noundef [[L4]]) #[[ATTR4]]
; IS__TUNIT____-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR5]]
; IS__TUNIT____-NEXT: ret i1 [[R]]
;
; IS__CGSCC____: Function Attrs: inaccessiblememonly nofree nosync nounwind willreturn
; IS__CGSCC____-LABEL: define {{[^@]+}}@assume_5c
; IS__CGSCC____-SAME: (i1 [[COND:%.*]]) #[[ATTR4]] {
; IS__CGSCC____-NEXT: [[STACK:%.*]] = alloca i1, align 1
; IS__CGSCC____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L1:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L1]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
; IS__CGSCC____: t:
; IS__CGSCC____-NEXT: store i1 true, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L2:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L2]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: br label [[M:%.*]]
; IS__CGSCC____: f:
; IS__CGSCC____-NEXT: store i1 false, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: [[L3:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L3]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: br label [[M]]
; IS__CGSCC____: m:
; IS__CGSCC____-NEXT: [[L4:%.*]] = load i1, i1* [[STACK]], align 1
; IS__CGSCC____-NEXT: call void @llvm.assume(i1 noundef [[L4]]) #[[ATTR5]]
; IS__CGSCC____-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR6]]
; IS__CGSCC____-NEXT: ret i1 [[R]]
;
%stack = alloca i1
store i1 true, i1* %stack
%l1 = load i1, i1* %stack
call void @llvm.assume(i1 %l1)
br i1 %cond, label %t, label %f
t:
store i1 true, i1* %stack
%l2 = load i1, i1* %stack
call void @llvm.assume(i1 %l2)
br label %m
f:
store i1 false, i1* %stack
%l3 = load i1, i1* %stack
call void @llvm.assume(i1 %l3)
br label %m
m:
%l4 = load i1, i1* %stack
call void @llvm.assume(i1 %l4)
%r = call i1 @readI1p(i1* %stack)
ret i1 %r
}
;.
; IS__TUNIT____: attributes #[[ATTR0:[0-9]+]] = { inaccessiblememonly nocallback nofree nosync nounwind willreturn }
; IS__TUNIT____: attributes #[[ATTR1]] = { argmemonly nofree norecurse nosync nounwind readonly willreturn }
; IS__TUNIT____: attributes #[[ATTR2]] = { norecurse }
; IS__TUNIT____: attributes #[[ATTR3]] = { inaccessiblememonly nofree norecurse nosync nounwind willreturn }
; IS__TUNIT____: attributes #[[ATTR4]] = { willreturn }
; IS__TUNIT____: attributes #[[ATTR5]] = { nofree nosync nounwind readonly willreturn }
;.
; IS__CGSCC____: attributes #[[ATTR0:[0-9]+]] = { inaccessiblememonly nocallback nofree nosync nounwind willreturn }
; IS__CGSCC____: attributes #[[ATTR1]] = { argmemonly nofree norecurse nosync nounwind readonly willreturn }
; IS__CGSCC____: attributes #[[ATTR2]] = { norecurse }
; IS__CGSCC____: attributes #[[ATTR3]] = { inaccessiblememonly nofree norecurse nosync nounwind willreturn }
; IS__CGSCC____: attributes #[[ATTR4]] = { inaccessiblememonly nofree nosync nounwind willreturn }
; IS__CGSCC____: attributes #[[ATTR5]] = { willreturn }
; IS__CGSCC____: attributes #[[ATTR6]] = { readonly willreturn }
;.