Sink: Convert tests to opaque pointers
This commit is contained in:
parent
8c58a9ace0
commit
a198d2041e
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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(...)
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue