1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-apple-darwin -fast-isel -verify-machineinstrs < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; 4*9880d681SAndroid Build Coastguard Worker; Test folding of the sign-/zero-extend into the load instruction. 5*9880d681SAndroid Build Coastguard Worker; 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; Unscaled 8*9880d681SAndroid Build Coastguard Workerdefine i32 @load_unscaled_zext_i8_to_i32(i64 %a) { 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_unscaled_zext_i8_to_i32 10*9880d681SAndroid Build Coastguard Worker; CHECK: ldurb [[REG:w[0-9]+]], [x0, #-8] 11*9880d681SAndroid Build Coastguard Worker; CHECK: uxtb w0, [[REG]] 12*9880d681SAndroid Build Coastguard Worker %1 = sub i64 %a, 8 13*9880d681SAndroid Build Coastguard Worker %2 = inttoptr i64 %1 to i8 addrspace(256)* 14*9880d681SAndroid Build Coastguard Worker %3 = load i8, i8 addrspace(256)* %2 15*9880d681SAndroid Build Coastguard Worker %4 = zext i8 %3 to i32 16*9880d681SAndroid Build Coastguard Worker ret i32 %4 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdefine i32 @load_unscaled_zext_i16_to_i32(i64 %a) { 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_unscaled_zext_i16_to_i32 21*9880d681SAndroid Build Coastguard Worker; CHECK: ldurh [[REG:w[0-9]+]], [x0, #-8] 22*9880d681SAndroid Build Coastguard Worker; CHECK: uxth w0, [[REG]] 23*9880d681SAndroid Build Coastguard Worker %1 = sub i64 %a, 8 24*9880d681SAndroid Build Coastguard Worker %2 = inttoptr i64 %1 to i16 addrspace(256)* 25*9880d681SAndroid Build Coastguard Worker %3 = load i16, i16 addrspace(256)* %2 26*9880d681SAndroid Build Coastguard Worker %4 = zext i16 %3 to i32 27*9880d681SAndroid Build Coastguard Worker ret i32 %4 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdefine i64 @load_unscaled_zext_i8_to_i64(i64 %a) { 31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_unscaled_zext_i8_to_i64 32*9880d681SAndroid Build Coastguard Worker; CHECK: ldurb w[[REG:[0-9]+]], [x0, #-8] 33*9880d681SAndroid Build Coastguard Worker; CHECK: ubfx x0, x[[REG]], #0, #8 34*9880d681SAndroid Build Coastguard Worker %1 = sub i64 %a, 8 35*9880d681SAndroid Build Coastguard Worker %2 = inttoptr i64 %1 to i8 addrspace(256)* 36*9880d681SAndroid Build Coastguard Worker %3 = load i8, i8 addrspace(256)* %2 37*9880d681SAndroid Build Coastguard Worker %4 = zext i8 %3 to i64 38*9880d681SAndroid Build Coastguard Worker ret i64 %4 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerdefine i64 @load_unscaled_zext_i16_to_i64(i64 %a) { 42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_unscaled_zext_i16_to_i64 43*9880d681SAndroid Build Coastguard Worker; CHECK: ldurh w[[REG:[0-9]+]], [x0, #-8] 44*9880d681SAndroid Build Coastguard Worker; CHECK: ubfx x0, x[[REG]], #0, #16 45*9880d681SAndroid Build Coastguard Worker %1 = sub i64 %a, 8 46*9880d681SAndroid Build Coastguard Worker %2 = inttoptr i64 %1 to i16 addrspace(256)* 47*9880d681SAndroid Build Coastguard Worker %3 = load i16, i16 addrspace(256)* %2 48*9880d681SAndroid Build Coastguard Worker %4 = zext i16 %3 to i64 49*9880d681SAndroid Build Coastguard Worker ret i64 %4 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Workerdefine i64 @load_unscaled_zext_i32_to_i64(i64 %a) { 53*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_unscaled_zext_i32_to_i64 54*9880d681SAndroid Build Coastguard Worker; CHECK: ldur w[[REG:[0-9]+]], [x0, #-8] 55*9880d681SAndroid Build Coastguard Worker; CHECK: ubfx x0, x[[REG]], #0, #32 56*9880d681SAndroid Build Coastguard Worker %1 = sub i64 %a, 8 57*9880d681SAndroid Build Coastguard Worker %2 = inttoptr i64 %1 to i32 addrspace(256)* 58*9880d681SAndroid Build Coastguard Worker %3 = load i32, i32 addrspace(256)* %2 59*9880d681SAndroid Build Coastguard Worker %4 = zext i32 %3 to i64 60*9880d681SAndroid Build Coastguard Worker ret i64 %4 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerdefine i32 @load_unscaled_sext_i8_to_i32(i64 %a) { 64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_unscaled_sext_i8_to_i32 65*9880d681SAndroid Build Coastguard Worker; CHECK: ldurb [[REG:w[0-9]+]], [x0, #-8] 66*9880d681SAndroid Build Coastguard Worker; CHECK: sxtb w0, [[REG]] 67*9880d681SAndroid Build Coastguard Worker %1 = sub i64 %a, 8 68*9880d681SAndroid Build Coastguard Worker %2 = inttoptr i64 %1 to i8 addrspace(256)* 69*9880d681SAndroid Build Coastguard Worker %3 = load i8, i8 addrspace(256)* %2 70*9880d681SAndroid Build Coastguard Worker %4 = sext i8 %3 to i32 71*9880d681SAndroid Build Coastguard Worker ret i32 %4 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerdefine i32 @load_unscaled_sext_i16_to_i32(i64 %a) { 75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_unscaled_sext_i16_to_i32 76*9880d681SAndroid Build Coastguard Worker; CHECK: ldurh [[REG:w[0-9]+]], [x0, #-8] 77*9880d681SAndroid Build Coastguard Worker; CHECK: sxth w0, [[REG]] 78*9880d681SAndroid Build Coastguard Worker %1 = sub i64 %a, 8 79*9880d681SAndroid Build Coastguard Worker %2 = inttoptr i64 %1 to i16 addrspace(256)* 80*9880d681SAndroid Build Coastguard Worker %3 = load i16, i16 addrspace(256)* %2 81*9880d681SAndroid Build Coastguard Worker %4 = sext i16 %3 to i32 82*9880d681SAndroid Build Coastguard Worker ret i32 %4 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Workerdefine i64 @load_unscaled_sext_i8_to_i64(i64 %a) { 86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_unscaled_sext_i8_to_i64 87*9880d681SAndroid Build Coastguard Worker; CHECK: ldurb [[REG:w[0-9]+]], [x0, #-8] 88*9880d681SAndroid Build Coastguard Worker; CHECK: sxtb x0, [[REG]] 89*9880d681SAndroid Build Coastguard Worker %1 = sub i64 %a, 8 90*9880d681SAndroid Build Coastguard Worker %2 = inttoptr i64 %1 to i8 addrspace(256)* 91*9880d681SAndroid Build Coastguard Worker %3 = load i8, i8 addrspace(256)* %2 92*9880d681SAndroid Build Coastguard Worker %4 = sext i8 %3 to i64 93*9880d681SAndroid Build Coastguard Worker ret i64 %4 94*9880d681SAndroid Build Coastguard Worker} 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Workerdefine i64 @load_unscaled_sext_i16_to_i64(i64 %a) { 97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_unscaled_sext_i16_to_i64 98*9880d681SAndroid Build Coastguard Worker; CHECK: ldurh [[REG:w[0-9]+]], [x0, #-8] 99*9880d681SAndroid Build Coastguard Worker; CHECK: sxth x0, [[REG]] 100*9880d681SAndroid Build Coastguard Worker %1 = sub i64 %a, 8 101*9880d681SAndroid Build Coastguard Worker %2 = inttoptr i64 %1 to i16 addrspace(256)* 102*9880d681SAndroid Build Coastguard Worker %3 = load i16, i16 addrspace(256)* %2 103*9880d681SAndroid Build Coastguard Worker %4 = sext i16 %3 to i64 104*9880d681SAndroid Build Coastguard Worker ret i64 %4 105*9880d681SAndroid Build Coastguard Worker} 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerdefine i64 @load_unscaled_sext_i32_to_i64(i64 %a) { 108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_unscaled_sext_i32_to_i64 109*9880d681SAndroid Build Coastguard Worker; CHECK: ldur [[REG:w[0-9]+]], [x0, #-8] 110*9880d681SAndroid Build Coastguard Worker; CHECK: sxtw x0, [[REG]] 111*9880d681SAndroid Build Coastguard Worker %1 = sub i64 %a, 8 112*9880d681SAndroid Build Coastguard Worker %2 = inttoptr i64 %1 to i32 addrspace(256)* 113*9880d681SAndroid Build Coastguard Worker %3 = load i32, i32 addrspace(256)* %2 114*9880d681SAndroid Build Coastguard Worker %4 = sext i32 %3 to i64 115*9880d681SAndroid Build Coastguard Worker ret i64 %4 116*9880d681SAndroid Build Coastguard Worker} 117*9880d681SAndroid Build Coastguard Worker 118