; 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* %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* %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* %D, i64 0, i32 1               ; <i32*> [#uses=1]
        %reg820 = load i32* %reg841             ; <i32> [#uses=1]
        ret i32 %reg820
}

