195 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple powerpc64le < %s | FileCheck %s3 4; Check constrained ops converted to call5define void @test(ptr %cast) strictfp {6; CHECK-LABEL: test:7; CHECK: # %bb.0: # %root8; CHECK-NEXT: mflr 09; CHECK-NEXT: .cfi_def_cfa_offset 6410; CHECK-NEXT: .cfi_offset lr, 1611; CHECK-NEXT: .cfi_offset r29, -2412; CHECK-NEXT: .cfi_offset r30, -1613; CHECK-NEXT: std 29, -24(1) # 8-byte Folded Spill14; CHECK-NEXT: std 30, -16(1) # 8-byte Folded Spill15; CHECK-NEXT: stdu 1, -64(1)16; CHECK-NEXT: addi 30, 3, -817; CHECK-NEXT: li 29, 25518; CHECK-NEXT: std 0, 80(1)19; CHECK-NEXT: .p2align 520; CHECK-NEXT: .LBB0_1: # %for.body21; CHECK-NEXT: #22; CHECK-NEXT: lfdu 1, 8(30)23; CHECK-NEXT: bl cos24; CHECK-NEXT: nop25; CHECK-NEXT: addi 29, 29, -126; CHECK-NEXT: stfd 1, 0(30)27; CHECK-NEXT: cmpldi 29, 028; CHECK-NEXT: bc 12, 1, .LBB0_129; CHECK-NEXT: # %bb.2: # %exit30; CHECK-NEXT: addi 1, 1, 6431; CHECK-NEXT: ld 0, 16(1)32; CHECK-NEXT: ld 30, -16(1) # 8-byte Folded Reload33; CHECK-NEXT: ld 29, -24(1) # 8-byte Folded Reload34; CHECK-NEXT: mtlr 035; CHECK-NEXT: blr36root:37 br label %for.body38 39exit:40 ret void41 42for.body:43 %i = phi i64 [ 0, %root ], [ %next, %for.body ]44 %idx = getelementptr inbounds double, ptr %cast, i64 %i45 %val = load double, ptr %idx46 %cos = tail call nnan ninf nsz arcp double @llvm.experimental.constrained.cos.f64(double %val, metadata !"round.dynamic", metadata !"fpexcept.strict")47 store double %cos, ptr %idx, align 848 %next = add nuw nsw i64 %i, 149 %cond = icmp eq i64 %next, 25550 br i1 %cond, label %exit, label %for.body51}52 53; Check constrained ops converted to native instruction54define void @test2(ptr %cast) strictfp {55; CHECK-LABEL: test2:56; CHECK: # %bb.0: # %entry57; CHECK-NEXT: li 4, 25558; CHECK-NEXT: addi 3, 3, -859; CHECK-NEXT: mtctr 460; CHECK-NEXT: .p2align 461; CHECK-NEXT: .LBB1_1: # %for.body62; CHECK-NEXT: #63; CHECK-NEXT: lfdu 0, 8(3)64; CHECK-NEXT: xssqrtdp 0, 065; CHECK-NEXT: stfd 0, 0(3)66; CHECK-NEXT: bdnz .LBB1_167; CHECK-NEXT: # %bb.2: # %exit68; CHECK-NEXT: blr69entry:70 br label %for.body71 72for.body:73 %i = phi i64 [ 0, %entry ], [ %next, %for.body ]74 %idx = getelementptr inbounds double, ptr %cast, i64 %i75 %val = load double, ptr %idx76 %cos = tail call nnan ninf nsz arcp double @llvm.experimental.constrained.sqrt.f64(double %val, metadata !"round.dynamic", metadata !"fpexcept.strict")77 store double %cos, ptr %idx, align 878 %next = add nuw nsw i64 %i, 179 %cond = icmp eq i64 %next, 25580 br i1 %cond, label %exit, label %for.body81 82exit:83 ret void84}85 86; Check constrained ops converted to call87define void @testTan(ptr %cast) strictfp {88; CHECK-LABEL: testTan:89; CHECK: # %bb.0: # %root90; CHECK-NEXT: mflr 091; CHECK-NEXT: .cfi_def_cfa_offset 6492; CHECK-NEXT: .cfi_offset lr, 1693; CHECK-NEXT: .cfi_offset r29, -2494; CHECK-NEXT: .cfi_offset r30, -1695; CHECK-NEXT: std 29, -24(1) # 8-byte Folded Spill96; CHECK-NEXT: std 30, -16(1) # 8-byte Folded Spill97; CHECK-NEXT: stdu 1, -64(1)98; CHECK-NEXT: addi 30, 3, -899; CHECK-NEXT: li 29, 255100; CHECK-NEXT: std 0, 80(1)101; CHECK-NEXT: .p2align 5102; CHECK-NEXT: .LBB2_1: # %for.body103; CHECK-NEXT: #104; CHECK-NEXT: lfdu 1, 8(30)105; CHECK-NEXT: bl tan106; CHECK-NEXT: nop107; CHECK-NEXT: addi 29, 29, -1108; CHECK-NEXT: stfd 1, 0(30)109; CHECK-NEXT: cmpldi 29, 0110; CHECK-NEXT: bc 12, 1, .LBB2_1111; CHECK-NEXT: # %bb.2: # %exit112; CHECK-NEXT: addi 1, 1, 64113; CHECK-NEXT: ld 0, 16(1)114; CHECK-NEXT: ld 30, -16(1) # 8-byte Folded Reload115; CHECK-NEXT: ld 29, -24(1) # 8-byte Folded Reload116; CHECK-NEXT: mtlr 0117; CHECK-NEXT: blr118root:119 br label %for.body120 121exit:122 ret void123 124for.body:125 %i = phi i64 [ 0, %root ], [ %next, %for.body ]126 %idx = getelementptr inbounds double, ptr %cast, i64 %i127 %val = load double, ptr %idx128 %tan = tail call nnan ninf nsz arcp double @llvm.experimental.constrained.tan.f64(double %val, metadata !"round.dynamic", metadata !"fpexcept.strict")129 store double %tan, ptr %idx, align 8130 %next = add nuw nsw i64 %i, 1131 %cond = icmp eq i64 %next, 255132 br i1 %cond, label %exit, label %for.body133}134 135; Check constrained ops converted to call136define void @testAtan2(ptr %cast1, ptr %cast2) strictfp {137; CHECK-LABEL: testAtan2:138; CHECK: # %bb.0: # %root139; CHECK-NEXT: mflr 0140; CHECK-NEXT: .cfi_def_cfa_offset 64141; CHECK-NEXT: .cfi_offset lr, 16142; CHECK-NEXT: .cfi_offset r28, -32143; CHECK-NEXT: .cfi_offset r29, -24144; CHECK-NEXT: .cfi_offset r30, -16145; CHECK-NEXT: std 28, -32(1) # 8-byte Folded Spill146; CHECK-NEXT: std 29, -24(1) # 8-byte Folded Spill147; CHECK-NEXT: std 30, -16(1) # 8-byte Folded Spill148; CHECK-NEXT: stdu 1, -64(1)149; CHECK-NEXT: addi 30, 3, -8150; CHECK-NEXT: addi 29, 4, -8151; CHECK-NEXT: li 28, 255152; CHECK-NEXT: std 0, 80(1)153; CHECK-NEXT: .p2align 5154; CHECK-NEXT: .LBB3_1: # %for.body155; CHECK-NEXT: #156; CHECK-NEXT: lfdu 2, 8(29)157; CHECK-NEXT: lfdu 1, 8(30)158; CHECK-NEXT: bl atan2159; CHECK-NEXT: nop160; CHECK-NEXT: addi 28, 28, -1161; CHECK-NEXT: stfd 1, 0(30)162; CHECK-NEXT: cmpldi 28, 0163; CHECK-NEXT: bc 12, 1, .LBB3_1164; CHECK-NEXT: # %bb.2: # %exit165; CHECK-NEXT: addi 1, 1, 64166; CHECK-NEXT: ld 0, 16(1)167; CHECK-NEXT: ld 30, -16(1) # 8-byte Folded Reload168; CHECK-NEXT: ld 29, -24(1) # 8-byte Folded Reload169; CHECK-NEXT: ld 28, -32(1) # 8-byte Folded Reload170; CHECK-NEXT: mtlr 0171; CHECK-NEXT: blr172root:173 br label %for.body174 175exit:176 ret void177 178for.body:179 %i = phi i64 [ 0, %root ], [ %next, %for.body ]180 %idx1 = getelementptr inbounds double, ptr %cast1, i64 %i181 %idx2 = getelementptr inbounds double, ptr %cast2, i64 %i182 %val1 = load double, ptr %idx1183 %val2 = load double, ptr %idx2184 %tan = tail call nnan ninf nsz arcp double @llvm.experimental.constrained.atan2.f64(double %val1, double %val2, metadata !"round.dynamic", metadata !"fpexcept.strict")185 store double %tan, ptr %idx1, align 8186 %next = add nuw nsw i64 %i, 1187 %cond = icmp eq i64 %next, 255188 br i1 %cond, label %exit, label %for.body189}190 191declare double @llvm.experimental.constrained.cos.f64(double, metadata, metadata)192declare double @llvm.experimental.constrained.tan.f64(double, metadata, metadata)193declare double @llvm.experimental.constrained.atan2.f64(double, double, metadata, metadata)194declare double @llvm.experimental.constrained.sqrt.f64(double, metadata, metadata)195