33
44; Reproducer for https://github.com/llvm/llvm-project/issues/197982
55
6- target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
7- target triple = "x86_64-apple-macosx14.0.0"
6+ @g = external global ptr
87
9- define void @dtor (ptr captures(none) %this ) local_unnamed_addr #0 {
10- ; CHECK-LABEL: define void @dtor(
11- ; CHECK-SAME: ptr captures(none) [[THIS:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
12- ; CHECK-NEXT: [[OLD_I:%.*]] = load ptr, ptr [[THIS]], align 8
13- ; CHECK-NEXT: store ptr null, ptr [[THIS]], align 8
14- ; CHECK-NEXT: store volatile i32 0, ptr [[OLD_I]], align 4
15- ; CHECK-NEXT: ret void
16- ;
17- %old.i = load ptr , ptr %this , align 8
18- store ptr null , ptr %this , align 8
19- store volatile i32 0 , ptr %old.i , align 4
20- ret void
21- }
22-
23- define noalias noundef ptr @assign (ptr captures(none) %this ) local_unnamed_addr #0 {
24- ; CHECK-LABEL: define noalias noundef ptr @assign(
25- ; CHECK-SAME: ptr captures(none) [[THIS:%.*]]) local_unnamed_addr #[[ATTR0]] {
26- ; CHECK-NEXT: [[CALL:%.*]] = load volatile ptr, ptr null, align 4294967296
27- ; CHECK-NEXT: [[OLD_I:%.*]] = load ptr, ptr [[THIS]], align 8
28- ; CHECK-NEXT: store ptr [[CALL]], ptr [[THIS]], align 8
29- ; CHECK-NEXT: store volatile i32 0, ptr [[OLD_I]], align 4
30- ; CHECK-NEXT: ret ptr null
31- ;
32- %call = load volatile ptr , ptr null , align 4294967296
33- %old.i = load ptr , ptr %this , align 8
34- store ptr %call , ptr %this , align 8
35- store volatile i32 0 , ptr %old.i , align 4
36- ret ptr null
37- }
8+ declare void @ext ()
389
39- define void @ctor (ptr writeonly captures(none) initializes(( 0 , 8 ), ( 16 , 24 )) %this ) local_unnamed_addr !prof !14 {
10+ define void @ctor (ptr %this ) !prof !14 {
4011; CHECK-LABEL: define void @ctor(
41- ; CHECK-SAME: ptr writeonly captures(none) initializes((0, 8), (16, 24)) [[THIS:%.*]]) local_unnamed_addr #[[ATTR1 :[0-9]+]] !prof [[PROF14:![0-9]+]] {
12+ ; CHECK-SAME: ptr [[THIS:%.*]]) #[[ATTR0 :[0-9]+]] !prof [[PROF14:![0-9]+]] {
4213; CHECK-NEXT: tail call void @ext()
4314; CHECK-NEXT: store ptr null, ptr [[THIS]], align 16
4415; CHECK-NEXT: [[P:%.*]] = getelementptr i8, ptr [[THIS]], i64 16
@@ -58,58 +29,40 @@ define void @ctor(ptr writeonly captures(none) initializes((0, 8), (16, 24)) %th
5829 ret void
5930}
6031
61- declare void @ext () local_unnamed_addr
62-
63- define void @writeAsOperandInternal (ptr readonly captures(none) %WriterCtx , i1 %cond ) local_unnamed_addr {
32+ define void @writeAsOperandInternal (ptr %WriterCtx , i1 %cond ) {
6433; CHECK-LABEL: define void @writeAsOperandInternal(
65- ; CHECK-SAME: ptr readonly captures(none) [[WRITERCTX:%.*]], i1 [[COND:%.*]]) local_unnamed_addr {
34+ ; CHECK-SAME: ptr [[WRITERCTX:%.*]], i1 [[COND:%.*]]) {
6635; CHECK-NEXT: [[ENTRY:.*]]:
6736; CHECK-NEXT: br i1 [[COND]], label %[[CODEREPL:.*]], label %[[IF_END:.*]]
6837; CHECK: [[CODEREPL]]:
69- ; CHECK-NEXT: [[TMP0:%.*]] = call ptr @writeAsOperandInternal.cold.1() #[[ATTR2 :[0-9]+]]
38+ ; CHECK-NEXT: [[TMP0:%.*]] = call ptr @writeAsOperandInternal.cold.1() #[[ATTR1 :[0-9]+]]
7039; CHECK-NEXT: br label %[[IF_END]]
7140; CHECK: [[IF_END]]:
72- ; CHECK-NEXT: [[S_SROA_0_0:%.*]] = phi ptr [ [[TMP0]], %[[CODEREPL]] ], [ poison , %[[ENTRY]] ]
73- ; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[TMP0]], %[[CODEREPL]] ], [ null , %[[ENTRY]] ]
41+ ; CHECK-NEXT: [[S_SROA_0_0:%.*]] = phi ptr [ [[TMP0]], %[[CODEREPL]] ], [ @g , %[[ENTRY]] ]
42+ ; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[TMP0]], %[[CODEREPL]] ], [ @g , %[[ENTRY]] ]
7443; CHECK-NEXT: [[FP:%.*]] = load ptr, ptr [[WRITERCTX]], align 8
75- ; CHECK-NEXT: [[R:%.*]] = tail call i32 [[FP]](ptr [[P]], ptr null )
44+ ; CHECK-NEXT: [[R:%.*]] = tail call i32 [[FP]](ptr [[P]], ptr @g )
7645; CHECK-NEXT: store volatile i32 0, ptr [[S_SROA_0_0]], align 4
7746; CHECK-NEXT: ret void
7847;
7948entry:
8049 br i1 %cond , label %if.then , label %if.end
8150
8251if.then:
83- tail call void @ctor (ptr null )
84- %call.i = load volatile ptr , ptr null , align 4294967296
85- store volatile i32 0 , ptr poison , align 4
52+ tail call void @ctor (ptr @g )
53+ %call.i = load volatile ptr , ptr @g , align 8
54+ store volatile i32 0 , ptr @g , align 4
8655 br label %if.end
8756
8857if.end:
89- %s.sroa.0.0 = phi ptr [ %call.i , %if.then ], [ poison , %entry ]
90- %p = phi ptr [ %call.i , %if.then ], [ null , %entry ]
58+ %s.sroa.0.0 = phi ptr [ %call.i , %if.then ], [ @g , %entry ]
59+ %p = phi ptr [ %call.i , %if.then ], [ @g , %entry ]
9160 %fp = load ptr , ptr %WriterCtx , align 8
92- %r = tail call i32 %fp (ptr %p , ptr null )
61+ %r = tail call i32 %fp (ptr %p , ptr @g )
9362 store volatile i32 0 , ptr %s.sroa.0.0 , align 4
9463 ret void
9564}
9665
97- define void @reset (ptr captures(none) %this , ptr %p ) local_unnamed_addr #0 {
98- ; CHECK-LABEL: define void @reset(
99- ; CHECK-SAME: ptr captures(none) [[THIS:%.*]], ptr [[P:%.*]]) local_unnamed_addr #[[ATTR0]] {
100- ; CHECK-NEXT: [[OLD:%.*]] = load ptr, ptr [[THIS]], align 8
101- ; CHECK-NEXT: store ptr [[P]], ptr [[THIS]], align 8
102- ; CHECK-NEXT: store volatile i32 0, ptr [[OLD]], align 4
103- ; CHECK-NEXT: ret void
104- ;
105- %old = load ptr , ptr %this , align 8
106- store ptr %p , ptr %this , align 8
107- store volatile i32 0 , ptr %old , align 4
108- ret void
109- }
110-
111- attributes #0 = { nofree norecurse nounwind memory(readwrite, target_mem: none) }
112-
11366!llvm.module.flags = !{!0 }
11467
11568!0 = !{i32 1 , !"ProfileSummary" , !1 }
0 commit comments