[X86][ARM] Add tests for bitwise logic trees of shifts; NFC
Baseline tests for D131189.
This commit is contained in:
		
							parent
							
								
									bf48b128b0
								
							
						
					
					
						commit
						6c52f82d77
					
				| 
						 | 
					@ -893,3 +893,410 @@ entry:
 | 
				
			||||||
  %cmp.i = icmp ugt i32 %bf.cast.i, %AttrArgNo
 | 
					  %cmp.i = icmp ugt i32 %bf.cast.i, %AttrArgNo
 | 
				
			||||||
  ret i1 %cmp.i
 | 
					  ret i1 %cmp.i
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i64 @or_tree_with_shifts_i64(i64 %a, i64 %b, i64 %c, i64 %d) {
 | 
				
			||||||
 | 
					; CHECK-ARM-LABEL: or_tree_with_shifts_i64:
 | 
				
			||||||
 | 
					; CHECK-ARM:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    .save {r11, lr}
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    push {r11, lr}
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    ldr lr, [sp, #16]
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    lsl r3, r3, #16
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    ldr r12, [sp, #8]
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    orr r3, r3, r2, lsr #16
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    orr r0, r0, r2, lsl #16
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    orr r1, r1, lr, lsl #16
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    orr r1, r1, r3
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    orr r1, r1, r12
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    pop {r11, pc}
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-BE-LABEL: or_tree_with_shifts_i64:
 | 
				
			||||||
 | 
					; CHECK-BE:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    .save {r11, lr}
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    push {r11, lr}
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    ldr lr, [sp, #20]
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    lsl r2, r2, #16
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    ldr r12, [sp, #12]
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    orr r2, r2, r3, lsr #16
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    orr r1, r1, r3, lsl #16
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    orr r0, r0, lr, lsl #16
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    orr r0, r0, r2
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    orr r0, r0, r12
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    pop {r11, pc}
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-ALIGN-LABEL: or_tree_with_shifts_i64:
 | 
				
			||||||
 | 
					; CHECK-ALIGN:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    ldr.w r12, [sp, #8]
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    lsls r3, r3, #16
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    orr.w r3, r3, r2, lsr #16
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    orr.w r0, r0, r2, lsl #16
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    orr.w r1, r1, r12, lsl #16
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    orrs r1, r3
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    ldr r3, [sp]
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    orrs r1, r3
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-V6M-LABEL: or_tree_with_shifts_i64:
 | 
				
			||||||
 | 
					; CHECK-V6M:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    push {r4, lr}
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    lsrs r4, r2, #16
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    lsls r3, r3, #16
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    adds r3, r3, r4
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    ldr r4, [sp, #16]
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    lsls r4, r4, #16
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    orrs r1, r4
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    orrs r1, r3
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    ldr r3, [sp, #8]
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    orrs r1, r3
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    lsls r2, r2, #16
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    orrs r0, r2
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    pop {r4, pc}
 | 
				
			||||||
 | 
					  %b.shifted = shl i64 %b, 16
 | 
				
			||||||
 | 
					  %c.shifted = shl i64 %c, 32
 | 
				
			||||||
 | 
					  %d.shifted = shl i64 %d, 48
 | 
				
			||||||
 | 
					  %or.ad = or i64 %a, %d.shifted
 | 
				
			||||||
 | 
					  %or.adb = or i64 %or.ad, %b.shifted
 | 
				
			||||||
 | 
					  %or.adbc = or i64 %or.adb, %c.shifted
 | 
				
			||||||
 | 
					  ret i64 %or.adbc
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @or_tree_with_shifts_i32(i32 %a, i32 %b, i32 %c, i32 %d) {
 | 
				
			||||||
 | 
					; CHECK-ARM-LABEL: or_tree_with_shifts_i32:
 | 
				
			||||||
 | 
					; CHECK-ARM:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    orr r2, r3, r2, lsl #16
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    orr r0, r1, r0, lsl #16
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    orr r0, r0, r2
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-BE-LABEL: or_tree_with_shifts_i32:
 | 
				
			||||||
 | 
					; CHECK-BE:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    orr r2, r3, r2, lsl #16
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    orr r0, r1, r0, lsl #16
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    orr r0, r0, r2
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-THUMB-LABEL: or_tree_with_shifts_i32:
 | 
				
			||||||
 | 
					; CHECK-THUMB:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    orr.w r2, r3, r2, lsl #16
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    orr.w r0, r1, r0, lsl #16
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    orrs r0, r2
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-ALIGN-LABEL: or_tree_with_shifts_i32:
 | 
				
			||||||
 | 
					; CHECK-ALIGN:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    orr.w r2, r3, r2, lsl #16
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    orr.w r0, r1, r0, lsl #16
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    orrs r0, r2
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-V6M-LABEL: or_tree_with_shifts_i32:
 | 
				
			||||||
 | 
					; CHECK-V6M:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    lsls r2, r2, #16
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    orrs r2, r3
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    lsls r0, r0, #16
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    orrs r0, r1
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    orrs r0, r2
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    bx lr
 | 
				
			||||||
 | 
					  %a.shifted = shl i32 %a, 16
 | 
				
			||||||
 | 
					  %c.shifted = shl i32 %c, 16
 | 
				
			||||||
 | 
					  %or.ab = or i32 %a.shifted, %b
 | 
				
			||||||
 | 
					  %or.cd = or i32 %c.shifted, %d
 | 
				
			||||||
 | 
					  %r = or i32 %or.ab, %or.cd
 | 
				
			||||||
 | 
					  ret i32 %r
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @xor_tree_with_shifts_i32(i32 %a, i32 %b, i32 %c, i32 %d) {
 | 
				
			||||||
 | 
					; CHECK-ARM-LABEL: xor_tree_with_shifts_i32:
 | 
				
			||||||
 | 
					; CHECK-ARM:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    eor r2, r3, r2, lsr #16
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    eor r0, r1, r0, lsr #16
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    eor r0, r0, r2
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-BE-LABEL: xor_tree_with_shifts_i32:
 | 
				
			||||||
 | 
					; CHECK-BE:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    eor r2, r3, r2, lsr #16
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    eor r0, r1, r0, lsr #16
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    eor r0, r0, r2
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-THUMB-LABEL: xor_tree_with_shifts_i32:
 | 
				
			||||||
 | 
					; CHECK-THUMB:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    eor.w r2, r3, r2, lsr #16
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    eor.w r0, r1, r0, lsr #16
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    eors r0, r2
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-ALIGN-LABEL: xor_tree_with_shifts_i32:
 | 
				
			||||||
 | 
					; CHECK-ALIGN:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    eor.w r2, r3, r2, lsr #16
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    eor.w r0, r1, r0, lsr #16
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    eors r0, r2
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-V6M-LABEL: xor_tree_with_shifts_i32:
 | 
				
			||||||
 | 
					; CHECK-V6M:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    lsrs r2, r2, #16
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    eors r2, r3
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    lsrs r0, r0, #16
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    eors r0, r1
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    eors r0, r2
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    bx lr
 | 
				
			||||||
 | 
					  %a.shifted = lshr i32 %a, 16
 | 
				
			||||||
 | 
					  %c.shifted = lshr i32 %c, 16
 | 
				
			||||||
 | 
					  %xor.ab = xor i32 %a.shifted, %b
 | 
				
			||||||
 | 
					  %xor.cd = xor i32 %c.shifted, %d
 | 
				
			||||||
 | 
					  %r = xor i32 %xor.ab, %xor.cd
 | 
				
			||||||
 | 
					  ret i32 %r
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @and_tree_with_shifts_i32(i32 %a, i32 %b, i32 %c, i32 %d) {
 | 
				
			||||||
 | 
					; CHECK-ARM-LABEL: and_tree_with_shifts_i32:
 | 
				
			||||||
 | 
					; CHECK-ARM:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    and r2, r3, r2, asr #16
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    and r0, r1, r0, asr #16
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    and r0, r0, r2
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-BE-LABEL: and_tree_with_shifts_i32:
 | 
				
			||||||
 | 
					; CHECK-BE:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    and r2, r3, r2, asr #16
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    and r0, r1, r0, asr #16
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    and r0, r0, r2
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-THUMB-LABEL: and_tree_with_shifts_i32:
 | 
				
			||||||
 | 
					; CHECK-THUMB:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    and.w r2, r3, r2, asr #16
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    and.w r0, r1, r0, asr #16
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    ands r0, r2
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-ALIGN-LABEL: and_tree_with_shifts_i32:
 | 
				
			||||||
 | 
					; CHECK-ALIGN:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    and.w r2, r3, r2, asr #16
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    and.w r0, r1, r0, asr #16
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    ands r0, r2
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-V6M-LABEL: and_tree_with_shifts_i32:
 | 
				
			||||||
 | 
					; CHECK-V6M:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    asrs r2, r2, #16
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    ands r2, r3
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    asrs r0, r0, #16
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    ands r0, r1
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    ands r0, r2
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    bx lr
 | 
				
			||||||
 | 
					  %a.shifted = ashr i32 %a, 16
 | 
				
			||||||
 | 
					  %c.shifted = ashr i32 %c, 16
 | 
				
			||||||
 | 
					  %and.ab = and i32 %a.shifted, %b
 | 
				
			||||||
 | 
					  %and.cd = and i32 %c.shifted, %d
 | 
				
			||||||
 | 
					  %r = and i32 %and.ab, %and.cd
 | 
				
			||||||
 | 
					  ret i32 %r
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @logic_tree_with_shifts_var_i32(i32 %a, i32 %b, i32 %c, i32 %d, i32 %s) {
 | 
				
			||||||
 | 
					; CHECK-ARM-LABEL: logic_tree_with_shifts_var_i32:
 | 
				
			||||||
 | 
					; CHECK-ARM:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    ldr r12, [sp]
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    orr r2, r3, r2, lsl r12
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    orr r0, r1, r0, lsl r12
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    orr r0, r0, r2
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-BE-LABEL: logic_tree_with_shifts_var_i32:
 | 
				
			||||||
 | 
					; CHECK-BE:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    ldr r12, [sp]
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    orr r2, r3, r2, lsl r12
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    orr r0, r1, r0, lsl r12
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    orr r0, r0, r2
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-THUMB-LABEL: logic_tree_with_shifts_var_i32:
 | 
				
			||||||
 | 
					; CHECK-THUMB:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    ldr.w r12, [sp]
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    lsl.w r2, r2, r12
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    lsl.w r0, r0, r12
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    orrs r2, r3
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    orrs r0, r1
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    orrs r0, r2
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-ALIGN-LABEL: logic_tree_with_shifts_var_i32:
 | 
				
			||||||
 | 
					; CHECK-ALIGN:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    ldr.w r12, [sp]
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    lsl.w r2, r2, r12
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    lsl.w r0, r0, r12
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    orrs r2, r3
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    orrs r0, r1
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    orrs r0, r2
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-V6M-LABEL: logic_tree_with_shifts_var_i32:
 | 
				
			||||||
 | 
					; CHECK-V6M:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    push {r4, lr}
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    ldr r4, [sp, #8]
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    lsls r2, r4
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    orrs r2, r3
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    lsls r0, r4
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    orrs r0, r1
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    orrs r0, r2
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    pop {r4, pc}
 | 
				
			||||||
 | 
					  %a.shifted = shl i32 %a, %s
 | 
				
			||||||
 | 
					  %c.shifted = shl i32 %c, %s
 | 
				
			||||||
 | 
					  %or.ab = or i32 %a.shifted, %b
 | 
				
			||||||
 | 
					  %or.cd = or i32 %c.shifted, %d
 | 
				
			||||||
 | 
					  %r = or i32 %or.ab, %or.cd
 | 
				
			||||||
 | 
					  ret i32 %r
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @logic_tree_with_mismatching_shifts_i32(i32 %a, i32 %b, i32 %c, i32 %d) {
 | 
				
			||||||
 | 
					; CHECK-ARM-LABEL: logic_tree_with_mismatching_shifts_i32:
 | 
				
			||||||
 | 
					; CHECK-ARM:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    orr r2, r3, r2, lsl #16
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    orr r0, r1, r0, lsl #15
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    orr r0, r0, r2
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-BE-LABEL: logic_tree_with_mismatching_shifts_i32:
 | 
				
			||||||
 | 
					; CHECK-BE:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    orr r2, r3, r2, lsl #16
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    orr r0, r1, r0, lsl #15
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    orr r0, r0, r2
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-THUMB-LABEL: logic_tree_with_mismatching_shifts_i32:
 | 
				
			||||||
 | 
					; CHECK-THUMB:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    orr.w r2, r3, r2, lsl #16
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    orr.w r0, r1, r0, lsl #15
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    orrs r0, r2
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-ALIGN-LABEL: logic_tree_with_mismatching_shifts_i32:
 | 
				
			||||||
 | 
					; CHECK-ALIGN:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    orr.w r2, r3, r2, lsl #16
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    orr.w r0, r1, r0, lsl #15
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    orrs r0, r2
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-V6M-LABEL: logic_tree_with_mismatching_shifts_i32:
 | 
				
			||||||
 | 
					; CHECK-V6M:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    lsls r2, r2, #16
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    orrs r2, r3
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    lsls r0, r0, #15
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    orrs r0, r1
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    orrs r0, r2
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    bx lr
 | 
				
			||||||
 | 
					  %a.shifted = shl i32 %a, 15
 | 
				
			||||||
 | 
					  %c.shifted = shl i32 %c, 16
 | 
				
			||||||
 | 
					  %or.ab = or i32 %a.shifted, %b
 | 
				
			||||||
 | 
					  %or.cd = or i32 %c.shifted, %d
 | 
				
			||||||
 | 
					  %r = or i32 %or.ab, %or.cd
 | 
				
			||||||
 | 
					  ret i32 %r
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @logic_tree_with_mismatching_shifts2_i32(i32 %a, i32 %b, i32 %c, i32 %d) {
 | 
				
			||||||
 | 
					; CHECK-ARM-LABEL: logic_tree_with_mismatching_shifts2_i32:
 | 
				
			||||||
 | 
					; CHECK-ARM:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    orr r2, r3, r2, lsr #16
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    orr r0, r1, r0, lsl #16
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    orr r0, r0, r2
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-BE-LABEL: logic_tree_with_mismatching_shifts2_i32:
 | 
				
			||||||
 | 
					; CHECK-BE:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    orr r2, r3, r2, lsr #16
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    orr r0, r1, r0, lsl #16
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    orr r0, r0, r2
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-THUMB-LABEL: logic_tree_with_mismatching_shifts2_i32:
 | 
				
			||||||
 | 
					; CHECK-THUMB:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    orr.w r2, r3, r2, lsr #16
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    orr.w r0, r1, r0, lsl #16
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    orrs r0, r2
 | 
				
			||||||
 | 
					; CHECK-THUMB-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-ALIGN-LABEL: logic_tree_with_mismatching_shifts2_i32:
 | 
				
			||||||
 | 
					; CHECK-ALIGN:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    orr.w r2, r3, r2, lsr #16
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    orr.w r0, r1, r0, lsl #16
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    orrs r0, r2
 | 
				
			||||||
 | 
					; CHECK-ALIGN-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-V6M-LABEL: logic_tree_with_mismatching_shifts2_i32:
 | 
				
			||||||
 | 
					; CHECK-V6M:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    lsrs r2, r2, #16
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    orrs r2, r3
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    lsls r0, r0, #16
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    orrs r0, r1
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    orrs r0, r2
 | 
				
			||||||
 | 
					; CHECK-V6M-NEXT:    bx lr
 | 
				
			||||||
 | 
					  %a.shifted = shl i32 %a, 16
 | 
				
			||||||
 | 
					  %c.shifted = lshr i32 %c, 16
 | 
				
			||||||
 | 
					  %or.ab = or i32 %a.shifted, %b
 | 
				
			||||||
 | 
					  %or.cd = or i32 %c.shifted, %d
 | 
				
			||||||
 | 
					  %r = or i32 %or.ab, %or.cd
 | 
				
			||||||
 | 
					  ret i32 %r
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define <4 x i32> @or_tree_with_shifts_vec_i32(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d) {
 | 
				
			||||||
 | 
					; CHECK-ARM-LABEL: or_tree_with_shifts_vec_i32:
 | 
				
			||||||
 | 
					; CHECK-ARM:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    vshl.i32 q8, q2, #16
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    vshl.i32 q9, q0, #16
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    vorr q8, q8, q3
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    vorr q9, q9, q1
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    vorr q0, q9, q8
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-BE-LABEL: or_tree_with_shifts_vec_i32:
 | 
				
			||||||
 | 
					; CHECK-BE:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    vrev64.32 q8, q2
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    vrev64.32 q9, q0
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    vshl.i32 q8, q8, #16
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    vrev64.32 q10, q3
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    vshl.i32 q9, q9, #16
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    vrev64.32 q11, q1
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    vorr q8, q8, q10
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    vorr q9, q9, q11
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    vorr q8, q9, q8
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    vrev64.32 q0, q8
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    bx lr
 | 
				
			||||||
 | 
					  %a.shifted = shl <4 x i32> %a, <i32 16, i32 16, i32 16, i32 16>
 | 
				
			||||||
 | 
					  %c.shifted = shl <4 x i32> %c, <i32 16, i32 16, i32 16, i32 16>
 | 
				
			||||||
 | 
					  %or.ab = or <4 x i32> %a.shifted, %b
 | 
				
			||||||
 | 
					  %or.cd = or <4 x i32> %c.shifted, %d
 | 
				
			||||||
 | 
					  %r = or <4 x i32> %or.ab, %or.cd
 | 
				
			||||||
 | 
					  ret <4 x i32> %r
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define <4 x i32> @or_tree_with_mismatching_shifts_vec_i32(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d) {
 | 
				
			||||||
 | 
					; CHECK-ARM-LABEL: or_tree_with_mismatching_shifts_vec_i32:
 | 
				
			||||||
 | 
					; CHECK-ARM:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    vshl.i32 q8, q2, #17
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    vshl.i32 q9, q0, #16
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    vorr q8, q8, q3
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    vorr q9, q9, q1
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    vorr q0, q9, q8
 | 
				
			||||||
 | 
					; CHECK-ARM-NEXT:    bx lr
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; CHECK-BE-LABEL: or_tree_with_mismatching_shifts_vec_i32:
 | 
				
			||||||
 | 
					; CHECK-BE:       @ %bb.0:
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    vrev64.32 q8, q2
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    vrev64.32 q9, q0
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    vshl.i32 q8, q8, #17
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    vrev64.32 q10, q3
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    vshl.i32 q9, q9, #16
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    vrev64.32 q11, q1
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    vorr q8, q8, q10
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    vorr q9, q9, q11
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    vorr q8, q9, q8
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    vrev64.32 q0, q8
 | 
				
			||||||
 | 
					; CHECK-BE-NEXT:    bx lr
 | 
				
			||||||
 | 
					  %a.shifted = shl <4 x i32> %a, <i32 16, i32 16, i32 16, i32 16>
 | 
				
			||||||
 | 
					  %c.shifted = shl <4 x i32> %c, <i32 17, i32 17, i32 17, i32 17>
 | 
				
			||||||
 | 
					  %or.ab = or <4 x i32> %a.shifted, %b
 | 
				
			||||||
 | 
					  %or.cd = or <4 x i32> %c.shifted, %d
 | 
				
			||||||
 | 
					  %r = or <4 x i32> %or.ab, %or.cd
 | 
				
			||||||
 | 
					  ret <4 x i32> %r
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -506,3 +506,208 @@ define <4 x i32> @ashr_add_neg_shl_v4i8(<4 x i32> %r) nounwind {
 | 
				
			||||||
  %conv1 = ashr <4 x i32> %sext, <i32 24, i32 24, i32 24, i32 24>
 | 
					  %conv1 = ashr <4 x i32> %sext, <i32 24, i32 24, i32 24, i32 24>
 | 
				
			||||||
  ret <4 x i32> %conv1
 | 
					  ret <4 x i32> %conv1
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @or_tree_with_shifts_i32(i32 %a, i32 %b, i32 %c, i32 %d) {
 | 
				
			||||||
 | 
					; X32-LABEL: or_tree_with_shifts_i32:
 | 
				
			||||||
 | 
					; X32:       # %bb.0:
 | 
				
			||||||
 | 
					; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
 | 
				
			||||||
 | 
					; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
 | 
				
			||||||
 | 
					; X32-NEXT:    shll $16, %ecx
 | 
				
			||||||
 | 
					; X32-NEXT:    shll $16, %eax
 | 
				
			||||||
 | 
					; X32-NEXT:    orl {{[0-9]+}}(%esp), %ecx
 | 
				
			||||||
 | 
					; X32-NEXT:    orl {{[0-9]+}}(%esp), %eax
 | 
				
			||||||
 | 
					; X32-NEXT:    orl %ecx, %eax
 | 
				
			||||||
 | 
					; X32-NEXT:    retl
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; X64-LABEL: or_tree_with_shifts_i32:
 | 
				
			||||||
 | 
					; X64:       # %bb.0:
 | 
				
			||||||
 | 
					; X64-NEXT:    movl %edx, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    shll $16, %edi
 | 
				
			||||||
 | 
					; X64-NEXT:    shll $16, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    orl %ecx, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    orl %esi, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    orl %edi, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    retq
 | 
				
			||||||
 | 
					  %a.shifted = shl i32 %a, 16
 | 
				
			||||||
 | 
					  %c.shifted = shl i32 %c, 16
 | 
				
			||||||
 | 
					  %or.ab = or i32 %a.shifted, %b
 | 
				
			||||||
 | 
					  %or.cd = or i32 %c.shifted, %d
 | 
				
			||||||
 | 
					  %r = or i32 %or.ab, %or.cd
 | 
				
			||||||
 | 
					  ret i32 %r
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @xor_tree_with_shifts_i32(i32 %a, i32 %b, i32 %c, i32 %d) {
 | 
				
			||||||
 | 
					; X32-LABEL: xor_tree_with_shifts_i32:
 | 
				
			||||||
 | 
					; X32:       # %bb.0:
 | 
				
			||||||
 | 
					; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
 | 
				
			||||||
 | 
					; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
 | 
				
			||||||
 | 
					; X32-NEXT:    xorl {{[0-9]+}}(%esp), %ecx
 | 
				
			||||||
 | 
					; X32-NEXT:    xorl {{[0-9]+}}(%esp), %eax
 | 
				
			||||||
 | 
					; X32-NEXT:    xorl %ecx, %eax
 | 
				
			||||||
 | 
					; X32-NEXT:    retl
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; X64-LABEL: xor_tree_with_shifts_i32:
 | 
				
			||||||
 | 
					; X64:       # %bb.0:
 | 
				
			||||||
 | 
					; X64-NEXT:    movl %edx, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    shrl $16, %edi
 | 
				
			||||||
 | 
					; X64-NEXT:    shrl $16, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    xorl %ecx, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    xorl %esi, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    xorl %edi, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    retq
 | 
				
			||||||
 | 
					  %a.shifted = lshr i32 %a, 16
 | 
				
			||||||
 | 
					  %c.shifted = lshr i32 %c, 16
 | 
				
			||||||
 | 
					  %xor.ab = xor i32 %a.shifted, %b
 | 
				
			||||||
 | 
					  %xor.cd = xor i32 %c.shifted, %d
 | 
				
			||||||
 | 
					  %r = xor i32 %xor.ab, %xor.cd
 | 
				
			||||||
 | 
					  ret i32 %r
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @and_tree_with_shifts_i32(i32 %a, i32 %b, i32 %c, i32 %d) {
 | 
				
			||||||
 | 
					; X32-LABEL: and_tree_with_shifts_i32:
 | 
				
			||||||
 | 
					; X32:       # %bb.0:
 | 
				
			||||||
 | 
					; X32-NEXT:    movswl {{[0-9]+}}(%esp), %eax
 | 
				
			||||||
 | 
					; X32-NEXT:    movswl {{[0-9]+}}(%esp), %ecx
 | 
				
			||||||
 | 
					; X32-NEXT:    andl {{[0-9]+}}(%esp), %ecx
 | 
				
			||||||
 | 
					; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
 | 
				
			||||||
 | 
					; X32-NEXT:    andl %ecx, %eax
 | 
				
			||||||
 | 
					; X32-NEXT:    retl
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; X64-LABEL: and_tree_with_shifts_i32:
 | 
				
			||||||
 | 
					; X64:       # %bb.0:
 | 
				
			||||||
 | 
					; X64-NEXT:    movl %edx, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    sarl $16, %edi
 | 
				
			||||||
 | 
					; X64-NEXT:    sarl $16, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    andl %ecx, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    andl %esi, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    andl %edi, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    retq
 | 
				
			||||||
 | 
					  %a.shifted = ashr i32 %a, 16
 | 
				
			||||||
 | 
					  %c.shifted = ashr i32 %c, 16
 | 
				
			||||||
 | 
					  %and.ab = and i32 %a.shifted, %b
 | 
				
			||||||
 | 
					  %and.cd = and i32 %c.shifted, %d
 | 
				
			||||||
 | 
					  %r = and i32 %and.ab, %and.cd
 | 
				
			||||||
 | 
					  ret i32 %r
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @logic_tree_with_shifts_var_i32(i32 %a, i32 %b, i32 %c, i32 %d, i32 %s) {
 | 
				
			||||||
 | 
					; X32-LABEL: logic_tree_with_shifts_var_i32:
 | 
				
			||||||
 | 
					; X32:       # %bb.0:
 | 
				
			||||||
 | 
					; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
 | 
				
			||||||
 | 
					; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
 | 
				
			||||||
 | 
					; X32-NEXT:    movl {{[0-9]+}}(%esp), %edx
 | 
				
			||||||
 | 
					; X32-NEXT:    shll %cl, %edx
 | 
				
			||||||
 | 
					; X32-NEXT:    shll %cl, %eax
 | 
				
			||||||
 | 
					; X32-NEXT:    orl {{[0-9]+}}(%esp), %edx
 | 
				
			||||||
 | 
					; X32-NEXT:    orl {{[0-9]+}}(%esp), %eax
 | 
				
			||||||
 | 
					; X32-NEXT:    orl %edx, %eax
 | 
				
			||||||
 | 
					; X32-NEXT:    retl
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; X64-LABEL: logic_tree_with_shifts_var_i32:
 | 
				
			||||||
 | 
					; X64:       # %bb.0:
 | 
				
			||||||
 | 
					; X64-NEXT:    movl %ecx, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    movl %r8d, %ecx
 | 
				
			||||||
 | 
					; X64-NEXT:    shll %cl, %edi
 | 
				
			||||||
 | 
					; X64-NEXT:    shll %cl, %edx
 | 
				
			||||||
 | 
					; X64-NEXT:    orl %edx, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    orl %esi, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    orl %edi, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    retq
 | 
				
			||||||
 | 
					  %a.shifted = shl i32 %a, %s
 | 
				
			||||||
 | 
					  %c.shifted = shl i32 %c, %s
 | 
				
			||||||
 | 
					  %or.ab = or i32 %a.shifted, %b
 | 
				
			||||||
 | 
					  %or.cd = or i32 %c.shifted, %d
 | 
				
			||||||
 | 
					  %r = or i32 %or.ab, %or.cd
 | 
				
			||||||
 | 
					  ret i32 %r
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @logic_tree_with_mismatching_shifts_i32(i32 %a, i32 %b, i32 %c, i32 %d) {
 | 
				
			||||||
 | 
					; X32-LABEL: logic_tree_with_mismatching_shifts_i32:
 | 
				
			||||||
 | 
					; X32:       # %bb.0:
 | 
				
			||||||
 | 
					; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
 | 
				
			||||||
 | 
					; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
 | 
				
			||||||
 | 
					; X32-NEXT:    shll $15, %ecx
 | 
				
			||||||
 | 
					; X32-NEXT:    shll $16, %eax
 | 
				
			||||||
 | 
					; X32-NEXT:    orl {{[0-9]+}}(%esp), %ecx
 | 
				
			||||||
 | 
					; X32-NEXT:    orl {{[0-9]+}}(%esp), %eax
 | 
				
			||||||
 | 
					; X32-NEXT:    orl %ecx, %eax
 | 
				
			||||||
 | 
					; X32-NEXT:    retl
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; X64-LABEL: logic_tree_with_mismatching_shifts_i32:
 | 
				
			||||||
 | 
					; X64:       # %bb.0:
 | 
				
			||||||
 | 
					; X64-NEXT:    movl %edx, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    shll $15, %edi
 | 
				
			||||||
 | 
					; X64-NEXT:    shll $16, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    orl %ecx, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    orl %esi, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    orl %edi, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    retq
 | 
				
			||||||
 | 
					  %a.shifted = shl i32 %a, 15
 | 
				
			||||||
 | 
					  %c.shifted = shl i32 %c, 16
 | 
				
			||||||
 | 
					  %or.ab = or i32 %a.shifted, %b
 | 
				
			||||||
 | 
					  %or.cd = or i32 %c.shifted, %d
 | 
				
			||||||
 | 
					  %r = or i32 %or.ab, %or.cd
 | 
				
			||||||
 | 
					  ret i32 %r
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @logic_tree_with_mismatching_shifts2_i32(i32 %a, i32 %b, i32 %c, i32 %d) {
 | 
				
			||||||
 | 
					; X32-LABEL: logic_tree_with_mismatching_shifts2_i32:
 | 
				
			||||||
 | 
					; X32:       # %bb.0:
 | 
				
			||||||
 | 
					; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
 | 
				
			||||||
 | 
					; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
 | 
				
			||||||
 | 
					; X32-NEXT:    shll $16, %ecx
 | 
				
			||||||
 | 
					; X32-NEXT:    orl {{[0-9]+}}(%esp), %ecx
 | 
				
			||||||
 | 
					; X32-NEXT:    orl {{[0-9]+}}(%esp), %eax
 | 
				
			||||||
 | 
					; X32-NEXT:    orl %ecx, %eax
 | 
				
			||||||
 | 
					; X32-NEXT:    retl
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; X64-LABEL: logic_tree_with_mismatching_shifts2_i32:
 | 
				
			||||||
 | 
					; X64:       # %bb.0:
 | 
				
			||||||
 | 
					; X64-NEXT:    movl %edx, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    shll $16, %edi
 | 
				
			||||||
 | 
					; X64-NEXT:    shrl $16, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    orl %ecx, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    orl %esi, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    orl %edi, %eax
 | 
				
			||||||
 | 
					; X64-NEXT:    retq
 | 
				
			||||||
 | 
					  %a.shifted = shl i32 %a, 16
 | 
				
			||||||
 | 
					  %c.shifted = lshr i32 %c, 16
 | 
				
			||||||
 | 
					  %or.ab = or i32 %a.shifted, %b
 | 
				
			||||||
 | 
					  %or.cd = or i32 %c.shifted, %d
 | 
				
			||||||
 | 
					  %r = or i32 %or.ab, %or.cd
 | 
				
			||||||
 | 
					  ret i32 %r
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define <4 x i32> @or_tree_with_shifts_vec_i32(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d) {
 | 
				
			||||||
 | 
					; X64-LABEL: or_tree_with_shifts_vec_i32:
 | 
				
			||||||
 | 
					; X64:       # %bb.0:
 | 
				
			||||||
 | 
					; X64-NEXT:    pslld $16, %xmm0
 | 
				
			||||||
 | 
					; X64-NEXT:    pslld $16, %xmm2
 | 
				
			||||||
 | 
					; X64-NEXT:    por %xmm3, %xmm2
 | 
				
			||||||
 | 
					; X64-NEXT:    por %xmm1, %xmm2
 | 
				
			||||||
 | 
					; X64-NEXT:    por %xmm2, %xmm0
 | 
				
			||||||
 | 
					; X64-NEXT:    retq
 | 
				
			||||||
 | 
					  %a.shifted = shl <4 x i32> %a, <i32 16, i32 16, i32 16, i32 16>
 | 
				
			||||||
 | 
					  %c.shifted = shl <4 x i32> %c, <i32 16, i32 16, i32 16, i32 16>
 | 
				
			||||||
 | 
					  %or.ab = or <4 x i32> %a.shifted, %b
 | 
				
			||||||
 | 
					  %or.cd = or <4 x i32> %c.shifted, %d
 | 
				
			||||||
 | 
					  %r = or <4 x i32> %or.ab, %or.cd
 | 
				
			||||||
 | 
					  ret <4 x i32> %r
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define <4 x i32> @or_tree_with_mismatching_shifts_vec_i32(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d) {
 | 
				
			||||||
 | 
					; X64-LABEL: or_tree_with_mismatching_shifts_vec_i32:
 | 
				
			||||||
 | 
					; X64:       # %bb.0:
 | 
				
			||||||
 | 
					; X64-NEXT:    pslld $16, %xmm0
 | 
				
			||||||
 | 
					; X64-NEXT:    pslld $17, %xmm2
 | 
				
			||||||
 | 
					; X64-NEXT:    por %xmm3, %xmm2
 | 
				
			||||||
 | 
					; X64-NEXT:    por %xmm1, %xmm2
 | 
				
			||||||
 | 
					; X64-NEXT:    por %xmm2, %xmm0
 | 
				
			||||||
 | 
					; X64-NEXT:    retq
 | 
				
			||||||
 | 
					  %a.shifted = shl <4 x i32> %a, <i32 16, i32 16, i32 16, i32 16>
 | 
				
			||||||
 | 
					  %c.shifted = shl <4 x i32> %c, <i32 17, i32 17, i32 17, i32 17>
 | 
				
			||||||
 | 
					  %or.ab = or <4 x i32> %a.shifted, %b
 | 
				
			||||||
 | 
					  %or.cd = or <4 x i32> %c.shifted, %d
 | 
				
			||||||
 | 
					  %r = or <4 x i32> %or.ab, %or.cd
 | 
				
			||||||
 | 
					  ret <4 x i32> %r
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue