| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: opt -passes=slp-vectorizer -mtriple=x86_64-unknown-linux-gnu -mcpu=skylake-avx512 -S < %s | FileCheck %s |
| ; RUN: opt -passes=slp-vectorizer -mtriple=x86_64-unknown-linux-gnu -mcpu=skylake-avx512 -slp-vectorize-with-runtime-alias-checks=false -S < %s | FileCheck %s --check-prefix=NOCHK |
| |
| declare void @nodup() noduplicate |
| declare void @musttail_callee(ptr, ptr, ptr) |
| |
| define void @test(ptr %dst, ptr %x, ptr %y) { |
| ; CHECK-LABEL: define void @test( |
| ; CHECK-SAME: ptr [[DST:%.*]], ptr [[X:%.*]], ptr [[Y:%.*]]) #[[ATTR1:[0-9]+]] { |
| ; CHECK-NEXT: [[ENTRY:.*:]] |
| ; CHECK-NEXT: [[DST10:%.*]] = ptrtoaddr ptr [[DST]] to i64 |
| ; CHECK-NEXT: [[Y9:%.*]] = ptrtoaddr ptr [[Y]] to i64 |
| ; CHECK-NEXT: [[X8:%.*]] = ptrtoaddr ptr [[X]] to i64 |
| ; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[X8]], 64 |
| ; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[Y9]], 64 |
| ; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[DST10]], 64 |
| ; CHECK-NEXT: [[RT_BOUND0:%.*]] = icmp ult i64 [[DST10]], [[TMP0]] |
| ; CHECK-NEXT: [[RT_BOUND1:%.*]] = icmp ult i64 [[X8]], [[TMP2]] |
| ; CHECK-NEXT: [[RT_CONFLICT:%.*]] = and i1 [[RT_BOUND0]], [[RT_BOUND1]] |
| ; CHECK-NEXT: [[RT_BOUND011:%.*]] = icmp ult i64 [[DST10]], [[TMP1]] |
| ; CHECK-NEXT: [[RT_BOUND112:%.*]] = icmp ult i64 [[Y9]], [[TMP2]] |
| ; CHECK-NEXT: [[RT_CONFLICT13:%.*]] = and i1 [[RT_BOUND011]], [[RT_BOUND112]] |
| ; CHECK-NEXT: [[RT_CONFLICT_ALL:%.*]] = or i1 [[RT_CONFLICT]], [[RT_CONFLICT13]] |
| ; CHECK-NEXT: [[RT_GUARD:%.*]] = freeze i1 [[RT_CONFLICT_ALL]] |
| ; CHECK-NEXT: br i1 [[RT_GUARD]], label %[[ENTRY_RTSCALAR:.*]], label %[[ENTRY_RTVEC:.*]] |
| ; CHECK: [[ENTRY_RTVEC]]: |
| ; CHECK-NEXT: [[TMP3:%.*]] = load <4 x double>, ptr [[X]], align 8 |
| ; CHECK-NEXT: [[TMP4:%.*]] = load <4 x double>, ptr [[Y]], align 8 |
| ; CHECK-NEXT: [[TMP5:%.*]] = fdiv <4 x double> [[TMP3]], [[TMP4]] |
| ; CHECK-NEXT: store <4 x double> [[TMP5]], ptr [[DST]], align 8 |
| ; CHECK-NEXT: [[X4P1:%.*]] = getelementptr inbounds double, ptr [[X]], i64 4 |
| ; CHECK-NEXT: [[Y4P1:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 4 |
| ; CHECK-NEXT: [[DST8:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 4 |
| ; CHECK-NEXT: [[TMP6:%.*]] = load <4 x double>, ptr [[X4P1]], align 8 |
| ; CHECK-NEXT: [[TMP7:%.*]] = load <4 x double>, ptr [[Y4P1]], align 8 |
| ; CHECK-NEXT: [[TMP8:%.*]] = fdiv <4 x double> [[TMP6]], [[TMP7]] |
| ; CHECK-NEXT: store <4 x double> [[TMP8]], ptr [[DST8]], align 8 |
| ; CHECK-NEXT: br label %[[ENTRY_RTCONT:.*]] |
| ; CHECK: [[ENTRY_RTSCALAR]]: |
| ; CHECK-NEXT: [[X0:%.*]] = load double, ptr [[X]], align 8 |
| ; CHECK-NEXT: [[Y0:%.*]] = load double, ptr [[Y]], align 8 |
| ; CHECK-NEXT: [[D0:%.*]] = fdiv double [[X0]], [[Y0]] |
| ; CHECK-NEXT: store double [[D0]], ptr [[DST]], align 8 |
| ; CHECK-NEXT: [[X1P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 1 |
| ; CHECK-NEXT: [[X1:%.*]] = load double, ptr [[X1P]], align 8 |
| ; CHECK-NEXT: [[Y1P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 1 |
| ; CHECK-NEXT: [[Y1:%.*]] = load double, ptr [[Y1P]], align 8 |
| ; CHECK-NEXT: [[D1:%.*]] = fdiv double [[X1]], [[Y1]] |
| ; CHECK-NEXT: [[DST1:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 1 |
| ; CHECK-NEXT: store double [[D1]], ptr [[DST1]], align 8 |
| ; CHECK-NEXT: [[X2P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 2 |
| ; CHECK-NEXT: [[X2:%.*]] = load double, ptr [[X2P]], align 8 |
| ; CHECK-NEXT: [[Y2P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 2 |
| ; CHECK-NEXT: [[Y2:%.*]] = load double, ptr [[Y2P]], align 8 |
| ; CHECK-NEXT: [[D2:%.*]] = fdiv double [[X2]], [[Y2]] |
| ; CHECK-NEXT: [[DST2:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 2 |
| ; CHECK-NEXT: store double [[D2]], ptr [[DST2]], align 8 |
| ; CHECK-NEXT: [[X3P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 3 |
| ; CHECK-NEXT: [[X3:%.*]] = load double, ptr [[X3P]], align 8 |
| ; CHECK-NEXT: [[Y3P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 3 |
| ; CHECK-NEXT: [[Y3:%.*]] = load double, ptr [[Y3P]], align 8 |
| ; CHECK-NEXT: [[D3:%.*]] = fdiv double [[X3]], [[Y3]] |
| ; CHECK-NEXT: [[DST3:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 3 |
| ; CHECK-NEXT: store double [[D3]], ptr [[DST3]], align 8 |
| ; CHECK-NEXT: [[X4P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 4 |
| ; CHECK-NEXT: [[X4:%.*]] = load double, ptr [[X4P]], align 8 |
| ; CHECK-NEXT: [[Y4P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 4 |
| ; CHECK-NEXT: [[Y4:%.*]] = load double, ptr [[Y4P]], align 8 |
| ; CHECK-NEXT: [[D4:%.*]] = fdiv double [[X4]], [[Y4]] |
| ; CHECK-NEXT: [[DST4:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 4 |
| ; CHECK-NEXT: store double [[D4]], ptr [[DST4]], align 8 |
| ; CHECK-NEXT: [[X5P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 5 |
| ; CHECK-NEXT: [[X5:%.*]] = load double, ptr [[X5P]], align 8 |
| ; CHECK-NEXT: [[Y5P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 5 |
| ; CHECK-NEXT: [[Y5:%.*]] = load double, ptr [[Y5P]], align 8 |
| ; CHECK-NEXT: [[D5:%.*]] = fdiv double [[X5]], [[Y5]] |
| ; CHECK-NEXT: [[DST5:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 5 |
| ; CHECK-NEXT: store double [[D5]], ptr [[DST5]], align 8 |
| ; CHECK-NEXT: [[X6P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 6 |
| ; CHECK-NEXT: [[X6:%.*]] = load double, ptr [[X6P]], align 8 |
| ; CHECK-NEXT: [[Y6P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 6 |
| ; CHECK-NEXT: [[Y6:%.*]] = load double, ptr [[Y6P]], align 8 |
| ; CHECK-NEXT: [[D6:%.*]] = fdiv double [[X6]], [[Y6]] |
| ; CHECK-NEXT: [[DST6:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 6 |
| ; CHECK-NEXT: store double [[D6]], ptr [[DST6]], align 8 |
| ; CHECK-NEXT: [[X7P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 7 |
| ; CHECK-NEXT: [[X7:%.*]] = load double, ptr [[X7P]], align 8 |
| ; CHECK-NEXT: [[Y7P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 7 |
| ; CHECK-NEXT: [[Y7:%.*]] = load double, ptr [[Y7P]], align 8 |
| ; CHECK-NEXT: [[D7:%.*]] = fdiv double [[X7]], [[Y7]] |
| ; CHECK-NEXT: [[DST7:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 7 |
| ; CHECK-NEXT: store double [[D7]], ptr [[DST7]], align 8 |
| ; CHECK-NEXT: br label %[[ENTRY_RTCONT]] |
| ; CHECK: [[ENTRY_RTCONT]]: |
| ; CHECK-NEXT: ret void |
| ; |
| ; NOCHK-LABEL: define void @test( |
| ; NOCHK-SAME: ptr [[DST:%.*]], ptr [[X:%.*]], ptr [[Y:%.*]]) #[[ATTR1:[0-9]+]] { |
| ; NOCHK-NEXT: [[ENTRY:.*:]] |
| ; NOCHK-NEXT: [[X0:%.*]] = load double, ptr [[X]], align 8 |
| ; NOCHK-NEXT: [[Y0:%.*]] = load double, ptr [[Y]], align 8 |
| ; NOCHK-NEXT: [[D0:%.*]] = fdiv double [[X0]], [[Y0]] |
| ; NOCHK-NEXT: store double [[D0]], ptr [[DST]], align 8 |
| ; NOCHK-NEXT: [[X1P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 1 |
| ; NOCHK-NEXT: [[X1:%.*]] = load double, ptr [[X1P]], align 8 |
| ; NOCHK-NEXT: [[Y1P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 1 |
| ; NOCHK-NEXT: [[Y1:%.*]] = load double, ptr [[Y1P]], align 8 |
| ; NOCHK-NEXT: [[D1:%.*]] = fdiv double [[X1]], [[Y1]] |
| ; NOCHK-NEXT: [[DST1:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 1 |
| ; NOCHK-NEXT: store double [[D1]], ptr [[DST1]], align 8 |
| ; NOCHK-NEXT: [[X2P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 2 |
| ; NOCHK-NEXT: [[X2:%.*]] = load double, ptr [[X2P]], align 8 |
| ; NOCHK-NEXT: [[Y2P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 2 |
| ; NOCHK-NEXT: [[Y2:%.*]] = load double, ptr [[Y2P]], align 8 |
| ; NOCHK-NEXT: [[D2:%.*]] = fdiv double [[X2]], [[Y2]] |
| ; NOCHK-NEXT: [[DST2:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 2 |
| ; NOCHK-NEXT: store double [[D2]], ptr [[DST2]], align 8 |
| ; NOCHK-NEXT: [[X3P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 3 |
| ; NOCHK-NEXT: [[X3:%.*]] = load double, ptr [[X3P]], align 8 |
| ; NOCHK-NEXT: [[Y3P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 3 |
| ; NOCHK-NEXT: [[Y3:%.*]] = load double, ptr [[Y3P]], align 8 |
| ; NOCHK-NEXT: [[D3:%.*]] = fdiv double [[X3]], [[Y3]] |
| ; NOCHK-NEXT: [[DST3:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 3 |
| ; NOCHK-NEXT: store double [[D3]], ptr [[DST3]], align 8 |
| ; NOCHK-NEXT: [[X4P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 4 |
| ; NOCHK-NEXT: [[X4:%.*]] = load double, ptr [[X4P]], align 8 |
| ; NOCHK-NEXT: [[Y4P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 4 |
| ; NOCHK-NEXT: [[Y4:%.*]] = load double, ptr [[Y4P]], align 8 |
| ; NOCHK-NEXT: [[D4:%.*]] = fdiv double [[X4]], [[Y4]] |
| ; NOCHK-NEXT: [[DST4:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 4 |
| ; NOCHK-NEXT: store double [[D4]], ptr [[DST4]], align 8 |
| ; NOCHK-NEXT: [[X5P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 5 |
| ; NOCHK-NEXT: [[X5:%.*]] = load double, ptr [[X5P]], align 8 |
| ; NOCHK-NEXT: [[Y5P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 5 |
| ; NOCHK-NEXT: [[Y5:%.*]] = load double, ptr [[Y5P]], align 8 |
| ; NOCHK-NEXT: [[D5:%.*]] = fdiv double [[X5]], [[Y5]] |
| ; NOCHK-NEXT: [[DST5:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 5 |
| ; NOCHK-NEXT: store double [[D5]], ptr [[DST5]], align 8 |
| ; NOCHK-NEXT: [[X6P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 6 |
| ; NOCHK-NEXT: [[X6:%.*]] = load double, ptr [[X6P]], align 8 |
| ; NOCHK-NEXT: [[Y6P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 6 |
| ; NOCHK-NEXT: [[Y6:%.*]] = load double, ptr [[Y6P]], align 8 |
| ; NOCHK-NEXT: [[D6:%.*]] = fdiv double [[X6]], [[Y6]] |
| ; NOCHK-NEXT: [[DST6:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 6 |
| ; NOCHK-NEXT: store double [[D6]], ptr [[DST6]], align 8 |
| ; NOCHK-NEXT: [[X7P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 7 |
| ; NOCHK-NEXT: [[X7:%.*]] = load double, ptr [[X7P]], align 8 |
| ; NOCHK-NEXT: [[Y7P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 7 |
| ; NOCHK-NEXT: [[Y7:%.*]] = load double, ptr [[Y7P]], align 8 |
| ; NOCHK-NEXT: [[D7:%.*]] = fdiv double [[X7]], [[Y7]] |
| ; NOCHK-NEXT: [[DST7:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 7 |
| ; NOCHK-NEXT: store double [[D7]], ptr [[DST7]], align 8 |
| ; NOCHK-NEXT: ret void |
| ; |
| entry: |
| %x0 = load double, ptr %x, align 8 |
| %y0 = load double, ptr %y, align 8 |
| %d0 = fdiv double %x0, %y0 |
| store double %d0, ptr %dst, align 8 |
| %x1p = getelementptr inbounds double, ptr %x, i64 1 |
| %x1 = load double, ptr %x1p, align 8 |
| %y1p = getelementptr inbounds double, ptr %y, i64 1 |
| %y1 = load double, ptr %y1p, align 8 |
| %d1 = fdiv double %x1, %y1 |
| %dst1 = getelementptr inbounds double, ptr %dst, i64 1 |
| store double %d1, ptr %dst1, align 8 |
| %x2p = getelementptr inbounds double, ptr %x, i64 2 |
| %x2 = load double, ptr %x2p, align 8 |
| %y2p = getelementptr inbounds double, ptr %y, i64 2 |
| %y2 = load double, ptr %y2p, align 8 |
| %d2 = fdiv double %x2, %y2 |
| %dst2 = getelementptr inbounds double, ptr %dst, i64 2 |
| store double %d2, ptr %dst2, align 8 |
| %x3p = getelementptr inbounds double, ptr %x, i64 3 |
| %x3 = load double, ptr %x3p, align 8 |
| %y3p = getelementptr inbounds double, ptr %y, i64 3 |
| %y3 = load double, ptr %y3p, align 8 |
| %d3 = fdiv double %x3, %y3 |
| %dst3 = getelementptr inbounds double, ptr %dst, i64 3 |
| store double %d3, ptr %dst3, align 8 |
| %x4p = getelementptr inbounds double, ptr %x, i64 4 |
| %x4 = load double, ptr %x4p, align 8 |
| %y4p = getelementptr inbounds double, ptr %y, i64 4 |
| %y4 = load double, ptr %y4p, align 8 |
| %d4 = fdiv double %x4, %y4 |
| %dst4 = getelementptr inbounds double, ptr %dst, i64 4 |
| store double %d4, ptr %dst4, align 8 |
| %x5p = getelementptr inbounds double, ptr %x, i64 5 |
| %x5 = load double, ptr %x5p, align 8 |
| %y5p = getelementptr inbounds double, ptr %y, i64 5 |
| %y5 = load double, ptr %y5p, align 8 |
| %d5 = fdiv double %x5, %y5 |
| %dst5 = getelementptr inbounds double, ptr %dst, i64 5 |
| store double %d5, ptr %dst5, align 8 |
| %x6p = getelementptr inbounds double, ptr %x, i64 6 |
| %x6 = load double, ptr %x6p, align 8 |
| %y6p = getelementptr inbounds double, ptr %y, i64 6 |
| %y6 = load double, ptr %y6p, align 8 |
| %d6 = fdiv double %x6, %y6 |
| %dst6 = getelementptr inbounds double, ptr %dst, i64 6 |
| store double %d6, ptr %dst6, align 8 |
| %x7p = getelementptr inbounds double, ptr %x, i64 7 |
| %x7 = load double, ptr %x7p, align 8 |
| %y7p = getelementptr inbounds double, ptr %y, i64 7 |
| %y7 = load double, ptr %y7p, align 8 |
| %d7 = fdiv double %x7, %y7 |
| %dst7 = getelementptr inbounds double, ptr %dst, i64 7 |
| store double %d7, ptr %dst7, align 8 |
| ret void |
| } |
| |
| define void @reject_noduplicate_call(ptr %dst, ptr %x, ptr %y) { |
| ; CHECK-LABEL: define void @reject_noduplicate_call( |
| ; CHECK-SAME: ptr [[DST:%.*]], ptr [[X:%.*]], ptr [[Y:%.*]]) #[[ATTR1]] { |
| ; CHECK-NEXT: [[ENTRY:.*:]] |
| ; CHECK-NEXT: [[X0:%.*]] = load double, ptr [[X]], align 8 |
| ; CHECK-NEXT: [[Y0:%.*]] = load double, ptr [[Y]], align 8 |
| ; CHECK-NEXT: [[D0:%.*]] = fdiv double [[X0]], [[Y0]] |
| ; CHECK-NEXT: store double [[D0]], ptr [[DST]], align 8 |
| ; CHECK-NEXT: [[X1P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 1 |
| ; CHECK-NEXT: [[X1:%.*]] = load double, ptr [[X1P]], align 8 |
| ; CHECK-NEXT: [[Y1P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 1 |
| ; CHECK-NEXT: [[Y1:%.*]] = load double, ptr [[Y1P]], align 8 |
| ; CHECK-NEXT: [[D1:%.*]] = fdiv double [[X1]], [[Y1]] |
| ; CHECK-NEXT: [[DST1:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 1 |
| ; CHECK-NEXT: store double [[D1]], ptr [[DST1]], align 8 |
| ; CHECK-NEXT: [[X2P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 2 |
| ; CHECK-NEXT: [[X2:%.*]] = load double, ptr [[X2P]], align 8 |
| ; CHECK-NEXT: [[Y2P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 2 |
| ; CHECK-NEXT: [[Y2:%.*]] = load double, ptr [[Y2P]], align 8 |
| ; CHECK-NEXT: [[D2:%.*]] = fdiv double [[X2]], [[Y2]] |
| ; CHECK-NEXT: [[DST2:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 2 |
| ; CHECK-NEXT: store double [[D2]], ptr [[DST2]], align 8 |
| ; CHECK-NEXT: [[X3P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 3 |
| ; CHECK-NEXT: [[X3:%.*]] = load double, ptr [[X3P]], align 8 |
| ; CHECK-NEXT: [[Y3P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 3 |
| ; CHECK-NEXT: [[Y3:%.*]] = load double, ptr [[Y3P]], align 8 |
| ; CHECK-NEXT: [[D3:%.*]] = fdiv double [[X3]], [[Y3]] |
| ; CHECK-NEXT: [[DST3:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 3 |
| ; CHECK-NEXT: store double [[D3]], ptr [[DST3]], align 8 |
| ; CHECK-NEXT: [[X4P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 4 |
| ; CHECK-NEXT: [[X4:%.*]] = load double, ptr [[X4P]], align 8 |
| ; CHECK-NEXT: [[Y4P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 4 |
| ; CHECK-NEXT: [[Y4:%.*]] = load double, ptr [[Y4P]], align 8 |
| ; CHECK-NEXT: [[D4:%.*]] = fdiv double [[X4]], [[Y4]] |
| ; CHECK-NEXT: [[DST4:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 4 |
| ; CHECK-NEXT: store double [[D4]], ptr [[DST4]], align 8 |
| ; CHECK-NEXT: [[X5P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 5 |
| ; CHECK-NEXT: [[X5:%.*]] = load double, ptr [[X5P]], align 8 |
| ; CHECK-NEXT: [[Y5P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 5 |
| ; CHECK-NEXT: [[Y5:%.*]] = load double, ptr [[Y5P]], align 8 |
| ; CHECK-NEXT: [[D5:%.*]] = fdiv double [[X5]], [[Y5]] |
| ; CHECK-NEXT: [[DST5:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 5 |
| ; CHECK-NEXT: store double [[D5]], ptr [[DST5]], align 8 |
| ; CHECK-NEXT: [[X6P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 6 |
| ; CHECK-NEXT: [[X6:%.*]] = load double, ptr [[X6P]], align 8 |
| ; CHECK-NEXT: [[Y6P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 6 |
| ; CHECK-NEXT: [[Y6:%.*]] = load double, ptr [[Y6P]], align 8 |
| ; CHECK-NEXT: [[D6:%.*]] = fdiv double [[X6]], [[Y6]] |
| ; CHECK-NEXT: [[DST6:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 6 |
| ; CHECK-NEXT: store double [[D6]], ptr [[DST6]], align 8 |
| ; CHECK-NEXT: [[X7P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 7 |
| ; CHECK-NEXT: [[X7:%.*]] = load double, ptr [[X7P]], align 8 |
| ; CHECK-NEXT: [[Y7P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 7 |
| ; CHECK-NEXT: [[Y7:%.*]] = load double, ptr [[Y7P]], align 8 |
| ; CHECK-NEXT: [[D7:%.*]] = fdiv double [[X7]], [[Y7]] |
| ; CHECK-NEXT: [[DST7:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 7 |
| ; CHECK-NEXT: store double [[D7]], ptr [[DST7]], align 8 |
| ; CHECK-NEXT: call void @nodup() |
| ; CHECK-NEXT: ret void |
| ; |
| ; NOCHK-LABEL: define void @reject_noduplicate_call( |
| ; NOCHK-SAME: ptr [[DST:%.*]], ptr [[X:%.*]], ptr [[Y:%.*]]) #[[ATTR1]] { |
| ; NOCHK-NEXT: [[ENTRY:.*:]] |
| ; NOCHK-NEXT: [[X0:%.*]] = load double, ptr [[X]], align 8 |
| ; NOCHK-NEXT: [[Y0:%.*]] = load double, ptr [[Y]], align 8 |
| ; NOCHK-NEXT: [[D0:%.*]] = fdiv double [[X0]], [[Y0]] |
| ; NOCHK-NEXT: store double [[D0]], ptr [[DST]], align 8 |
| ; NOCHK-NEXT: [[X1P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 1 |
| ; NOCHK-NEXT: [[X1:%.*]] = load double, ptr [[X1P]], align 8 |
| ; NOCHK-NEXT: [[Y1P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 1 |
| ; NOCHK-NEXT: [[Y1:%.*]] = load double, ptr [[Y1P]], align 8 |
| ; NOCHK-NEXT: [[D1:%.*]] = fdiv double [[X1]], [[Y1]] |
| ; NOCHK-NEXT: [[DST1:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 1 |
| ; NOCHK-NEXT: store double [[D1]], ptr [[DST1]], align 8 |
| ; NOCHK-NEXT: [[X2P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 2 |
| ; NOCHK-NEXT: [[X2:%.*]] = load double, ptr [[X2P]], align 8 |
| ; NOCHK-NEXT: [[Y2P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 2 |
| ; NOCHK-NEXT: [[Y2:%.*]] = load double, ptr [[Y2P]], align 8 |
| ; NOCHK-NEXT: [[D2:%.*]] = fdiv double [[X2]], [[Y2]] |
| ; NOCHK-NEXT: [[DST2:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 2 |
| ; NOCHK-NEXT: store double [[D2]], ptr [[DST2]], align 8 |
| ; NOCHK-NEXT: [[X3P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 3 |
| ; NOCHK-NEXT: [[X3:%.*]] = load double, ptr [[X3P]], align 8 |
| ; NOCHK-NEXT: [[Y3P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 3 |
| ; NOCHK-NEXT: [[Y3:%.*]] = load double, ptr [[Y3P]], align 8 |
| ; NOCHK-NEXT: [[D3:%.*]] = fdiv double [[X3]], [[Y3]] |
| ; NOCHK-NEXT: [[DST3:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 3 |
| ; NOCHK-NEXT: store double [[D3]], ptr [[DST3]], align 8 |
| ; NOCHK-NEXT: [[X4P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 4 |
| ; NOCHK-NEXT: [[X4:%.*]] = load double, ptr [[X4P]], align 8 |
| ; NOCHK-NEXT: [[Y4P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 4 |
| ; NOCHK-NEXT: [[Y4:%.*]] = load double, ptr [[Y4P]], align 8 |
| ; NOCHK-NEXT: [[D4:%.*]] = fdiv double [[X4]], [[Y4]] |
| ; NOCHK-NEXT: [[DST4:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 4 |
| ; NOCHK-NEXT: store double [[D4]], ptr [[DST4]], align 8 |
| ; NOCHK-NEXT: [[X5P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 5 |
| ; NOCHK-NEXT: [[X5:%.*]] = load double, ptr [[X5P]], align 8 |
| ; NOCHK-NEXT: [[Y5P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 5 |
| ; NOCHK-NEXT: [[Y5:%.*]] = load double, ptr [[Y5P]], align 8 |
| ; NOCHK-NEXT: [[D5:%.*]] = fdiv double [[X5]], [[Y5]] |
| ; NOCHK-NEXT: [[DST5:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 5 |
| ; NOCHK-NEXT: store double [[D5]], ptr [[DST5]], align 8 |
| ; NOCHK-NEXT: [[X6P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 6 |
| ; NOCHK-NEXT: [[X6:%.*]] = load double, ptr [[X6P]], align 8 |
| ; NOCHK-NEXT: [[Y6P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 6 |
| ; NOCHK-NEXT: [[Y6:%.*]] = load double, ptr [[Y6P]], align 8 |
| ; NOCHK-NEXT: [[D6:%.*]] = fdiv double [[X6]], [[Y6]] |
| ; NOCHK-NEXT: [[DST6:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 6 |
| ; NOCHK-NEXT: store double [[D6]], ptr [[DST6]], align 8 |
| ; NOCHK-NEXT: [[X7P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 7 |
| ; NOCHK-NEXT: [[X7:%.*]] = load double, ptr [[X7P]], align 8 |
| ; NOCHK-NEXT: [[Y7P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 7 |
| ; NOCHK-NEXT: [[Y7:%.*]] = load double, ptr [[Y7P]], align 8 |
| ; NOCHK-NEXT: [[D7:%.*]] = fdiv double [[X7]], [[Y7]] |
| ; NOCHK-NEXT: [[DST7:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 7 |
| ; NOCHK-NEXT: store double [[D7]], ptr [[DST7]], align 8 |
| ; NOCHK-NEXT: call void @nodup() |
| ; NOCHK-NEXT: ret void |
| ; |
| entry: |
| %x0 = load double, ptr %x, align 8 |
| %y0 = load double, ptr %y, align 8 |
| %d0 = fdiv double %x0, %y0 |
| store double %d0, ptr %dst, align 8 |
| %x1p = getelementptr inbounds double, ptr %x, i64 1 |
| %x1 = load double, ptr %x1p, align 8 |
| %y1p = getelementptr inbounds double, ptr %y, i64 1 |
| %y1 = load double, ptr %y1p, align 8 |
| %d1 = fdiv double %x1, %y1 |
| %dst1 = getelementptr inbounds double, ptr %dst, i64 1 |
| store double %d1, ptr %dst1, align 8 |
| %x2p = getelementptr inbounds double, ptr %x, i64 2 |
| %x2 = load double, ptr %x2p, align 8 |
| %y2p = getelementptr inbounds double, ptr %y, i64 2 |
| %y2 = load double, ptr %y2p, align 8 |
| %d2 = fdiv double %x2, %y2 |
| %dst2 = getelementptr inbounds double, ptr %dst, i64 2 |
| store double %d2, ptr %dst2, align 8 |
| %x3p = getelementptr inbounds double, ptr %x, i64 3 |
| %x3 = load double, ptr %x3p, align 8 |
| %y3p = getelementptr inbounds double, ptr %y, i64 3 |
| %y3 = load double, ptr %y3p, align 8 |
| %d3 = fdiv double %x3, %y3 |
| %dst3 = getelementptr inbounds double, ptr %dst, i64 3 |
| store double %d3, ptr %dst3, align 8 |
| %x4p = getelementptr inbounds double, ptr %x, i64 4 |
| %x4 = load double, ptr %x4p, align 8 |
| %y4p = getelementptr inbounds double, ptr %y, i64 4 |
| %y4 = load double, ptr %y4p, align 8 |
| %d4 = fdiv double %x4, %y4 |
| %dst4 = getelementptr inbounds double, ptr %dst, i64 4 |
| store double %d4, ptr %dst4, align 8 |
| %x5p = getelementptr inbounds double, ptr %x, i64 5 |
| %x5 = load double, ptr %x5p, align 8 |
| %y5p = getelementptr inbounds double, ptr %y, i64 5 |
| %y5 = load double, ptr %y5p, align 8 |
| %d5 = fdiv double %x5, %y5 |
| %dst5 = getelementptr inbounds double, ptr %dst, i64 5 |
| store double %d5, ptr %dst5, align 8 |
| %x6p = getelementptr inbounds double, ptr %x, i64 6 |
| %x6 = load double, ptr %x6p, align 8 |
| %y6p = getelementptr inbounds double, ptr %y, i64 6 |
| %y6 = load double, ptr %y6p, align 8 |
| %d6 = fdiv double %x6, %y6 |
| %dst6 = getelementptr inbounds double, ptr %dst, i64 6 |
| store double %d6, ptr %dst6, align 8 |
| %x7p = getelementptr inbounds double, ptr %x, i64 7 |
| %x7 = load double, ptr %x7p, align 8 |
| %y7p = getelementptr inbounds double, ptr %y, i64 7 |
| %y7 = load double, ptr %y7p, align 8 |
| %d7 = fdiv double %x7, %y7 |
| %dst7 = getelementptr inbounds double, ptr %dst, i64 7 |
| store double %d7, ptr %dst7, align 8 |
| call void @nodup() |
| ret void |
| } |
| |
| define void @reject_musttail(ptr %dst, ptr %x, ptr %y) { |
| ; CHECK-LABEL: define void @reject_musttail( |
| ; CHECK-SAME: ptr [[DST:%.*]], ptr [[X:%.*]], ptr [[Y:%.*]]) #[[ATTR1]] { |
| ; CHECK-NEXT: [[ENTRY:.*:]] |
| ; CHECK-NEXT: [[X0:%.*]] = load double, ptr [[X]], align 8 |
| ; CHECK-NEXT: [[Y0:%.*]] = load double, ptr [[Y]], align 8 |
| ; CHECK-NEXT: [[D0:%.*]] = fdiv double [[X0]], [[Y0]] |
| ; CHECK-NEXT: store double [[D0]], ptr [[DST]], align 8 |
| ; CHECK-NEXT: [[X1P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 1 |
| ; CHECK-NEXT: [[X1:%.*]] = load double, ptr [[X1P]], align 8 |
| ; CHECK-NEXT: [[Y1P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 1 |
| ; CHECK-NEXT: [[Y1:%.*]] = load double, ptr [[Y1P]], align 8 |
| ; CHECK-NEXT: [[D1:%.*]] = fdiv double [[X1]], [[Y1]] |
| ; CHECK-NEXT: [[DST1:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 1 |
| ; CHECK-NEXT: store double [[D1]], ptr [[DST1]], align 8 |
| ; CHECK-NEXT: [[X2P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 2 |
| ; CHECK-NEXT: [[X2:%.*]] = load double, ptr [[X2P]], align 8 |
| ; CHECK-NEXT: [[Y2P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 2 |
| ; CHECK-NEXT: [[Y2:%.*]] = load double, ptr [[Y2P]], align 8 |
| ; CHECK-NEXT: [[D2:%.*]] = fdiv double [[X2]], [[Y2]] |
| ; CHECK-NEXT: [[DST2:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 2 |
| ; CHECK-NEXT: store double [[D2]], ptr [[DST2]], align 8 |
| ; CHECK-NEXT: [[X3P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 3 |
| ; CHECK-NEXT: [[X3:%.*]] = load double, ptr [[X3P]], align 8 |
| ; CHECK-NEXT: [[Y3P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 3 |
| ; CHECK-NEXT: [[Y3:%.*]] = load double, ptr [[Y3P]], align 8 |
| ; CHECK-NEXT: [[D3:%.*]] = fdiv double [[X3]], [[Y3]] |
| ; CHECK-NEXT: [[DST3:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 3 |
| ; CHECK-NEXT: store double [[D3]], ptr [[DST3]], align 8 |
| ; CHECK-NEXT: [[X4P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 4 |
| ; CHECK-NEXT: [[X4:%.*]] = load double, ptr [[X4P]], align 8 |
| ; CHECK-NEXT: [[Y4P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 4 |
| ; CHECK-NEXT: [[Y4:%.*]] = load double, ptr [[Y4P]], align 8 |
| ; CHECK-NEXT: [[D4:%.*]] = fdiv double [[X4]], [[Y4]] |
| ; CHECK-NEXT: [[DST4:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 4 |
| ; CHECK-NEXT: store double [[D4]], ptr [[DST4]], align 8 |
| ; CHECK-NEXT: [[X5P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 5 |
| ; CHECK-NEXT: [[X5:%.*]] = load double, ptr [[X5P]], align 8 |
| ; CHECK-NEXT: [[Y5P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 5 |
| ; CHECK-NEXT: [[Y5:%.*]] = load double, ptr [[Y5P]], align 8 |
| ; CHECK-NEXT: [[D5:%.*]] = fdiv double [[X5]], [[Y5]] |
| ; CHECK-NEXT: [[DST5:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 5 |
| ; CHECK-NEXT: store double [[D5]], ptr [[DST5]], align 8 |
| ; CHECK-NEXT: [[X6P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 6 |
| ; CHECK-NEXT: [[X6:%.*]] = load double, ptr [[X6P]], align 8 |
| ; CHECK-NEXT: [[Y6P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 6 |
| ; CHECK-NEXT: [[Y6:%.*]] = load double, ptr [[Y6P]], align 8 |
| ; CHECK-NEXT: [[D6:%.*]] = fdiv double [[X6]], [[Y6]] |
| ; CHECK-NEXT: [[DST6:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 6 |
| ; CHECK-NEXT: store double [[D6]], ptr [[DST6]], align 8 |
| ; CHECK-NEXT: [[X7P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 7 |
| ; CHECK-NEXT: [[X7:%.*]] = load double, ptr [[X7P]], align 8 |
| ; CHECK-NEXT: [[Y7P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 7 |
| ; CHECK-NEXT: [[Y7:%.*]] = load double, ptr [[Y7P]], align 8 |
| ; CHECK-NEXT: [[D7:%.*]] = fdiv double [[X7]], [[Y7]] |
| ; CHECK-NEXT: [[DST7:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 7 |
| ; CHECK-NEXT: store double [[D7]], ptr [[DST7]], align 8 |
| ; CHECK-NEXT: musttail call void @musttail_callee(ptr [[DST]], ptr [[X]], ptr [[Y]]) |
| ; CHECK-NEXT: ret void |
| ; |
| ; NOCHK-LABEL: define void @reject_musttail( |
| ; NOCHK-SAME: ptr [[DST:%.*]], ptr [[X:%.*]], ptr [[Y:%.*]]) #[[ATTR1]] { |
| ; NOCHK-NEXT: [[ENTRY:.*:]] |
| ; NOCHK-NEXT: [[X0:%.*]] = load double, ptr [[X]], align 8 |
| ; NOCHK-NEXT: [[Y0:%.*]] = load double, ptr [[Y]], align 8 |
| ; NOCHK-NEXT: [[D0:%.*]] = fdiv double [[X0]], [[Y0]] |
| ; NOCHK-NEXT: store double [[D0]], ptr [[DST]], align 8 |
| ; NOCHK-NEXT: [[X1P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 1 |
| ; NOCHK-NEXT: [[X1:%.*]] = load double, ptr [[X1P]], align 8 |
| ; NOCHK-NEXT: [[Y1P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 1 |
| ; NOCHK-NEXT: [[Y1:%.*]] = load double, ptr [[Y1P]], align 8 |
| ; NOCHK-NEXT: [[D1:%.*]] = fdiv double [[X1]], [[Y1]] |
| ; NOCHK-NEXT: [[DST1:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 1 |
| ; NOCHK-NEXT: store double [[D1]], ptr [[DST1]], align 8 |
| ; NOCHK-NEXT: [[X2P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 2 |
| ; NOCHK-NEXT: [[X2:%.*]] = load double, ptr [[X2P]], align 8 |
| ; NOCHK-NEXT: [[Y2P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 2 |
| ; NOCHK-NEXT: [[Y2:%.*]] = load double, ptr [[Y2P]], align 8 |
| ; NOCHK-NEXT: [[D2:%.*]] = fdiv double [[X2]], [[Y2]] |
| ; NOCHK-NEXT: [[DST2:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 2 |
| ; NOCHK-NEXT: store double [[D2]], ptr [[DST2]], align 8 |
| ; NOCHK-NEXT: [[X3P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 3 |
| ; NOCHK-NEXT: [[X3:%.*]] = load double, ptr [[X3P]], align 8 |
| ; NOCHK-NEXT: [[Y3P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 3 |
| ; NOCHK-NEXT: [[Y3:%.*]] = load double, ptr [[Y3P]], align 8 |
| ; NOCHK-NEXT: [[D3:%.*]] = fdiv double [[X3]], [[Y3]] |
| ; NOCHK-NEXT: [[DST3:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 3 |
| ; NOCHK-NEXT: store double [[D3]], ptr [[DST3]], align 8 |
| ; NOCHK-NEXT: [[X4P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 4 |
| ; NOCHK-NEXT: [[X4:%.*]] = load double, ptr [[X4P]], align 8 |
| ; NOCHK-NEXT: [[Y4P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 4 |
| ; NOCHK-NEXT: [[Y4:%.*]] = load double, ptr [[Y4P]], align 8 |
| ; NOCHK-NEXT: [[D4:%.*]] = fdiv double [[X4]], [[Y4]] |
| ; NOCHK-NEXT: [[DST4:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 4 |
| ; NOCHK-NEXT: store double [[D4]], ptr [[DST4]], align 8 |
| ; NOCHK-NEXT: [[X5P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 5 |
| ; NOCHK-NEXT: [[X5:%.*]] = load double, ptr [[X5P]], align 8 |
| ; NOCHK-NEXT: [[Y5P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 5 |
| ; NOCHK-NEXT: [[Y5:%.*]] = load double, ptr [[Y5P]], align 8 |
| ; NOCHK-NEXT: [[D5:%.*]] = fdiv double [[X5]], [[Y5]] |
| ; NOCHK-NEXT: [[DST5:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 5 |
| ; NOCHK-NEXT: store double [[D5]], ptr [[DST5]], align 8 |
| ; NOCHK-NEXT: [[X6P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 6 |
| ; NOCHK-NEXT: [[X6:%.*]] = load double, ptr [[X6P]], align 8 |
| ; NOCHK-NEXT: [[Y6P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 6 |
| ; NOCHK-NEXT: [[Y6:%.*]] = load double, ptr [[Y6P]], align 8 |
| ; NOCHK-NEXT: [[D6:%.*]] = fdiv double [[X6]], [[Y6]] |
| ; NOCHK-NEXT: [[DST6:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 6 |
| ; NOCHK-NEXT: store double [[D6]], ptr [[DST6]], align 8 |
| ; NOCHK-NEXT: [[X7P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 7 |
| ; NOCHK-NEXT: [[X7:%.*]] = load double, ptr [[X7P]], align 8 |
| ; NOCHK-NEXT: [[Y7P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 7 |
| ; NOCHK-NEXT: [[Y7:%.*]] = load double, ptr [[Y7P]], align 8 |
| ; NOCHK-NEXT: [[D7:%.*]] = fdiv double [[X7]], [[Y7]] |
| ; NOCHK-NEXT: [[DST7:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 7 |
| ; NOCHK-NEXT: store double [[D7]], ptr [[DST7]], align 8 |
| ; NOCHK-NEXT: musttail call void @musttail_callee(ptr [[DST]], ptr [[X]], ptr [[Y]]) |
| ; NOCHK-NEXT: ret void |
| ; |
| entry: |
| %x0 = load double, ptr %x, align 8 |
| %y0 = load double, ptr %y, align 8 |
| %d0 = fdiv double %x0, %y0 |
| store double %d0, ptr %dst, align 8 |
| %x1p = getelementptr inbounds double, ptr %x, i64 1 |
| %x1 = load double, ptr %x1p, align 8 |
| %y1p = getelementptr inbounds double, ptr %y, i64 1 |
| %y1 = load double, ptr %y1p, align 8 |
| %d1 = fdiv double %x1, %y1 |
| %dst1 = getelementptr inbounds double, ptr %dst, i64 1 |
| store double %d1, ptr %dst1, align 8 |
| %x2p = getelementptr inbounds double, ptr %x, i64 2 |
| %x2 = load double, ptr %x2p, align 8 |
| %y2p = getelementptr inbounds double, ptr %y, i64 2 |
| %y2 = load double, ptr %y2p, align 8 |
| %d2 = fdiv double %x2, %y2 |
| %dst2 = getelementptr inbounds double, ptr %dst, i64 2 |
| store double %d2, ptr %dst2, align 8 |
| %x3p = getelementptr inbounds double, ptr %x, i64 3 |
| %x3 = load double, ptr %x3p, align 8 |
| %y3p = getelementptr inbounds double, ptr %y, i64 3 |
| %y3 = load double, ptr %y3p, align 8 |
| %d3 = fdiv double %x3, %y3 |
| %dst3 = getelementptr inbounds double, ptr %dst, i64 3 |
| store double %d3, ptr %dst3, align 8 |
| %x4p = getelementptr inbounds double, ptr %x, i64 4 |
| %x4 = load double, ptr %x4p, align 8 |
| %y4p = getelementptr inbounds double, ptr %y, i64 4 |
| %y4 = load double, ptr %y4p, align 8 |
| %d4 = fdiv double %x4, %y4 |
| %dst4 = getelementptr inbounds double, ptr %dst, i64 4 |
| store double %d4, ptr %dst4, align 8 |
| %x5p = getelementptr inbounds double, ptr %x, i64 5 |
| %x5 = load double, ptr %x5p, align 8 |
| %y5p = getelementptr inbounds double, ptr %y, i64 5 |
| %y5 = load double, ptr %y5p, align 8 |
| %d5 = fdiv double %x5, %y5 |
| %dst5 = getelementptr inbounds double, ptr %dst, i64 5 |
| store double %d5, ptr %dst5, align 8 |
| %x6p = getelementptr inbounds double, ptr %x, i64 6 |
| %x6 = load double, ptr %x6p, align 8 |
| %y6p = getelementptr inbounds double, ptr %y, i64 6 |
| %y6 = load double, ptr %y6p, align 8 |
| %d6 = fdiv double %x6, %y6 |
| %dst6 = getelementptr inbounds double, ptr %dst, i64 6 |
| store double %d6, ptr %dst6, align 8 |
| %x7p = getelementptr inbounds double, ptr %x, i64 7 |
| %x7 = load double, ptr %x7p, align 8 |
| %y7p = getelementptr inbounds double, ptr %y, i64 7 |
| %y7 = load double, ptr %y7p, align 8 |
| %d7 = fdiv double %x7, %y7 |
| %dst7 = getelementptr inbounds double, ptr %dst, i64 7 |
| store double %d7, ptr %dst7, align 8 |
| musttail call void @musttail_callee(ptr %dst, ptr %x, ptr %y) |
| ret void |
| } |
| |
| define void @reject_outside_operand_vectorized(ptr %q, ptr %p) { |
| ; CHECK-LABEL: define void @reject_outside_operand_vectorized( |
| ; CHECK-SAME: ptr [[Q:%.*]], ptr [[P:%.*]]) #[[ATTR1]] { |
| ; CHECK-NEXT: [[ENTRY:.*]]: |
| ; CHECK-NEXT: [[BUF:%.*]] = alloca [5 x i32], align 16 |
| ; CHECK-NEXT: br i1 true, label %[[PRE:.*]], label %[[BODY:.*]] |
| ; CHECK: [[PRE]]: |
| ; CHECK-NEXT: store i32 0, ptr [[BUF]], align 4 |
| ; CHECK-NEXT: [[T1:%.*]] = getelementptr i8, ptr [[BUF]], i64 4 |
| ; CHECK-NEXT: [[PRE1:%.*]] = load i32, ptr [[T1]], align 4 |
| ; CHECK-NEXT: [[T2:%.*]] = getelementptr i8, ptr [[BUF]], i64 8 |
| ; CHECK-NEXT: [[PRE2:%.*]] = load i32, ptr [[T2]], align 8 |
| ; CHECK-NEXT: br label %[[BODY]] |
| ; CHECK: [[BODY]]: |
| ; CHECK-NEXT: [[PH1:%.*]] = phi i32 [ [[PRE2]], %[[PRE]] ], [ 0, %[[ENTRY]] ] |
| ; CHECK-NEXT: [[PH2:%.*]] = phi i32 [ [[PRE1]], %[[PRE]] ], [ 0, %[[ENTRY]] ] |
| ; CHECK-NEXT: store i32 0, ptr null, align 4 |
| ; CHECK-NEXT: [[Q0:%.*]] = load i32, ptr [[Q]], align 4 |
| ; CHECK-NEXT: [[Q0O:%.*]] = or i32 [[Q0]], 1 |
| ; CHECK-NEXT: store i32 [[Q0O]], ptr [[Q]], align 4 |
| ; CHECK-NEXT: [[P4:%.*]] = getelementptr i8, ptr [[P]], i64 4 |
| ; CHECK-NEXT: [[L4:%.*]] = load i32, ptr [[P4]], align 4 |
| ; CHECK-NEXT: [[O4:%.*]] = or i32 [[PH2]], [[L4]] |
| ; CHECK-NEXT: store i32 [[O4]], ptr [[P4]], align 4 |
| ; CHECK-NEXT: [[Q1:%.*]] = load i32, ptr [[Q]], align 4 |
| ; CHECK-NEXT: [[Q1O:%.*]] = or i32 [[Q1]], 1 |
| ; CHECK-NEXT: store i32 [[Q1O]], ptr [[Q]], align 4 |
| ; CHECK-NEXT: [[P8:%.*]] = getelementptr i8, ptr [[P]], i64 8 |
| ; CHECK-NEXT: [[L8:%.*]] = load i32, ptr [[P8]], align 4 |
| ; CHECK-NEXT: [[O8:%.*]] = or i32 [[PH1]], [[L8]] |
| ; CHECK-NEXT: store i32 [[O8]], ptr [[P8]], align 4 |
| ; CHECK-NEXT: [[Q2:%.*]] = load i32, ptr [[Q]], align 4 |
| ; CHECK-NEXT: [[Q2O:%.*]] = or i32 [[Q2]], 1 |
| ; CHECK-NEXT: store i32 [[Q2O]], ptr [[Q]], align 4 |
| ; CHECK-NEXT: [[P12:%.*]] = getelementptr i8, ptr [[P]], i64 12 |
| ; CHECK-NEXT: [[L12:%.*]] = load i32, ptr [[P12]], align 4 |
| ; CHECK-NEXT: [[O12:%.*]] = or i32 [[L12]], 1 |
| ; CHECK-NEXT: store i32 [[O12]], ptr [[P12]], align 4 |
| ; CHECK-NEXT: [[Q3:%.*]] = load i32, ptr [[Q]], align 4 |
| ; CHECK-NEXT: [[Q3O:%.*]] = or i32 [[Q3]], 1 |
| ; CHECK-NEXT: store i32 [[Q3O]], ptr [[Q]], align 4 |
| ; CHECK-NEXT: [[P16:%.*]] = getelementptr i8, ptr [[P]], i64 16 |
| ; CHECK-NEXT: [[L16:%.*]] = load i32, ptr [[P16]], align 4 |
| ; CHECK-NEXT: [[O16:%.*]] = or i32 [[L16]], 1 |
| ; CHECK-NEXT: store i32 [[O16]], ptr [[P]], align 4 |
| ; CHECK-NEXT: [[Q4:%.*]] = load i32, ptr [[Q]], align 4 |
| ; CHECK-NEXT: [[Q4O:%.*]] = or i32 [[Q4]], 1 |
| ; CHECK-NEXT: store i32 [[Q4O]], ptr [[Q]], align 4 |
| ; CHECK-NEXT: ret void |
| ; |
| ; NOCHK-LABEL: define void @reject_outside_operand_vectorized( |
| ; NOCHK-SAME: ptr [[Q:%.*]], ptr [[P:%.*]]) #[[ATTR1]] { |
| ; NOCHK-NEXT: [[ENTRY:.*]]: |
| ; NOCHK-NEXT: [[BUF:%.*]] = alloca [5 x i32], align 16 |
| ; NOCHK-NEXT: br i1 true, label %[[PRE:.*]], label %[[BODY:.*]] |
| ; NOCHK: [[PRE]]: |
| ; NOCHK-NEXT: store i32 0, ptr [[BUF]], align 4 |
| ; NOCHK-NEXT: [[T1:%.*]] = getelementptr i8, ptr [[BUF]], i64 4 |
| ; NOCHK-NEXT: [[PRE1:%.*]] = load i32, ptr [[T1]], align 4 |
| ; NOCHK-NEXT: [[T2:%.*]] = getelementptr i8, ptr [[BUF]], i64 8 |
| ; NOCHK-NEXT: [[PRE2:%.*]] = load i32, ptr [[T2]], align 8 |
| ; NOCHK-NEXT: br label %[[BODY]] |
| ; NOCHK: [[BODY]]: |
| ; NOCHK-NEXT: [[PH1:%.*]] = phi i32 [ [[PRE2]], %[[PRE]] ], [ 0, %[[ENTRY]] ] |
| ; NOCHK-NEXT: [[PH2:%.*]] = phi i32 [ [[PRE1]], %[[PRE]] ], [ 0, %[[ENTRY]] ] |
| ; NOCHK-NEXT: store i32 0, ptr null, align 4 |
| ; NOCHK-NEXT: [[Q0:%.*]] = load i32, ptr [[Q]], align 4 |
| ; NOCHK-NEXT: [[Q0O:%.*]] = or i32 [[Q0]], 1 |
| ; NOCHK-NEXT: store i32 [[Q0O]], ptr [[Q]], align 4 |
| ; NOCHK-NEXT: [[P4:%.*]] = getelementptr i8, ptr [[P]], i64 4 |
| ; NOCHK-NEXT: [[L4:%.*]] = load i32, ptr [[P4]], align 4 |
| ; NOCHK-NEXT: [[O4:%.*]] = or i32 [[PH2]], [[L4]] |
| ; NOCHK-NEXT: store i32 [[O4]], ptr [[P4]], align 4 |
| ; NOCHK-NEXT: [[Q1:%.*]] = load i32, ptr [[Q]], align 4 |
| ; NOCHK-NEXT: [[Q1O:%.*]] = or i32 [[Q1]], 1 |
| ; NOCHK-NEXT: store i32 [[Q1O]], ptr [[Q]], align 4 |
| ; NOCHK-NEXT: [[P8:%.*]] = getelementptr i8, ptr [[P]], i64 8 |
| ; NOCHK-NEXT: [[L8:%.*]] = load i32, ptr [[P8]], align 4 |
| ; NOCHK-NEXT: [[O8:%.*]] = or i32 [[PH1]], [[L8]] |
| ; NOCHK-NEXT: store i32 [[O8]], ptr [[P8]], align 4 |
| ; NOCHK-NEXT: [[Q2:%.*]] = load i32, ptr [[Q]], align 4 |
| ; NOCHK-NEXT: [[Q2O:%.*]] = or i32 [[Q2]], 1 |
| ; NOCHK-NEXT: store i32 [[Q2O]], ptr [[Q]], align 4 |
| ; NOCHK-NEXT: [[P12:%.*]] = getelementptr i8, ptr [[P]], i64 12 |
| ; NOCHK-NEXT: [[L12:%.*]] = load i32, ptr [[P12]], align 4 |
| ; NOCHK-NEXT: [[O12:%.*]] = or i32 [[L12]], 1 |
| ; NOCHK-NEXT: store i32 [[O12]], ptr [[P12]], align 4 |
| ; NOCHK-NEXT: [[Q3:%.*]] = load i32, ptr [[Q]], align 4 |
| ; NOCHK-NEXT: [[Q3O:%.*]] = or i32 [[Q3]], 1 |
| ; NOCHK-NEXT: store i32 [[Q3O]], ptr [[Q]], align 4 |
| ; NOCHK-NEXT: [[P16:%.*]] = getelementptr i8, ptr [[P]], i64 16 |
| ; NOCHK-NEXT: [[L16:%.*]] = load i32, ptr [[P16]], align 4 |
| ; NOCHK-NEXT: [[O16:%.*]] = or i32 [[L16]], 1 |
| ; NOCHK-NEXT: store i32 [[O16]], ptr [[P]], align 4 |
| ; NOCHK-NEXT: [[Q4:%.*]] = load i32, ptr [[Q]], align 4 |
| ; NOCHK-NEXT: [[Q4O:%.*]] = or i32 [[Q4]], 1 |
| ; NOCHK-NEXT: store i32 [[Q4O]], ptr [[Q]], align 4 |
| ; NOCHK-NEXT: ret void |
| ; |
| entry: |
| %buf = alloca [5 x i32], align 16 |
| br i1 true, label %pre, label %body |
| |
| pre: |
| store i32 0, ptr %buf, align 4 |
| %t1 = getelementptr i8, ptr %buf, i64 4 |
| %pre1 = load i32, ptr %t1, align 4 |
| %t2 = getelementptr i8, ptr %buf, i64 8 |
| %pre2 = load i32, ptr %t2, align 8 |
| br label %body |
| |
| body: |
| %ph1 = phi i32 [ %pre2, %pre ], [ 0, %entry ] |
| %ph2 = phi i32 [ %pre1, %pre ], [ 0, %entry ] |
| store i32 0, ptr null, align 4 |
| %q0 = load i32, ptr %q, align 4 |
| %q0o = or i32 %q0, 1 |
| store i32 %q0o, ptr %q, align 4 |
| %p4 = getelementptr i8, ptr %p, i64 4 |
| %l4 = load i32, ptr %p4, align 4 |
| %o4 = or i32 %ph2, %l4 |
| store i32 %o4, ptr %p4, align 4 |
| %q1 = load i32, ptr %q, align 4 |
| %q1o = or i32 %q1, 1 |
| store i32 %q1o, ptr %q, align 4 |
| %p8 = getelementptr i8, ptr %p, i64 8 |
| %l8 = load i32, ptr %p8, align 4 |
| %o8 = or i32 %ph1, %l8 |
| store i32 %o8, ptr %p8, align 4 |
| %q2 = load i32, ptr %q, align 4 |
| %q2o = or i32 %q2, 1 |
| store i32 %q2o, ptr %q, align 4 |
| %p12 = getelementptr i8, ptr %p, i64 12 |
| %l12 = load i32, ptr %p12, align 4 |
| %o12 = or i32 %l12, 1 |
| store i32 %o12, ptr %p12, align 4 |
| %q3 = load i32, ptr %q, align 4 |
| %q3o = or i32 %q3, 1 |
| store i32 %q3o, ptr %q, align 4 |
| %p16 = getelementptr i8, ptr %p, i64 16 |
| %l16 = load i32, ptr %p16, align 4 |
| %o16 = or i32 %l16, 1 |
| store i32 %o16, ptr %p, align 4 |
| %q4 = load i32, ptr %q, align 4 |
| %q4o = or i32 %q4, 1 |
| store i32 %q4o, ptr %q, align 4 |
| ret void |
| } |
| |
| define void @reject_optsize(ptr %dst, ptr %x, ptr %y) optsize { |
| ; CHECK-LABEL: define void @reject_optsize( |
| ; CHECK-SAME: ptr [[DST:%.*]], ptr [[X:%.*]], ptr [[Y:%.*]]) #[[ATTR2:[0-9]+]] { |
| ; CHECK-NEXT: [[ENTRY:.*:]] |
| ; CHECK-NEXT: [[X0:%.*]] = load double, ptr [[X]], align 8 |
| ; CHECK-NEXT: [[Y0:%.*]] = load double, ptr [[Y]], align 8 |
| ; CHECK-NEXT: [[D0:%.*]] = fdiv double [[X0]], [[Y0]] |
| ; CHECK-NEXT: store double [[D0]], ptr [[DST]], align 8 |
| ; CHECK-NEXT: [[X1P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 1 |
| ; CHECK-NEXT: [[X1:%.*]] = load double, ptr [[X1P]], align 8 |
| ; CHECK-NEXT: [[Y1P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 1 |
| ; CHECK-NEXT: [[Y1:%.*]] = load double, ptr [[Y1P]], align 8 |
| ; CHECK-NEXT: [[D1:%.*]] = fdiv double [[X1]], [[Y1]] |
| ; CHECK-NEXT: [[DST1:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 1 |
| ; CHECK-NEXT: store double [[D1]], ptr [[DST1]], align 8 |
| ; CHECK-NEXT: [[X2P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 2 |
| ; CHECK-NEXT: [[X2:%.*]] = load double, ptr [[X2P]], align 8 |
| ; CHECK-NEXT: [[Y2P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 2 |
| ; CHECK-NEXT: [[Y2:%.*]] = load double, ptr [[Y2P]], align 8 |
| ; CHECK-NEXT: [[D2:%.*]] = fdiv double [[X2]], [[Y2]] |
| ; CHECK-NEXT: [[DST2:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 2 |
| ; CHECK-NEXT: store double [[D2]], ptr [[DST2]], align 8 |
| ; CHECK-NEXT: [[X3P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 3 |
| ; CHECK-NEXT: [[X3:%.*]] = load double, ptr [[X3P]], align 8 |
| ; CHECK-NEXT: [[Y3P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 3 |
| ; CHECK-NEXT: [[Y3:%.*]] = load double, ptr [[Y3P]], align 8 |
| ; CHECK-NEXT: [[D3:%.*]] = fdiv double [[X3]], [[Y3]] |
| ; CHECK-NEXT: [[DST3:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 3 |
| ; CHECK-NEXT: store double [[D3]], ptr [[DST3]], align 8 |
| ; CHECK-NEXT: [[X4P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 4 |
| ; CHECK-NEXT: [[X4:%.*]] = load double, ptr [[X4P]], align 8 |
| ; CHECK-NEXT: [[Y4P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 4 |
| ; CHECK-NEXT: [[Y4:%.*]] = load double, ptr [[Y4P]], align 8 |
| ; CHECK-NEXT: [[D4:%.*]] = fdiv double [[X4]], [[Y4]] |
| ; CHECK-NEXT: [[DST4:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 4 |
| ; CHECK-NEXT: store double [[D4]], ptr [[DST4]], align 8 |
| ; CHECK-NEXT: [[X5P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 5 |
| ; CHECK-NEXT: [[X5:%.*]] = load double, ptr [[X5P]], align 8 |
| ; CHECK-NEXT: [[Y5P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 5 |
| ; CHECK-NEXT: [[Y5:%.*]] = load double, ptr [[Y5P]], align 8 |
| ; CHECK-NEXT: [[D5:%.*]] = fdiv double [[X5]], [[Y5]] |
| ; CHECK-NEXT: [[DST5:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 5 |
| ; CHECK-NEXT: store double [[D5]], ptr [[DST5]], align 8 |
| ; CHECK-NEXT: [[X6P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 6 |
| ; CHECK-NEXT: [[X6:%.*]] = load double, ptr [[X6P]], align 8 |
| ; CHECK-NEXT: [[Y6P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 6 |
| ; CHECK-NEXT: [[Y6:%.*]] = load double, ptr [[Y6P]], align 8 |
| ; CHECK-NEXT: [[D6:%.*]] = fdiv double [[X6]], [[Y6]] |
| ; CHECK-NEXT: [[DST6:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 6 |
| ; CHECK-NEXT: store double [[D6]], ptr [[DST6]], align 8 |
| ; CHECK-NEXT: [[X7P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 7 |
| ; CHECK-NEXT: [[X7:%.*]] = load double, ptr [[X7P]], align 8 |
| ; CHECK-NEXT: [[Y7P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 7 |
| ; CHECK-NEXT: [[Y7:%.*]] = load double, ptr [[Y7P]], align 8 |
| ; CHECK-NEXT: [[D7:%.*]] = fdiv double [[X7]], [[Y7]] |
| ; CHECK-NEXT: [[DST7:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 7 |
| ; CHECK-NEXT: store double [[D7]], ptr [[DST7]], align 8 |
| ; CHECK-NEXT: ret void |
| ; |
| ; NOCHK-LABEL: define void @reject_optsize( |
| ; NOCHK-SAME: ptr [[DST:%.*]], ptr [[X:%.*]], ptr [[Y:%.*]]) #[[ATTR2:[0-9]+]] { |
| ; NOCHK-NEXT: [[ENTRY:.*:]] |
| ; NOCHK-NEXT: [[X0:%.*]] = load double, ptr [[X]], align 8 |
| ; NOCHK-NEXT: [[Y0:%.*]] = load double, ptr [[Y]], align 8 |
| ; NOCHK-NEXT: [[D0:%.*]] = fdiv double [[X0]], [[Y0]] |
| ; NOCHK-NEXT: store double [[D0]], ptr [[DST]], align 8 |
| ; NOCHK-NEXT: [[X1P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 1 |
| ; NOCHK-NEXT: [[X1:%.*]] = load double, ptr [[X1P]], align 8 |
| ; NOCHK-NEXT: [[Y1P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 1 |
| ; NOCHK-NEXT: [[Y1:%.*]] = load double, ptr [[Y1P]], align 8 |
| ; NOCHK-NEXT: [[D1:%.*]] = fdiv double [[X1]], [[Y1]] |
| ; NOCHK-NEXT: [[DST1:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 1 |
| ; NOCHK-NEXT: store double [[D1]], ptr [[DST1]], align 8 |
| ; NOCHK-NEXT: [[X2P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 2 |
| ; NOCHK-NEXT: [[X2:%.*]] = load double, ptr [[X2P]], align 8 |
| ; NOCHK-NEXT: [[Y2P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 2 |
| ; NOCHK-NEXT: [[Y2:%.*]] = load double, ptr [[Y2P]], align 8 |
| ; NOCHK-NEXT: [[D2:%.*]] = fdiv double [[X2]], [[Y2]] |
| ; NOCHK-NEXT: [[DST2:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 2 |
| ; NOCHK-NEXT: store double [[D2]], ptr [[DST2]], align 8 |
| ; NOCHK-NEXT: [[X3P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 3 |
| ; NOCHK-NEXT: [[X3:%.*]] = load double, ptr [[X3P]], align 8 |
| ; NOCHK-NEXT: [[Y3P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 3 |
| ; NOCHK-NEXT: [[Y3:%.*]] = load double, ptr [[Y3P]], align 8 |
| ; NOCHK-NEXT: [[D3:%.*]] = fdiv double [[X3]], [[Y3]] |
| ; NOCHK-NEXT: [[DST3:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 3 |
| ; NOCHK-NEXT: store double [[D3]], ptr [[DST3]], align 8 |
| ; NOCHK-NEXT: [[X4P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 4 |
| ; NOCHK-NEXT: [[X4:%.*]] = load double, ptr [[X4P]], align 8 |
| ; NOCHK-NEXT: [[Y4P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 4 |
| ; NOCHK-NEXT: [[Y4:%.*]] = load double, ptr [[Y4P]], align 8 |
| ; NOCHK-NEXT: [[D4:%.*]] = fdiv double [[X4]], [[Y4]] |
| ; NOCHK-NEXT: [[DST4:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 4 |
| ; NOCHK-NEXT: store double [[D4]], ptr [[DST4]], align 8 |
| ; NOCHK-NEXT: [[X5P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 5 |
| ; NOCHK-NEXT: [[X5:%.*]] = load double, ptr [[X5P]], align 8 |
| ; NOCHK-NEXT: [[Y5P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 5 |
| ; NOCHK-NEXT: [[Y5:%.*]] = load double, ptr [[Y5P]], align 8 |
| ; NOCHK-NEXT: [[D5:%.*]] = fdiv double [[X5]], [[Y5]] |
| ; NOCHK-NEXT: [[DST5:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 5 |
| ; NOCHK-NEXT: store double [[D5]], ptr [[DST5]], align 8 |
| ; NOCHK-NEXT: [[X6P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 6 |
| ; NOCHK-NEXT: [[X6:%.*]] = load double, ptr [[X6P]], align 8 |
| ; NOCHK-NEXT: [[Y6P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 6 |
| ; NOCHK-NEXT: [[Y6:%.*]] = load double, ptr [[Y6P]], align 8 |
| ; NOCHK-NEXT: [[D6:%.*]] = fdiv double [[X6]], [[Y6]] |
| ; NOCHK-NEXT: [[DST6:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 6 |
| ; NOCHK-NEXT: store double [[D6]], ptr [[DST6]], align 8 |
| ; NOCHK-NEXT: [[X7P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 7 |
| ; NOCHK-NEXT: [[X7:%.*]] = load double, ptr [[X7P]], align 8 |
| ; NOCHK-NEXT: [[Y7P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 7 |
| ; NOCHK-NEXT: [[Y7:%.*]] = load double, ptr [[Y7P]], align 8 |
| ; NOCHK-NEXT: [[D7:%.*]] = fdiv double [[X7]], [[Y7]] |
| ; NOCHK-NEXT: [[DST7:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 7 |
| ; NOCHK-NEXT: store double [[D7]], ptr [[DST7]], align 8 |
| ; NOCHK-NEXT: ret void |
| ; |
| entry: |
| %x0 = load double, ptr %x, align 8 |
| %y0 = load double, ptr %y, align 8 |
| %d0 = fdiv double %x0, %y0 |
| store double %d0, ptr %dst, align 8 |
| %x1p = getelementptr inbounds double, ptr %x, i64 1 |
| %x1 = load double, ptr %x1p, align 8 |
| %y1p = getelementptr inbounds double, ptr %y, i64 1 |
| %y1 = load double, ptr %y1p, align 8 |
| %d1 = fdiv double %x1, %y1 |
| %dst1 = getelementptr inbounds double, ptr %dst, i64 1 |
| store double %d1, ptr %dst1, align 8 |
| %x2p = getelementptr inbounds double, ptr %x, i64 2 |
| %x2 = load double, ptr %x2p, align 8 |
| %y2p = getelementptr inbounds double, ptr %y, i64 2 |
| %y2 = load double, ptr %y2p, align 8 |
| %d2 = fdiv double %x2, %y2 |
| %dst2 = getelementptr inbounds double, ptr %dst, i64 2 |
| store double %d2, ptr %dst2, align 8 |
| %x3p = getelementptr inbounds double, ptr %x, i64 3 |
| %x3 = load double, ptr %x3p, align 8 |
| %y3p = getelementptr inbounds double, ptr %y, i64 3 |
| %y3 = load double, ptr %y3p, align 8 |
| %d3 = fdiv double %x3, %y3 |
| %dst3 = getelementptr inbounds double, ptr %dst, i64 3 |
| store double %d3, ptr %dst3, align 8 |
| %x4p = getelementptr inbounds double, ptr %x, i64 4 |
| %x4 = load double, ptr %x4p, align 8 |
| %y4p = getelementptr inbounds double, ptr %y, i64 4 |
| %y4 = load double, ptr %y4p, align 8 |
| %d4 = fdiv double %x4, %y4 |
| %dst4 = getelementptr inbounds double, ptr %dst, i64 4 |
| store double %d4, ptr %dst4, align 8 |
| %x5p = getelementptr inbounds double, ptr %x, i64 5 |
| %x5 = load double, ptr %x5p, align 8 |
| %y5p = getelementptr inbounds double, ptr %y, i64 5 |
| %y5 = load double, ptr %y5p, align 8 |
| %d5 = fdiv double %x5, %y5 |
| %dst5 = getelementptr inbounds double, ptr %dst, i64 5 |
| store double %d5, ptr %dst5, align 8 |
| %x6p = getelementptr inbounds double, ptr %x, i64 6 |
| %x6 = load double, ptr %x6p, align 8 |
| %y6p = getelementptr inbounds double, ptr %y, i64 6 |
| %y6 = load double, ptr %y6p, align 8 |
| %d6 = fdiv double %x6, %y6 |
| %dst6 = getelementptr inbounds double, ptr %dst, i64 6 |
| store double %d6, ptr %dst6, align 8 |
| %x7p = getelementptr inbounds double, ptr %x, i64 7 |
| %x7 = load double, ptr %x7p, align 8 |
| %y7p = getelementptr inbounds double, ptr %y, i64 7 |
| %y7 = load double, ptr %y7p, align 8 |
| %d7 = fdiv double %x7, %y7 |
| %dst7 = getelementptr inbounds double, ptr %dst, i64 7 |
| store double %d7, ptr %dst7, align 8 |
| ret void |
| } |