Sink: Convert tests to opaque pointers

This commit is contained in:
Matt Arsenault 2022-11-26 16:16:47 -05:00
parent 8c58a9ace0
commit a198d2041e
7 changed files with 72 additions and 72 deletions

View File

@ -1,25 +1,25 @@
; RUN: opt < %s -passes=sink -S | FileCheck %s
declare void @foo(i64 *)
declare i8* @llvm.load.relative.i32(i8* %ptr, i32 %offset) argmemonly nounwind readonly
define i64 @sinkload(i1 %cmp, i8* %ptr, i32 %off) {
declare void @foo(ptr)
declare ptr @llvm.load.relative.i32(ptr %ptr, i32 %offset) argmemonly nounwind readonly
define i64 @sinkload(i1 %cmp, ptr %ptr, i32 %off) {
; CHECK-LABEL: @sinkload
top:
%a = alloca i64
; CHECK: call void @foo(i64* %a)
; CHECK-NEXT: %x = load i64, i64* %a
; CHECK-NEXT: %y = call i8* @llvm.load.relative.i32(i8* %ptr, i32 %off)
call void @foo(i64* %a)
%x = load i64, i64* %a
%y = call i8* @llvm.load.relative.i32(i8* %ptr, i32 %off)
; CHECK: call void @foo(ptr %a)
; CHECK-NEXT: %x = load i64, ptr %a
; CHECK-NEXT: %y = call ptr @llvm.load.relative.i32(ptr %ptr, i32 %off)
call void @foo(ptr %a)
%x = load i64, ptr %a
%y = call ptr @llvm.load.relative.i32(ptr %ptr, i32 %off)
br i1 %cmp, label %A, label %B
A:
store i64 0, i64 *%a
store i8 0, i8 *%ptr
store i64 0, ptr %a
store i8 0, ptr %ptr
br label %B
B:
; CHECK-NOT: load i64, i64 *%a
; CHECK-NOT: call i8* @llvm.load.relative(i8* %ptr, i32 off)
%y2 = ptrtoint i8* %y to i64
; CHECK-NOT: load i64, ptr %a
; CHECK-NOT: call ptr @llvm.load.relative(ptr %ptr, i32 off)
%y2 = ptrtoint ptr %y to i64
%retval = add i64 %y2, %x
ret i64 %retval
}

View File

@ -9,12 +9,12 @@
; CHECK-LABEL: @foo(
; CHECK: true:
; CHECK-NEXT: %l = load i32, i32* @A
; CHECK-NEXT: %l = load i32, ptr @A
; CHECK-NEXT: ret i32 %l
define i32 @foo(i1 %z) {
%l = load i32, i32* @A
store i32 0, i32* @B
%l = load i32, ptr @A
store i32 0, ptr @B
br i1 %z, label %true, label %false
true:
ret i32 %l
@ -29,8 +29,8 @@ false:
; CHECK-NEXT: store i32
define i32 @foo2(i1 %z) {
%l = load volatile i32, i32* @A
store i32 0, i32* @B
%l = load volatile i32, ptr @A
store i32 0, ptr @B
br i1 %z, label %true, label %false
true:
ret i32 %l
@ -76,11 +76,11 @@ entry:
br i1 %1, label %if, label %endif
if:
%2 = getelementptr i32, i32* %0, i32 1
store i32 0, i32* %0
store i32 1, i32* %2
%3 = getelementptr i32, i32* %0, i32 %b
%4 = load i32, i32* %3
%2 = getelementptr i32, ptr %0, i32 1
store i32 0, ptr %0
store i32 1, ptr %2
%3 = getelementptr i32, ptr %0, i32 %b
%4 = load i32, ptr %3
ret i32 %4
endif:
@ -101,11 +101,11 @@ entry:
br i1 %1, label %if, label %endif
if:
%2 = getelementptr i32, i32* %0, i32 1
store i32 0, i32* %0
store i32 1, i32* %2
%3 = getelementptr i32, i32* %0, i32 %b
%4 = load i32, i32* %3
%2 = getelementptr i32, ptr %0, i32 1
store i32 0, ptr %0
store i32 1, ptr %2
%3 = getelementptr i32, ptr %0, i32 %b
%4 = load i32, ptr %3
ret i32 %4
endif:
@ -132,11 +132,11 @@ if0:
br i1 %1, label %if, label %endif
if:
%2 = getelementptr i32, i32* %0, i32 1
store i32 0, i32* %0
store i32 1, i32* %2
%3 = getelementptr i32, i32* %0, i32 %b
%4 = load i32, i32* %3
%2 = getelementptr i32, ptr %0, i32 1
store i32 0, ptr %0
store i32 1, ptr %2
%3 = getelementptr i32, ptr %0, i32 %b
%4 = load i32, ptr %3
ret i32 %4
endif:

View File

@ -4,10 +4,10 @@
declare i32 @f_load_global() nounwind willreturn readonly
declare i32 @f_load_global_throwable() willreturn readonly
declare i32 @f_load_global_may_not_return() nounwind readonly
declare i32 @f_load_arg(i32*) nounwind willreturn readonly argmemonly
declare i32 @f_load_arg(ptr) nounwind willreturn readonly argmemonly
declare void @f_store_global(i32) nounwind willreturn
declare void @f_store_arg(i32*) nounwind willreturn argmemonly
declare void @f_readonly_arg(i32* readonly, i32*) nounwind willreturn argmemonly
declare void @f_store_arg(ptr) nounwind willreturn argmemonly
declare void @f_readonly_arg(ptr readonly, ptr) nounwind willreturn argmemonly
declare i32 @f_readnone(i32) nounwind willreturn readnone
@A = external global i32
@ -68,16 +68,16 @@ false:
define i32 @test_sink_argmem_store(i1 %z) {
; CHECK-LABEL: @test_sink_argmem_store(
; CHECK-NEXT: store i32 0, i32* @B, align 4
; CHECK-NEXT: store i32 0, ptr @B, align 4
; CHECK-NEXT: br i1 [[Z:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]
; CHECK: true:
; CHECK-NEXT: [[L:%.*]] = call i32 @f_load_arg(i32* @A)
; CHECK-NEXT: [[L:%.*]] = call i32 @f_load_arg(ptr @A)
; CHECK-NEXT: ret i32 [[L]]
; CHECK: false:
; CHECK-NEXT: ret i32 0
;
%l = call i32 @f_load_arg(i32* @A)
store i32 0, i32* @B
%l = call i32 @f_load_arg(ptr @A)
store i32 0, ptr @B
br i1 %z, label %true, label %false
true:
ret i32 %l
@ -87,16 +87,16 @@ false:
define i32 @test_sink_argmem_call(i1 %z) {
; CHECK-LABEL: @test_sink_argmem_call(
; CHECK-NEXT: call void @f_store_arg(i32* @B)
; CHECK-NEXT: call void @f_store_arg(ptr @B)
; CHECK-NEXT: br i1 [[Z:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]
; CHECK: true:
; CHECK-NEXT: [[L:%.*]] = call i32 @f_load_arg(i32* @A)
; CHECK-NEXT: [[L:%.*]] = call i32 @f_load_arg(ptr @A)
; CHECK-NEXT: ret i32 [[L]]
; CHECK: false:
; CHECK-NEXT: ret i32 0
;
%l = call i32 @f_load_arg(i32* @A)
call void @f_store_arg(i32* @B)
%l = call i32 @f_load_arg(ptr @A)
call void @f_store_arg(ptr @B)
br i1 %z, label %true, label %false
true:
ret i32 %l
@ -106,16 +106,16 @@ false:
define i32 @test_sink_argmem_multiple(i1 %z) {
; CHECK-LABEL: @test_sink_argmem_multiple(
; CHECK-NEXT: call void @f_readonly_arg(i32* @A, i32* @B)
; CHECK-NEXT: call void @f_readonly_arg(ptr @A, ptr @B)
; CHECK-NEXT: br i1 [[Z:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]
; CHECK: true:
; CHECK-NEXT: [[L:%.*]] = call i32 @f_load_arg(i32* @A)
; CHECK-NEXT: [[L:%.*]] = call i32 @f_load_arg(ptr @A)
; CHECK-NEXT: ret i32 [[L]]
; CHECK: false:
; CHECK-NEXT: ret i32 0
;
%l = call i32 @f_load_arg(i32* @A)
call void @f_readonly_arg(i32* @A, i32* @B)
%l = call i32 @f_load_arg(ptr @A)
call void @f_readonly_arg(ptr @A, ptr @B)
br i1 %z, label %true, label %false
true:
ret i32 %l
@ -127,7 +127,7 @@ false:
define i32 @test_nosink_store(i1 %z) {
; CHECK-LABEL: @test_nosink_store(
; CHECK-NEXT: [[L:%.*]] = call i32 @f_load_global()
; CHECK-NEXT: store i32 0, i32* @A, align 4
; CHECK-NEXT: store i32 0, ptr @A, align 4
; CHECK-NEXT: br i1 [[Z:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]
; CHECK: true:
; CHECK-NEXT: ret i32 [[L]]
@ -135,7 +135,7 @@ define i32 @test_nosink_store(i1 %z) {
; CHECK-NEXT: ret i32 0
;
%l = call i32 @f_load_global()
store i32 0, i32* @A
store i32 0, ptr @A
br i1 %z, label %true, label %false
true:
ret i32 %l
@ -165,7 +165,7 @@ false:
; readnone calls are sunk across stores.
define i32 @test_sink_readnone(i1 %z) {
; CHECK-LABEL: @test_sink_readnone(
; CHECK-NEXT: store i32 0, i32* @A, align 4
; CHECK-NEXT: store i32 0, ptr @A, align 4
; CHECK-NEXT: br i1 [[Z:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]
; CHECK: true:
; CHECK-NEXT: [[L:%.*]] = call i32 @f_readnone(i32 0)
@ -174,7 +174,7 @@ define i32 @test_sink_readnone(i1 %z) {
; CHECK-NEXT: ret i32 0
;
%l = call i32 @f_readnone(i32 0)
store i32 0, i32* @A
store i32 0, ptr @A
br i1 %z, label %true, label %false
true:
ret i32 %l

View File

@ -3,17 +3,17 @@
target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
target triple = "i686-pc-windows-msvc"
define void @h() personality i32 (...)* @__CxxFrameHandler3 {
define void @h() personality ptr @__CxxFrameHandler3 {
entry:
%call = call i32 @g(i32 1) readnone
invoke void @_CxxThrowException(i8* null, i8* null) noreturn
invoke void @_CxxThrowException(ptr null, ptr null) noreturn
to label %unreachable unwind label %catch.dispatch
catch.dispatch: ; preds = %entry
%cs = catchswitch within none [label %catch] unwind to caller
catch: ; preds = %catch.dispatch
%cp = catchpad within %cs [i8* null, i32 64, i8* null]
%cp = catchpad within %cs [ptr null, i32 64, ptr null]
catchret from %cp to label %try.cont
try.cont: ; preds = %catch
@ -24,7 +24,7 @@ unreachable: ; preds = %entry
unreachable
}
declare x86_stdcallcc void @_CxxThrowException(i8*, i8*)
declare x86_stdcallcc void @_CxxThrowException(ptr, ptr)
declare i32 @__CxxFrameHandler3(...)

View File

@ -2,11 +2,11 @@
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
define void @test1(i32* ()*) {
define void @test1(ptr) {
entry:
%1 = call i32* %0() #0
%1 = call ptr %0() #0
fence syncscope("singlethread") seq_cst
%2 = load i32, i32* %1, align 4
%2 = load i32, ptr %1, align 4
fence syncscope("singlethread") seq_cst
%3 = icmp eq i32 %2, 0
br i1 %3, label %fail, label %pass
@ -19,9 +19,9 @@ pass: ; preds = %fail, %top
}
; CHECK-LABEL: @test1(
; CHECK: %[[call:.*]] = call i32* %0()
; CHECK: %[[call:.*]] = call ptr %0()
; CHECK: fence syncscope("singlethread") seq_cst
; CHECK: load i32, i32* %[[call]], align 4
; CHECK: load i32, ptr %[[call]], align 4
; CHECK: fence syncscope("singlethread") seq_cst

View File

@ -3,7 +3,7 @@
; Loads marked invariant can be sunk across critical edges
define <4 x float> @invariant_load(<4 x float> *%in, i32 %s) {
define <4 x float> @invariant_load(ptr %in, i32 %s) {
; CHECK-LABEL: @invariant_load(
; CHECK-NEXT: main_body:
; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[S:%.*]], 0
@ -12,11 +12,11 @@ define <4 x float> @invariant_load(<4 x float> *%in, i32 %s) {
; CHECK-NEXT: [[Z:%.*]] = add i32 [[S]], 1
; CHECK-NEXT: br label [[END]]
; CHECK: end:
; CHECK-NEXT: [[V:%.*]] = load <4 x float>, <4 x float>* [[IN:%.*]], align 16, !invariant.load !0
; CHECK-NEXT: [[V:%.*]] = load <4 x float>, ptr [[IN:%.*]], align 16, !invariant.load !0
; CHECK-NEXT: ret <4 x float> [[V]]
;
main_body:
%v = load <4 x float>, <4 x float> *%in, !invariant.load !0
%v = load <4 x float>, ptr %in, !invariant.load !0
%c = icmp eq i32 %s, 0
br i1 %c, label %block, label %end
block:

View File

@ -5,7 +5,7 @@ declare hidden void @g()
declare void @h()
declare i32 @__gxx_personality_v0(...)
define void @f() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
define void @f() personality ptr @__gxx_personality_v0 {
entry:
invoke void @g()
to label %invoke.cont.15 unwind label %lpad
@ -14,20 +14,20 @@ invoke.cont.15:
unreachable
; CHECK: lpad:
; CHECK: %0 = landingpad { i8*, i32 }
; CHECK: %0 = landingpad { ptr, i32 }
lpad:
%0 = landingpad { i8*, i32 }
catch i8* null
%0 = landingpad { ptr, i32 }
catch ptr null
invoke void @h()
to label %invoke.cont unwind label %lpad.1
; CHECK: invoke.cont
; CHECK-NOT: %0 = landingpad { i8*, i32 }
; CHECK-NOT: %0 = landingpad { ptr, i32 }
invoke.cont:
ret void
lpad.1:
%1 = landingpad { i8*, i32 }
%1 = landingpad { ptr, i32 }
cleanup
resume { i8*, i32 } %1
resume { ptr, i32 } %1
}