[Local] Only intersect tbaa metadata if instr moves. (#116682)
Preserve tbaa metadata on the replacement instruction, if it does not move. In that case, the program would be UB, if the aliasing property encoded in the metadata does not hold. This makes use of the clarification re tbaa metadata implying UB if the property does not hold: https://github.com/llvm/llvm-project/pull/116220 Same as https://github.com/llvm/llvm-project/pull/115868, but for !tbaa PR: https://github.com/llvm/llvm-project/pull/116682
This commit is contained in:
parent
c0efcc08e6
commit
0bb1b68330
@ -3326,7 +3326,8 @@ void llvm::combineMetadata(Instruction *K, const Instruction *J,
|
||||
K->mergeDIAssignID(J);
|
||||
break;
|
||||
case LLVMContext::MD_tbaa:
|
||||
K->setMetadata(Kind, MDNode::getMostGenericTBAA(JMD, KMD));
|
||||
if (DoesKMove)
|
||||
K->setMetadata(Kind, MDNode::getMostGenericTBAA(JMD, KMD));
|
||||
break;
|
||||
case LLVMContext::MD_alias_scope:
|
||||
K->setMetadata(Kind, MDNode::getMostGenericAliasScope(JMD, KMD));
|
||||
|
@ -1,10 +1,13 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
|
||||
; RUN: opt -passes=gvn -S < %s | FileCheck %s
|
||||
|
||||
define i32 @test1(ptr %p, ptr %q) {
|
||||
; CHECK-LABEL: @test1(ptr %p, ptr %q)
|
||||
; CHECK: call i32 @foo(ptr %p)
|
||||
; CHECK-NOT: tbaa
|
||||
; CHECK: %c = add i32 %a, %a
|
||||
; CHECK-LABEL: define i32 @test1(
|
||||
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
|
||||
; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA0:![0-9]+]]
|
||||
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
|
||||
; CHECK-NEXT: ret i32 [[C]]
|
||||
;
|
||||
%a = call i32 @foo(ptr %p), !tbaa !0
|
||||
%b = call i32 @foo(ptr %p)
|
||||
%c = add i32 %a, %b
|
||||
@ -12,9 +15,12 @@ define i32 @test1(ptr %p, ptr %q) {
|
||||
}
|
||||
|
||||
define i32 @test2(ptr %p, ptr %q) {
|
||||
; CHECK-LABEL: @test2(ptr %p, ptr %q)
|
||||
; CHECK: call i32 @foo(ptr %p), !tbaa [[TAGC:!.*]]
|
||||
; CHECK: %c = add i32 %a, %a
|
||||
; CHECK-LABEL: define i32 @test2(
|
||||
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
|
||||
; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA0]]
|
||||
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
|
||||
; CHECK-NEXT: ret i32 [[C]]
|
||||
;
|
||||
%a = call i32 @foo(ptr %p), !tbaa !0
|
||||
%b = call i32 @foo(ptr %p), !tbaa !0
|
||||
%c = add i32 %a, %b
|
||||
@ -22,9 +28,12 @@ define i32 @test2(ptr %p, ptr %q) {
|
||||
}
|
||||
|
||||
define i32 @test3(ptr %p, ptr %q) {
|
||||
; CHECK-LABEL: @test3(ptr %p, ptr %q)
|
||||
; CHECK: call i32 @foo(ptr %p), !tbaa [[TAGB:!.*]]
|
||||
; CHECK: %c = add i32 %a, %a
|
||||
; CHECK-LABEL: define i32 @test3(
|
||||
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
|
||||
; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA4:![0-9]+]]
|
||||
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
|
||||
; CHECK-NEXT: ret i32 [[C]]
|
||||
;
|
||||
%a = call i32 @foo(ptr %p), !tbaa !3
|
||||
%b = call i32 @foo(ptr %p), !tbaa !3
|
||||
%c = add i32 %a, %b
|
||||
@ -32,9 +41,12 @@ define i32 @test3(ptr %p, ptr %q) {
|
||||
}
|
||||
|
||||
define i32 @test4(ptr %p, ptr %q) {
|
||||
; CHECK-LABEL: @test4(ptr %p, ptr %q)
|
||||
; CHECK: call i32 @foo(ptr %p), !tbaa [[TAGA:!.*]]
|
||||
; CHECK: %c = add i32 %a, %a
|
||||
; CHECK-LABEL: define i32 @test4(
|
||||
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
|
||||
; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA6:![0-9]+]]
|
||||
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
|
||||
; CHECK-NEXT: ret i32 [[C]]
|
||||
;
|
||||
%a = call i32 @foo(ptr %p), !tbaa !1
|
||||
%b = call i32 @foo(ptr %p), !tbaa !0
|
||||
%c = add i32 %a, %b
|
||||
@ -42,9 +54,12 @@ define i32 @test4(ptr %p, ptr %q) {
|
||||
}
|
||||
|
||||
define i32 @test5(ptr %p, ptr %q) {
|
||||
; CHECK-LABEL: @test5(ptr %p, ptr %q)
|
||||
; CHECK: call i32 @foo(ptr %p), !tbaa [[TAGA]]
|
||||
; CHECK: %c = add i32 %a, %a
|
||||
; CHECK-LABEL: define i32 @test5(
|
||||
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
|
||||
; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA0]]
|
||||
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
|
||||
; CHECK-NEXT: ret i32 [[C]]
|
||||
;
|
||||
%a = call i32 @foo(ptr %p), !tbaa !0
|
||||
%b = call i32 @foo(ptr %p), !tbaa !1
|
||||
%c = add i32 %a, %b
|
||||
@ -52,9 +67,12 @@ define i32 @test5(ptr %p, ptr %q) {
|
||||
}
|
||||
|
||||
define i32 @test6(ptr %p, ptr %q) {
|
||||
; CHECK-LABEL: @test6(ptr %p, ptr %q)
|
||||
; CHECK: call i32 @foo(ptr %p), !tbaa [[TAGA]]
|
||||
; CHECK: %c = add i32 %a, %a
|
||||
; CHECK-LABEL: define i32 @test6(
|
||||
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
|
||||
; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA0]]
|
||||
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
|
||||
; CHECK-NEXT: ret i32 [[C]]
|
||||
;
|
||||
%a = call i32 @foo(ptr %p), !tbaa !0
|
||||
%b = call i32 @foo(ptr %p), !tbaa !3
|
||||
%c = add i32 %a, %b
|
||||
@ -62,10 +80,12 @@ define i32 @test6(ptr %p, ptr %q) {
|
||||
}
|
||||
|
||||
define i32 @test7(ptr %p, ptr %q) {
|
||||
; CHECK-LABEL: @test7(ptr %p, ptr %q)
|
||||
; CHECK: call i32 @foo(ptr %p)
|
||||
; CHECK-NOT: tbaa
|
||||
; CHECK: %c = add i32 %a, %a
|
||||
; CHECK-LABEL: define i32 @test7(
|
||||
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
|
||||
; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA7:![0-9]+]]
|
||||
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
|
||||
; CHECK-NEXT: ret i32 [[C]]
|
||||
;
|
||||
%a = call i32 @foo(ptr %p), !tbaa !4
|
||||
%b = call i32 @foo(ptr %p), !tbaa !3
|
||||
%c = add i32 %a, %b
|
||||
@ -73,9 +93,11 @@ define i32 @test7(ptr %p, ptr %q) {
|
||||
}
|
||||
|
||||
define i32 @test8(ptr %p, ptr %q) {
|
||||
; CHECK-LABEL: @test8
|
||||
; CHECK-NEXT: store i32 15, ptr %p
|
||||
; CHECK-NEXT: ret i32 0
|
||||
; CHECK-LABEL: define i32 @test8(
|
||||
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
|
||||
; CHECK-NEXT: store i32 15, ptr [[P]], align 4
|
||||
; CHECK-NEXT: ret i32 0
|
||||
;
|
||||
; Since we know the location is invariant, we can forward the
|
||||
; load across the potentially aliasing store.
|
||||
|
||||
@ -87,9 +109,11 @@ define i32 @test8(ptr %p, ptr %q) {
|
||||
}
|
||||
|
||||
define i32 @test9(ptr %p, ptr %q) {
|
||||
; CHECK-LABEL: @test9
|
||||
; CHECK-NEXT: call void @clobber()
|
||||
; CHECK-NEXT: ret i32 0
|
||||
; CHECK-LABEL: define i32 @test9(
|
||||
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
|
||||
; CHECK-NEXT: call void @clobber()
|
||||
; CHECK-NEXT: ret i32 0
|
||||
;
|
||||
; Since we know the location is invariant, we can forward the
|
||||
; load across the potentially aliasing store (within the call).
|
||||
|
||||
@ -103,9 +127,12 @@ define i32 @test9(ptr %p, ptr %q) {
|
||||
define i32 @test10(ptr %p, ptr %q) {
|
||||
; If one access encloses the other, then the merged access is the enclosed one
|
||||
; and not just the common final access type.
|
||||
; CHECK-LABEL: @test10
|
||||
; CHECK: call i32 @foo(ptr %p), !tbaa [[TAG_X_i:!.*]]
|
||||
; CHECK: %c = add i32 %a, %a
|
||||
; CHECK-LABEL: define i32 @test10(
|
||||
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
|
||||
; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA10:![0-9]+]]
|
||||
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
|
||||
; CHECK-NEXT: ret i32 [[C]]
|
||||
;
|
||||
%a = call i32 @foo(ptr %p), !tbaa !15 ; TAG_X_i
|
||||
%b = call i32 @foo(ptr %p), !tbaa !19 ; TAG_Y_x_i
|
||||
%c = add i32 %a, %b
|
||||
@ -115,12 +142,6 @@ define i32 @test10(ptr %p, ptr %q) {
|
||||
declare void @clobber()
|
||||
declare i32 @foo(ptr) readonly
|
||||
|
||||
; CHECK-DAG: [[TAGC]] = !{[[TYPEC:!.*]], [[TYPEC]], i64 0}
|
||||
; CHECK-DAG: [[TYPEC]] = !{!"C", [[TYPEA:!.*]]}
|
||||
; CHECK-DAG: [[TYPEA]] = !{!"A", !{{.*}}}
|
||||
; CHECK-DAG: [[TAGB]] = !{[[TYPEB:!.*]], [[TYPEB]], i64 0}
|
||||
; CHECK-DAG: [[TYPEB]] = !{!"B", [[TYPEA]]}
|
||||
; CHECK-DAG: [[TAGA]] = !{[[TYPEA]], [[TYPEA]], i64 0}
|
||||
!0 = !{!5, !5, i64 0}
|
||||
!1 = !{!6, !6, i64 0}
|
||||
!2 = !{!"tbaa root"}
|
||||
@ -132,9 +153,6 @@ declare i32 @foo(ptr) readonly
|
||||
!8 = !{!"another root"}
|
||||
!11 = !{!"scalar type", !8}
|
||||
|
||||
; CHECK-DAG: [[TAG_X_i]] = !{[[TYPE_X:!.*]], [[TYPE_int:!.*]], i64 0}
|
||||
; CHECK-DAG: [[TYPE_X:!.*]] = !{!"struct X", [[TYPE_int]], i64 0}
|
||||
; CHECK-DAG: [[TYPE_int]] = !{!"int", {{!.*}}, i64 0}
|
||||
!15 = !{!16, !17, i64 0} ; TAG_X_i
|
||||
!16 = !{!"struct X", !17, i64 0} ; struct X { int i; };
|
||||
!17 = !{!"int", !18, i64 0}
|
||||
@ -146,3 +164,19 @@ declare i32 @foo(ptr) readonly
|
||||
; A TBAA structure who's only point is to have a constant location.
|
||||
!9 = !{!"yet another root"}
|
||||
!10 = !{!"node", !9, i64 1}
|
||||
;.
|
||||
; CHECK: [[TBAA0]] = !{[[META1:![0-9]+]], [[META1]], i64 0}
|
||||
; CHECK: [[META1]] = !{!"C", [[META2:![0-9]+]]}
|
||||
; CHECK: [[META2]] = !{!"A", [[META3:![0-9]+]]}
|
||||
; CHECK: [[META3]] = !{!"tbaa root"}
|
||||
; CHECK: [[TBAA4]] = !{[[META5:![0-9]+]], [[META5]], i64 0}
|
||||
; CHECK: [[META5]] = !{!"B", [[META2]]}
|
||||
; CHECK: [[TBAA6]] = !{[[META2]], [[META2]], i64 0}
|
||||
; CHECK: [[TBAA7]] = !{[[META8:![0-9]+]], [[META8]], i64 0}
|
||||
; CHECK: [[META8]] = !{!"scalar type", [[META9:![0-9]+]]}
|
||||
; CHECK: [[META9]] = !{!"another root"}
|
||||
; CHECK: [[TBAA10]] = !{[[META11:![0-9]+]], [[META12:![0-9]+]], i64 0}
|
||||
; CHECK: [[META11]] = !{!"struct X", [[META12]], i64 0}
|
||||
; CHECK: [[META12]] = !{!"int", [[META13:![0-9]+]], i64 0}
|
||||
; CHECK: [[META13]] = !{!"char", [[META3]], i64 0}
|
||||
;.
|
||||
|
@ -204,8 +204,8 @@ entry:
|
||||
define double @preserve_load_metadata_after_select_transform2(ptr %a, ptr %b) {
|
||||
; CHECK-LABEL: @preserve_load_metadata_after_select_transform2(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[L_A:%.*]] = load double, ptr [[A:%.*]], align 8, !llvm.access.group [[META6]]
|
||||
; CHECK-NEXT: [[L_B:%.*]] = load double, ptr [[B:%.*]], align 8, !llvm.access.group [[META6]]
|
||||
; CHECK-NEXT: [[L_A:%.*]] = load double, ptr [[A:%.*]], align 8, !tbaa [[TBAA0]], !llvm.access.group [[META6]]
|
||||
; CHECK-NEXT: [[L_B:%.*]] = load double, ptr [[B:%.*]], align 8, !tbaa [[TBAA0]], !llvm.access.group [[META6]]
|
||||
; CHECK-NEXT: [[CMP_I:%.*]] = fcmp fast olt double [[L_A]], [[L_B]]
|
||||
; CHECK-NEXT: [[L_SEL:%.*]] = select i1 [[CMP_I]], double [[L_B]], double [[L_A]]
|
||||
; CHECK-NEXT: ret double [[L_SEL]]
|
||||
@ -223,7 +223,7 @@ define double @preserve_load_metadata_after_select_transform_metadata_missing_1(
|
||||
; CHECK-LABEL: @preserve_load_metadata_after_select_transform_metadata_missing_1(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[L_A:%.*]] = load double, ptr [[A:%.*]], align 8, !llvm.access.group [[META6]]
|
||||
; CHECK-NEXT: [[L_B:%.*]] = load double, ptr [[B:%.*]], align 8, !llvm.access.group [[META6]]
|
||||
; CHECK-NEXT: [[L_B:%.*]] = load double, ptr [[B:%.*]], align 8, !tbaa [[TBAA0]], !llvm.access.group [[META6]]
|
||||
; CHECK-NEXT: [[CMP_I:%.*]] = fcmp fast olt double [[L_A]], [[L_B]]
|
||||
; CHECK-NEXT: [[L_SEL:%.*]] = select i1 [[CMP_I]], double [[L_B]], double [[L_A]]
|
||||
; CHECK-NEXT: ret double [[L_SEL]]
|
||||
@ -258,8 +258,8 @@ entry:
|
||||
define double @preserve_load_metadata_after_select_transform_metadata_missing_3(ptr %a, ptr %b) {
|
||||
; CHECK-LABEL: @preserve_load_metadata_after_select_transform_metadata_missing_3(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[L_A:%.*]] = load double, ptr [[A:%.*]], align 8, !llvm.access.group [[META6]]
|
||||
; CHECK-NEXT: [[L_B:%.*]] = load double, ptr [[B:%.*]], align 8, !llvm.access.group [[META6]]
|
||||
; CHECK-NEXT: [[L_A:%.*]] = load double, ptr [[A:%.*]], align 8, !tbaa [[TBAA0]], !llvm.access.group [[META6]]
|
||||
; CHECK-NEXT: [[L_B:%.*]] = load double, ptr [[B:%.*]], align 8, !tbaa [[TBAA0]], !llvm.access.group [[META6]]
|
||||
; CHECK-NEXT: [[CMP_I:%.*]] = fcmp fast olt double [[L_A]], [[L_B]]
|
||||
; CHECK-NEXT: [[L_SEL:%.*]] = select i1 [[CMP_I]], double [[L_B]], double [[L_A]]
|
||||
; CHECK-NEXT: ret double [[L_SEL]]
|
||||
@ -278,8 +278,8 @@ entry:
|
||||
define double @preserve_load_metadata_after_select_transform_metadata_missing_4(ptr %a, ptr %b) {
|
||||
; CHECK-LABEL: @preserve_load_metadata_after_select_transform_metadata_missing_4(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[L_A:%.*]] = load double, ptr [[A:%.*]], align 8, !llvm.access.group [[META6]]
|
||||
; CHECK-NEXT: [[L_B:%.*]] = load double, ptr [[B:%.*]], align 8, !llvm.access.group [[ACC_GRP10:![0-9]+]]
|
||||
; CHECK-NEXT: [[L_A:%.*]] = load double, ptr [[A:%.*]], align 8, !tbaa [[TBAA0]], !llvm.access.group [[META6]]
|
||||
; CHECK-NEXT: [[L_B:%.*]] = load double, ptr [[B:%.*]], align 8, !tbaa [[TBAA0]], !llvm.access.group [[ACC_GRP10:![0-9]+]]
|
||||
; CHECK-NEXT: [[CMP_I:%.*]] = fcmp fast olt double [[L_A]], [[L_B]]
|
||||
; CHECK-NEXT: [[L_SEL:%.*]] = select i1 [[CMP_I]], double [[L_B]], double [[L_A]]
|
||||
; CHECK-NEXT: ret double [[L_SEL]]
|
||||
|
@ -1,4 +1,4 @@
|
||||
; 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 smart
|
||||
; RUN: opt < %s -passes=jump-threading -S | FileCheck %s
|
||||
; RUN: opt < %s -aa-pipeline=basic-aa -passes=jump-threading -S | FileCheck %s
|
||||
|
||||
@ -316,13 +316,12 @@ bb3:
|
||||
ret i32 %res.0
|
||||
}
|
||||
|
||||
; Make sure we merge the aliasing metadata. We keep the range metadata for the
|
||||
; first load, as it dominates the second load. Hence we can eliminate the
|
||||
; branch.
|
||||
; We keep the tbaa and range metadata for the first load, as it dominates the
|
||||
; second load. Hence we can eliminate the branch.
|
||||
define void @test8(ptr, ptr, ptr) {
|
||||
; CHECK-LABEL: @test8(
|
||||
; CHECK-NEXT: ret2:
|
||||
; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[TMP0:%.*]], align 4, !range [[RNG4:![0-9]+]], !noundef !5
|
||||
; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[TMP0:%.*]], align 4, !tbaa [[TBAA0]], !range [[RNG4:![0-9]+]], !noundef [[META5:![0-9]+]]
|
||||
; CHECK-NEXT: store i32 [[A]], ptr [[TMP1:%.*]], align 4
|
||||
; CHECK-NEXT: [[XXX:%.*]] = tail call i32 (...) @f1() #[[ATTR0]]
|
||||
; CHECK-NEXT: ret void
|
||||
@ -455,8 +454,8 @@ define fastcc i32 @Search(i64 %idxprom.i, i64 %idxprom.i89, i32 %c) {
|
||||
; CHECK-NEXT: [[ARRAYIDX89:%.*]] = getelementptr inbounds [65 x ptr], ptr @last, i64 0, i64 [[IDXPROM_I]]
|
||||
; CHECK-NEXT: [[PHASE:%.*]] = getelementptr inbounds [65 x %struct.NEXT_MOVE], ptr @next_status, i64 0, i64 [[IDXPROM_I]], i32 0
|
||||
; CHECK-NEXT: switch i32 [[C:%.*]], label [[CLEANUP:%.*]] [
|
||||
; CHECK-NEXT: i32 1, label [[SW_BB_I:%.*]]
|
||||
; CHECK-NEXT: i32 0, label [[SW_BB21_I:%.*]]
|
||||
; CHECK-NEXT: i32 1, label [[SW_BB_I:%.*]]
|
||||
; CHECK-NEXT: i32 0, label [[SW_BB21_I:%.*]]
|
||||
; CHECK-NEXT: ]
|
||||
; CHECK: sw.bb.i:
|
||||
; CHECK-NEXT: [[CALL_I62:%.*]] = call fastcc ptr @GenerateCheckEvasions()
|
||||
@ -680,7 +679,6 @@ right_x:
|
||||
}
|
||||
|
||||
|
||||
; CHECK: [[RNG4]] = !{i32 0, i32 1}
|
||||
|
||||
!0 = !{!3, !3, i64 0}
|
||||
!1 = !{!"omnipotent char", !2}
|
||||
@ -694,3 +692,11 @@ right_x:
|
||||
!9 = !{!7}
|
||||
!10 = !{!8}
|
||||
!11 = !{}
|
||||
;.
|
||||
; CHECK: [[TBAA0]] = !{[[META1:![0-9]+]], [[META1]], i64 0}
|
||||
; CHECK: [[META1]] = !{!"int", [[META2:![0-9]+]]}
|
||||
; CHECK: [[META2]] = !{!"omnipotent char", [[META3:![0-9]+]]}
|
||||
; CHECK: [[META3]] = !{!"Simple C/C++ TBAA"}
|
||||
; CHECK: [[RNG4]] = !{i32 0, i32 1}
|
||||
; CHECK: [[META5]] = !{}
|
||||
;.
|
||||
|
@ -4,7 +4,7 @@
|
||||
define i32 @test1(ptr %p, ptr %q) {
|
||||
; CHECK-LABEL: define i32 @test1(
|
||||
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
|
||||
; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]])
|
||||
; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA0:![0-9]+]]
|
||||
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
|
||||
; CHECK-NEXT: ret i32 [[C]]
|
||||
;
|
||||
@ -17,7 +17,7 @@ define i32 @test1(ptr %p, ptr %q) {
|
||||
define i32 @test2(ptr %p, ptr %q) {
|
||||
; CHECK-LABEL: define i32 @test2(
|
||||
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
|
||||
; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA0:![0-9]+]]
|
||||
; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA0]]
|
||||
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
|
||||
; CHECK-NEXT: ret i32 [[C]]
|
||||
;
|
||||
@ -56,7 +56,7 @@ define i32 @test4(ptr %p, ptr %q) {
|
||||
define i32 @test5(ptr %p, ptr %q) {
|
||||
; CHECK-LABEL: define i32 @test5(
|
||||
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
|
||||
; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA6]]
|
||||
; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA0]]
|
||||
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
|
||||
; CHECK-NEXT: ret i32 [[C]]
|
||||
;
|
||||
@ -69,7 +69,7 @@ define i32 @test5(ptr %p, ptr %q) {
|
||||
define i32 @test6(ptr %p, ptr %q) {
|
||||
; CHECK-LABEL: define i32 @test6(
|
||||
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
|
||||
; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA6]]
|
||||
; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA0]]
|
||||
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
|
||||
; CHECK-NEXT: ret i32 [[C]]
|
||||
;
|
||||
@ -82,7 +82,7 @@ define i32 @test6(ptr %p, ptr %q) {
|
||||
define i32 @test7(ptr %p, ptr %q) {
|
||||
; CHECK-LABEL: define i32 @test7(
|
||||
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
|
||||
; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]])
|
||||
; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA7:![0-9]+]]
|
||||
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
|
||||
; CHECK-NEXT: ret i32 [[C]]
|
||||
;
|
||||
@ -129,7 +129,7 @@ define i32 @test10(ptr %p, ptr %q) {
|
||||
; and not just the common final access type.
|
||||
; CHECK-LABEL: define i32 @test10(
|
||||
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
|
||||
; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA7:![0-9]+]]
|
||||
; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA10:![0-9]+]]
|
||||
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
|
||||
; CHECK-NEXT: ret i32 [[C]]
|
||||
;
|
||||
@ -172,8 +172,11 @@ declare i32 @foo(ptr) readonly
|
||||
; CHECK: [[TBAA4]] = !{[[META5:![0-9]+]], [[META5]], i64 0}
|
||||
; CHECK: [[META5]] = !{!"B", [[META2]]}
|
||||
; CHECK: [[TBAA6]] = !{[[META2]], [[META2]], i64 0}
|
||||
; CHECK: [[TBAA7]] = !{[[META8:![0-9]+]], [[META9:![0-9]+]], i64 0}
|
||||
; CHECK: [[META8]] = !{!"struct X", [[META9]], i64 0}
|
||||
; CHECK: [[META9]] = !{!"int", [[META10:![0-9]+]], i64 0}
|
||||
; CHECK: [[META10]] = !{!"char", [[META3]], i64 0}
|
||||
; CHECK: [[TBAA7]] = !{[[META8:![0-9]+]], [[META8]], i64 0}
|
||||
; CHECK: [[META8]] = !{!"scalar type", [[META9:![0-9]+]]}
|
||||
; CHECK: [[META9]] = !{!"another root"}
|
||||
; CHECK: [[TBAA10]] = !{[[META11:![0-9]+]], [[META12:![0-9]+]], i64 0}
|
||||
; CHECK: [[META11]] = !{!"struct X", [[META12]], i64 0}
|
||||
; CHECK: [[META12]] = !{!"int", [[META13:![0-9]+]], i64 0}
|
||||
; CHECK: [[META13]] = !{!"char", [[META3]], i64 0}
|
||||
;.
|
||||
|
@ -33,11 +33,11 @@ define void @test(i32 noundef %nface, i32 noundef %ncell, ptr noalias noundef %f
|
||||
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds double, ptr [[Y]], <4 x i64> [[TMP3]]
|
||||
; CHECK-NEXT: [[TMP5:%.*]] = sext <4 x i32> [[WIDE_LOAD12]] to <4 x i64>
|
||||
; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds double, ptr [[X]], <4 x i64> [[TMP5]]
|
||||
; CHECK-NEXT: [[WIDE_MASKED_GATHER:%.*]] = tail call <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr> [[TMP4]], i32 8, <4 x i1> splat (i1 true), <4 x double> poison), !llvm.access.group [[ACC_GRP4]]
|
||||
; CHECK-NEXT: [[WIDE_MASKED_GATHER13:%.*]] = tail call <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr> [[TMP6]], i32 8, <4 x i1> splat (i1 true), <4 x double> poison), !llvm.access.group [[ACC_GRP4]]
|
||||
; CHECK-NEXT: [[WIDE_MASKED_GATHER:%.*]] = tail call <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr> [[TMP4]], i32 8, <4 x i1> splat (i1 true), <4 x double> poison), !tbaa [[TBAA5:![0-9]+]], !llvm.access.group [[ACC_GRP4]]
|
||||
; CHECK-NEXT: [[WIDE_MASKED_GATHER13:%.*]] = tail call <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr> [[TMP6]], i32 8, <4 x i1> splat (i1 true), <4 x double> poison), !tbaa [[TBAA5]], !llvm.access.group [[ACC_GRP4]]
|
||||
; CHECK-NEXT: [[TMP7:%.*]] = fcmp fast olt <4 x double> [[WIDE_MASKED_GATHER]], [[WIDE_MASKED_GATHER13]]
|
||||
; CHECK-NEXT: [[TMP8:%.*]] = select <4 x i1> [[TMP7]], <4 x double> [[WIDE_MASKED_GATHER13]], <4 x double> [[WIDE_MASKED_GATHER]]
|
||||
; CHECK-NEXT: tail call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> [[TMP8]], <4 x ptr> [[TMP4]], i32 8, <4 x i1> splat (i1 true)), !tbaa [[TBAA5:![0-9]+]], !llvm.access.group [[ACC_GRP4]]
|
||||
; CHECK-NEXT: tail call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> [[TMP8]], <4 x ptr> [[TMP4]], i32 8, <4 x i1> splat (i1 true)), !tbaa [[TBAA5]], !llvm.access.group [[ACC_GRP4]]
|
||||
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDVARS_IV_EPIL]], 4
|
||||
; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[UNROLL_ITER]]
|
||||
; CHECK-NEXT: br i1 [[TMP9]], label %[[MIDDLE_BLOCK]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
|
||||
@ -56,8 +56,8 @@ define void @test(i32 noundef %nface, i32 noundef %ncell, ptr noalias noundef %f
|
||||
; CHECK-NEXT: [[ARRAYIDX4_3:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 [[IDXPROM3_3]]
|
||||
; CHECK-NEXT: [[IDXPROM5_3:%.*]] = sext i32 [[TMP23]] to i64
|
||||
; CHECK-NEXT: [[ARRAYIDX6_3:%.*]] = getelementptr inbounds double, ptr [[X]], i64 [[IDXPROM5_3]]
|
||||
; CHECK-NEXT: [[TMP24:%.*]] = load double, ptr [[ARRAYIDX4_3]], align 8, !llvm.access.group [[ACC_GRP4]]
|
||||
; CHECK-NEXT: [[TMP25:%.*]] = load double, ptr [[ARRAYIDX6_3]], align 8, !llvm.access.group [[ACC_GRP4]]
|
||||
; CHECK-NEXT: [[TMP24:%.*]] = load double, ptr [[ARRAYIDX4_3]], align 8, !tbaa [[TBAA5]], !llvm.access.group [[ACC_GRP4]]
|
||||
; CHECK-NEXT: [[TMP25:%.*]] = load double, ptr [[ARRAYIDX6_3]], align 8, !tbaa [[TBAA5]], !llvm.access.group [[ACC_GRP4]]
|
||||
; CHECK-NEXT: [[CMP_I_3:%.*]] = fcmp fast olt double [[TMP24]], [[TMP25]]
|
||||
; CHECK-NEXT: [[TMP26:%.*]] = select i1 [[CMP_I_3]], double [[TMP25]], double [[TMP24]]
|
||||
; CHECK-NEXT: store double [[TMP26]], ptr [[ARRAYIDX4_3]], align 8, !tbaa [[TBAA5]], !llvm.access.group [[ACC_GRP4]]
|
||||
|
Loading…
x
Reference in New Issue
Block a user