11; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature
2+ ; RUN: opt -assume-builder -verify --enable-knowledge-retention -S %s | FileCheck %s --check-prefixes=BASIC
3+ ; RUN: opt -assume-builder -verify --enable-knowledge-retention --assume-preserve-all -S %s | FileCheck %s --check-prefixes=ALL
4+ ; RUN: opt -assumption-cache-tracker -assume-builder -verify --enable-knowledge-retention -S %s | FileCheck %s --check-prefixes=WITH-AC
5+ ; RUN: opt -domtree -assumption-cache-tracker -assume-builder -verify --enable-knowledge-retention -S %s | FileCheck %s --check-prefixes=CROSS-BLOCK,CROSS-BLOCK-OLDPM
6+ ; RUN: opt -assume-builder -domtree -assumption-cache-tracker -assume-simplify -verify --enable-knowledge-retention -S %s | FileCheck %s --check-prefixes=FULL-SIMPLIFY
7+
28; RUN: opt -passes='assume-builder,verify' --enable-knowledge-retention -S %s | FileCheck %s --check-prefixes=BASIC
39; RUN: opt -passes='assume-builder,verify' --enable-knowledge-retention --assume-preserve-all -S %s | FileCheck %s --check-prefixes=ALL
410; RUN: opt -passes='require<assumptions>,assume-builder,verify' --enable-knowledge-retention -S %s | FileCheck %s --check-prefixes=WITH-AC
5- ; RUN: opt -passes='require<domtree>,require<assumptions>,assume-builder,verify' --enable-knowledge-retention -S %s | FileCheck %s --check-prefixes=CROSS-BLOCK
11+ ; RUN: opt -passes='require<domtree>,require<assumptions>,assume-builder,verify' --enable-knowledge-retention -S %s | FileCheck %s --check-prefixes=CROSS-BLOCK,CROSS-BLOCK-NEWMP
612; RUN: opt -passes='assume-builder,require<domtree>,require<assumptions>,assume-simplify,verify' --enable-knowledge-retention -S %s | FileCheck %s --check-prefixes=FULL-SIMPLIFY
713
814target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
@@ -641,28 +647,30 @@ define dso_local i32 @_Z6squarePi(i32* %P, i32* %P1, i1 %cond) {
641647; WITH-AC-NEXT: store i32 0, i32* [[P1]], align 4
642648; WITH-AC-NEXT: ret i32 0
643649;
644- ; CROSS-BLOCK-LABEL: define {{[^@]+}}@_Z6squarePi
645- ; CROSS-BLOCK-SAME: (i32* [[P:%.*]], i32* [[P1:%.*]], i1 [[COND:%.*]])
646- ; CROSS-BLOCK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P]], i64 4), "nonnull"(i32* [[P]]), "align"(i32* [[P]], i64 4) ]
647- ; CROSS-BLOCK-NEXT: store i32 0, i32* [[P]], align 4
648- ; CROSS-BLOCK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P1]], i64 4), "nonnull"(i32* [[P1]]), "align"(i32* [[P1]], i64 8) ]
649- ; CROSS-BLOCK-NEXT: store i32 0, i32* [[P1]], align 8
650- ; CROSS-BLOCK-NEXT: br i1 [[COND]], label [[A:%.*]], label [[B:%.*]]
651- ; CROSS-BLOCK: A:
652- ; CROSS-BLOCK-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P]], i64 8) ]
653- ; CROSS-BLOCK-NEXT: store i32 0, i32* [[P]], align 8
654- ; CROSS-BLOCK-NEXT: store i32 0, i32* [[P1]], align 4
655- ; CROSS-BLOCK-NEXT: br i1 [[COND]], label [[C:%.*]], label [[B]]
656- ; CROSS-BLOCK: B:
657- ; CROSS-BLOCK-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P]], i64 8) ]
658- ; CROSS-BLOCK-NEXT: store i32 0, i32* [[P]], align 8
659- ; CROSS-BLOCK-NEXT: store i32 0, i32* [[P1]], align 8
660- ; CROSS-BLOCK-NEXT: br label [[C]]
661- ; CROSS-BLOCK: C:
662- ; CROSS-BLOCK-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P]], i64 32) ]
663- ; CROSS-BLOCK-NEXT: store i32 0, i32* [[P]], align 32
664- ; CROSS-BLOCK-NEXT: store i32 0, i32* [[P1]], align 4
665- ; CROSS-BLOCK-NEXT: ret i32 0
650+ ; CROSS-BLOCK-OLDPM-LABEL: define {{[^@]+}}@_Z6squarePi
651+ ; CROSS-BLOCK-OLDPM-SAME: (i32* [[P:%.*]], i32* [[P1:%.*]], i1 [[COND:%.*]])
652+ ; CROSS-BLOCK-OLDPM-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P]], i64 4), "nonnull"(i32* [[P]]), "align"(i32* [[P]], i64 4) ]
653+ ; CROSS-BLOCK-OLDPM-NEXT: store i32 0, i32* [[P]], align 4
654+ ; CROSS-BLOCK-OLDPM-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P1]], i64 4), "nonnull"(i32* [[P1]]), "align"(i32* [[P1]], i64 8) ]
655+ ; CROSS-BLOCK-OLDPM-NEXT: store i32 0, i32* [[P1]], align 8
656+ ; CROSS-BLOCK-OLDPM-NEXT: br i1 [[COND]], label [[A:%.*]], label [[B:%.*]]
657+ ; CROSS-BLOCK-OLDPM: A:
658+ ; CROSS-BLOCK-OLDPM-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P]], i64 8) ]
659+ ; CROSS-BLOCK-OLDPM-NEXT: store i32 0, i32* [[P]], align 8
660+ ; CROSS-BLOCK-OLDPM-NEXT: store i32 0, i32* [[P1]], align 4
661+ ; CROSS-BLOCK-OLDPM-NEXT: br i1 [[COND]], label [[C:%.*]], label [[B]]
662+ ; CROSS-BLOCK-OLDPM: B:
663+ ; CROSS-BLOCK-OLDPM-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P]], i64 4), "nonnull"(i32* [[P]]), "align"(i32* [[P]], i64 8) ]
664+ ; CROSS-BLOCK-OLDPM-NEXT: store i32 0, i32* [[P]], align 8
665+ ; CROSS-BLOCK-OLDPM-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P1]], i64 4), "nonnull"(i32* [[P1]]), "align"(i32* [[P1]], i64 8) ]
666+ ; CROSS-BLOCK-OLDPM-NEXT: store i32 0, i32* [[P1]], align 8
667+ ; CROSS-BLOCK-OLDPM-NEXT: br label [[C]]
668+ ; CROSS-BLOCK-OLDPM: C:
669+ ; CROSS-BLOCK-OLDPM-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P]], i64 4), "nonnull"(i32* [[P]]), "align"(i32* [[P]], i64 32) ]
670+ ; CROSS-BLOCK-OLDPM-NEXT: store i32 0, i32* [[P]], align 32
671+ ; CROSS-BLOCK-OLDPM-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P1]], i64 4), "nonnull"(i32* [[P1]]), "align"(i32* [[P1]], i64 4) ]
672+ ; CROSS-BLOCK-OLDPM-NEXT: store i32 0, i32* [[P1]], align 4
673+ ; CROSS-BLOCK-OLDPM-NEXT: ret i32 0
666674;
667675; FULL-SIMPLIFY-LABEL: define {{[^@]+}}@_Z6squarePi
668676; FULL-SIMPLIFY-SAME: (i32* nonnull align 4 dereferenceable(4) [[P:%.*]], i32* nonnull align 8 dereferenceable(4) [[P1:%.*]], i1 [[COND:%.*]])
@@ -684,6 +692,29 @@ define dso_local i32 @_Z6squarePi(i32* %P, i32* %P1, i1 %cond) {
684692; FULL-SIMPLIFY-NEXT: store i32 0, i32* [[P]], align 32
685693; FULL-SIMPLIFY-NEXT: store i32 0, i32* [[P1]], align 4
686694; FULL-SIMPLIFY-NEXT: ret i32 0
695+ ;
696+ ; CROSS-BLOCK-NEWMP-LABEL: define {{[^@]+}}@_Z6squarePi
697+ ; CROSS-BLOCK-NEWMP-SAME: (i32* [[P:%.*]], i32* [[P1:%.*]], i1 [[COND:%.*]])
698+ ; CROSS-BLOCK-NEWMP-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P]], i64 4), "nonnull"(i32* [[P]]), "align"(i32* [[P]], i64 4) ]
699+ ; CROSS-BLOCK-NEWMP-NEXT: store i32 0, i32* [[P]], align 4
700+ ; CROSS-BLOCK-NEWMP-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P1]], i64 4), "nonnull"(i32* [[P1]]), "align"(i32* [[P1]], i64 8) ]
701+ ; CROSS-BLOCK-NEWMP-NEXT: store i32 0, i32* [[P1]], align 8
702+ ; CROSS-BLOCK-NEWMP-NEXT: br i1 [[COND]], label [[A:%.*]], label [[B:%.*]]
703+ ; CROSS-BLOCK-NEWMP: A:
704+ ; CROSS-BLOCK-NEWMP-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P]], i64 8) ]
705+ ; CROSS-BLOCK-NEWMP-NEXT: store i32 0, i32* [[P]], align 8
706+ ; CROSS-BLOCK-NEWMP-NEXT: store i32 0, i32* [[P1]], align 4
707+ ; CROSS-BLOCK-NEWMP-NEXT: br i1 [[COND]], label [[C:%.*]], label [[B]]
708+ ; CROSS-BLOCK-NEWMP: B:
709+ ; CROSS-BLOCK-NEWMP-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P]], i64 8) ]
710+ ; CROSS-BLOCK-NEWMP-NEXT: store i32 0, i32* [[P]], align 8
711+ ; CROSS-BLOCK-NEWMP-NEXT: store i32 0, i32* [[P1]], align 8
712+ ; CROSS-BLOCK-NEWMP-NEXT: br label [[C]]
713+ ; CROSS-BLOCK-NEWMP: C:
714+ ; CROSS-BLOCK-NEWMP-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P]], i64 32) ]
715+ ; CROSS-BLOCK-NEWMP-NEXT: store i32 0, i32* [[P]], align 32
716+ ; CROSS-BLOCK-NEWMP-NEXT: store i32 0, i32* [[P1]], align 4
717+ ; CROSS-BLOCK-NEWMP-NEXT: ret i32 0
687718;
688719 store i32 0 , i32* %P , align 4
689720 store i32 0 , i32* %P1 , align 8
0 commit comments