| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc < %s -mtriple=x86_64-darwin -mcpu=corei7 | FileCheck %s |
| |
| define i64 @constant_hoisting(i64 %o0, i64 %o1, i64 %o2, i64 %o3, i64 %o4, i64 %o5) { |
| ; CHECK-LABEL: constant_hoisting: |
| ; CHECK: ## %bb.0: ## %entry |
| ; CHECK-NEXT: movabsq $-281474976710654, %rax ## imm = 0xFFFF000000000002 |
| ; CHECK-NEXT: testq %rax, %rdi |
| ; CHECK-NEXT: jne LBB0_7 |
| ; CHECK-NEXT: ## %bb.1: ## %bb1 |
| ; CHECK-NEXT: testq %rax, %rsi |
| ; CHECK-NEXT: jne LBB0_7 |
| ; CHECK-NEXT: ## %bb.2: ## %bb2 |
| ; CHECK-NEXT: testq %rax, %rdx |
| ; CHECK-NEXT: jne LBB0_7 |
| ; CHECK-NEXT: ## %bb.3: ## %bb3 |
| ; CHECK-NEXT: testq %rax, %rcx |
| ; CHECK-NEXT: jne LBB0_7 |
| ; CHECK-NEXT: ## %bb.4: ## %bb4 |
| ; CHECK-NEXT: leaq 1(%rax), %rcx |
| ; CHECK-NEXT: testq %rcx, %r8 |
| ; CHECK-NEXT: jne LBB0_7 |
| ; CHECK-NEXT: ## %bb.5: ## %bb5 |
| ; CHECK-NEXT: addq $2, %rax |
| ; CHECK-NEXT: andq %rax, %r9 |
| ; CHECK-NEXT: je LBB0_6 |
| ; CHECK-NEXT: LBB0_7: ## %fail |
| ; CHECK-NEXT: movq $-1, %rax |
| ; CHECK-NEXT: retq |
| ; CHECK-NEXT: LBB0_6: ## %bb6 |
| ; CHECK-NEXT: movq %r9, %rax |
| ; CHECK-NEXT: retq |
| entry: |
| %l0 = and i64 %o0, -281474976710654 |
| %c0 = icmp ne i64 %l0, 0 |
| br i1 %c0, label %fail, label %bb1 |
| |
| bb1: |
| %l1 = and i64 %o1, -281474976710654 |
| %c1 = icmp ne i64 %l1, 0 |
| br i1 %c1, label %fail, label %bb2 |
| |
| bb2: |
| %l2 = and i64 %o2, -281474976710654 |
| %c2 = icmp ne i64 %l2, 0 |
| br i1 %c2, label %fail, label %bb3 |
| |
| bb3: |
| %l3 = and i64 %o3, -281474976710654 |
| %c3 = icmp ne i64 %l3, 0 |
| br i1 %c3, label %fail, label %bb4 |
| |
| bb4: |
| %l4 = and i64 %o4, -281474976710653 |
| %c4 = icmp ne i64 %l4, 0 |
| br i1 %c4, label %fail, label %bb5 |
| |
| bb5: |
| %l5 = and i64 %o5, -281474976710652 |
| %c5 = icmp ne i64 %l5, 0 |
| br i1 %c5, label %fail, label %bb6 |
| |
| bb6: |
| ret i64 %l5 |
| |
| fail: |
| ret i64 -1 |
| } |
| |
| define void @constant_expressions() { |
| ; CHECK-LABEL: constant_expressions: |
| ; CHECK: ## %bb.0: ## %entry |
| ; CHECK-NEXT: movabsq $51250129900, %rax ## imm = 0xBEEBEEBEC |
| ; CHECK-NEXT: movq (%rax), %rcx |
| ; CHECK-NEXT: movq 16(%rax), %rdx |
| ; CHECK-NEXT: addq 8(%rax), %rcx |
| ; CHECK-NEXT: addq 24(%rax), %rdx |
| ; CHECK-NEXT: addq %rcx, %rdx |
| ; CHECK-NEXT: movq %rdx, (%rax) |
| ; CHECK-NEXT: retq |
| entry: |
| %0 = load i64, i64* inttoptr (i64 add (i64 51250129900, i64 0) to i64*) |
| %1 = load i64, i64* inttoptr (i64 add (i64 51250129900, i64 8) to i64*) |
| %2 = load i64, i64* inttoptr (i64 add (i64 51250129900, i64 16) to i64*) |
| %3 = load i64, i64* inttoptr (i64 add (i64 51250129900, i64 24) to i64*) |
| %4 = add i64 %0, %1 |
| %5 = add i64 %2, %3 |
| %6 = add i64 %4, %5 |
| store i64 %6, i64* inttoptr (i64 add (i64 51250129900, i64 0) to i64*) |
| ret void |
| } |
| |
| |
| define void @constant_expressions2() { |
| ; CHECK-LABEL: constant_expressions2: |
| ; CHECK: ## %bb.0: ## %entry |
| ; CHECK-NEXT: movabsq $51250129900, %rax ## imm = 0xBEEBEEBEC |
| ; CHECK-NEXT: movq (%rax), %rcx |
| ; CHECK-NEXT: movq 16(%rax), %rdx |
| ; CHECK-NEXT: addq 8(%rax), %rcx |
| ; CHECK-NEXT: addq 24(%rax), %rdx |
| ; CHECK-NEXT: addq %rcx, %rdx |
| ; CHECK-NEXT: movq %rdx, (%rax) |
| ; CHECK-NEXT: retq |
| entry: |
| %0 = load i64, i64* inttoptr (i64 51250129900 to i64*) |
| %1 = load i64, i64* inttoptr (i64 51250129908 to i64*) |
| %2 = load i64, i64* inttoptr (i64 51250129916 to i64*) |
| %3 = load i64, i64* inttoptr (i64 51250129924 to i64*) |
| %4 = add i64 %0, %1 |
| %5 = add i64 %2, %3 |
| %6 = add i64 %4, %5 |
| store i64 %6, i64* inttoptr (i64 51250129900 to i64*) |
| ret void |
| } |
| |