1fed6107dSQiu Chaofan; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2fed6107dSQiu Chaofan; RUN: llc -mtriple powerpc64le < %s | FileCheck %s 3fed6107dSQiu Chaofan 4fed6107dSQiu Chaofan; Check constrained ops converted to call 5fed6107dSQiu Chaofandefine void @test(double* %cast) { 6fed6107dSQiu Chaofan; CHECK-LABEL: test: 7fed6107dSQiu Chaofan; CHECK: # %bb.0: # %root 8fed6107dSQiu Chaofan; CHECK-NEXT: mflr 0 9fed6107dSQiu Chaofan; CHECK-NEXT: .cfi_def_cfa_offset 64 10fed6107dSQiu Chaofan; CHECK-NEXT: .cfi_offset lr, 16 11fed6107dSQiu Chaofan; CHECK-NEXT: .cfi_offset r29, -24 12fed6107dSQiu Chaofan; CHECK-NEXT: .cfi_offset r30, -16 13fed6107dSQiu Chaofan; CHECK-NEXT: std 29, -24(1) # 8-byte Folded Spill 14fed6107dSQiu Chaofan; CHECK-NEXT: std 30, -16(1) # 8-byte Folded Spill 15fed6107dSQiu Chaofan; CHECK-NEXT: std 0, 16(1) 16fed6107dSQiu Chaofan; CHECK-NEXT: stdu 1, -64(1) 17fed6107dSQiu Chaofan; CHECK-NEXT: li 30, 0 18fed6107dSQiu Chaofan; CHECK-NEXT: addi 29, 3, -8 19fed6107dSQiu Chaofan; CHECK-NEXT: .p2align 5 20fed6107dSQiu Chaofan; CHECK-NEXT: .LBB0_1: # %for.body 21fed6107dSQiu Chaofan; CHECK-NEXT: # 22fed6107dSQiu Chaofan; CHECK-NEXT: lfdu 1, 8(29) 23fed6107dSQiu Chaofan; CHECK-NEXT: bl cos 24fed6107dSQiu Chaofan; CHECK-NEXT: nop 25fed6107dSQiu Chaofan; CHECK-NEXT: addi 30, 30, 8 26*ba627a32SAmy Kwan; CHECK-NEXT: stfd 1, 0(29) 27fed6107dSQiu Chaofan; CHECK-NEXT: cmpldi 30, 2040 28fed6107dSQiu Chaofan; CHECK-NEXT: bne 0, .LBB0_1 29fed6107dSQiu Chaofan; CHECK-NEXT: # %bb.2: # %exit 30fed6107dSQiu Chaofan; CHECK-NEXT: addi 1, 1, 64 31fed6107dSQiu Chaofan; CHECK-NEXT: ld 0, 16(1) 32fed6107dSQiu Chaofan; CHECK-NEXT: ld 30, -16(1) # 8-byte Folded Reload 33fed6107dSQiu Chaofan; CHECK-NEXT: ld 29, -24(1) # 8-byte Folded Reload 34fed6107dSQiu Chaofan; CHECK-NEXT: mtlr 0 35fed6107dSQiu Chaofan; CHECK-NEXT: blr 36fed6107dSQiu Chaofanroot: 37fed6107dSQiu Chaofan br label %for.body 38fed6107dSQiu Chaofan 39fed6107dSQiu Chaofanexit: 40fed6107dSQiu Chaofan ret void 41fed6107dSQiu Chaofan 42fed6107dSQiu Chaofanfor.body: 43fed6107dSQiu Chaofan %i = phi i64 [ 0, %root ], [ %next, %for.body ] 44fed6107dSQiu Chaofan %idx = getelementptr inbounds double, double* %cast, i64 %i 45fed6107dSQiu Chaofan %val = load double, double* %idx 46fed6107dSQiu Chaofan %cos = tail call nnan ninf nsz arcp double @llvm.experimental.constrained.cos.f64(double %val, metadata !"round.dynamic", metadata !"fpexcept.strict") 47fed6107dSQiu Chaofan store double %cos, double* %idx, align 8 48fed6107dSQiu Chaofan %next = add nuw nsw i64 %i, 1 49fed6107dSQiu Chaofan %cond = icmp eq i64 %next, 255 50fed6107dSQiu Chaofan br i1 %cond, label %exit, label %for.body 51fed6107dSQiu Chaofan} 52fed6107dSQiu Chaofan 53fed6107dSQiu Chaofan; Check constrained ops converted to native instruction 54fed6107dSQiu Chaofandefine void @test2(double* %cast) { 55fed6107dSQiu Chaofan; CHECK-LABEL: test2: 56fed6107dSQiu Chaofan; CHECK: # %bb.0: # %entry 57fed6107dSQiu Chaofan; CHECK-NEXT: li 4, 255 58fed6107dSQiu Chaofan; CHECK-NEXT: addi 3, 3, -8 59fed6107dSQiu Chaofan; CHECK-NEXT: mtctr 4 60fed6107dSQiu Chaofan; CHECK-NEXT: .p2align 4 61fed6107dSQiu Chaofan; CHECK-NEXT: .LBB1_1: # %for.body 62fed6107dSQiu Chaofan; CHECK-NEXT: # 63fed6107dSQiu Chaofan; CHECK-NEXT: lfdu 0, 8(3) 64fed6107dSQiu Chaofan; CHECK-NEXT: xssqrtdp 0, 0 65*ba627a32SAmy Kwan; CHECK-NEXT: stfd 0, 0(3) 66fed6107dSQiu Chaofan; CHECK-NEXT: bdnz .LBB1_1 67fed6107dSQiu Chaofan; CHECK-NEXT: # %bb.2: # %exit 68fed6107dSQiu Chaofan; CHECK-NEXT: blr 69fed6107dSQiu Chaofanentry: 70fed6107dSQiu Chaofan br label %for.body 71fed6107dSQiu Chaofan 72fed6107dSQiu Chaofanfor.body: 73fed6107dSQiu Chaofan %i = phi i64 [ 0, %entry ], [ %next, %for.body ] 74fed6107dSQiu Chaofan %idx = getelementptr inbounds double, double* %cast, i64 %i 75fed6107dSQiu Chaofan %val = load double, double* %idx 76fed6107dSQiu Chaofan %cos = tail call nnan ninf nsz arcp double @llvm.experimental.constrained.sqrt.f64(double %val, metadata !"round.dynamic", metadata !"fpexcept.strict") 77fed6107dSQiu Chaofan store double %cos, double* %idx, align 8 78fed6107dSQiu Chaofan %next = add nuw nsw i64 %i, 1 79fed6107dSQiu Chaofan %cond = icmp eq i64 %next, 255 80fed6107dSQiu Chaofan br i1 %cond, label %exit, label %for.body 81fed6107dSQiu Chaofan 82fed6107dSQiu Chaofanexit: 83fed6107dSQiu Chaofan ret void 84fed6107dSQiu Chaofan} 85fed6107dSQiu Chaofan 86fed6107dSQiu Chaofandeclare double @llvm.experimental.constrained.cos.f64(double, metadata, metadata) 87fed6107dSQiu Chaofandeclare double @llvm.experimental.constrained.sqrt.f64(double, metadata, metadata) 88