Should cover most of the tests for GVN, GVNHoist, GVNSink, GlobalOpt, GlobalSplit, InstCombine, Reassociate, SROA and TailCallElim that had not been updated earlier.
74 lines
3.5 KiB
LLVM
74 lines
3.5 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -passes=instcombine -instcombine-max-iterations=1 -S | FileCheck %s
|
|
; These tests check the optimizations specific to
|
|
; pointers being relocated at a statepoint.
|
|
|
|
|
|
declare void @func()
|
|
|
|
define i1 @test_null(i1 %cond) gc "statepoint-example" {
|
|
; CHECK-LABEL: @test_null(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: br i1 [[COND:%.*]], label [[LEFT:%.*]], label [[RIGHT:%.*]]
|
|
; CHECK: right:
|
|
; CHECK-NEXT: br label [[MERGE:%.*]]
|
|
; CHECK: left:
|
|
; CHECK-NEXT: [[SAFEPOINT_TOKEN:%.*]] = tail call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr nonnull elementtype(void ()) @func, i32 0, i32 0, i32 0, i32 0) [ "gc-live"() ]
|
|
; CHECK-NEXT: br label [[MERGE]]
|
|
; CHECK: merge:
|
|
; CHECK-NEXT: [[SAFEPOINT_TOKEN2:%.*]] = tail call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr nonnull elementtype(void ()) @func, i32 0, i32 0, i32 0, i32 0) [ "gc-live"() ]
|
|
; CHECK-NEXT: ret i1 true
|
|
;
|
|
entry:
|
|
br i1 %cond, label %left, label %right
|
|
|
|
right:
|
|
br label %merge
|
|
|
|
left:
|
|
%safepoint_token = tail call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(void ()) @func, i32 0, i32 0, i32 0, i32 0) ["gc-live" (ptr null)]
|
|
%pnew = call ptr @llvm.experimental.gc.relocate.p1(token %safepoint_token, i32 0, i32 0)
|
|
br label %merge
|
|
|
|
merge:
|
|
%pnew_phi = phi ptr [null, %right], [%pnew, %left]
|
|
%safepoint_token2 = tail call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(void ()) @func, i32 0, i32 0, i32 0, i32 0) ["gc-live" (ptr %pnew_phi)]
|
|
%pnew2 = call ptr @llvm.experimental.gc.relocate.p1(token %safepoint_token2, i32 0, i32 0)
|
|
%cmp = icmp eq ptr %pnew2, null
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define ptr @test_undef(i1 %cond) gc "statepoint-example" {
|
|
; CHECK-LABEL: @test_undef(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: br i1 [[COND:%.*]], label [[LEFT:%.*]], label [[RIGHT:%.*]]
|
|
; CHECK: right:
|
|
; CHECK-NEXT: br label [[MERGE:%.*]]
|
|
; CHECK: left:
|
|
; CHECK-NEXT: [[SAFEPOINT_TOKEN:%.*]] = tail call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr nonnull elementtype(void ()) @func, i32 0, i32 0, i32 0, i32 0) [ "gc-live"() ]
|
|
; CHECK-NEXT: br label [[MERGE]]
|
|
; CHECK: merge:
|
|
; CHECK-NEXT: [[SAFEPOINT_TOKEN2:%.*]] = tail call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr nonnull elementtype(void ()) @func, i32 0, i32 0, i32 0, i32 0) [ "gc-live"() ]
|
|
; CHECK-NEXT: ret ptr undef
|
|
;
|
|
entry:
|
|
br i1 %cond, label %left, label %right
|
|
|
|
right:
|
|
br label %merge
|
|
|
|
left:
|
|
%safepoint_token = tail call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(void ()) @func, i32 0, i32 0, i32 0, i32 0) ["gc-live" (ptr undef)]
|
|
%pnew = call ptr @llvm.experimental.gc.relocate.p1(token %safepoint_token, i32 0, i32 0)
|
|
br label %merge
|
|
|
|
merge:
|
|
%pnew_phi = phi ptr [undef, %right], [%pnew, %left]
|
|
%safepoint_token2 = tail call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(void ()) @func, i32 0, i32 0, i32 0, i32 0) ["gc-live" (ptr %pnew_phi)]
|
|
%pnew2 = call ptr @llvm.experimental.gc.relocate.p1(token %safepoint_token2, i32 0, i32 0)
|
|
ret ptr %pnew2
|
|
}
|
|
|
|
declare token @llvm.experimental.gc.statepoint.p0(i64, i32, ptr, i32, i32, ...)
|
|
declare ptr @llvm.experimental.gc.relocate.p1(token, i32, i32)
|