; RUN: opt -S -verify < %s | FileCheck %s target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" target triple = "aarch64--linux-gnu" ;; Check supported instructions are accepted without dropping 'vscale'. ;; Same order as the LangRef ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Unary Operations ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; define @fneg( %val) { ; CHECK-LABEL: @fneg ; CHECK: %r = fneg %val ; CHECK-NEXT: ret %r %r = fneg %val ret %r } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Binary Operations ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; define @add( %a, %b) { ; CHECK-LABEL: @add ; CHECK: %r = add %a, %b ; CHECK-NEXT: ret %r %r = add %a, %b ret %r } define @fadd( %a, %b) { ; CHECK-LABEL: @fadd ; CHECK: %r = fadd %a, %b ; CHECK-NEXT: ret %r %r = fadd %a, %b ret %r } define @sub( %a, %b) { ; CHECK-LABEL: @sub ; CHECK: %r = sub %a, %b ; CHECK-NEXT: ret %r %r = sub %a, %b ret %r } define @fsub( %a, %b) { ; CHECK-LABEL: @fsub ; CHECK: %r = fsub %a, %b ; CHECK-NEXT: ret %r %r = fsub %a, %b ret %r } define @mul( %a, %b) { ; CHECK-LABEL: @mul ; CHECK: %r = mul %a, %b ; CHECK-NEXT: ret %r %r = mul %a, %b ret %r } define @fmul( %a, %b) { ; CHECK-LABEL: @fmul ; CHECK: %r = fmul %a, %b ; CHECK-NEXT: ret %r %r = fmul %a, %b ret %r } define @udiv( %a, %b) { ; CHECK-LABEL: @udiv ; CHECK: %r = udiv %a, %b ; CHECK-NEXT: ret %r %r = udiv %a, %b ret %r } define @sdiv( %a, %b) { ; CHECK-LABEL: @sdiv ; CHECK: %r = sdiv %a, %b ; CHECK-NEXT: ret %r %r = sdiv %a, %b ret %r } define @fdiv( %a, %b) { ; CHECK-LABEL: @fdiv ; CHECK: %r = fdiv %a, %b ; CHECK-NEXT: ret %r %r = fdiv %a, %b ret %r } define @urem( %a, %b) { ; CHECK-LABEL: @urem ; CHECK: %r = urem %a, %b ; CHECK-NEXT: ret %r %r = urem %a, %b ret %r } define @srem( %a, %b) { ; CHECK-LABEL: @srem ; CHECK: %r = srem %a, %b ; CHECK-NEXT: ret %r %r = srem %a, %b ret %r } define @frem( %a, %b) { ; CHECK-LABEL: @frem ; CHECK: %r = frem %a, %b ; CHECK-NEXT: ret %r %r = frem %a, %b ret %r } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Bitwise Binary Operations ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; define @shl( %a, %b) { ; CHECK-LABEL: @shl ; CHECK: %r = shl %a, %b ; CHECK-NEXT: ret %r %r = shl %a, %b ret %r } define @lshr( %a, %b) { ; CHECK-LABEL: @lshr ; CHECK: %r = lshr %a, %b ; CHECK-NEXT: ret %r %r = lshr %a, %b ret %r } define @ashr( %a, %b) { ; CHECK-LABEL: @ashr ; CHECK: %r = ashr %a, %b ; CHECK-NEXT: ret %r %r = ashr %a, %b ret %r } define @and( %a, %b) { ; CHECK-LABEL: @and ; CHECK: %r = and %a, %b ; CHECK-NEXT: ret %r %r = and %a, %b ret %r } define @or( %a, %b) { ; CHECK-LABEL: @or ; CHECK: %r = or %a, %b ; CHECK-NEXT: ret %r %r = or %a, %b ret %r } define @xor( %a, %b) { ; CHECK-LABEL: @xor ; CHECK: %r = xor %a, %b ; CHECK-NEXT: ret %r %r = xor %a, %b ret %r } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Vector Operations ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; define i64 @extractelement( %val) { ; CHECK-LABEL: @extractelement ; CHECK: %r = extractelement %val, i32 0 ; CHECK-NEXT: ret i64 %r %r = extractelement %val, i32 0 ret i64 %r } define @insertelement( %vec, i8 %ins) { ; CHECK-LABEL: @insertelement ; CHECK: %r = insertelement %vec, i8 %ins, i32 0 ; CHECK-NEXT: ret %r %r = insertelement %vec, i8 %ins, i32 0 ret %r } define @shufflevector(half %val) { ; CHECK-LABEL: @shufflevector ; CHECK: %insvec = insertelement undef, half %val, i32 0 ; CHECK-NEXT: %r = shufflevector %insvec, undef, zeroinitializer ; CHECK-NEXT: ret %r %insvec = insertelement undef, half %val, i32 0 %r = shufflevector %insvec, undef, zeroinitializer ret %r } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Memory Access and Addressing Operations ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; define void @alloca() { ; CHECK-LABEL: @alloca ; CHECK: %vec = alloca ; CHECK-NEXT: ret void %vec = alloca ret void } define @load(* %ptr) { ; CHECK-LABEL: @load ; CHECK: %r = load , * %ptr ; CHECK-NEXT: ret %r %r = load , * %ptr ret %r } define void @store( %data, * %ptr) { ; CHECK-LABEL: @store ; CHECK: store %data, * %ptr ; CHECK-NEXT: ret void store %data, * %ptr ret void } define * @getelementptr(* %base) { ; CHECK-LABEL: @getelementptr ; CHECK: %r = getelementptr , * %base, i64 0 ; CHECK-NEXT: ret * %r %r = getelementptr , * %base, i64 0 ret * %r } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Conversion Operations ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; define @truncto( %val) { ; CHECK-LABEL: @truncto ; CHECK: %r = trunc %val to ; CHECK-NEXT: ret %r %r = trunc %val to ret %r } define @zextto( %val) { ; CHECK-LABEL: @zextto ; CHECK: %r = zext %val to ; CHECK-NEXT: ret %r %r = zext %val to ret %r } define @sextto( %val) { ; CHECK-LABEL: @sextto ; CHECK: %r = sext %val to ; CHECK-NEXT: ret %r %r = sext %val to ret %r } define @fptruncto( %val) { ; CHECK-LABEL: @fptruncto ; CHECK: %r = fptrunc %val to ; CHECK-NEXT: ret %r %r = fptrunc %val to ret %r } define @fpextto( %val) { ; CHECK-LABEL: @fpextto ; CHECK: %r = fpext %val to ; CHECK-NEXT: ret %r %r = fpext %val to ret %r } define @fptouito( %val) { ; CHECK-LABEL: @fptoui ; CHECK: %r = fptoui %val to ; CHECK-NEXT: ret %r %r = fptoui %val to ret %r } define @fptosito( %val) { ; CHECK-LABEL: @fptosi ; CHECK: %r = fptosi %val to ; CHECK-NEXT: ret %r %r = fptosi %val to ret %r } define @uitofpto( %val) { ; CHECK-LABEL: @uitofp ; CHECK: %r = uitofp %val to ; CHECK-NEXT: ret %r %r = uitofp %val to ret %r } define @sitofpto( %val) { ; CHECK-LABEL: @sitofp ; CHECK: %r = sitofp %val to ; CHECK-NEXT: ret %r %r = sitofp %val to ret %r } define @ptrtointto( %val) { ; CHECK-LABEL: @ptrtointto ; CHECK: %r = ptrtoint %val to ; CHECK-NEXT: ret %r %r = ptrtoint %val to ret %r } define @inttoptrto( %val) { ; CHECK-LABEL: @inttoptrto ; CHECK: %r = inttoptr %val to ; CHECK-NEXT: ret %r %r = inttoptr %val to ret %r } define @bitcastto( %a) { ; CHECK-LABEL: @bitcast ; CHECK: %r = bitcast %a to ; CHECK-NEXT: ret %r %r = bitcast %a to ret %r } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Other Operations ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; define @icmp( %a, %b) { ; CHECK-LABEL: @icmp ; CHECK: %r = icmp eq %a, %b ; CHECK-NEXT: ret %r %r = icmp eq %a, %b ret %r } define @fcmp( %a, %b) { ; CHECK-LABEL: @fcmp ; CHECK: %r = fcmp une %a, %b ; CHECK-NEXT: ret %r %r = fcmp une %a, %b ret %r } define @phi( %a, i32 %val) { ; CHECK-LABEL: @phi ; CHECK: %r = phi [ %a, %entry ], [ %added, %iszero ] ; CHECK-NEXT: ret %r entry: %cmp = icmp eq i32 %val, 0 br i1 %cmp, label %iszero, label %end iszero: %ins = insertelement undef, i8 1, i32 0 %splatone = shufflevector %ins, undef, zeroinitializer %added = add %a, %splatone br label %end end: %r = phi [ %a, %entry ], [ %added, %iszero ] ret %r } define @select( %a, %b, %sval) { ; CHECK-LABEL: @select ; CHECK: %r = select %sval, %a, %b ; CHECK-NEXT: ret %r %r = select %sval, %a, %b ret %r } declare @callee() define @call( %val) { ; CHECK-LABEL: @call ; CHECK: %r = call @callee( %val) ; CHECK-NEXT: ret %r %r = call @callee( %val) ret %r }