llvm-project/llvm/test/Transforms/GVN/PRE/protected-field-ptr.ll
Peter Collingbourne b66fae37ed
GVN: Inhibit PRE for llvm.protected.field.ptr.
Similar case to #151649.

Reviewers: fmayer, nikic

Pull Request: https://github.com/llvm/llvm-project/pull/182976
2026-02-24 12:51:41 -08:00

42 lines
1.4 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -passes=gvn -S < %s | FileCheck %s
; Check that PRE is inhibited for llvm.protected.field.ptr.
declare void @use(ptr)
define void @test1(i1 %c, ptr %arg) {
; CHECK-LABEL: @test1(
; CHECK-NEXT: br i1 [[C:%.*]], label [[BB1:%.*]], label [[DOTBB2_CRIT_EDGE:%.*]]
; CHECK: bb1:
; CHECK-NEXT: [[CALL:%.*]] = call ptr @llvm.protected.field.ptr.p0(ptr [[ARG:%.*]], i64 1, i1 true)
; CHECK-NEXT: br label [[BB3:%.*]]
; CHECK: bb2:
; CHECK-NEXT: [[CALL2:%.*]] = call ptr @llvm.protected.field.ptr.p0(ptr [[ARG]], i64 1, i1 true)
; CHECK-NEXT: [[V:%.*]] = load ptr, ptr [[CALL2]], align 8
; CHECK-NEXT: call void @use(ptr [[V]])
; CHECK-NEXT: br label [[BB3]]
; CHECK: bb3:
; CHECK-NEXT: [[CALL3:%.*]] = call ptr @llvm.protected.field.ptr.p0(ptr [[ARG]], i64 1, i1 true)
; CHECK-NEXT: [[V2:%.*]] = load ptr, ptr [[CALL3]], align 8
; CHECK-NEXT: call void @use(ptr [[V2]])
; CHECK-NEXT: br label [[DOTBB2_CRIT_EDGE]]
;
br i1 %c, label %bb1, label %bb2
bb1:
%call = call ptr @llvm.protected.field.ptr.p0(ptr %arg, i64 1, i1 true)
br label %bb3
bb2:
%call2 = call ptr @llvm.protected.field.ptr.p0(ptr %arg, i64 1, i1 true)
%v = load ptr, ptr %call2
call void @use(ptr %v)
br label %bb3
bb3:
%call3 = call ptr @llvm.protected.field.ptr.p0(ptr %arg, i64 1, i1 true)
%v2 = load ptr, ptr %call3
call void @use(ptr %v2)
br label %bb2
}