; RUN: llc < %s

%Domain = type { i8*, i32, i32*, i32, i32, i32*, %Domain* }
@AConst = constant i32 123              ; <i32*> [#uses=1]

; Test setting values of different constants in registers.
; 
define void @testConsts(i32 %N, float %X) {
        %a = add i32 %N, 1              ; <i32> [#uses=0]
        %i = add i32 %N, 12345678               ; <i32> [#uses=0]
        %b = add i16 4, 3               ; <i16> [#uses=0]
        %c = fadd float %X, 0.000000e+00         ; <float> [#uses=0]
        %d = fadd float %X, 0x400921CAC0000000           ; <float> [#uses=0]
        %f = add i32 -1, 10             ; <i32> [#uses=0]
        %g = add i16 20, -1             ; <i16> [#uses=0]
        %j = add i16 -1, 30             ; <i16> [#uses=0]
        %h = add i8 40, -1              ; <i8> [#uses=0]
        %k = add i8 -1, 50              ; <i8> [#uses=0]
        ret void
}

; A SetCC whose result is used should produce instructions to
; compute the boolean value in a register.  One whose result
; is unused will only generate the condition code but not
; the boolean result.
; 
define void @unusedBool(i32* %x, i32* %y) {
        icmp eq i32* %x, %y             ; <i1>:1 [#uses=1]
        xor i1 %1, true         ; <i1>:2 [#uses=0]
        icmp ne i32* %x, %y             ; <i1>:3 [#uses=0]
        ret void
}

; A constant argument to a Phi produces a Cast instruction in the
; corresponding predecessor basic block.  This checks a few things:
; -- phi arguments coming from the bottom of the same basic block
;    (they should not be forward substituted in the machine code!)
; -- code generation for casts of various types
; -- use of immediate fields for integral constants of different sizes
; -- branch on a constant condition
; 
define void @mergeConstants(i32* %x, i32* %y) {
; <label>:0
        br label %Top

Top:            ; preds = %Next, %Top, %0
        phi i32 [ 0, %0 ], [ 1, %Top ], [ 524288, %Next ]               ; <i32>:1 [#uses=0]
        phi float [ 0.000000e+00, %0 ], [ 1.000000e+00, %Top ], [ 2.000000e+00, %Next ]         ; <float>:2 [#uses=0]
        phi double [ 5.000000e-01, %0 ], [ 1.500000e+00, %Top ], [ 2.500000e+00, %Next ]         
        phi i1 [ true, %0 ], [ false, %Top ], [ true, %Next ]           ; <i1>:4 [#uses=0]
        br i1 true, label %Top, label %Next

Next:           ; preds = %Top
        br label %Top
}



; A constant argument to a cast used only once should be forward substituted
; and loaded where needed, which happens is:
; -- User of cast has no immediate field
; -- User of cast has immediate field but constant is too large to fit
;    or constant is not resolved until later (e.g., global address)
; -- User of cast uses it as a call arg. or return value so it is an implicit
;    use but has to be loaded into a virtual register so that the reg.
;    allocator can allocate the appropriate phys. reg. for it
;  
define i32* @castconst(float) {
        %castbig = trunc i64 99999999 to i32            ; <i32> [#uses=1]
        %castsmall = trunc i64 1 to i32         ; <i32> [#uses=1]
        %usebig = add i32 %castbig, %castsmall          ; <i32> [#uses=0]
        %castglob = bitcast i32* @AConst to i64*                ; <i64*> [#uses=1]
        %dummyl = load i64, i64* %castglob           ; <i64> [#uses=0]
        %castnull = inttoptr i64 0 to i32*              ; <i32*> [#uses=1]
        ret i32* %castnull
}

; Test branch-on-comparison-with-zero, in two ways:
; 1. can be folded
; 2. cannot be folded because result of comparison is used twice
;
define void @testbool(i32 %A, i32 %B) {
        br label %Top

Top:            ; preds = %loop, %0
        %D = add i32 %A, %B             ; <i32> [#uses=2]
        %E = sub i32 %D, -4             ; <i32> [#uses=1]
        %C = icmp sle i32 %E, 0         ; <i1> [#uses=1]
        br i1 %C, label %retlbl, label %loop

loop:           ; preds = %loop, %Top
        %F = add i32 %A, %B             ; <i32> [#uses=0]
        %G = sub i32 %D, -4             ; <i32> [#uses=1]
        %D.upgrd.1 = icmp sle i32 %G, 0         ; <i1> [#uses=1]
        %E.upgrd.2 = xor i1 %D.upgrd.1, true            ; <i1> [#uses=1]
        br i1 %E.upgrd.2, label %loop, label %Top

retlbl:         ; preds = %Top
        ret void
}


;; Test use of a boolean result in cast operations.
;; Requires converting a condition code result into a 0/1 value in a reg.
;; 
define i32 @castbool(i32 %A, i32 %B) {
bb0:
        %cond213 = icmp slt i32 %A, %B          ; <i1> [#uses=1]
        %cast110 = zext i1 %cond213 to i8               ; <i8> [#uses=1]
        %cast109 = zext i8 %cast110 to i32              ; <i32> [#uses=1]
        ret i32 %cast109
}

;; Test use of a boolean result in arithmetic and logical operations.
;; Requires converting a condition code result into a 0/1 value in a reg.
;; 
define i1 @boolexpr(i1 %b, i32 %N) {
        %b2 = icmp sge i32 %N, 0                ; <i1> [#uses=1]
        %b3 = and i1 %b, %b2            ; <i1> [#uses=1]
        ret i1 %b3
}

; Test branch on floating point comparison
;
define void @testfloatbool(float %x, float %y) {
        br label %Top

Top:            ; preds = %Top, %0
        %p = fadd float %x, %y           ; <float> [#uses=1]
        %z = fsub float %x, %y           ; <float> [#uses=1]
        %b = fcmp ole float %p, %z              ; <i1> [#uses=2]
        %c = xor i1 %b, true            ; <i1> [#uses=0]
        br i1 %b, label %Top, label %goon

goon:           ; preds = %Top
        ret void
}


; Test cases where an LLVM instruction requires no machine
; instructions (e.g., cast int* to long).  But there are 2 cases:
; 1. If the result register has only a single use and the use is in the
;    same basic block, the operand will be copy-propagated during
;    instruction selection.
; 2. If the result register has multiple uses or is in a different
;    basic block, it cannot (or will not) be copy propagated during
;    instruction selection.  It will generate a
;    copy instruction (add-with-0), but this copy should get coalesced
;    away by the register allocator.
;
define i32 @checkForward(i32 %N, i32* %A) {
bb2:
        %reg114 = shl i32 %N, 2         ; <i32> [#uses=1]
        %cast115 = sext i32 %reg114 to i64              ; <i64> [#uses=1]
        %cast116 = ptrtoint i32* %A to i64              ; <i64> [#uses=1]
        %reg116 = add i64 %cast116, %cast115            ; <i64> [#uses=1]
        %castPtr = inttoptr i64 %reg116 to i32*         ; <i32*> [#uses=1]
        %reg118 = load i32, i32* %castPtr            ; <i32> [#uses=1]
        %cast117 = sext i32 %reg118 to i64              ; <i64> [#uses=2]
        %reg159 = add i64 1234567, %cast117             ; <i64> [#uses=0]
        %reg160 = add i64 7654321, %cast117             ; <i64> [#uses=0]
        ret i32 0
}


; Test case for unary NOT operation constructed from XOR.
; 
define void @checkNot(i1 %b, i32 %i) {
        %notB = xor i1 %b, true         ; <i1> [#uses=1]
        %notI = xor i32 %i, -1          ; <i32> [#uses=2]
        %F = icmp sge i32 %notI, 100            ; <i1> [#uses=1]
        %J = add i32 %i, %i             ; <i32> [#uses=1]
        %andNotB = and i1 %F, %notB             ; <i1> [#uses=0]
        %andNotI = and i32 %J, %notI            ; <i32> [#uses=0]
        %notB2 = xor i1 true, %b                ; <i1> [#uses=0]
        %notI2 = xor i32 -1, %i         ; <i32> [#uses=0]
        ret void
}

; Test case for folding getelementptr into a load/store
;
define i32 @checkFoldGEP(%Domain* %D, i64 %idx) {
        %reg841 = getelementptr %Domain, %Domain* %D, i64 0, i32 1               ; <i32*> [#uses=1]
        %reg820 = load i32, i32* %reg841             ; <i32> [#uses=1]
        ret i32 %reg820
}

; Test case for scalarising a 1 element vselect
;
define <1 x i32> @checkScalariseVSELECT(<1 x i32> %a, <1 x i32> %b) {
        %cond = icmp uge <1 x i32> %a, %b
        %s = select <1 x i1> %cond, <1 x i32> %a, <1 x i32> %b
        ret <1 x i32> %s
}
