Imported Upstream version 5.18.0.246

Former-commit-id: 0c7ce5b1a7851e13f22acfd379b7f9fb304e4833
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2019-01-23 08:21:40 +00:00
parent a7724cd563
commit 279aa8f685
28482 changed files with 3866972 additions and 44 deletions

View File

@ -0,0 +1,8 @@
; RUN: opt < %s -instcombine -S | grep 4294967295
define i64 @test(i64 %Val) {
%tmp.3 = trunc i64 %Val to i32 ; <i32> [#uses=1]
%tmp.8 = zext i32 %tmp.3 to i64 ; <i64> [#uses=1]
ret i64 %tmp.8
}

View File

@ -0,0 +1,10 @@
; RUN: opt < %s -instcombine -disable-output
@X = global i32 5 ; <i32*> [#uses=1]
define i64 @test() {
%C = add i64 1, 2 ; <i64> [#uses=1]
%V = add i64 ptrtoint (i32* @X to i64), %C ; <i64> [#uses=1]
ret i64 %V
}

View File

@ -0,0 +1,16 @@
; This testcase causes an infinite loop in the instruction combiner,
; because it things that the constant value is a not expression... and
; constantly inverts the branch back and forth.
;
; RUN: opt < %s -instcombine -disable-output
define i8 @test19(i1 %c) {
br i1 true, label %True, label %False
True: ; preds = %0
ret i8 1
False: ; preds = %0
ret i8 3
}

View File

@ -0,0 +1,44 @@
;
; Test: ExternalConstant
;
; Description:
; This regression test helps check whether the instruction combining
; optimization pass correctly handles global variables which are marked
; as external and constant.
;
; If a problem occurs, we should die on an assert(). Otherwise, we
; should pass through the optimizer without failure.
;
; Extra code:
; RUN: opt < %s -instcombine
; END.
target datalayout = "e-p:32:32"
@silly = external constant i32 ; <i32*> [#uses=1]
declare void @bzero(i8*, i32)
declare void @bcopy(i8*, i8*, i32)
declare i32 @bcmp(i8*, i8*, i32)
declare i32 @fputs(i8*, i8*)
declare i32 @fputs_unlocked(i8*, i8*)
define i32 @function(i32 %a.1) {
entry:
%a.0 = alloca i32 ; <i32*> [#uses=2]
%result = alloca i32 ; <i32*> [#uses=2]
store i32 %a.1, i32* %a.0
%tmp.0 = load i32, i32* %a.0 ; <i32> [#uses=1]
%tmp.1 = load i32, i32* @silly ; <i32> [#uses=1]
%tmp.2 = add i32 %tmp.0, %tmp.1 ; <i32> [#uses=1]
store i32 %tmp.2, i32* %result
br label %return
return: ; preds = %entry
%tmp.3 = load i32, i32* %result ; <i32> [#uses=1]
ret i32 %tmp.3
}

View File

@ -0,0 +1,21 @@
; This testcase can be simplified by "realizing" that alloca can never return
; null.
; RUN: opt < %s -instcombine -simplifycfg -S | FileCheck %s
; CHECK-NOT: br
declare i32 @bitmap_clear(...)
define i32 @oof() {
entry:
%live_head = alloca i32 ; <i32*> [#uses=2]
%tmp.1 = icmp ne i32* %live_head, null ; <i1> [#uses=1]
br i1 %tmp.1, label %then, label %UnifiedExitNode
then: ; preds = %entry
%tmp.4 = call i32 (...) @bitmap_clear( i32* %live_head ) ; <i32> [#uses=0]
br label %UnifiedExitNode
UnifiedExitNode: ; preds = %then, %entry
ret i32 0
}

View File

@ -0,0 +1,7 @@
; RUN: opt < %s -instcombine -S | grep load
define void @test(i32* %P) {
; Dead but not deletable!
%X = load volatile i32, i32* %P ; <i32> [#uses=0]
ret void
}

View File

@ -0,0 +1,18 @@
; RUN: opt < %s -instcombine -disable-output
declare i32* @bar()
define float* @foo() personality i32 (...)* @__gxx_personality_v0 {
%tmp.11 = invoke float* bitcast (i32* ()* @bar to float* ()*)( )
to label %invoke_cont unwind label %X ; <float*> [#uses=1]
invoke_cont: ; preds = %0
ret float* %tmp.11
X: ; preds = %0
%exn = landingpad {i8*, i32}
cleanup
ret float* null
}
declare i32 @__gxx_personality_v0(...)

View File

@ -0,0 +1,13 @@
; The cast in this testcase is not eliminable on a 32-bit target!
; RUN: opt < %s -instcombine -S | grep inttoptr
target datalayout = "e-p:32:32"
declare void @foo(...)
define void @test(i64 %X) {
%Y = inttoptr i64 %X to i32* ; <i32*> [#uses=1]
call void (...) @foo( i32* %Y )
ret void
}

View File

@ -0,0 +1,31 @@
; Test for a problem afflicting several C++ programs in the testsuite. The
; instcombine pass is trying to get rid of the cast in the invoke instruction,
; inserting a cast of the return value after the PHI instruction, but which is
; used by the PHI instruction. This is bad: because of the semantics of the
; invoke instruction, we really cannot perform this transformation at all at
; least without splitting the critical edge.
;
; RUN: opt < %s -instcombine -disable-output
declare i8* @test()
define i32 @foo() personality i32 (...)* @__gxx_personality_v0 {
entry:
br i1 true, label %cont, label %call
call: ; preds = %entry
%P = invoke i32* bitcast (i8* ()* @test to i32* ()*)( )
to label %cont unwind label %N ; <i32*> [#uses=1]
cont: ; preds = %call, %entry
%P2 = phi i32* [ %P, %call ], [ null, %entry ] ; <i32*> [#uses=1]
%V = load i32, i32* %P2 ; <i32> [#uses=1]
ret i32 %V
N: ; preds = %call
%exn = landingpad {i8*, i32}
cleanup
ret i32 0
}
declare i32 @__gxx_personality_v0(...)

View File

@ -0,0 +1,15 @@
; RUN: opt < %s -instcombine -S | not grep 34
define i32 @test(i32 %X) {
; Do not fold into shr X, 34, as this uses undefined behavior!
%Y = ashr i32 %X, 17 ; <i32> [#uses=1]
%Z = ashr i32 %Y, 17 ; <i32> [#uses=1]
ret i32 %Z
}
define i32 @test2(i32 %X) {
; Do not fold into shl X, 34, as this uses undefined behavior!
%Y = shl i32 %X, 17 ; <i32> [#uses=1]
%Z = shl i32 %Y, 17 ; <i32> [#uses=1]
ret i32 %Z
}

View File

@ -0,0 +1,13 @@
; This testcase caused the combiner to go into an infinite loop, moving the
; cast back and forth, changing the seteq to operate on int vs uint and back.
; RUN: opt < %s -instcombine -disable-output
define i1 @test(i32 %A, i32 %B) {
%C = sub i32 0, %A ; <i32> [#uses=1]
%Cc = bitcast i32 %C to i32 ; <i32> [#uses=1]
%D = sub i32 0, %B ; <i32> [#uses=1]
%E = icmp eq i32 %Cc, %D ; <i1> [#uses=1]
ret i1 %E
}

View File

@ -0,0 +1,10 @@
; RUN: opt < %s -instcombine -disable-output
define i32 @test() {
ret i32 0
Loop: ; preds = %Loop
%X = add i32 %X, 1 ; <i32> [#uses=1]
br label %Loop
}

View File

@ -0,0 +1,10 @@
; RUN: opt < %s -instcombine -disable-output
%Ty = type opaque
define i32 @test(%Ty* %X) {
%Y = bitcast %Ty* %X to i32* ; <i32*> [#uses=1]
%Z = load i32, i32* %Y ; <i32> [#uses=1]
ret i32 %Z
}

View File

@ -0,0 +1,9 @@
; RUN: opt < %s -instcombine -disable-output
@p = weak global i32 0 ; <i32*> [#uses=1]
define i32 @test(i32 %x) {
%y = mul i32 %x, ptrtoint (i32* @p to i32) ; <i32> [#uses=1]
ret i32 %y
}

View File

@ -0,0 +1,9 @@
; RUN: opt < %s -instcombine
; This testcase should not send the instcombiner into an infinite loop!
define i32 @test(i32 %X) {
%Y = srem i32 %X, 0 ; <i32> [#uses=1]
ret i32 %Y
}

View File

@ -0,0 +1,8 @@
; RUN: opt < %s -instcombine -S | \
; RUN: grep "ret i1 false"
define i1 @test(i1 %V) {
%Y = icmp ult i1 %V, false ; <i1> [#uses=1]
ret i1 %Y
}

View File

@ -0,0 +1,18 @@
; RUN: opt < %s -instcombine -mem2reg -S | \
; RUN: not grep "i32 1"
; When propagating the load through the select, make sure that the load is
; inserted where the original load was, not where the select is. Not doing
; so could produce incorrect results!
define i32 @test(i1 %C) {
%X = alloca i32 ; <i32*> [#uses=3]
%X2 = alloca i32 ; <i32*> [#uses=2]
store i32 1, i32* %X
store i32 2, i32* %X2
%Y = select i1 %C, i32* %X, i32* %X2 ; <i32*> [#uses=1]
store i32 3, i32* %X
%Z = load i32, i32* %Y ; <i32> [#uses=1]
ret i32 %Z
}

View File

@ -0,0 +1,25 @@
; RUN: opt < %s -instcombine -mem2reg -simplifycfg | \
; RUN: llvm-dis | grep -v store | not grep "i32 1"
; Test to make sure that instcombine does not accidentally propagate the load
; into the PHI, which would break the program.
define i32 @test(i1 %C) {
entry:
%X = alloca i32 ; <i32*> [#uses=3]
%X2 = alloca i32 ; <i32*> [#uses=2]
store i32 1, i32* %X
store i32 2, i32* %X2
br i1 %C, label %cond_true.i, label %cond_continue.i
cond_true.i: ; preds = %entry
br label %cond_continue.i
cond_continue.i: ; preds = %cond_true.i, %entry
%mem_tmp.i.0 = phi i32* [ %X, %cond_true.i ], [ %X2, %entry ] ; <i32*> [#uses=1]
store i32 3, i32* %X
%tmp.3 = load i32, i32* %mem_tmp.i.0 ; <i32> [#uses=1]
ret i32 %tmp.3
}

View File

@ -0,0 +1,9 @@
; RUN: opt < %s -instcombine -S | not grep -- -65536
define i1 @test(i32 %tmp.124) {
%tmp.125 = shl i32 %tmp.124, 8 ; <i32> [#uses=1]
%tmp.126.mask = and i32 %tmp.125, -16777216 ; <i32> [#uses=1]
%tmp.128 = icmp eq i32 %tmp.126.mask, 167772160 ; <i1> [#uses=1]
ret i1 %tmp.128
}

View File

@ -0,0 +1,10 @@
; RUN: opt < %s -instcombine -S | not grep and
define i8 @test21(i8 %A) {
;; sign extend
%C = ashr i8 %A, 7 ; <i8> [#uses=1]
;; chop off sign
%D = and i8 %C, 1 ; <i8> [#uses=1]
ret i8 %D
}

Some files were not shown because too many files have changed in this diff Show More