diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index 00b45545178ae..6b18e279e9596 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -3671,8 +3671,7 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) { // into // call void @llvm.assume(i1 true) [ "align"(i32* [[A]], i64 Constant + 1)] uint64_t AlignMask = 1; - if (EnableKnowledgeRetention && - (match(IIOperand, m_Not(m_Trunc(m_Value(A)))) || + if ((match(IIOperand, m_Not(m_Trunc(m_Value(A)))) || match(IIOperand, m_SpecificICmp(ICmpInst::ICMP_EQ, m_And(m_Value(A), m_ConstantInt(AlignMask)), diff --git a/llvm/test/Transforms/InstCombine/assume-loop-align.ll b/llvm/test/Transforms/InstCombine/assume-loop-align.ll index 24fd343d1448e..7669d5bae5b08 100644 --- a/llvm/test/Transforms/InstCombine/assume-loop-align.ll +++ b/llvm/test/Transforms/InstCombine/assume-loop-align.ll @@ -10,14 +10,8 @@ target triple = "x86_64-unknown-linux-gnu" define void @foo(ptr %a, ptr %b) #0 { ; CHECK-LABEL: @foo( ; CHECK-NEXT: entry: -; CHECK-NEXT: [[PTRINT:%.*]] = ptrtoint ptr [[A:%.*]] to i64 -; CHECK-NEXT: [[MASKEDPTR:%.*]] = and i64 [[PTRINT]], 63 -; CHECK-NEXT: [[MASKCOND:%.*]] = icmp eq i64 [[MASKEDPTR]], 0 -; CHECK-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]]) -; CHECK-NEXT: [[PTRINT1:%.*]] = ptrtoint ptr [[B:%.*]] to i64 -; CHECK-NEXT: [[MASKEDPTR2:%.*]] = and i64 [[PTRINT1]], 63 -; CHECK-NEXT: [[MASKCOND3:%.*]] = icmp eq i64 [[MASKEDPTR2]], 0 -; CHECK-NEXT: tail call void @llvm.assume(i1 [[MASKCOND3]]) +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A:%.*]], i64 64) ] +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[B:%.*]], i64 64) ] ; CHECK-NEXT: br label [[FOR_BODY:%.*]] ; CHECK: for.body: ; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ] diff --git a/llvm/test/Transforms/InstCombine/assume.ll b/llvm/test/Transforms/InstCombine/assume.ll index cc87d6542fa12..a44c87149a98d 100644 --- a/llvm/test/Transforms/InstCombine/assume.ll +++ b/llvm/test/Transforms/InstCombine/assume.ll @@ -11,18 +11,10 @@ declare void @llvm.assume(i1) #1 ; Check that the assume has not been removed: define i32 @align_to_bundle(ptr %a) #0 { -; DEFAULT-LABEL: @align_to_bundle( -; DEFAULT-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4 -; DEFAULT-NEXT: [[PTRINT:%.*]] = ptrtoint ptr [[A]] to i64 -; DEFAULT-NEXT: [[MASKEDPTR:%.*]] = and i64 [[PTRINT]], 31 -; DEFAULT-NEXT: [[MASKCOND:%.*]] = icmp eq i64 [[MASKEDPTR]], 0 -; DEFAULT-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]]) -; DEFAULT-NEXT: ret i32 [[T0]] -; -; BUNDLES-LABEL: @align_to_bundle( -; BUNDLES-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4 -; BUNDLES-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 32) ] -; BUNDLES-NEXT: ret i32 [[T0]] +; CHECK-LABEL: @align_to_bundle( +; CHECK-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4 +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 32) ] +; CHECK-NEXT: ret i32 [[T0]] ; %t0 = load i32, ptr %a, align 4 %ptrint = ptrtoint ptr %a to i64 @@ -33,18 +25,10 @@ define i32 @align_to_bundle(ptr %a) #0 { } define i32 @align_to_bundle_ptrtoaddr(ptr %a) #0 { -; DEFAULT-LABEL: @align_to_bundle_ptrtoaddr( -; DEFAULT-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4 -; DEFAULT-NEXT: [[PTRINT:%.*]] = ptrtoaddr ptr [[A]] to i64 -; DEFAULT-NEXT: [[MASKEDPTR:%.*]] = and i64 [[PTRINT]], 31 -; DEFAULT-NEXT: [[MASKCOND:%.*]] = icmp eq i64 [[MASKEDPTR]], 0 -; DEFAULT-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]]) -; DEFAULT-NEXT: ret i32 [[T0]] -; -; BUNDLES-LABEL: @align_to_bundle_ptrtoaddr( -; BUNDLES-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4 -; BUNDLES-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 32) ] -; BUNDLES-NEXT: ret i32 [[T0]] +; CHECK-LABEL: @align_to_bundle_ptrtoaddr( +; CHECK-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4 +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 32) ] +; CHECK-NEXT: ret i32 [[T0]] ; %t0 = load i32, ptr %a, align 4 %ptrint = ptrtoaddr ptr %a to i64 @@ -55,18 +39,10 @@ define i32 @align_to_bundle_ptrtoaddr(ptr %a) #0 { } define i32 @align_assume_trunc_cond(ptr %a) #0 { -; DEFAULT-LABEL: @align_assume_trunc_cond( -; DEFAULT-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4 -; DEFAULT-NEXT: [[PTRINT:%.*]] = ptrtoint ptr [[A]] to i64 -; DEFAULT-NEXT: [[TRUNC:%.*]] = trunc i64 [[PTRINT]] to i1 -; DEFAULT-NEXT: [[MASKCOND:%.*]] = xor i1 [[TRUNC]], true -; DEFAULT-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]]) -; DEFAULT-NEXT: ret i32 [[T0]] -; -; BUNDLES-LABEL: @align_assume_trunc_cond( -; BUNDLES-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4 -; BUNDLES-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 2) ] -; BUNDLES-NEXT: ret i32 [[T0]] +; CHECK-LABEL: @align_assume_trunc_cond( +; CHECK-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4 +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 2) ] +; CHECK-NEXT: ret i32 [[T0]] ; %t0 = load i32, ptr %a, align 4 %ptrint = ptrtoint ptr %a to i64 @@ -79,18 +55,10 @@ define i32 @align_assume_trunc_cond(ptr %a) #0 { ; Same check as in @foo1, but make sure it works if the assume is first too. define i32 @foo2(ptr %a) #0 { -; DEFAULT-LABEL: @foo2( -; DEFAULT-NEXT: [[PTRINT:%.*]] = ptrtoint ptr [[A:%.*]] to i64 -; DEFAULT-NEXT: [[MASKEDPTR:%.*]] = and i64 [[PTRINT]], 31 -; DEFAULT-NEXT: [[MASKCOND:%.*]] = icmp eq i64 [[MASKEDPTR]], 0 -; DEFAULT-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]]) -; DEFAULT-NEXT: [[T0:%.*]] = load i32, ptr [[A]], align 4 -; DEFAULT-NEXT: ret i32 [[T0]] -; -; BUNDLES-LABEL: @foo2( -; BUNDLES-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A:%.*]], i64 32) ] -; BUNDLES-NEXT: [[T0:%.*]] = load i32, ptr [[A]], align 4 -; BUNDLES-NEXT: ret i32 [[T0]] +; CHECK-LABEL: @foo2( +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A:%.*]], i64 32) ] +; CHECK-NEXT: [[T0:%.*]] = load i32, ptr [[A]], align 4 +; CHECK-NEXT: ret i32 [[T0]] ; %ptrint = ptrtoint ptr %a to i64 %maskedptr = and i64 %ptrint, 31 diff --git a/llvm/test/Transforms/InstCombine/assume_inevitable.ll b/llvm/test/Transforms/InstCombine/assume_inevitable.ll index 5f27ff1e609ba..f899be41e0584 100644 --- a/llvm/test/Transforms/InstCombine/assume_inevitable.ll +++ b/llvm/test/Transforms/InstCombine/assume_inevitable.ll @@ -16,10 +16,7 @@ define i32 @assume_inevitable(ptr %a, ptr %b, ptr %c) { ; CHECK-NEXT: [[M_A:%.*]] = call ptr @llvm.ptr.annotation.p0.p0(ptr nonnull [[M]], ptr nonnull @.str, ptr nonnull @.str1, i32 2, ptr null) ; CHECK-NEXT: [[OBJSZ:%.*]] = call i64 @llvm.objectsize.i64.p0(ptr [[C:%.*]], i1 false, i1 false, i1 false) ; CHECK-NEXT: store i64 [[OBJSZ]], ptr [[M_A]], align 4 -; CHECK-NEXT: [[PTRINT:%.*]] = ptrtoint ptr [[A]] to i64 -; CHECK-NEXT: [[MASKEDPTR:%.*]] = and i64 [[PTRINT]], 31 -; CHECK-NEXT: [[MASKCOND:%.*]] = icmp eq i64 [[MASKEDPTR]], 0 -; CHECK-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]]) +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 32) ] ; CHECK-NEXT: ret i32 [[TMP0]] ; entry: