Skip to content

Commit

Permalink
[IR] Mark llvm.trap as memory(inaccessiblemem: write)
Browse files Browse the repository at this point in the history
Traps will not read/write the program state but they need an effect for
preservation, similar to `llvm.assume`. We really want a new memory kind
for that (see TODO), but for now `inaccessiblemem: write` is better than
any possible effect.

Differential Revision: https://reviews.llvm.org/D156476
  • Loading branch information
jdoerfert committed Jul 31, 2023
1 parent deb0ea3 commit 6fa8244
Show file tree
Hide file tree
Showing 15 changed files with 32 additions and 29 deletions.
6 changes: 4 additions & 2 deletions llvm/include/llvm/IR/Intrinsics.td
Original file line number Diff line number Diff line change
Expand Up @@ -1670,8 +1670,10 @@ def int_coro_subfn_addr : DefaultAttrsIntrinsic<

///===-------------------------- Other Intrinsics --------------------------===//
//
def int_trap : Intrinsic<[], [], [IntrNoReturn, IntrCold]>,
ClangBuiltin<"__builtin_trap">;
// TODO: We should introduce a new memory kind fo traps (and other side effects
// we only model to keep things alive).
def int_trap : Intrinsic<[], [], [IntrNoReturn, IntrCold, IntrInaccessibleMemOnly,
IntrWriteMem]>, ClangBuiltin<"__builtin_trap">;
def int_debugtrap : Intrinsic<[]>,
ClangBuiltin<"__builtin_debugtrap">;
def int_ubsantrap : Intrinsic<[], [llvm_i8_ty],
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Feature/intrinsics.ll
Original file line number Diff line number Diff line change
Expand Up @@ -70,4 +70,4 @@ define void @trap() {
}

; CHECK: attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
; CHECK: attributes #1 = { cold noreturn nounwind }
; CHECK: attributes #1 = { cold noreturn nounwind memory(inaccessiblemem: write) }
21 changes: 11 additions & 10 deletions llvm/test/Transforms/Attributor/cgscc_bugs.ll
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ define linkonce_odr hidden { ptr, i64 } @f3(i64 %0) align 2 {
; CHECK-SAME: (i64 [[TMP0:%.*]]) align 2 {
; CHECK-NEXT: [[TMP2:%.*]] = call i32 @f4()
; CHECK-NEXT: [[TMP3:%.*]] = zext i32 [[TMP2]] to i64
; CHECK-NEXT: call void @f5(i64 [[TMP3]], i64 [[TMP0]]) #[[ATTR0:[0-9]+]]
; CHECK-NEXT: call void @f5(i64 [[TMP3]], i64 [[TMP0]]) #[[ATTR2:[0-9]+]]
; CHECK-NEXT: ret { ptr, i64 } undef
;
%2 = call i32 @f4()
Expand All @@ -40,18 +40,18 @@ define linkonce_odr hidden i32 @f4() align 2 {
}

define internal void @f5(i64 %0, i64 %1) {
; CHECK: Function Attrs: nounwind
; CHECK: Function Attrs: nounwind memory(inaccessiblemem: write)
; CHECK-LABEL: define {{[^@]+}}@f5
; CHECK-SAME: (i64 [[TMP0:%.*]], i64 [[TMP1:%.*]]) #[[ATTR0]] {
; CHECK-SAME: (i64 [[TMP0:%.*]], i64 [[TMP1:%.*]]) #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: br label [[TMP3:%.*]]
; CHECK: 3:
; CHECK-NEXT: call void @f6(i64 [[TMP0]]) #[[ATTR0]]
; CHECK-NEXT: call void @f6(i64 [[TMP0]]) #[[ATTR2]]
; CHECK-NEXT: [[TMP4:%.*]] = icmp sgt i64 [[TMP1]], [[TMP0]]
; CHECK-NEXT: br i1 [[TMP4]], label [[TMP5:%.*]], label [[TMP6:%.*]]
; CHECK: 5:
; CHECK-NEXT: ret void
; CHECK: 6:
; CHECK-NEXT: call void @f5(i64 [[TMP0]], i64 [[TMP1]]) #[[ATTR0]]
; CHECK-NEXT: call void @f5(i64 [[TMP0]], i64 [[TMP1]]) #[[ATTR2]]
; CHECK-NEXT: br label [[TMP3]]
;
br label %3
Expand All @@ -70,13 +70,13 @@ define internal void @f5(i64 %0, i64 %1) {
}

define internal void @f6(i64 %0) {
; CHECK: Function Attrs: nounwind
; CHECK: Function Attrs: nounwind memory(inaccessiblemem: write)
; CHECK-LABEL: define {{[^@]+}}@f6
; CHECK-SAME: (i64 [[TMP0:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i64 [[TMP0]], 0
; CHECK-NEXT: br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4:%.*]]
; CHECK: 3:
; CHECK-NEXT: call void @llvm.trap() #[[ATTR2:[0-9]+]]
; CHECK-NEXT: call void @llvm.trap() #[[ATTR3:[0-9]+]]
; CHECK-NEXT: unreachable
; CHECK: 4:
; CHECK-NEXT: ret void
Expand All @@ -98,9 +98,10 @@ declare void @llvm.trap() #0
attributes #0 = { cold noreturn nounwind }

;.
; CHECK: attributes #[[ATTR0]] = { nounwind }
; CHECK: attributes #[[ATTR1:[0-9]+]] = { cold noreturn nounwind }
; CHECK: attributes #[[ATTR2]] = { noreturn }
; CHECK: attributes #[[ATTR0]] = { nounwind memory(inaccessiblemem: write) }
; CHECK: attributes #[[ATTR1:[0-9]+]] = { cold noreturn nounwind memory(inaccessiblemem: write) }
; CHECK: attributes #[[ATTR2]] = { nounwind memory(write) }
; CHECK: attributes #[[ATTR3]] = { noreturn memory(write) }
;.
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
; CGSCC: {{.*}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,5 @@ declare void @dtor()
; CHECK-NEXT: ret void
;
;.
; CHECK: attributes #[[ATTR0:[0-9]+]] = { cold noreturn nounwind }
; CHECK: attributes #[[ATTR0:[0-9]+]] = { cold noreturn nounwind memory(inaccessiblemem: write) }
;.
2 changes: 1 addition & 1 deletion llvm/test/Transforms/SimplifyCFG/switch-on-const-select.ll
Original file line number Diff line number Diff line change
Expand Up @@ -158,4 +158,4 @@ declare void @llvm.trap() nounwind noreturn
declare void @bees.a() nounwind
declare void @bees.b() nounwind

; CHECK: attributes #1 = { cold noreturn nounwind }
; CHECK: attributes #1 = { cold noreturn nounwind memory(inaccessiblemem: write) }
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,5 @@ exit:
ret void
}

declare void @llvm.trap() noreturn cold
declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write)
declare void @_Z10sideeffectv()
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ exit:
ret void
}

declare void @llvm.trap() noreturn cold
declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write)
declare void @_Z10sideeffectv()
; CHECK-LABEL: @foo(
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ exit:
ret void
}

declare void @llvm.trap() noreturn cold
declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write)
declare void @_Z10sideeffectv()
;.
; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = external dso_local global i32, align 4
Expand Down Expand Up @@ -78,7 +78,7 @@ declare void @_Z10sideeffectv()
; CHECK-NEXT: unreachable
;
;.
; CHECK: attributes #[[ATTR0:[0-9]+]] = { cold noreturn nounwind }
; CHECK: attributes #[[ATTR0:[0-9]+]] = { cold noreturn nounwind memory(inaccessiblemem: write) }
; CHECK: attributes #[[ATTR1:[0-9]+]] = { cold minsize noreturn }
; CHECK: attributes #[[ATTR2]] = { noinline }
;.
Original file line number Diff line number Diff line change
Expand Up @@ -53,5 +53,5 @@ exit:
ret void
}

declare void @llvm.trap() noreturn cold
declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write)
declare void @_Z10sideeffectv()
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,10 @@ exit:
ret void
}

declare void @llvm.trap() noreturn cold
declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write)
declare void @_Z10sideeffectv()
;.
; CHECK: attributes #[[ATTR0:[0-9]+]] = { cold noreturn nounwind }
; CHECK: attributes #[[ATTR0:[0-9]+]] = { cold noreturn nounwind memory(inaccessiblemem: write) }
; CHECK: attributes #[[ATTR1:[0-9]+]] = { cold minsize noreturn }
; CHECK: attributes #[[ATTR2]] = { noinline }
;.
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,5 @@ exit:
ret void
}

declare void @llvm.trap() noreturn cold
declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write)
declare void @_Z10sideeffectv()
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ exit:
ret void
}

declare void @llvm.trap() noreturn cold
declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write)
declare void @_Z10sideeffectv()
; REUSE-LABEL: @foo(
; REUSE-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ exit:
ret void
}

declare void @llvm.trap() noreturn cold
declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write)
declare void @_Z10sideeffectv()
;.
; REUSE: @[[G:[a-zA-Z0-9_$"\\.-]+]] = external dso_local global i32, align 4
Expand Down Expand Up @@ -79,7 +79,7 @@ declare void @_Z10sideeffectv()
; REUSE-NEXT: unreachable
;
;.
; REUSE: attributes #[[ATTR0:[0-9]+]] = { cold noreturn nounwind }
; REUSE: attributes #[[ATTR0:[0-9]+]] = { cold noreturn nounwind memory(inaccessiblemem: write) }
; REUSE: attributes #[[ATTR1:[0-9]+]] = { cold minsize noreturn }
; REUSE: attributes #[[ATTR2]] = { noinline }
;.
Original file line number Diff line number Diff line change
Expand Up @@ -54,5 +54,5 @@ exit:
ret void
}

declare void @llvm.trap() noreturn cold
declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write)
declare void @_Z10sideeffectv()
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,10 @@ exit:
ret void
}

declare void @llvm.trap() noreturn cold
declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write)
declare void @_Z10sideeffectv()
;.
; REUSE: attributes #[[ATTR0:[0-9]+]] = { cold noreturn nounwind }
; REUSE: attributes #[[ATTR0:[0-9]+]] = { cold noreturn nounwind memory(inaccessiblemem: write) }
; REUSE: attributes #[[ATTR1:[0-9]+]] = { cold minsize noreturn }
; REUSE: attributes #[[ATTR2]] = { noinline }
;.

0 comments on commit 6fa8244

Please sign in to comment.