blob: 9af4179a249400fe439e1b4c8e563230f83687ec [file]
; 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:.*]], !prof [[PROF0:![0-9]+]]
; 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 @test_dup_switch_successor(ptr %dst, ptr %x, ptr %y, i32 %cond) {
; CHECK-LABEL: define void @test_dup_switch_successor(
; CHECK-SAME: ptr [[DST:%.*]], ptr [[X:%.*]], ptr [[Y:%.*]], i32 [[COND:%.*]]) #[[ATTR1]] {
; 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:.*]], !prof [[PROF0]]
; CHECK: [[EXIT:.*]]:
; CHECK-NEXT: ret void
; 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: [[X4P:%.*]] = getelementptr inbounds double, ptr [[X]], i64 4
; CHECK-NEXT: [[Y4P:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 4
; CHECK-NEXT: [[DST4:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 4
; CHECK-NEXT: [[TMP6:%.*]] = load <4 x double>, ptr [[X4P]], align 8
; CHECK-NEXT: [[TMP7:%.*]] = load <4 x double>, ptr [[Y4P]], align 8
; CHECK-NEXT: [[TMP8:%.*]] = fdiv <4 x double> [[TMP6]], [[TMP7]]
; CHECK-NEXT: store <4 x double> [[TMP8]], ptr [[DST4]], align 8
; CHECK-NEXT: br label %[[ENTRY_RTCONT:.*]]
; CHECK: [[ENTRY_RTSCALAR]]:
; CHECK-NEXT: [[X0_SCALAR:%.*]] = load double, ptr [[X]], align 8
; CHECK-NEXT: [[Y0_SCALAR:%.*]] = load double, ptr [[Y]], align 8
; CHECK-NEXT: [[D0_SCALAR:%.*]] = fdiv double [[X0_SCALAR]], [[Y0_SCALAR]]
; CHECK-NEXT: store double [[D0_SCALAR]], ptr [[DST]], align 8
; CHECK-NEXT: [[X1P_SCALAR:%.*]] = getelementptr inbounds double, ptr [[X]], i64 1
; CHECK-NEXT: [[X1_SCALAR:%.*]] = load double, ptr [[X1P_SCALAR]], align 8
; CHECK-NEXT: [[Y1P_SCALAR:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 1
; CHECK-NEXT: [[Y1_SCALAR:%.*]] = load double, ptr [[Y1P_SCALAR]], align 8
; CHECK-NEXT: [[D1_SCALAR:%.*]] = fdiv double [[X1_SCALAR]], [[Y1_SCALAR]]
; CHECK-NEXT: [[DST1_SCALAR:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 1
; CHECK-NEXT: store double [[D1_SCALAR]], ptr [[DST1_SCALAR]], align 8
; CHECK-NEXT: [[X2P_SCALAR:%.*]] = getelementptr inbounds double, ptr [[X]], i64 2
; CHECK-NEXT: [[X2_SCALAR:%.*]] = load double, ptr [[X2P_SCALAR]], align 8
; CHECK-NEXT: [[Y2P_SCALAR:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 2
; CHECK-NEXT: [[Y2_SCALAR:%.*]] = load double, ptr [[Y2P_SCALAR]], align 8
; CHECK-NEXT: [[D2_SCALAR:%.*]] = fdiv double [[X2_SCALAR]], [[Y2_SCALAR]]
; CHECK-NEXT: [[DST2_SCALAR:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 2
; CHECK-NEXT: store double [[D2_SCALAR]], ptr [[DST2_SCALAR]], align 8
; CHECK-NEXT: [[X3P_SCALAR:%.*]] = getelementptr inbounds double, ptr [[X]], i64 3
; CHECK-NEXT: [[X3_SCALAR:%.*]] = load double, ptr [[X3P_SCALAR]], align 8
; CHECK-NEXT: [[Y3P_SCALAR:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 3
; CHECK-NEXT: [[Y3_SCALAR:%.*]] = load double, ptr [[Y3P_SCALAR]], align 8
; CHECK-NEXT: [[D3_SCALAR:%.*]] = fdiv double [[X3_SCALAR]], [[Y3_SCALAR]]
; CHECK-NEXT: [[DST3_SCALAR:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 3
; CHECK-NEXT: store double [[D3_SCALAR]], ptr [[DST3_SCALAR]], align 8
; CHECK-NEXT: [[X4P_SCALAR:%.*]] = getelementptr inbounds double, ptr [[X]], i64 4
; CHECK-NEXT: [[X4_SCALAR:%.*]] = load double, ptr [[X4P_SCALAR]], align 8
; CHECK-NEXT: [[Y4P_SCALAR:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 4
; CHECK-NEXT: [[Y4_SCALAR:%.*]] = load double, ptr [[Y4P_SCALAR]], align 8
; CHECK-NEXT: [[D4_SCALAR:%.*]] = fdiv double [[X4_SCALAR]], [[Y4_SCALAR]]
; CHECK-NEXT: [[DST4_SCALAR:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 4
; CHECK-NEXT: store double [[D4_SCALAR]], ptr [[DST4_SCALAR]], align 8
; CHECK-NEXT: [[X5P_SCALAR:%.*]] = getelementptr inbounds double, ptr [[X]], i64 5
; CHECK-NEXT: [[X5_SCALAR:%.*]] = load double, ptr [[X5P_SCALAR]], align 8
; CHECK-NEXT: [[Y5P_SCALAR:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 5
; CHECK-NEXT: [[Y5_SCALAR:%.*]] = load double, ptr [[Y5P_SCALAR]], align 8
; CHECK-NEXT: [[D5_SCALAR:%.*]] = fdiv double [[X5_SCALAR]], [[Y5_SCALAR]]
; CHECK-NEXT: [[DST5_SCALAR:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 5
; CHECK-NEXT: store double [[D5_SCALAR]], ptr [[DST5_SCALAR]], align 8
; CHECK-NEXT: [[X6P_SCALAR:%.*]] = getelementptr inbounds double, ptr [[X]], i64 6
; CHECK-NEXT: [[X6_SCALAR:%.*]] = load double, ptr [[X6P_SCALAR]], align 8
; CHECK-NEXT: [[Y6P_SCALAR:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 6
; CHECK-NEXT: [[Y6_SCALAR:%.*]] = load double, ptr [[Y6P_SCALAR]], align 8
; CHECK-NEXT: [[D6_SCALAR:%.*]] = fdiv double [[X6_SCALAR]], [[Y6_SCALAR]]
; CHECK-NEXT: [[DST6_SCALAR:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 6
; CHECK-NEXT: store double [[D6_SCALAR]], ptr [[DST6_SCALAR]], align 8
; CHECK-NEXT: [[X7P_SCALAR:%.*]] = getelementptr inbounds double, ptr [[X]], i64 7
; CHECK-NEXT: [[X7_SCALAR:%.*]] = load double, ptr [[X7P_SCALAR]], align 8
; CHECK-NEXT: [[Y7P_SCALAR:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 7
; CHECK-NEXT: [[Y7_SCALAR:%.*]] = load double, ptr [[Y7P_SCALAR]], align 8
; CHECK-NEXT: [[D7_SCALAR:%.*]] = fdiv double [[X7_SCALAR]], [[Y7_SCALAR]]
; CHECK-NEXT: [[DST7_SCALAR:%.*]] = getelementptr inbounds double, ptr [[DST]], i64 7
; CHECK-NEXT: store double [[D7_SCALAR]], ptr [[DST7_SCALAR]], align 8
; CHECK-NEXT: br label %[[ENTRY_RTCONT]]
; CHECK: [[ENTRY_RTCONT]]:
; CHECK-NEXT: switch i32 [[COND]], label %[[EXIT]] [
; CHECK-NEXT: i32 0, label %[[EXIT]]
; CHECK-NEXT: ]
;
; NOCHK-LABEL: define void @test_dup_switch_successor(
; NOCHK-SAME: ptr [[DST:%.*]], ptr [[X:%.*]], ptr [[Y:%.*]], i32 [[COND:%.*]]) #[[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: switch i32 [[COND]], label %[[EXIT:.*]] [
; NOCHK-NEXT: i32 0, label %[[EXIT]]
; NOCHK-NEXT: ]
; NOCHK: [[EXIT]]:
; 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
switch i32 %cond, label %exit [
i32 0, label %exit
]
exit:
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
}
@global = external global i8, align 1
define void @versioned_block_with_loop_defined_base(ptr %arg, ptr %arg1, ptr %arg2) {
; CHECK-LABEL: define void @versioned_block_with_loop_defined_base(
; CHECK-SAME: ptr [[ARG:%.*]], ptr [[ARG1:%.*]], ptr [[ARG2:%.*]]) #[[ATTR1]] {
; CHECK-NEXT: [[BBL:.*]]:
; CHECK-NEXT: [[ARG22:%.*]] = ptrtoaddr ptr [[ARG2]] to i64
; CHECK-NEXT: br label %[[BBL4:.*]]
; CHECK: [[BBL4]]:
; CHECK-NEXT: [[PHI:%.*]] = phi ptr [ @global, %[[BBL6:.*]] ], [ [[ARG1]], %[[BBL]] ]
; CHECK-NEXT: br label %[[BBL6]]
; CHECK: [[BBL6]]:
; CHECK-NEXT: [[PHI7:%.*]] = phi ptr [ [[ARG]], %[[BBL4]] ], [ [[PHI]], %[[BBL6]] ]
; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr [[PHI7]], align 4
; CHECK-NEXT: switch i8 [[LOAD]], label %[[BBL6]] [
; CHECK-NEXT: i8 3, label %[[BBL9:.*]]
; CHECK-NEXT: i8 6, label %[[BBL4]]
; CHECK-NEXT: ]
; CHECK: [[BBL9]]:
; CHECK-NEXT: [[PHI_LCSSA:%.*]] = phi ptr [ [[PHI]], %[[BBL6]] ]
; CHECK-NEXT: [[PHI_LCSSA1:%.*]] = ptrtoaddr ptr [[PHI_LCSSA]] to i64
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[PHI_LCSSA1]], 16
; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[ARG22]], 16
; CHECK-NEXT: [[RT_BOUND0:%.*]] = icmp ult i64 [[ARG22]], [[TMP0]]
; CHECK-NEXT: [[RT_BOUND1:%.*]] = icmp ult i64 [[PHI_LCSSA1]], [[TMP1]]
; CHECK-NEXT: [[RT_CONFLICT:%.*]] = and i1 [[RT_BOUND0]], [[RT_BOUND1]]
; CHECK-NEXT: [[RT_GUARD:%.*]] = freeze i1 [[RT_CONFLICT]]
; CHECK-NEXT: br i1 [[RT_GUARD]], label %[[BBL9_RTSCALAR:.*]], label %[[BBL9_RTVEC:.*]], !prof [[PROF0]]
; CHECK: [[BBL9_RTVEC]]:
; CHECK-NEXT: [[TMP2:%.*]] = load <16 x i8>, ptr [[PHI_LCSSA]], align 1
; CHECK-NEXT: store <16 x i8> [[TMP2]], ptr [[ARG2]], align 1
; CHECK-NEXT: br label %[[BBL9_RTCONT:.*]]
; CHECK: [[BBL9_RTSCALAR]]:
; CHECK-NEXT: [[LOAD10_SCALAR:%.*]] = load i8, ptr [[PHI_LCSSA]], align 1
; CHECK-NEXT: store i8 [[LOAD10_SCALAR]], ptr [[ARG2]], align 1
; CHECK-NEXT: [[GEP1_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI_LCSSA]], i64 1
; CHECK-NEXT: [[LOAD11_SCALAR:%.*]] = load i8, ptr [[GEP1_SCALAR]], align 1
; CHECK-NEXT: [[GEP12_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 1
; CHECK-NEXT: store i8 [[LOAD11_SCALAR]], ptr [[GEP12_SCALAR]], align 1
; CHECK-NEXT: [[GEP13_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI_LCSSA]], i64 2
; CHECK-NEXT: [[LOAD14_SCALAR:%.*]] = load i8, ptr [[GEP13_SCALAR]], align 1
; CHECK-NEXT: [[GEP15_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 2
; CHECK-NEXT: store i8 [[LOAD14_SCALAR]], ptr [[GEP15_SCALAR]], align 1
; CHECK-NEXT: [[GEP16_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI_LCSSA]], i64 3
; CHECK-NEXT: [[LOAD17_SCALAR:%.*]] = load i8, ptr [[GEP16_SCALAR]], align 1
; CHECK-NEXT: [[GEP18_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 3
; CHECK-NEXT: store i8 [[LOAD17_SCALAR]], ptr [[GEP18_SCALAR]], align 1
; CHECK-NEXT: [[GEP19_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI_LCSSA]], i64 4
; CHECK-NEXT: [[LOAD20_SCALAR:%.*]] = load i8, ptr [[GEP19_SCALAR]], align 1
; CHECK-NEXT: [[GEP21_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 4
; CHECK-NEXT: store i8 [[LOAD20_SCALAR]], ptr [[GEP21_SCALAR]], align 1
; CHECK-NEXT: [[GEP22_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI_LCSSA]], i64 5
; CHECK-NEXT: [[LOAD23_SCALAR:%.*]] = load i8, ptr [[GEP22_SCALAR]], align 1
; CHECK-NEXT: [[GEP24_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 5
; CHECK-NEXT: store i8 [[LOAD23_SCALAR]], ptr [[GEP24_SCALAR]], align 1
; CHECK-NEXT: [[GEP25_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI_LCSSA]], i64 6
; CHECK-NEXT: [[LOAD26_SCALAR:%.*]] = load i8, ptr [[GEP25_SCALAR]], align 1
; CHECK-NEXT: [[GEP27_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 6
; CHECK-NEXT: store i8 [[LOAD26_SCALAR]], ptr [[GEP27_SCALAR]], align 1
; CHECK-NEXT: [[GEP28_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI_LCSSA]], i64 7
; CHECK-NEXT: [[LOAD29_SCALAR:%.*]] = load i8, ptr [[GEP28_SCALAR]], align 1
; CHECK-NEXT: [[GEP30_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 7
; CHECK-NEXT: store i8 [[LOAD29_SCALAR]], ptr [[GEP30_SCALAR]], align 1
; CHECK-NEXT: [[GEP31_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI_LCSSA]], i64 8
; CHECK-NEXT: [[LOAD32_SCALAR:%.*]] = load i8, ptr [[GEP31_SCALAR]], align 1
; CHECK-NEXT: [[GEP33_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 8
; CHECK-NEXT: store i8 [[LOAD32_SCALAR]], ptr [[GEP33_SCALAR]], align 1
; CHECK-NEXT: [[GEP34_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI_LCSSA]], i64 9
; CHECK-NEXT: [[LOAD35_SCALAR:%.*]] = load i8, ptr [[GEP34_SCALAR]], align 1
; CHECK-NEXT: [[GEP36_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 9
; CHECK-NEXT: store i8 [[LOAD35_SCALAR]], ptr [[GEP36_SCALAR]], align 1
; CHECK-NEXT: [[GEP37_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI_LCSSA]], i64 10
; CHECK-NEXT: [[LOAD38_SCALAR:%.*]] = load i8, ptr [[GEP37_SCALAR]], align 1
; CHECK-NEXT: [[GEP39_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 10
; CHECK-NEXT: store i8 [[LOAD38_SCALAR]], ptr [[GEP39_SCALAR]], align 1
; CHECK-NEXT: [[GEP40_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI_LCSSA]], i64 11
; CHECK-NEXT: [[LOAD41_SCALAR:%.*]] = load i8, ptr [[GEP40_SCALAR]], align 1
; CHECK-NEXT: [[GEP42_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 11
; CHECK-NEXT: store i8 [[LOAD41_SCALAR]], ptr [[GEP42_SCALAR]], align 1
; CHECK-NEXT: [[GEP43_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI_LCSSA]], i64 12
; CHECK-NEXT: [[LOAD44_SCALAR:%.*]] = load i8, ptr [[GEP43_SCALAR]], align 1
; CHECK-NEXT: [[GEP45_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 12
; CHECK-NEXT: store i8 [[LOAD44_SCALAR]], ptr [[GEP45_SCALAR]], align 1
; CHECK-NEXT: [[GEP46_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI_LCSSA]], i64 13
; CHECK-NEXT: [[LOAD47_SCALAR:%.*]] = load i8, ptr [[GEP46_SCALAR]], align 1
; CHECK-NEXT: [[GEP48_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 13
; CHECK-NEXT: store i8 [[LOAD47_SCALAR]], ptr [[GEP48_SCALAR]], align 1
; CHECK-NEXT: [[GEP49_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI_LCSSA]], i64 14
; CHECK-NEXT: [[LOAD50_SCALAR:%.*]] = load i8, ptr [[GEP49_SCALAR]], align 1
; CHECK-NEXT: [[GEP51_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 14
; CHECK-NEXT: store i8 [[LOAD50_SCALAR]], ptr [[GEP51_SCALAR]], align 1
; CHECK-NEXT: [[GEP52_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI_LCSSA]], i64 15
; CHECK-NEXT: [[LOAD53_SCALAR:%.*]] = load i8, ptr [[GEP52_SCALAR]], align 1
; CHECK-NEXT: [[GEP54_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 15
; CHECK-NEXT: store i8 [[LOAD53_SCALAR]], ptr [[GEP54_SCALAR]], align 1
; CHECK-NEXT: br label %[[BBL9_RTCONT]]
; CHECK: [[BBL9_RTCONT]]:
; CHECK-NEXT: ret void
;
; NOCHK-LABEL: define void @versioned_block_with_loop_defined_base(
; NOCHK-SAME: ptr [[ARG:%.*]], ptr [[ARG1:%.*]], ptr [[ARG2:%.*]]) #[[ATTR1]] {
; NOCHK-NEXT: [[BBL:.*]]:
; NOCHK-NEXT: br label %[[BBL4:.*]]
; NOCHK: [[BBL4]]:
; NOCHK-NEXT: [[PHI:%.*]] = phi ptr [ @global, %[[BBL6:.*]] ], [ [[ARG1]], %[[BBL]] ]
; NOCHK-NEXT: br label %[[BBL6]]
; NOCHK: [[BBL6]]:
; NOCHK-NEXT: [[PHI7:%.*]] = phi ptr [ [[ARG]], %[[BBL4]] ], [ [[PHI]], %[[BBL6]] ]
; NOCHK-NEXT: [[LOAD:%.*]] = load i8, ptr [[PHI7]], align 4
; NOCHK-NEXT: switch i8 [[LOAD]], label %[[BBL6]] [
; NOCHK-NEXT: i8 3, label %[[BBL9:.*]]
; NOCHK-NEXT: i8 6, label %[[BBL4]]
; NOCHK-NEXT: ]
; NOCHK: [[BBL9]]:
; NOCHK-NEXT: [[LOAD10:%.*]] = load i8, ptr [[PHI]], align 1
; NOCHK-NEXT: store i8 [[LOAD10]], ptr [[ARG2]], align 1
; NOCHK-NEXT: [[GEP1:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI]], i64 1
; NOCHK-NEXT: [[LOAD11:%.*]] = load i8, ptr [[GEP1]], align 1
; NOCHK-NEXT: [[GEP12:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 1
; NOCHK-NEXT: store i8 [[LOAD11]], ptr [[GEP12]], align 1
; NOCHK-NEXT: [[GEP13:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI]], i64 2
; NOCHK-NEXT: [[LOAD14:%.*]] = load i8, ptr [[GEP13]], align 1
; NOCHK-NEXT: [[GEP15:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 2
; NOCHK-NEXT: store i8 [[LOAD14]], ptr [[GEP15]], align 1
; NOCHK-NEXT: [[GEP16:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI]], i64 3
; NOCHK-NEXT: [[LOAD17:%.*]] = load i8, ptr [[GEP16]], align 1
; NOCHK-NEXT: [[GEP18:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 3
; NOCHK-NEXT: store i8 [[LOAD17]], ptr [[GEP18]], align 1
; NOCHK-NEXT: [[GEP19:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI]], i64 4
; NOCHK-NEXT: [[LOAD20:%.*]] = load i8, ptr [[GEP19]], align 1
; NOCHK-NEXT: [[GEP21:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 4
; NOCHK-NEXT: store i8 [[LOAD20]], ptr [[GEP21]], align 1
; NOCHK-NEXT: [[GEP22:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI]], i64 5
; NOCHK-NEXT: [[LOAD23:%.*]] = load i8, ptr [[GEP22]], align 1
; NOCHK-NEXT: [[GEP24:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 5
; NOCHK-NEXT: store i8 [[LOAD23]], ptr [[GEP24]], align 1
; NOCHK-NEXT: [[GEP25:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI]], i64 6
; NOCHK-NEXT: [[LOAD26:%.*]] = load i8, ptr [[GEP25]], align 1
; NOCHK-NEXT: [[GEP27:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 6
; NOCHK-NEXT: store i8 [[LOAD26]], ptr [[GEP27]], align 1
; NOCHK-NEXT: [[GEP28:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI]], i64 7
; NOCHK-NEXT: [[LOAD29:%.*]] = load i8, ptr [[GEP28]], align 1
; NOCHK-NEXT: [[GEP30:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 7
; NOCHK-NEXT: store i8 [[LOAD29]], ptr [[GEP30]], align 1
; NOCHK-NEXT: [[GEP31:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI]], i64 8
; NOCHK-NEXT: [[LOAD32:%.*]] = load i8, ptr [[GEP31]], align 1
; NOCHK-NEXT: [[GEP33:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 8
; NOCHK-NEXT: store i8 [[LOAD32]], ptr [[GEP33]], align 1
; NOCHK-NEXT: [[GEP34:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI]], i64 9
; NOCHK-NEXT: [[LOAD35:%.*]] = load i8, ptr [[GEP34]], align 1
; NOCHK-NEXT: [[GEP36:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 9
; NOCHK-NEXT: store i8 [[LOAD35]], ptr [[GEP36]], align 1
; NOCHK-NEXT: [[GEP37:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI]], i64 10
; NOCHK-NEXT: [[LOAD38:%.*]] = load i8, ptr [[GEP37]], align 1
; NOCHK-NEXT: [[GEP39:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 10
; NOCHK-NEXT: store i8 [[LOAD38]], ptr [[GEP39]], align 1
; NOCHK-NEXT: [[GEP40:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI]], i64 11
; NOCHK-NEXT: [[LOAD41:%.*]] = load i8, ptr [[GEP40]], align 1
; NOCHK-NEXT: [[GEP42:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 11
; NOCHK-NEXT: store i8 [[LOAD41]], ptr [[GEP42]], align 1
; NOCHK-NEXT: [[GEP43:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI]], i64 12
; NOCHK-NEXT: [[LOAD44:%.*]] = load i8, ptr [[GEP43]], align 1
; NOCHK-NEXT: [[GEP45:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 12
; NOCHK-NEXT: store i8 [[LOAD44]], ptr [[GEP45]], align 1
; NOCHK-NEXT: [[GEP46:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI]], i64 13
; NOCHK-NEXT: [[LOAD47:%.*]] = load i8, ptr [[GEP46]], align 1
; NOCHK-NEXT: [[GEP48:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 13
; NOCHK-NEXT: store i8 [[LOAD47]], ptr [[GEP48]], align 1
; NOCHK-NEXT: [[GEP49:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI]], i64 14
; NOCHK-NEXT: [[LOAD50:%.*]] = load i8, ptr [[GEP49]], align 1
; NOCHK-NEXT: [[GEP51:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 14
; NOCHK-NEXT: store i8 [[LOAD50]], ptr [[GEP51]], align 1
; NOCHK-NEXT: [[GEP52:%.*]] = getelementptr inbounds nuw i8, ptr [[PHI]], i64 15
; NOCHK-NEXT: [[LOAD53:%.*]] = load i8, ptr [[GEP52]], align 1
; NOCHK-NEXT: [[GEP54:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG2]], i64 15
; NOCHK-NEXT: store i8 [[LOAD53]], ptr [[GEP54]], align 1
; NOCHK-NEXT: ret void
;
bbl:
br label %bbl4
bbl4:
%phi = phi ptr [ @global, %bbl6 ], [ %arg1, %bbl ]
br label %bbl6
bbl6:
%phi7 = phi ptr [ %arg, %bbl4 ], [ %phi, %bbl6 ]
%load = load i8, ptr %phi7, align 4
switch i8 %load, label %bbl6 [
i8 3, label %bbl9
i8 6, label %bbl4
]
bbl9:
%load10 = load i8, ptr %phi, align 1
store i8 %load10, ptr %arg2, align 1
%gep1 = getelementptr inbounds nuw i8, ptr %phi, i64 1
%load11 = load i8, ptr %gep1, align 1
%gep12 = getelementptr inbounds nuw i8, ptr %arg2, i64 1
store i8 %load11, ptr %gep12, align 1
%gep13 = getelementptr inbounds nuw i8, ptr %phi, i64 2
%load14 = load i8, ptr %gep13, align 1
%gep15 = getelementptr inbounds nuw i8, ptr %arg2, i64 2
store i8 %load14, ptr %gep15, align 1
%gep16 = getelementptr inbounds nuw i8, ptr %phi, i64 3
%load17 = load i8, ptr %gep16, align 1
%gep18 = getelementptr inbounds nuw i8, ptr %arg2, i64 3
store i8 %load17, ptr %gep18, align 1
%gep19 = getelementptr inbounds nuw i8, ptr %phi, i64 4
%load20 = load i8, ptr %gep19, align 1
%gep21 = getelementptr inbounds nuw i8, ptr %arg2, i64 4
store i8 %load20, ptr %gep21, align 1
%gep22 = getelementptr inbounds nuw i8, ptr %phi, i64 5
%load23 = load i8, ptr %gep22, align 1
%gep24 = getelementptr inbounds nuw i8, ptr %arg2, i64 5
store i8 %load23, ptr %gep24, align 1
%gep25 = getelementptr inbounds nuw i8, ptr %phi, i64 6
%load26 = load i8, ptr %gep25, align 1
%gep27 = getelementptr inbounds nuw i8, ptr %arg2, i64 6
store i8 %load26, ptr %gep27, align 1
%gep28 = getelementptr inbounds nuw i8, ptr %phi, i64 7
%load29 = load i8, ptr %gep28, align 1
%gep30 = getelementptr inbounds nuw i8, ptr %arg2, i64 7
store i8 %load29, ptr %gep30, align 1
%gep31 = getelementptr inbounds nuw i8, ptr %phi, i64 8
%load32 = load i8, ptr %gep31, align 1
%gep33 = getelementptr inbounds nuw i8, ptr %arg2, i64 8
store i8 %load32, ptr %gep33, align 1
%gep34 = getelementptr inbounds nuw i8, ptr %phi, i64 9
%load35 = load i8, ptr %gep34, align 1
%gep36 = getelementptr inbounds nuw i8, ptr %arg2, i64 9
store i8 %load35, ptr %gep36, align 1
%gep37 = getelementptr inbounds nuw i8, ptr %phi, i64 10
%load38 = load i8, ptr %gep37, align 1
%gep39 = getelementptr inbounds nuw i8, ptr %arg2, i64 10
store i8 %load38, ptr %gep39, align 1
%gep40 = getelementptr inbounds nuw i8, ptr %phi, i64 11
%load41 = load i8, ptr %gep40, align 1
%gep42 = getelementptr inbounds nuw i8, ptr %arg2, i64 11
store i8 %load41, ptr %gep42, align 1
%gep43 = getelementptr inbounds nuw i8, ptr %phi, i64 12
%load44 = load i8, ptr %gep43, align 1
%gep45 = getelementptr inbounds nuw i8, ptr %arg2, i64 12
store i8 %load44, ptr %gep45, align 1
%gep46 = getelementptr inbounds nuw i8, ptr %phi, i64 13
%load47 = load i8, ptr %gep46, align 1
%gep48 = getelementptr inbounds nuw i8, ptr %arg2, i64 13
store i8 %load47, ptr %gep48, align 1
%gep49 = getelementptr inbounds nuw i8, ptr %phi, i64 14
%load50 = load i8, ptr %gep49, align 1
%gep51 = getelementptr inbounds nuw i8, ptr %arg2, i64 14
store i8 %load50, ptr %gep51, align 1
%gep52 = getelementptr inbounds nuw i8, ptr %phi, i64 15
%load53 = load i8, ptr %gep52, align 1
%gep54 = getelementptr inbounds nuw i8, ptr %arg2, i64 15
store i8 %load53, ptr %gep54, align 1
ret void
}
define void @test_udiv(ptr %dst, ptr %x, ptr %y) {
; CHECK-LABEL: define void @test_udiv(
; CHECK-SAME: ptr [[DST:%.*]], ptr [[X:%.*]], ptr [[Y:%.*]]) #[[ATTR1]] {
; 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]], 32
; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[Y9]], 32
; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[DST10]], 32
; 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:.*]], !prof [[PROF0]]
; CHECK: [[ENTRY_RTVEC]]:
; CHECK-NEXT: [[TMP3:%.*]] = load <8 x i32>, ptr [[X]], align 4
; CHECK-NEXT: [[TMP4:%.*]] = load <8 x i32>, ptr [[Y]], align 4
; CHECK-NEXT: [[TMP5:%.*]] = udiv <8 x i32> [[TMP3]], [[TMP4]]
; CHECK-NEXT: store <8 x i32> [[TMP5]], ptr [[DST]], align 4
; CHECK-NEXT: br label %[[ENTRY_RTCONT:.*]]
; CHECK: [[ENTRY_RTSCALAR]]:
; CHECK-NEXT: [[X0_SCALAR:%.*]] = load i32, ptr [[X]], align 4
; CHECK-NEXT: [[Y0_SCALAR:%.*]] = load i32, ptr [[Y]], align 4
; CHECK-NEXT: [[D0_SCALAR:%.*]] = udiv i32 [[X0_SCALAR]], [[Y0_SCALAR]]
; CHECK-NEXT: store i32 [[D0_SCALAR]], ptr [[DST]], align 4
; CHECK-NEXT: [[X1P_SCALAR:%.*]] = getelementptr inbounds i32, ptr [[X]], i64 1
; CHECK-NEXT: [[X1_SCALAR:%.*]] = load i32, ptr [[X1P_SCALAR]], align 4
; CHECK-NEXT: [[Y1P_SCALAR:%.*]] = getelementptr inbounds i32, ptr [[Y]], i64 1
; CHECK-NEXT: [[Y1_SCALAR:%.*]] = load i32, ptr [[Y1P_SCALAR]], align 4
; CHECK-NEXT: [[D1_SCALAR:%.*]] = udiv i32 [[X1_SCALAR]], [[Y1_SCALAR]]
; CHECK-NEXT: [[DST1_SCALAR:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 1
; CHECK-NEXT: store i32 [[D1_SCALAR]], ptr [[DST1_SCALAR]], align 4
; CHECK-NEXT: [[X2P_SCALAR:%.*]] = getelementptr inbounds i32, ptr [[X]], i64 2
; CHECK-NEXT: [[X2_SCALAR:%.*]] = load i32, ptr [[X2P_SCALAR]], align 4
; CHECK-NEXT: [[Y2P_SCALAR:%.*]] = getelementptr inbounds i32, ptr [[Y]], i64 2
; CHECK-NEXT: [[Y2_SCALAR:%.*]] = load i32, ptr [[Y2P_SCALAR]], align 4
; CHECK-NEXT: [[D2_SCALAR:%.*]] = udiv i32 [[X2_SCALAR]], [[Y2_SCALAR]]
; CHECK-NEXT: [[DST2_SCALAR:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 2
; CHECK-NEXT: store i32 [[D2_SCALAR]], ptr [[DST2_SCALAR]], align 4
; CHECK-NEXT: [[X3P_SCALAR:%.*]] = getelementptr inbounds i32, ptr [[X]], i64 3
; CHECK-NEXT: [[X3_SCALAR:%.*]] = load i32, ptr [[X3P_SCALAR]], align 4
; CHECK-NEXT: [[Y3P_SCALAR:%.*]] = getelementptr inbounds i32, ptr [[Y]], i64 3
; CHECK-NEXT: [[Y3_SCALAR:%.*]] = load i32, ptr [[Y3P_SCALAR]], align 4
; CHECK-NEXT: [[D3_SCALAR:%.*]] = udiv i32 [[X3_SCALAR]], [[Y3_SCALAR]]
; CHECK-NEXT: [[DST3_SCALAR:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 3
; CHECK-NEXT: store i32 [[D3_SCALAR]], ptr [[DST3_SCALAR]], align 4
; CHECK-NEXT: [[X4P_SCALAR:%.*]] = getelementptr inbounds i32, ptr [[X]], i64 4
; CHECK-NEXT: [[X4_SCALAR:%.*]] = load i32, ptr [[X4P_SCALAR]], align 4
; CHECK-NEXT: [[Y4P_SCALAR:%.*]] = getelementptr inbounds i32, ptr [[Y]], i64 4
; CHECK-NEXT: [[Y4_SCALAR:%.*]] = load i32, ptr [[Y4P_SCALAR]], align 4
; CHECK-NEXT: [[D4_SCALAR:%.*]] = udiv i32 [[X4_SCALAR]], [[Y4_SCALAR]]
; CHECK-NEXT: [[DST4_SCALAR:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 4
; CHECK-NEXT: store i32 [[D4_SCALAR]], ptr [[DST4_SCALAR]], align 4
; CHECK-NEXT: [[X5P_SCALAR:%.*]] = getelementptr inbounds i32, ptr [[X]], i64 5
; CHECK-NEXT: [[X5_SCALAR:%.*]] = load i32, ptr [[X5P_SCALAR]], align 4
; CHECK-NEXT: [[Y5P_SCALAR:%.*]] = getelementptr inbounds i32, ptr [[Y]], i64 5
; CHECK-NEXT: [[Y5_SCALAR:%.*]] = load i32, ptr [[Y5P_SCALAR]], align 4
; CHECK-NEXT: [[D5_SCALAR:%.*]] = udiv i32 [[X5_SCALAR]], [[Y5_SCALAR]]
; CHECK-NEXT: [[DST5_SCALAR:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 5
; CHECK-NEXT: store i32 [[D5_SCALAR]], ptr [[DST5_SCALAR]], align 4
; CHECK-NEXT: [[X6P_SCALAR:%.*]] = getelementptr inbounds i32, ptr [[X]], i64 6
; CHECK-NEXT: [[X6_SCALAR:%.*]] = load i32, ptr [[X6P_SCALAR]], align 4
; CHECK-NEXT: [[Y6P_SCALAR:%.*]] = getelementptr inbounds i32, ptr [[Y]], i64 6
; CHECK-NEXT: [[Y6_SCALAR:%.*]] = load i32, ptr [[Y6P_SCALAR]], align 4
; CHECK-NEXT: [[D6_SCALAR:%.*]] = udiv i32 [[X6_SCALAR]], [[Y6_SCALAR]]
; CHECK-NEXT: [[DST6_SCALAR:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 6
; CHECK-NEXT: store i32 [[D6_SCALAR]], ptr [[DST6_SCALAR]], align 4
; CHECK-NEXT: [[X7P_SCALAR:%.*]] = getelementptr inbounds i32, ptr [[X]], i64 7
; CHECK-NEXT: [[X7_SCALAR:%.*]] = load i32, ptr [[X7P_SCALAR]], align 4
; CHECK-NEXT: [[Y7P_SCALAR:%.*]] = getelementptr inbounds i32, ptr [[Y]], i64 7
; CHECK-NEXT: [[Y7_SCALAR:%.*]] = load i32, ptr [[Y7P_SCALAR]], align 4
; CHECK-NEXT: [[D7_SCALAR:%.*]] = udiv i32 [[X7_SCALAR]], [[Y7_SCALAR]]
; CHECK-NEXT: [[DST7_SCALAR:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 7
; CHECK-NEXT: store i32 [[D7_SCALAR]], ptr [[DST7_SCALAR]], align 4
; CHECK-NEXT: br label %[[ENTRY_RTCONT]]
; CHECK: [[ENTRY_RTCONT]]:
; CHECK-NEXT: ret void
;
; NOCHK-LABEL: define void @test_udiv(
; NOCHK-SAME: ptr [[DST:%.*]], ptr [[X:%.*]], ptr [[Y:%.*]]) #[[ATTR1]] {
; NOCHK-NEXT: [[ENTRY:.*:]]
; NOCHK-NEXT: [[X0:%.*]] = load i32, ptr [[X]], align 4
; NOCHK-NEXT: [[Y0:%.*]] = load i32, ptr [[Y]], align 4
; NOCHK-NEXT: [[D0:%.*]] = udiv i32 [[X0]], [[Y0]]
; NOCHK-NEXT: store i32 [[D0]], ptr [[DST]], align 4
; NOCHK-NEXT: [[X1P:%.*]] = getelementptr inbounds i32, ptr [[X]], i64 1
; NOCHK-NEXT: [[X1:%.*]] = load i32, ptr [[X1P]], align 4
; NOCHK-NEXT: [[Y1P:%.*]] = getelementptr inbounds i32, ptr [[Y]], i64 1
; NOCHK-NEXT: [[Y1:%.*]] = load i32, ptr [[Y1P]], align 4
; NOCHK-NEXT: [[D1:%.*]] = udiv i32 [[X1]], [[Y1]]
; NOCHK-NEXT: [[DST1:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 1
; NOCHK-NEXT: store i32 [[D1]], ptr [[DST1]], align 4
; NOCHK-NEXT: [[X2P:%.*]] = getelementptr inbounds i32, ptr [[X]], i64 2
; NOCHK-NEXT: [[X2:%.*]] = load i32, ptr [[X2P]], align 4
; NOCHK-NEXT: [[Y2P:%.*]] = getelementptr inbounds i32, ptr [[Y]], i64 2
; NOCHK-NEXT: [[Y2:%.*]] = load i32, ptr [[Y2P]], align 4
; NOCHK-NEXT: [[D2:%.*]] = udiv i32 [[X2]], [[Y2]]
; NOCHK-NEXT: [[DST2:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 2
; NOCHK-NEXT: store i32 [[D2]], ptr [[DST2]], align 4
; NOCHK-NEXT: [[X3P:%.*]] = getelementptr inbounds i32, ptr [[X]], i64 3
; NOCHK-NEXT: [[X3:%.*]] = load i32, ptr [[X3P]], align 4
; NOCHK-NEXT: [[Y3P:%.*]] = getelementptr inbounds i32, ptr [[Y]], i64 3
; NOCHK-NEXT: [[Y3:%.*]] = load i32, ptr [[Y3P]], align 4
; NOCHK-NEXT: [[D3:%.*]] = udiv i32 [[X3]], [[Y3]]
; NOCHK-NEXT: [[DST3:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 3
; NOCHK-NEXT: store i32 [[D3]], ptr [[DST3]], align 4
; NOCHK-NEXT: [[X4P:%.*]] = getelementptr inbounds i32, ptr [[X]], i64 4
; NOCHK-NEXT: [[X4:%.*]] = load i32, ptr [[X4P]], align 4
; NOCHK-NEXT: [[Y4P:%.*]] = getelementptr inbounds i32, ptr [[Y]], i64 4
; NOCHK-NEXT: [[Y4:%.*]] = load i32, ptr [[Y4P]], align 4
; NOCHK-NEXT: [[D4:%.*]] = udiv i32 [[X4]], [[Y4]]
; NOCHK-NEXT: [[DST4:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 4
; NOCHK-NEXT: store i32 [[D4]], ptr [[DST4]], align 4
; NOCHK-NEXT: [[X5P:%.*]] = getelementptr inbounds i32, ptr [[X]], i64 5
; NOCHK-NEXT: [[X5:%.*]] = load i32, ptr [[X5P]], align 4
; NOCHK-NEXT: [[Y5P:%.*]] = getelementptr inbounds i32, ptr [[Y]], i64 5
; NOCHK-NEXT: [[Y5:%.*]] = load i32, ptr [[Y5P]], align 4
; NOCHK-NEXT: [[D5:%.*]] = udiv i32 [[X5]], [[Y5]]
; NOCHK-NEXT: [[DST5:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 5
; NOCHK-NEXT: store i32 [[D5]], ptr [[DST5]], align 4
; NOCHK-NEXT: [[X6P:%.*]] = getelementptr inbounds i32, ptr [[X]], i64 6
; NOCHK-NEXT: [[X6:%.*]] = load i32, ptr [[X6P]], align 4
; NOCHK-NEXT: [[Y6P:%.*]] = getelementptr inbounds i32, ptr [[Y]], i64 6
; NOCHK-NEXT: [[Y6:%.*]] = load i32, ptr [[Y6P]], align 4
; NOCHK-NEXT: [[D6:%.*]] = udiv i32 [[X6]], [[Y6]]
; NOCHK-NEXT: [[DST6:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 6
; NOCHK-NEXT: store i32 [[D6]], ptr [[DST6]], align 4
; NOCHK-NEXT: [[X7P:%.*]] = getelementptr inbounds i32, ptr [[X]], i64 7
; NOCHK-NEXT: [[X7:%.*]] = load i32, ptr [[X7P]], align 4
; NOCHK-NEXT: [[Y7P:%.*]] = getelementptr inbounds i32, ptr [[Y]], i64 7
; NOCHK-NEXT: [[Y7:%.*]] = load i32, ptr [[Y7P]], align 4
; NOCHK-NEXT: [[D7:%.*]] = udiv i32 [[X7]], [[Y7]]
; NOCHK-NEXT: [[DST7:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 7
; NOCHK-NEXT: store i32 [[D7]], ptr [[DST7]], align 4
; NOCHK-NEXT: ret void
;
entry:
%x0 = load i32, ptr %x, align 4
%y0 = load i32, ptr %y, align 4
%d0 = udiv i32 %x0, %y0
store i32 %d0, ptr %dst, align 4
%x1p = getelementptr inbounds i32, ptr %x, i64 1
%x1 = load i32, ptr %x1p, align 4
%y1p = getelementptr inbounds i32, ptr %y, i64 1
%y1 = load i32, ptr %y1p, align 4
%d1 = udiv i32 %x1, %y1
%dst1 = getelementptr inbounds i32, ptr %dst, i64 1
store i32 %d1, ptr %dst1, align 4
%x2p = getelementptr inbounds i32, ptr %x, i64 2
%x2 = load i32, ptr %x2p, align 4
%y2p = getelementptr inbounds i32, ptr %y, i64 2
%y2 = load i32, ptr %y2p, align 4
%d2 = udiv i32 %x2, %y2
%dst2 = getelementptr inbounds i32, ptr %dst, i64 2
store i32 %d2, ptr %dst2, align 4
%x3p = getelementptr inbounds i32, ptr %x, i64 3
%x3 = load i32, ptr %x3p, align 4
%y3p = getelementptr inbounds i32, ptr %y, i64 3
%y3 = load i32, ptr %y3p, align 4
%d3 = udiv i32 %x3, %y3
%dst3 = getelementptr inbounds i32, ptr %dst, i64 3
store i32 %d3, ptr %dst3, align 4
%x4p = getelementptr inbounds i32, ptr %x, i64 4
%x4 = load i32, ptr %x4p, align 4
%y4p = getelementptr inbounds i32, ptr %y, i64 4
%y4 = load i32, ptr %y4p, align 4
%d4 = udiv i32 %x4, %y4
%dst4 = getelementptr inbounds i32, ptr %dst, i64 4
store i32 %d4, ptr %dst4, align 4
%x5p = getelementptr inbounds i32, ptr %x, i64 5
%x5 = load i32, ptr %x5p, align 4
%y5p = getelementptr inbounds i32, ptr %y, i64 5
%y5 = load i32, ptr %y5p, align 4
%d5 = udiv i32 %x5, %y5
%dst5 = getelementptr inbounds i32, ptr %dst, i64 5
store i32 %d5, ptr %dst5, align 4
%x6p = getelementptr inbounds i32, ptr %x, i64 6
%x6 = load i32, ptr %x6p, align 4
%y6p = getelementptr inbounds i32, ptr %y, i64 6
%y6 = load i32, ptr %y6p, align 4
%d6 = udiv i32 %x6, %y6
%dst6 = getelementptr inbounds i32, ptr %dst, i64 6
store i32 %d6, ptr %dst6, align 4
%x7p = getelementptr inbounds i32, ptr %x, i64 7
%x7 = load i32, ptr %x7p, align 4
%y7p = getelementptr inbounds i32, ptr %y, i64 7
%y7 = load i32, ptr %y7p, align 4
%d7 = udiv i32 %x7, %y7
%dst7 = getelementptr inbounds i32, ptr %dst, i64 7
store i32 %d7, ptr %dst7, align 4
ret void
}
; The base object of the loads is reached through an addrspacecast from a
; differently-sized address space, so the block cannot be versioned.
define void @addrspacecast_base(ptr %p, ptr addrspace(270) %qas) {
; CHECK-LABEL: define void @addrspacecast_base(
; CHECK-SAME: ptr [[P:%.*]], ptr addrspace(270) [[QAS:%.*]]) #[[ATTR1]] {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: [[Q:%.*]] = addrspacecast ptr addrspace(270) [[QAS]] to ptr
; CHECK-NEXT: [[Q0:%.*]] = load i32, ptr [[Q]], align 4
; CHECK-NEXT: store i32 [[Q0]], ptr [[P]], align 4
; CHECK-NEXT: [[PQ1:%.*]] = getelementptr inbounds i32, ptr [[Q]], i64 1
; CHECK-NEXT: [[Q1:%.*]] = load i32, ptr [[PQ1]], align 4
; CHECK-NEXT: [[PP1:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 1
; CHECK-NEXT: store i32 [[Q1]], ptr [[PP1]], align 4
; CHECK-NEXT: [[PQ2:%.*]] = getelementptr inbounds i32, ptr [[Q]], i64 2
; CHECK-NEXT: [[Q2:%.*]] = load i32, ptr [[PQ2]], align 4
; CHECK-NEXT: [[PP2:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 2
; CHECK-NEXT: store i32 [[Q2]], ptr [[PP2]], align 4
; CHECK-NEXT: [[PQ3:%.*]] = getelementptr inbounds i32, ptr [[Q]], i64 3
; CHECK-NEXT: [[Q3:%.*]] = load i32, ptr [[PQ3]], align 4
; CHECK-NEXT: [[PP3:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 3
; CHECK-NEXT: store i32 [[Q3]], ptr [[PP3]], align 4
; CHECK-NEXT: ret void
;
; NOCHK-LABEL: define void @addrspacecast_base(
; NOCHK-SAME: ptr [[P:%.*]], ptr addrspace(270) [[QAS:%.*]]) #[[ATTR1]] {
; NOCHK-NEXT: [[ENTRY:.*:]]
; NOCHK-NEXT: [[Q:%.*]] = addrspacecast ptr addrspace(270) [[QAS]] to ptr
; NOCHK-NEXT: [[Q0:%.*]] = load i32, ptr [[Q]], align 4
; NOCHK-NEXT: store i32 [[Q0]], ptr [[P]], align 4
; NOCHK-NEXT: [[PQ1:%.*]] = getelementptr inbounds i32, ptr [[Q]], i64 1
; NOCHK-NEXT: [[Q1:%.*]] = load i32, ptr [[PQ1]], align 4
; NOCHK-NEXT: [[PP1:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 1
; NOCHK-NEXT: store i32 [[Q1]], ptr [[PP1]], align 4
; NOCHK-NEXT: [[PQ2:%.*]] = getelementptr inbounds i32, ptr [[Q]], i64 2
; NOCHK-NEXT: [[Q2:%.*]] = load i32, ptr [[PQ2]], align 4
; NOCHK-NEXT: [[PP2:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 2
; NOCHK-NEXT: store i32 [[Q2]], ptr [[PP2]], align 4
; NOCHK-NEXT: [[PQ3:%.*]] = getelementptr inbounds i32, ptr [[Q]], i64 3
; NOCHK-NEXT: [[Q3:%.*]] = load i32, ptr [[PQ3]], align 4
; NOCHK-NEXT: [[PP3:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 3
; NOCHK-NEXT: store i32 [[Q3]], ptr [[PP3]], align 4
; NOCHK-NEXT: ret void
;
entry:
%q = addrspacecast ptr addrspace(270) %qas to ptr
%q0 = load i32, ptr %q, align 4
store i32 %q0, ptr %p, align 4
%pq1 = getelementptr inbounds i32, ptr %q, i64 1
%q1 = load i32, ptr %pq1, align 4
%pp1 = getelementptr inbounds i32, ptr %p, i64 1
store i32 %q1, ptr %pp1, align 4
%pq2 = getelementptr inbounds i32, ptr %q, i64 2
%q2 = load i32, ptr %pq2, align 4
%pp2 = getelementptr inbounds i32, ptr %p, i64 2
store i32 %q2, ptr %pp2, align 4
%pq3 = getelementptr inbounds i32, ptr %q, i64 3
%q3 = load i32, ptr %pq3, align 4
%pp3 = getelementptr inbounds i32, ptr %p, i64 3
store i32 %q3, ptr %pp3, align 4
ret void
}
define void @versioned_loop_block(ptr %dst, i64 %stride, ptr %src, i64 %n) {
; CHECK-LABEL: define void @versioned_loop_block(
; CHECK-SAME: ptr [[DST:%.*]], i64 [[STRIDE:%.*]], ptr [[SRC:%.*]], i64 [[N:%.*]]) #[[ATTR1]] {
; CHECK-NEXT: [[LOOP_RTVEC:.*]]:
; CHECK-NEXT: br label %[[LOOP_RTCONT:.*]]
; CHECK: [[LOOP_RTCONT]]:
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[LOOP_RTVEC]] ], [ [[IV_NEXT_RTMERGE:%.*]], %[[EXIT:.*]] ]
; CHECK-NEXT: [[D:%.*]] = phi ptr [ [[DST]], %[[LOOP_RTVEC]] ], [ [[D_NEXT_RTMERGE:%.*]], %[[EXIT]] ]
; CHECK-NEXT: [[S:%.*]] = phi ptr [ [[SRC]], %[[LOOP_RTVEC]] ], [ [[S_NEXT_RTMERGE:%.*]], %[[EXIT]] ]
; CHECK-NEXT: [[S8:%.*]] = ptrtoaddr ptr [[S]] to i64
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[S8]], 16
; CHECK-NEXT: [[D9:%.*]] = ptrtoaddr ptr [[D]] to i64
; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[D9]], 8
; CHECK-NEXT: [[RT_BOUND0:%.*]] = icmp ult i64 [[D9]], [[TMP0]]
; CHECK-NEXT: [[RT_BOUND1:%.*]] = icmp ult i64 [[S8]], [[TMP1]]
; CHECK-NEXT: [[RT_CONFLICT:%.*]] = and i1 [[RT_BOUND0]], [[RT_BOUND1]]
; CHECK-NEXT: [[RT_GUARD:%.*]] = freeze i1 [[RT_CONFLICT]]
; CHECK-NEXT: br i1 [[RT_GUARD]], label %[[LOOP_RTSCALAR:.*]], label %[[LOOP_RTVEC1:.*]], !prof [[PROF0]]
; CHECK: [[EXIT1:.*]]:
; CHECK-NEXT: ret void
; CHECK: [[LOOP_RTVEC1]]:
; CHECK-NEXT: [[TMP2:%.*]] = load <8 x i16>, ptr [[S]], align 2
; CHECK-NEXT: [[TMP3:%.*]] = ashr <8 x i16> [[TMP2]], splat (i16 8)
; CHECK-NEXT: [[TMP4:%.*]] = sub <8 x i16> [[TMP2]], [[TMP3]]
; CHECK-NEXT: [[TMP5:%.*]] = lshr <8 x i16> [[TMP4]], splat (i16 6)
; CHECK-NEXT: [[TMP6:%.*]] = trunc <8 x i16> [[TMP5]] to <8 x i8>
; CHECK-NEXT: store <8 x i8> [[TMP6]], ptr [[D]], align 1
; CHECK-NEXT: [[D_NEXT:%.*]] = getelementptr inbounds i8, ptr [[D]], i64 [[STRIDE]]
; CHECK-NEXT: [[S_NEXT:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 16
; CHECK-NEXT: [[IV_NEXT:%.*]] = add nuw i64 [[IV]], 1
; CHECK-NEXT: [[COND:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
; CHECK-NEXT: br label %[[EXIT]]
; CHECK: [[LOOP_RTSCALAR]]:
; CHECK-NEXT: [[L0_SCALAR:%.*]] = load i16, ptr [[S]], align 2
; CHECK-NEXT: [[A0_SCALAR:%.*]] = ashr i16 [[L0_SCALAR]], 8
; CHECK-NEXT: [[B0_SCALAR:%.*]] = sub i16 [[L0_SCALAR]], [[A0_SCALAR]]
; CHECK-NEXT: [[C0_SCALAR:%.*]] = lshr i16 [[B0_SCALAR]], 6
; CHECK-NEXT: [[T0_SCALAR:%.*]] = trunc i16 [[C0_SCALAR]] to i8
; CHECK-NEXT: store i8 [[T0_SCALAR]], ptr [[D]], align 1
; CHECK-NEXT: [[S1_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 2
; CHECK-NEXT: [[D1_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[D]], i64 1
; CHECK-NEXT: [[L1_SCALAR:%.*]] = load i16, ptr [[S1_SCALAR]], align 2
; CHECK-NEXT: [[A1_SCALAR:%.*]] = ashr i16 [[L1_SCALAR]], 8
; CHECK-NEXT: [[B1_SCALAR:%.*]] = sub i16 [[L1_SCALAR]], [[A1_SCALAR]]
; CHECK-NEXT: [[C1_SCALAR:%.*]] = lshr i16 [[B1_SCALAR]], 6
; CHECK-NEXT: [[T1_SCALAR:%.*]] = trunc i16 [[C1_SCALAR]] to i8
; CHECK-NEXT: store i8 [[T1_SCALAR]], ptr [[D1_SCALAR]], align 1
; CHECK-NEXT: [[S2_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 4
; CHECK-NEXT: [[D2_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[D]], i64 2
; CHECK-NEXT: [[L2_SCALAR:%.*]] = load i16, ptr [[S2_SCALAR]], align 2
; CHECK-NEXT: [[A2_SCALAR:%.*]] = ashr i16 [[L2_SCALAR]], 8
; CHECK-NEXT: [[B2_SCALAR:%.*]] = sub i16 [[L2_SCALAR]], [[A2_SCALAR]]
; CHECK-NEXT: [[C2_SCALAR:%.*]] = lshr i16 [[B2_SCALAR]], 6
; CHECK-NEXT: [[T2_SCALAR:%.*]] = trunc i16 [[C2_SCALAR]] to i8
; CHECK-NEXT: store i8 [[T2_SCALAR]], ptr [[D2_SCALAR]], align 1
; CHECK-NEXT: [[S3_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 6
; CHECK-NEXT: [[D3_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[D]], i64 3
; CHECK-NEXT: [[L3_SCALAR:%.*]] = load i16, ptr [[S3_SCALAR]], align 2
; CHECK-NEXT: [[A3_SCALAR:%.*]] = ashr i16 [[L3_SCALAR]], 8
; CHECK-NEXT: [[B3_SCALAR:%.*]] = sub i16 [[L3_SCALAR]], [[A3_SCALAR]]
; CHECK-NEXT: [[C3_SCALAR:%.*]] = lshr i16 [[B3_SCALAR]], 6
; CHECK-NEXT: [[T3_SCALAR:%.*]] = trunc i16 [[C3_SCALAR]] to i8
; CHECK-NEXT: store i8 [[T3_SCALAR]], ptr [[D3_SCALAR]], align 1
; CHECK-NEXT: [[S4_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 8
; CHECK-NEXT: [[D4_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[D]], i64 4
; CHECK-NEXT: [[L4_SCALAR:%.*]] = load i16, ptr [[S4_SCALAR]], align 2
; CHECK-NEXT: [[A4_SCALAR:%.*]] = ashr i16 [[L4_SCALAR]], 8
; CHECK-NEXT: [[B4_SCALAR:%.*]] = sub i16 [[L4_SCALAR]], [[A4_SCALAR]]
; CHECK-NEXT: [[C4_SCALAR:%.*]] = lshr i16 [[B4_SCALAR]], 6
; CHECK-NEXT: [[T4_SCALAR:%.*]] = trunc i16 [[C4_SCALAR]] to i8
; CHECK-NEXT: store i8 [[T4_SCALAR]], ptr [[D4_SCALAR]], align 1
; CHECK-NEXT: [[S5_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 10
; CHECK-NEXT: [[D5_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[D]], i64 5
; CHECK-NEXT: [[L5_SCALAR:%.*]] = load i16, ptr [[S5_SCALAR]], align 2
; CHECK-NEXT: [[A5_SCALAR:%.*]] = ashr i16 [[L5_SCALAR]], 8
; CHECK-NEXT: [[B5_SCALAR:%.*]] = sub i16 [[L5_SCALAR]], [[A5_SCALAR]]
; CHECK-NEXT: [[C5_SCALAR:%.*]] = lshr i16 [[B5_SCALAR]], 6
; CHECK-NEXT: [[T5_SCALAR:%.*]] = trunc i16 [[C5_SCALAR]] to i8
; CHECK-NEXT: store i8 [[T5_SCALAR]], ptr [[D5_SCALAR]], align 1
; CHECK-NEXT: [[S6_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 12
; CHECK-NEXT: [[D6_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[D]], i64 6
; CHECK-NEXT: [[L6_SCALAR:%.*]] = load i16, ptr [[S6_SCALAR]], align 2
; CHECK-NEXT: [[A6_SCALAR:%.*]] = ashr i16 [[L6_SCALAR]], 8
; CHECK-NEXT: [[B6_SCALAR:%.*]] = sub i16 [[L6_SCALAR]], [[A6_SCALAR]]
; CHECK-NEXT: [[C6_SCALAR:%.*]] = lshr i16 [[B6_SCALAR]], 6
; CHECK-NEXT: [[T6_SCALAR:%.*]] = trunc i16 [[C6_SCALAR]] to i8
; CHECK-NEXT: store i8 [[T6_SCALAR]], ptr [[D6_SCALAR]], align 1
; CHECK-NEXT: [[S7_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 14
; CHECK-NEXT: [[D7_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[D]], i64 7
; CHECK-NEXT: [[L7_SCALAR:%.*]] = load i16, ptr [[S7_SCALAR]], align 2
; CHECK-NEXT: [[A7_SCALAR:%.*]] = ashr i16 [[L7_SCALAR]], 8
; CHECK-NEXT: [[B7_SCALAR:%.*]] = sub i16 [[L7_SCALAR]], [[A7_SCALAR]]
; CHECK-NEXT: [[C7_SCALAR:%.*]] = lshr i16 [[B7_SCALAR]], 6
; CHECK-NEXT: [[T7_SCALAR:%.*]] = trunc i16 [[C7_SCALAR]] to i8
; CHECK-NEXT: store i8 [[T7_SCALAR]], ptr [[D7_SCALAR]], align 1
; CHECK-NEXT: [[D_NEXT_SCALAR:%.*]] = getelementptr inbounds i8, ptr [[D]], i64 [[STRIDE]]
; CHECK-NEXT: [[S_NEXT_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 16
; CHECK-NEXT: [[IV_NEXT_SCALAR:%.*]] = add nuw i64 [[IV]], 1
; CHECK-NEXT: [[COND_SCALAR:%.*]] = icmp eq i64 [[IV_NEXT_SCALAR]], [[N]]
; CHECK-NEXT: br label %[[EXIT]]
; CHECK: [[EXIT]]:
; CHECK-NEXT: [[D_NEXT_RTMERGE]] = phi ptr [ [[D_NEXT]], %[[LOOP_RTVEC1]] ], [ [[D_NEXT_SCALAR]], %[[LOOP_RTSCALAR]] ]
; CHECK-NEXT: [[S_NEXT_RTMERGE]] = phi ptr [ [[S_NEXT]], %[[LOOP_RTVEC1]] ], [ [[S_NEXT_SCALAR]], %[[LOOP_RTSCALAR]] ]
; CHECK-NEXT: [[IV_NEXT_RTMERGE]] = phi i64 [ [[IV_NEXT]], %[[LOOP_RTVEC1]] ], [ [[IV_NEXT_SCALAR]], %[[LOOP_RTSCALAR]] ]
; CHECK-NEXT: [[COND_RTMERGE:%.*]] = phi i1 [ [[COND]], %[[LOOP_RTVEC1]] ], [ [[COND_SCALAR]], %[[LOOP_RTSCALAR]] ]
; CHECK-NEXT: br i1 [[COND_RTMERGE]], label %[[EXIT1]], label %[[LOOP_RTCONT]]
;
; NOCHK-LABEL: define void @versioned_loop_block(
; NOCHK-SAME: ptr [[DST:%.*]], i64 [[STRIDE:%.*]], ptr [[SRC:%.*]], i64 [[N:%.*]]) #[[ATTR1]] {
; NOCHK-NEXT: [[ENTRY:.*]]:
; NOCHK-NEXT: br label %[[LOOP:.*]]
; NOCHK: [[LOOP]]:
; NOCHK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
; NOCHK-NEXT: [[D:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[D_NEXT:%.*]], %[[LOOP]] ]
; NOCHK-NEXT: [[S:%.*]] = phi ptr [ [[SRC]], %[[ENTRY]] ], [ [[S_NEXT:%.*]], %[[LOOP]] ]
; NOCHK-NEXT: [[L0:%.*]] = load i16, ptr [[S]], align 2
; NOCHK-NEXT: [[A0:%.*]] = ashr i16 [[L0]], 8
; NOCHK-NEXT: [[B0:%.*]] = sub i16 [[L0]], [[A0]]
; NOCHK-NEXT: [[C0:%.*]] = lshr i16 [[B0]], 6
; NOCHK-NEXT: [[T0:%.*]] = trunc i16 [[C0]] to i8
; NOCHK-NEXT: store i8 [[T0]], ptr [[D]], align 1
; NOCHK-NEXT: [[S1:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 2
; NOCHK-NEXT: [[D1:%.*]] = getelementptr inbounds nuw i8, ptr [[D]], i64 1
; NOCHK-NEXT: [[L1:%.*]] = load i16, ptr [[S1]], align 2
; NOCHK-NEXT: [[A1:%.*]] = ashr i16 [[L1]], 8
; NOCHK-NEXT: [[B1:%.*]] = sub i16 [[L1]], [[A1]]
; NOCHK-NEXT: [[C1:%.*]] = lshr i16 [[B1]], 6
; NOCHK-NEXT: [[T1:%.*]] = trunc i16 [[C1]] to i8
; NOCHK-NEXT: store i8 [[T1]], ptr [[D1]], align 1
; NOCHK-NEXT: [[S2:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 4
; NOCHK-NEXT: [[D2:%.*]] = getelementptr inbounds nuw i8, ptr [[D]], i64 2
; NOCHK-NEXT: [[L2:%.*]] = load i16, ptr [[S2]], align 2
; NOCHK-NEXT: [[A2:%.*]] = ashr i16 [[L2]], 8
; NOCHK-NEXT: [[B2:%.*]] = sub i16 [[L2]], [[A2]]
; NOCHK-NEXT: [[C2:%.*]] = lshr i16 [[B2]], 6
; NOCHK-NEXT: [[T2:%.*]] = trunc i16 [[C2]] to i8
; NOCHK-NEXT: store i8 [[T2]], ptr [[D2]], align 1
; NOCHK-NEXT: [[S3:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 6
; NOCHK-NEXT: [[D3:%.*]] = getelementptr inbounds nuw i8, ptr [[D]], i64 3
; NOCHK-NEXT: [[L3:%.*]] = load i16, ptr [[S3]], align 2
; NOCHK-NEXT: [[A3:%.*]] = ashr i16 [[L3]], 8
; NOCHK-NEXT: [[B3:%.*]] = sub i16 [[L3]], [[A3]]
; NOCHK-NEXT: [[C3:%.*]] = lshr i16 [[B3]], 6
; NOCHK-NEXT: [[T3:%.*]] = trunc i16 [[C3]] to i8
; NOCHK-NEXT: store i8 [[T3]], ptr [[D3]], align 1
; NOCHK-NEXT: [[S4:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 8
; NOCHK-NEXT: [[D4:%.*]] = getelementptr inbounds nuw i8, ptr [[D]], i64 4
; NOCHK-NEXT: [[L4:%.*]] = load i16, ptr [[S4]], align 2
; NOCHK-NEXT: [[A4:%.*]] = ashr i16 [[L4]], 8
; NOCHK-NEXT: [[B4:%.*]] = sub i16 [[L4]], [[A4]]
; NOCHK-NEXT: [[C4:%.*]] = lshr i16 [[B4]], 6
; NOCHK-NEXT: [[T4:%.*]] = trunc i16 [[C4]] to i8
; NOCHK-NEXT: store i8 [[T4]], ptr [[D4]], align 1
; NOCHK-NEXT: [[S5:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 10
; NOCHK-NEXT: [[D5:%.*]] = getelementptr inbounds nuw i8, ptr [[D]], i64 5
; NOCHK-NEXT: [[L5:%.*]] = load i16, ptr [[S5]], align 2
; NOCHK-NEXT: [[A5:%.*]] = ashr i16 [[L5]], 8
; NOCHK-NEXT: [[B5:%.*]] = sub i16 [[L5]], [[A5]]
; NOCHK-NEXT: [[C5:%.*]] = lshr i16 [[B5]], 6
; NOCHK-NEXT: [[T5:%.*]] = trunc i16 [[C5]] to i8
; NOCHK-NEXT: store i8 [[T5]], ptr [[D5]], align 1
; NOCHK-NEXT: [[S6:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 12
; NOCHK-NEXT: [[D6:%.*]] = getelementptr inbounds nuw i8, ptr [[D]], i64 6
; NOCHK-NEXT: [[L6:%.*]] = load i16, ptr [[S6]], align 2
; NOCHK-NEXT: [[A6:%.*]] = ashr i16 [[L6]], 8
; NOCHK-NEXT: [[B6:%.*]] = sub i16 [[L6]], [[A6]]
; NOCHK-NEXT: [[C6:%.*]] = lshr i16 [[B6]], 6
; NOCHK-NEXT: [[T6:%.*]] = trunc i16 [[C6]] to i8
; NOCHK-NEXT: store i8 [[T6]], ptr [[D6]], align 1
; NOCHK-NEXT: [[S7:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 14
; NOCHK-NEXT: [[D7:%.*]] = getelementptr inbounds nuw i8, ptr [[D]], i64 7
; NOCHK-NEXT: [[L7:%.*]] = load i16, ptr [[S7]], align 2
; NOCHK-NEXT: [[A7:%.*]] = ashr i16 [[L7]], 8
; NOCHK-NEXT: [[B7:%.*]] = sub i16 [[L7]], [[A7]]
; NOCHK-NEXT: [[C7:%.*]] = lshr i16 [[B7]], 6
; NOCHK-NEXT: [[T7:%.*]] = trunc i16 [[C7]] to i8
; NOCHK-NEXT: store i8 [[T7]], ptr [[D7]], align 1
; NOCHK-NEXT: [[D_NEXT]] = getelementptr inbounds i8, ptr [[D]], i64 [[STRIDE]]
; NOCHK-NEXT: [[S_NEXT]] = getelementptr inbounds nuw i8, ptr [[S]], i64 16
; NOCHK-NEXT: [[IV_NEXT]] = add nuw i64 [[IV]], 1
; NOCHK-NEXT: [[COND:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
; NOCHK-NEXT: br i1 [[COND]], label %[[EXIT:.*]], label %[[LOOP]]
; NOCHK: [[EXIT]]:
; NOCHK-NEXT: ret void
;
entry:
br label %loop
loop:
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
%d = phi ptr [ %dst, %entry ], [ %d.next, %loop ]
%s = phi ptr [ %src, %entry ], [ %s.next, %loop ]
%l0 = load i16, ptr %s, align 2
%a0 = ashr i16 %l0, 8
%b0 = sub i16 %l0, %a0
%c0 = lshr i16 %b0, 6
%t0 = trunc i16 %c0 to i8
store i8 %t0, ptr %d, align 1
%s1 = getelementptr inbounds nuw i8, ptr %s, i64 2
%d1 = getelementptr inbounds nuw i8, ptr %d, i64 1
%l1 = load i16, ptr %s1, align 2
%a1 = ashr i16 %l1, 8
%b1 = sub i16 %l1, %a1
%c1 = lshr i16 %b1, 6
%t1 = trunc i16 %c1 to i8
store i8 %t1, ptr %d1, align 1
%s2 = getelementptr inbounds nuw i8, ptr %s, i64 4
%d2 = getelementptr inbounds nuw i8, ptr %d, i64 2
%l2 = load i16, ptr %s2, align 2
%a2 = ashr i16 %l2, 8
%b2 = sub i16 %l2, %a2
%c2 = lshr i16 %b2, 6
%t2 = trunc i16 %c2 to i8
store i8 %t2, ptr %d2, align 1
%s3 = getelementptr inbounds nuw i8, ptr %s, i64 6
%d3 = getelementptr inbounds nuw i8, ptr %d, i64 3
%l3 = load i16, ptr %s3, align 2
%a3 = ashr i16 %l3, 8
%b3 = sub i16 %l3, %a3
%c3 = lshr i16 %b3, 6
%t3 = trunc i16 %c3 to i8
store i8 %t3, ptr %d3, align 1
%s4 = getelementptr inbounds nuw i8, ptr %s, i64 8
%d4 = getelementptr inbounds nuw i8, ptr %d, i64 4
%l4 = load i16, ptr %s4, align 2
%a4 = ashr i16 %l4, 8
%b4 = sub i16 %l4, %a4
%c4 = lshr i16 %b4, 6
%t4 = trunc i16 %c4 to i8
store i8 %t4, ptr %d4, align 1
%s5 = getelementptr inbounds nuw i8, ptr %s, i64 10
%d5 = getelementptr inbounds nuw i8, ptr %d, i64 5
%l5 = load i16, ptr %s5, align 2
%a5 = ashr i16 %l5, 8
%b5 = sub i16 %l5, %a5
%c5 = lshr i16 %b5, 6
%t5 = trunc i16 %c5 to i8
store i8 %t5, ptr %d5, align 1
%s6 = getelementptr inbounds nuw i8, ptr %s, i64 12
%d6 = getelementptr inbounds nuw i8, ptr %d, i64 6
%l6 = load i16, ptr %s6, align 2
%a6 = ashr i16 %l6, 8
%b6 = sub i16 %l6, %a6
%c6 = lshr i16 %b6, 6
%t6 = trunc i16 %c6 to i8
store i8 %t6, ptr %d6, align 1
%s7 = getelementptr inbounds nuw i8, ptr %s, i64 14
%d7 = getelementptr inbounds nuw i8, ptr %d, i64 7
%l7 = load i16, ptr %s7, align 2
%a7 = ashr i16 %l7, 8
%b7 = sub i16 %l7, %a7
%c7 = lshr i16 %b7, 6
%t7 = trunc i16 %c7 to i8
store i8 %t7, ptr %d7, align 1
%d.next = getelementptr inbounds i8, ptr %d, i64 %stride
%s.next = getelementptr inbounds nuw i8, ptr %s, i64 16
%iv.next = add nuw i64 %iv, 1
%cond = icmp eq i64 %iv.next, %n
br i1 %cond, label %exit, label %loop
exit:
ret void
}
;.
; CHECK: [[PROF0]] = !{!"branch_weights", i32 1, i32 1048575}
;.