Skip to content

Commit 89b09c8

Browse files
committed
[GVN][JumpThreading] Address review comments
1 parent 673ab49 commit 89b09c8

File tree

12 files changed

+85
-32
lines changed

12 files changed

+85
-32
lines changed

llvm/lib/Transforms/Scalar/GVN.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1516,7 +1516,10 @@ void GVNPass::eliminatePartiallyRedundantLoad(
15161516
MSSAU->insertUse(cast<MemoryUse>(NewAccess), /*RenameUses=*/true);
15171517
}
15181518

1519-
copyMetadataForLoad(*NewLoad, *Load);
1519+
NewLoad->copyMetadata(*Load);
1520+
// Drop UB-implying metadata as we do not know if it is guaranteed to
1521+
// transfer the execution to the original load.
1522+
NewLoad->dropUBImplyingAttrsAndMetadata();
15201523

15211524
// Add the newly created load.
15221525
ValuesPerBlock.push_back(

llvm/lib/Transforms/Scalar/JumpThreading.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1362,11 +1362,14 @@ bool JumpThreadingPass::simplifyPartiallyRedundantLoad(LoadInst *LoadI) {
13621362
// farther than to a predecessor, we need to reuse the code from GVN's PRE.
13631363
// It requires domination tree analysis, so for this simple case it is an
13641364
// overkill.
1365+
bool TransfersExecution = false;
13651366
if (PredsScanned.size() != AvailablePreds.size() &&
1366-
!isSafeToSpeculativelyExecute(LoadI))
1367+
!isSafeToSpeculativelyExecute(LoadI)) {
13671368
for (auto I = LoadBB->begin(); &*I != LoadI; ++I)
13681369
if (!isGuaranteedToTransferExecutionToSuccessor(&*I))
13691370
return false;
1371+
TransfersExecution = true;
1372+
}
13701373

13711374
// If there is exactly one predecessor where the value is unavailable, the
13721375
// already computed 'OneUnavailablePred' block is it. If it ends in an
@@ -1407,7 +1410,11 @@ bool JumpThreadingPass::simplifyPartiallyRedundantLoad(LoadInst *LoadI) {
14071410
LoadI->getOrdering(), LoadI->getSyncScopeID(),
14081411
UnavailablePred->getTerminator()->getIterator());
14091412
NewVal->setDebugLoc(LoadI->getDebugLoc());
1410-
copyMetadataForLoad(*NewVal, *LoadI);
1413+
NewVal->copyMetadata(*LoadI);
1414+
// Drop UB-implying metadata if we do not know it is guaranteed to transfer
1415+
// the execution to the original load.
1416+
if (!TransfersExecution)
1417+
NewVal->dropUBImplyingAttrsAndMetadata();
14111418

14121419
AvailablePreds.emplace_back(UnavailablePred, NewVal);
14131420
}

llvm/lib/Transforms/Utils/Local.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3468,7 +3468,6 @@ void llvm::copyMetadataForLoad(LoadInst &Dest, const LoadInst &Source) {
34683468
case LLVMContext::MD_fpmath:
34693469
case LLVMContext::MD_tbaa_struct:
34703470
case LLVMContext::MD_invariant_load:
3471-
case LLVMContext::MD_invariant_group:
34723471
case LLVMContext::MD_alias_scope:
34733472
case LLVMContext::MD_noalias:
34743473
case LLVMContext::MD_nontemporal:

llvm/test/Analysis/MemoryDependenceAnalysis/InvariantLoad.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ declare void @foo(ptr)
1010
define i8 @test(i1 %cmp) {
1111
; CHECK-LABEL: @test(
1212
; CHECK-NEXT: entry:
13-
; CHECK-NEXT: [[P:%.*]] = alloca i8
14-
; CHECK-NEXT: store i8 5, ptr [[P]]
13+
; CHECK-NEXT: [[P:%.*]] = alloca i8, align 1
14+
; CHECK-NEXT: store i8 5, ptr [[P]], align 1
1515
; CHECK-NEXT: br label [[HEADER:%.*]]
1616
; CHECK: header:
1717
; CHECK-NEXT: [[V:%.*]] = phi i8 [ 5, [[ENTRY:%.*]] ], [ -5, [[ALIVE:%.*]] ]
@@ -23,7 +23,7 @@ define i8 @test(i1 %cmp) {
2323
; CHECK-NEXT: br label [[ALIVE]]
2424
; CHECK: alive:
2525
; CHECK-NEXT: [[I_2:%.*]] = phi i8 [ [[I]], [[HEADER]] ], [ [[I_1]], [[DEAD]] ]
26-
; CHECK-NEXT: store i8 -5, ptr [[P]]
26+
; CHECK-NEXT: store i8 -5, ptr [[P]], align 1
2727
; CHECK-NEXT: call void @llvm.memset.p0.i32(ptr align 1 [[P]], i8 0, i32 1, i1 false)
2828
; CHECK-NEXT: [[I_INC]] = add i8 [[I_2]], 1
2929
; CHECK-NEXT: [[CMP_LOOP:%.*]] = icmp ugt i8 [[I_INC]], 100
@@ -67,7 +67,7 @@ define i8 @test2(i1 %cmp, ptr %p) {
6767
; CHECK-NEXT: call void @foo(ptr [[P]])
6868
; CHECK-NEXT: br i1 [[CMP:%.*]], label [[B2:%.*]], label [[B1:%.*]]
6969
; CHECK: b1:
70-
; CHECK-NEXT: [[RES2:%.*]] = load i8, ptr [[P]]
70+
; CHECK-NEXT: [[RES2:%.*]] = load i8, ptr [[P]], align 1
7171
; CHECK-NEXT: [[RES3:%.*]] = add i8 [[RES1]], [[RES2]]
7272
; CHECK-NEXT: br label [[ALIVE:%.*]]
7373
; CHECK: b2:
@@ -105,7 +105,7 @@ define i8 @test3(i1 %cmp, ptr %p) {
105105
; CHECK-NEXT: call void @foo(ptr [[P]])
106106
; CHECK-NEXT: br i1 [[CMP:%.*]], label [[B1:%.*]], label [[B2:%.*]]
107107
; CHECK: b1:
108-
; CHECK-NEXT: [[RES2:%.*]] = load i8, ptr [[P]]
108+
; CHECK-NEXT: [[RES2:%.*]] = load i8, ptr [[P]], align 1
109109
; CHECK-NEXT: [[RES3:%.*]] = add i8 [[RES1]], [[RES2]]
110110
; CHECK-NEXT: br label [[ALIVE:%.*]]
111111
; CHECK: b2:
@@ -148,7 +148,7 @@ define void @test4() null_pointer_is_valid {
148148
; CHECK-NEXT: [[TMP4:%.*]] = fmul float [[TMP2]], [[TMP2]]
149149
; CHECK-NEXT: [[INVAR_INC3]] = add nuw nsw i64 [[FUSION_INVAR_ADDRESS_DIM_0_03]], 1
150150
; CHECK-NEXT: [[DOTPHI_TRANS_INSERT:%.*]] = getelementptr inbounds [2 x [1 x [4 x float]]], ptr null, i64 0, i64 [[INVAR_INC3]], i64 0, i64 2
151-
; CHECK-NEXT: [[DOTPRE]] = load float, ptr [[DOTPHI_TRANS_INSERT]], align 4, !invariant.load !0
151+
; CHECK-NEXT: [[DOTPRE]] = load float, ptr [[DOTPHI_TRANS_INSERT]], align 4
152152
; CHECK-NEXT: br label [[FUSION_LOOP_HEADER_DIM_1_PREHEADER]]
153153
;
154154
entry:

llvm/test/Analysis/MemoryDependenceAnalysis/invariant.group-bug.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ define void @fail(ptr noalias sret(i1) %arg, ptr %arg1, ptr %arg2, ptr %arg3, i1
2929
; CHECK-NEXT: br i1 [[ARG4:%.*]], label [[BB10:%.*]], label [[BB29:%.*]]
3030
; CHECK: bb10:
3131
; CHECK-NEXT: [[I14_PHI_TRANS_INSERT:%.*]] = getelementptr inbounds ptr, ptr [[I4]], i64 22
32-
; CHECK-NEXT: [[I15_PRE:%.*]] = load ptr, ptr [[I14_PHI_TRANS_INSERT]], align 8, !invariant.load [[META6]]
32+
; CHECK-NEXT: [[I15_PRE:%.*]] = load ptr, ptr [[I14_PHI_TRANS_INSERT]], align 8
3333
; CHECK-NEXT: br label [[BB12:%.*]]
3434
; CHECK: bb12:
3535
; CHECK-NEXT: [[I16:%.*]] = call i64 [[I15_PRE]](ptr nonnull [[ARG1]], ptr null, i64 0) #[[ATTR1]]

llvm/test/Transforms/GVN/PRE/invariant-load.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ define i32 @test8(i1 %cnd, ptr %p) {
162162
; CHECK-NEXT: br i1 [[CND]], label [[TAKEN:%.*]], label [[MERGE:%.*]]
163163
; CHECK: taken:
164164
; CHECK-NEXT: [[P2:%.*]] = call ptr (...) @bar(ptr [[P]])
165-
; CHECK-NEXT: [[V2_PRE:%.*]] = load i32, ptr [[P2]], align 4, !invariant.load [[META0]]
165+
; CHECK-NEXT: [[V2_PRE:%.*]] = load i32, ptr [[P2]], align 4
166166
; CHECK-NEXT: br label [[MERGE]]
167167
; CHECK: merge:
168168
; CHECK-NEXT: [[V2:%.*]] = phi i32 [ [[V1]], [[ENTRY:%.*]] ], [ [[V2_PRE]], [[TAKEN]] ]

llvm/test/Transforms/GVN/PRE/load-metadata.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ block1:
88
block2:
99
br label %block4
1010
; CHECK: block2:
11-
; CHECK-NEXT: load i32, ptr %p, align 4, !range !0, !invariant.group !1
11+
; CHECK-NEXT: load i32, ptr %p, align 4, !range !0
1212

1313
block3:
1414
store i32 0, ptr %p

llvm/test/Transforms/GVN/PRE/load-pre-metadata-accsess-group.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ define dso_local void @test1(ptr nocapture readonly %aa, ptr nocapture %bb) loca
1313
; CHECK-NEXT: [[TMP1:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[DOTPRE:%.*]], [[FOR_BODY_FOR_BODY_CRIT_EDGE:%.*]] ]
1414
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY_FOR_BODY_CRIT_EDGE]] ]
1515
; CHECK-NEXT: [[IDX4:%.*]] = getelementptr inbounds i32, ptr [[AA]], i64 [[INDVARS_IV]]
16-
; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[IDX4]], align 4, !llvm.access.group !0
16+
; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[IDX4]], align 4, !llvm.access.group [[ACC_GRP0:![0-9]+]]
1717
; CHECK-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP1]], [[TMP2]]
18-
; CHECK-NEXT: store i32 [[MUL]], ptr [[IDX4]], align 4, !llvm.access.group !0
18+
; CHECK-NEXT: store i32 [[MUL]], ptr [[IDX4]], align 4, !llvm.access.group [[ACC_GRP0]]
1919
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
2020
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT]], 100
2121
; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_BODY_FOR_BODY_CRIT_EDGE]], label [[FOR_END:%.*]]
2222
; CHECK: for.body.for.body_crit_edge:
23-
; CHECK-NEXT: [[DOTPRE]] = load i32, ptr [[IDX]], align 4, !llvm.access.group !0
23+
; CHECK-NEXT: [[DOTPRE]] = load i32, ptr [[IDX]], align 4
2424
; CHECK-NEXT: br label [[FOR_BODY]]
2525
; CHECK: for.end:
2626
; CHECK-NEXT: ret void
@@ -65,10 +65,10 @@ define dso_local void @test2(ptr nocapture readonly %aa, ptr nocapture %bb) loca
6565
; CHECK-NEXT: [[TMP2:%.*]] = phi i32 [ [[DOTPRE]], [[FOR_BODY]] ], [ [[MUL:%.*]], [[FOR_BODY2_FOR_BODY2_CRIT_EDGE]] ]
6666
; CHECK-NEXT: [[INDVARS2_IV:%.*]] = phi i64 [ 0, [[FOR_BODY]] ], [ 1, [[FOR_BODY2_FOR_BODY2_CRIT_EDGE]] ]
6767
; CHECK-NEXT: [[MUL]] = mul nsw i32 [[TMP1]], [[TMP2]]
68-
; CHECK-NEXT: store i32 [[MUL]], ptr [[AA]], align 4, !llvm.access.group !1
68+
; CHECK-NEXT: store i32 [[MUL]], ptr [[AA]], align 4, !llvm.access.group [[ACC_GRP1:![0-9]+]]
6969
; CHECK-NEXT: br i1 true, label [[FOR_BODY2_FOR_BODY2_CRIT_EDGE]], label [[FOR_END:%.*]]
7070
; CHECK: for.body2.for.body2_crit_edge:
71-
; CHECK-NEXT: [[DOTPRE1]] = load i32, ptr [[IDX]], align 4, !llvm.access.group !1
71+
; CHECK-NEXT: [[DOTPRE1]] = load i32, ptr [[IDX]], align 4
7272
; CHECK-NEXT: br label [[FOR_BODY2]]
7373
; CHECK: for.end:
7474
; CHECK-NEXT: br i1 false, label [[FOR_END_FOR_BODY_CRIT_EDGE:%.*]], label [[END:%.*]]

llvm/test/Transforms/GVN/PRE/preserve-tbaa.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ target datalayout = "e-p:64:64:64"
55
; GVN should preserve the TBAA tag on loads when doing PRE.
66

77
; CHECK-LABEL: @test(
8-
; CHECK: %tmp33.pre = load i16, ptr %P, align 2, !tbaa !0
8+
; CHECK: %tmp33.pre = load i16, ptr %P, align 2
99
; CHECK: br label %for.body
1010
define void @test(ptr %P, ptr %Q, i1 %arg) nounwind {
1111
entry:

llvm/test/Transforms/GVN/pr64598.ll

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,20 @@ define i32 @main(i64 %x, ptr %d, ptr noalias %p) {
66
; CHECK-SAME: (i64 [[X:%.*]], ptr [[D:%.*]], ptr noalias [[P:%.*]]) {
77
; CHECK-NEXT: entry:
88
; CHECK-NEXT: [[T1_PRE_PRE_PRE:%.*]] = load ptr, ptr [[P]], align 8
9-
; CHECK-NEXT: [[T2_PRE_PRE_PRE:%.*]] = load ptr, ptr [[T1_PRE_PRE_PRE]], align 8, !tbaa [[TBAA0:![0-9]+]]
9+
; CHECK-NEXT: [[T2_PRE_PRE_PRE:%.*]] = load ptr, ptr [[T1_PRE_PRE_PRE]], align 8
1010
; CHECK-NEXT: [[T3_PRE_PRE_PRE:%.*]] = load ptr, ptr [[T2_PRE_PRE_PRE]], align 8
1111
; CHECK-NEXT: br label [[LOOP:%.*]]
1212
; CHECK: loop:
13-
; CHECK-NEXT: [[T2_PRE_PRE:%.*]] = phi ptr [ [[T2_PRE_PRE23:%.*]], [[LOOP_LATCH:%.*]] ], [ [[T2_PRE_PRE_PRE]], [[ENTRY:%.*]] ]
14-
; CHECK-NEXT: [[T1_PRE_PRE:%.*]] = phi ptr [ [[T1_PRE_PRE19:%.*]], [[LOOP_LATCH]] ], [ [[T1_PRE_PRE_PRE]], [[ENTRY]] ]
13+
; CHECK-NEXT: [[T1_PRE_PRE:%.*]] = phi ptr [ [[T1_PRE_PRE19:%.*]], [[LOOP_LATCH:%.*]] ], [ [[T1_PRE_PRE_PRE]], [[ENTRY:%.*]] ]
1514
; CHECK-NEXT: br label [[LOOP2:%.*]]
1615
; CHECK: loop2:
17-
; CHECK-NEXT: [[T2_PRE_PRE25:%.*]] = phi ptr [ [[T2_PRE_PRE23]], [[LOOP2_LATCH_LOOP2_CRIT_EDGE:%.*]] ], [ [[T2_PRE_PRE]], [[LOOP]] ]
18-
; CHECK-NEXT: [[T1_PRE_PRE21:%.*]] = phi ptr [ [[T1_PRE_PRE19]], [[LOOP2_LATCH_LOOP2_CRIT_EDGE]] ], [ [[T1_PRE_PRE]], [[LOOP]] ]
16+
; CHECK-NEXT: [[T1_PRE_PRE21:%.*]] = phi ptr [ [[T1_PRE_PRE19]], [[LOOP2_LATCH_LOOP2_CRIT_EDGE:%.*]] ], [ [[T1_PRE_PRE]], [[LOOP]] ]
1917
; CHECK-NEXT: [[T3_PRE:%.*]] = phi ptr [ [[T3_PRE16:%.*]], [[LOOP2_LATCH_LOOP2_CRIT_EDGE]] ], [ [[T3_PRE_PRE_PRE]], [[LOOP]] ]
20-
; CHECK-NEXT: [[T2_PRE:%.*]] = phi ptr [ [[T2_PRE13:%.*]], [[LOOP2_LATCH_LOOP2_CRIT_EDGE]] ], [ [[T2_PRE_PRE]], [[LOOP]] ]
18+
; CHECK-NEXT: [[T2_PRE:%.*]] = phi ptr [ [[T2_PRE13:%.*]], [[LOOP2_LATCH_LOOP2_CRIT_EDGE]] ], [ [[T2_PRE_PRE_PRE]], [[LOOP]] ]
2119
; CHECK-NEXT: [[T1_PRE:%.*]] = phi ptr [ [[T1_PRE10:%.*]], [[LOOP2_LATCH_LOOP2_CRIT_EDGE]] ], [ [[T1_PRE_PRE]], [[LOOP]] ]
2220
; CHECK-NEXT: br label [[LOOP3:%.*]]
2321
; CHECK: loop3:
24-
; CHECK-NEXT: [[T2_PRE_PRE24:%.*]] = phi ptr [ [[T2_PRE_PRE23]], [[LOOP3_LATCH:%.*]] ], [ [[T2_PRE_PRE25]], [[LOOP2]] ]
25-
; CHECK-NEXT: [[T1_PRE_PRE20:%.*]] = phi ptr [ [[T1_PRE_PRE19]], [[LOOP3_LATCH]] ], [ [[T1_PRE_PRE21]], [[LOOP2]] ]
22+
; CHECK-NEXT: [[T1_PRE_PRE20:%.*]] = phi ptr [ [[T1_PRE_PRE19]], [[LOOP3_LATCH:%.*]] ], [ [[T1_PRE_PRE21]], [[LOOP2]] ]
2623
; CHECK-NEXT: [[T3_PRE17:%.*]] = phi ptr [ [[T3_PRE16]], [[LOOP3_LATCH]] ], [ [[T3_PRE]], [[LOOP2]] ]
2724
; CHECK-NEXT: [[T2_PRE14:%.*]] = phi ptr [ [[T2_PRE13]], [[LOOP3_LATCH]] ], [ [[T2_PRE]], [[LOOP2]] ]
2825
; CHECK-NEXT: [[T1_PRE11:%.*]] = phi ptr [ [[T1_PRE10]], [[LOOP3_LATCH]] ], [ [[T1_PRE]], [[LOOP2]] ]
@@ -36,11 +33,10 @@ define i32 @main(i64 %x, ptr %d, ptr noalias %p) {
3633
; CHECK: for.body.lr.ph.i:
3734
; CHECK-NEXT: store i32 0, ptr [[P]], align 4
3835
; CHECK-NEXT: [[T5_PRE:%.*]] = load ptr, ptr [[P]], align 8
39-
; CHECK-NEXT: [[T6_PRE:%.*]] = load ptr, ptr [[T5_PRE]], align 8, !tbaa [[TBAA0]]
36+
; CHECK-NEXT: [[T6_PRE:%.*]] = load ptr, ptr [[T5_PRE]], align 8
4037
; CHECK-NEXT: [[T7_PRE:%.*]] = load ptr, ptr [[T6_PRE]], align 8
4138
; CHECK-NEXT: br label [[LOOP3_LATCH]]
4239
; CHECK: loop3.latch:
43-
; CHECK-NEXT: [[T2_PRE_PRE23]] = phi ptr [ [[T2_PRE_PRE24]], [[LOOP3_LOOP3_LATCH_CRIT_EDGE]] ], [ [[T6_PRE]], [[FOR_BODY_LR_PH_I]] ]
4440
; CHECK-NEXT: [[T1_PRE_PRE19]] = phi ptr [ [[T1_PRE_PRE20]], [[LOOP3_LOOP3_LATCH_CRIT_EDGE]] ], [ [[T5_PRE]], [[FOR_BODY_LR_PH_I]] ]
4541
; CHECK-NEXT: [[T3_PRE16]] = phi ptr [ [[T3_PRE17]], [[LOOP3_LOOP3_LATCH_CRIT_EDGE]] ], [ [[T7_PRE]], [[FOR_BODY_LR_PH_I]] ]
4642
; CHECK-NEXT: [[T2_PRE13]] = phi ptr [ [[T2_PRE14]], [[LOOP3_LOOP3_LATCH_CRIT_EDGE]] ], [ [[T6_PRE]], [[FOR_BODY_LR_PH_I]] ]
@@ -54,7 +50,7 @@ define i32 @main(i64 %x, ptr %d, ptr noalias %p) {
5450
; CHECK: loop2.latch.loop2_crit_edge:
5551
; CHECK-NEXT: br label [[LOOP2]]
5652
; CHECK: loop.latch:
57-
; CHECK-NEXT: store i32 0, ptr [[D]], align 4, !tbaa [[TBAA4:![0-9]+]]
53+
; CHECK-NEXT: store i32 0, ptr [[D]], align 4, !tbaa [[TBAA0:![0-9]+]]
5854
; CHECK-NEXT: br label [[LOOP]]
5955
;
6056
entry:

0 commit comments

Comments
 (0)