Index: test/Transforms/CorrelatedValuePropagation/lshr.ll =================================================================== --- /dev/null +++ test/Transforms/CorrelatedValuePropagation/lshr.ll @@ -0,0 +1,667 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -correlated-propagation -S | FileCheck %s + +; Tests with constant shift amount + +define void @const0(i32 %n) { +; CHECK-LABEL: @const0( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP:%.*]] = icmp ule i32 [[N:%.*]], 65535 +; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] +; CHECK: bb: +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[N]], 6 +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; +entry: + %cmp = icmp ule i32 %n, 65535 + br i1 %cmp, label %bb, label %exit + +bb: + %div = lshr i32 %n, 6 + br label %exit + +exit: + ret void +} + +define void @const0_variant2(i32 %n) { +; CHECK-LABEL: @const0_variant2( +; CHECK-NEXT: [[TRUNC:%.*]] = and i32 [[N:%.*]], 65535 +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[TRUNC]], 6 +; CHECK-NEXT: ret void +; + %trunc = and i32 %n, 65535 + %div = lshr i32 %trunc, 6 + ret void +} + +define void @const1(i32 %n) { +; CHECK-LABEL: @const1( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP:%.*]] = icmp ule i32 [[N:%.*]], 255 +; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] +; CHECK: bb: +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[N]], 7 +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; +entry: + %cmp = icmp ule i32 %n, 255 + br i1 %cmp, label %bb, label %exit + +bb: + %div = lshr i32 %n, 7 + br label %exit + +exit: + ret void +} + +define void @const2(i32 %n) { +; CHECK-LABEL: @const2( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP:%.*]] = icmp ule i32 [[N:%.*]], 255 +; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] +; CHECK: bb: +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[N]], 8 +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; +entry: + %cmp = icmp ule i32 %n, 255 + br i1 %cmp, label %bb, label %exit + +bb: + %div = lshr i32 %n, 8 + br label %exit + +exit: + ret void +} + +define void @const3(i32 %n) { +; CHECK-LABEL: @const3( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP:%.*]] = icmp ule i32 [[N:%.*]], 255 +; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] +; CHECK: bb: +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[N]], 9 +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; +entry: + %cmp = icmp ule i32 %n, 255 + br i1 %cmp, label %bb, label %exit + +bb: + %div = lshr i32 %n, 9 + br label %exit + +exit: + ret void +} + +; Negative tests with constant shift + +define void @badconst_overflow(i64 %n) { +; CHECK-LABEL: @badconst_overflow( +; CHECK-NEXT: [[DIV:%.*]] = lshr i64 [[N:%.*]], -1 +; CHECK-NEXT: ret void +; + %div = lshr i64 %n, -1 + ret void +} + +define void @badconst_overflow2(i64 %n) { +; CHECK-LABEL: @badconst_overflow2( +; CHECK-NEXT: [[TRUNCN:%.*]] = and i64 [[N:%.*]], 65535 +; CHECK-NEXT: [[DIV:%.*]] = lshr i64 [[TRUNCN]], -1 +; CHECK-NEXT: ret void +; + %truncn = and i64 %n, 65535 + %div = lshr i64 %truncn, -1 + ret void +} + +define void @badconst0(i32 %n) { +; CHECK-LABEL: @badconst0( +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[N:%.*]], 6 +; CHECK-NEXT: ret void +; + %div = lshr i32 %n, 6 + ret void +} + +define void @badconst1(i32 %n) { +; CHECK-LABEL: @badconst1( +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[N:%.*]], 31 +; CHECK-NEXT: ret void +; + %div = lshr i32 %n, 31 + ret void +} + +define void @badconst2(i32 %n) { +; CHECK-LABEL: @badconst2( +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[N:%.*]], 32 +; CHECK-NEXT: ret void +; + %div = lshr i32 %n, 32 + ret void +} + +define void @badconst3(i32 %n) { +; CHECK-LABEL: @badconst3( +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[N:%.*]], 33 +; CHECK-NEXT: ret void +; + %div = lshr i32 %n, 33 + ret void +} + +define void @badconst4(i16 %n) { +; CHECK-LABEL: @badconst4( +; CHECK-NEXT: [[TRUNCN:%.*]] = and i16 [[N:%.*]], -1 +; CHECK-NEXT: [[DIV:%.*]] = lshr i16 [[TRUNCN]], 15 +; CHECK-NEXT: ret void +; + %truncn = and i16 %n, 65535 + %div = lshr i16 %truncn, 15 + ret void +} + +define void @badconst5(i16 %n) { +; CHECK-LABEL: @badconst5( +; CHECK-NEXT: [[TRUNCN:%.*]] = and i16 [[N:%.*]], -1 +; CHECK-NEXT: [[DIV:%.*]] = lshr i16 [[TRUNCN]], 16 +; CHECK-NEXT: ret void +; + %truncn = and i16 %n, 65535 + %div = lshr i16 %truncn, 16 + ret void +} + +define void @badconst6(i16 %n) { +; CHECK-LABEL: @badconst6( +; CHECK-NEXT: [[TRUNCN:%.*]] = and i16 [[N:%.*]], -1 +; CHECK-NEXT: [[DIV:%.*]] = lshr i16 [[TRUNCN]], 17 +; CHECK-NEXT: ret void +; + %truncn = and i16 %n, 65535 + %div = lshr i16 %truncn, 17 + ret void +} + +; Tests with variable shift amount + +define void @var0(i32 %m, i32 %n) { +; CHECK-LABEL: @var0( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i32 [[M:%.*]], 65535 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i32 [[N:%.*]], 6 +; CHECK-NEXT: [[CMP:%.*]] = and i1 [[CMP1]], [[CMP2]] +; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] +; CHECK: bb: +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[M]], [[N]] +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; +entry: + %cmp1 = icmp ule i32 %m, 65535 + %cmp2 = icmp ule i32 %n, 6 + %cmp = and i1 %cmp1, %cmp2 + br i1 %cmp, label %bb, label %exit + +bb: + %div = lshr i32 %m, %n + br label %exit + +exit: + ret void +} + +define void @var0_variant2(i32 %m, i32 %n) { +; CHECK-LABEL: @var0_variant2( +; CHECK-NEXT: [[TRUNCM:%.*]] = and i32 [[N:%.*]], 65535 +; CHECK-NEXT: [[TRUNCN:%.*]] = and i32 [[N]], 6 +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[TRUNCM]], [[TRUNCN]] +; CHECK-NEXT: ret void +; + %truncm = and i32 %n, 65535 + %truncn = and i32 %n, 6 + %div = lshr i32 %truncm, %truncn + ret void +} + +define void @var1(i32 %m, i32 %n) { +; CHECK-LABEL: @var1( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i32 [[M:%.*]], 255 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i32 [[N:%.*]], 7 +; CHECK-NEXT: [[CMP:%.*]] = and i1 [[CMP1]], [[CMP2]] +; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] +; CHECK: bb: +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[M]], [[N]] +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; +entry: + %cmp1 = icmp ule i32 %m, 255 + %cmp2 = icmp ule i32 %n, 7 + %cmp = and i1 %cmp1, %cmp2 + br i1 %cmp, label %bb, label %exit + +bb: + %div = lshr i32 %m, %n + br label %exit + +exit: + ret void +} + +define void @var2(i32 %m, i32 %n) { +; CHECK-LABEL: @var2( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i32 [[M:%.*]], 255 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i32 [[N:%.*]], 8 +; CHECK-NEXT: [[CMP:%.*]] = and i1 [[CMP1]], [[CMP2]] +; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] +; CHECK: bb: +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[M]], [[N]] +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; +entry: + %cmp1 = icmp ule i32 %m, 255 + %cmp2 = icmp ule i32 %n, 8 + %cmp = and i1 %cmp1, %cmp2 + br i1 %cmp, label %bb, label %exit + +bb: + %div = lshr i32 %m, %n + br label %exit + +exit: + ret void +} + +define void @var3(i32 %m, i32 %n) { +; CHECK-LABEL: @var3( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i32 [[M:%.*]], 255 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i32 [[N:%.*]], 9 +; CHECK-NEXT: [[CMP:%.*]] = and i1 [[CMP1]], [[CMP2]] +; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] +; CHECK: bb: +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[M]], [[N]] +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; +entry: + %cmp1 = icmp ule i32 %m, 255 + %cmp2 = icmp ule i32 %n, 9 + %cmp = and i1 %cmp1, %cmp2 + br i1 %cmp, label %bb, label %exit + +bb: + %div = lshr i32 %m, %n + br label %exit + +exit: + ret void +} + +; Negative tests with variable shift amount + +define void @badvar_overflow(i64 %m, i64 %n) { +; CHECK-LABEL: @badvar_overflow( +; CHECK-NEXT: [[DIV:%.*]] = lshr i64 [[M:%.*]], [[N:%.*]] +; CHECK-NEXT: ret void +; + %div = lshr i64 %m, %n + ret void +} + +define void @badvar_overflow2(i64 %m, i64 %n) { +; CHECK-LABEL: @badvar_overflow2( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP:%.*]] = icmp ule i64 [[M:%.*]], 65535 +; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] +; CHECK: bb: +; CHECK-NEXT: [[DIV:%.*]] = lshr i64 [[M]], [[N:%.*]] +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; +entry: + %cmp = icmp ule i64 %m, 65535 + br i1 %cmp, label %bb, label %exit + +bb: + %div = lshr i64 %m, %n + br label %exit + +exit: + ret void +} + +define void @badvar0(i32 %m, i32 %n) { +; CHECK-LABEL: @badvar0( +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[M:%.*]], [[N:%.*]] +; CHECK-NEXT: ret void +; + %div = lshr i32 %m, %n + ret void +} + +define void @badvar1(i32 %m, i32 %n) { +; CHECK-LABEL: @badvar1( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP:%.*]] = icmp ule i32 [[M:%.*]], 65535 +; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] +; CHECK: bb: +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[M]], [[N:%.*]] +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; +entry: + %cmp = icmp ule i32 %m, 65535 + br i1 %cmp, label %bb, label %exit + +bb: + %div = lshr i32 %m, %n + br label %exit + +exit: + ret void +} + +define void @badvar2(i32 %m, i32 %n) { +; CHECK-LABEL: @badvar2( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP:%.*]] = icmp ule i32 [[M:%.*]], 15 +; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] +; CHECK: bb: +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[M]], [[N:%.*]] +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; +entry: + %cmp = icmp ule i32 %m, 15 + br i1 %cmp, label %bb, label %exit + +bb: + %div = lshr i32 %m, %n + br label %exit + +exit: + ret void +} + +define void @badvar3(i32 %m, i32 %n) { +; CHECK-LABEL: @badvar3( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i32 [[M:%.*]], 65535 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i32 [[N:%.*]], 31 +; CHECK-NEXT: [[CMP:%.*]] = and i1 [[CMP1]], [[CMP2]] +; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] +; CHECK: bb: +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[M]], [[N]] +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; +entry: + %cmp1 = icmp ule i32 %m, 65535 + %cmp2 = icmp ule i32 %n, 31 + %cmp = and i1 %cmp1, %cmp2 + br i1 %cmp, label %bb, label %exit + +bb: + %div = lshr i32 %m, %n + br label %exit + +exit: + ret void +} + +define void @badvar4(i32 %m, i32 %n) { +; CHECK-LABEL: @badvar4( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i32 [[M:%.*]], 65535 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i32 [[N:%.*]], 32 +; CHECK-NEXT: [[CMP:%.*]] = and i1 [[CMP1]], [[CMP2]] +; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] +; CHECK: bb: +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[M]], [[N]] +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; +entry: + %cmp1 = icmp ule i32 %m, 65535 + %cmp2 = icmp ule i32 %n, 32 + %cmp = and i1 %cmp1, %cmp2 + br i1 %cmp, label %bb, label %exit + +bb: + %div = lshr i32 %m, %n + br label %exit + +exit: + ret void +} + +define void @badvar5(i32 %m, i32 %n) { +; CHECK-LABEL: @badvar5( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i32 [[M:%.*]], 65535 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i32 [[N:%.*]], 33 +; CHECK-NEXT: [[CMP:%.*]] = and i1 [[CMP1]], [[CMP2]] +; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] +; CHECK: bb: +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[M]], [[N]] +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; +entry: + %cmp1 = icmp ule i32 %m, 65535 + %cmp2 = icmp ule i32 %n, 33 + %cmp = and i1 %cmp1, %cmp2 + br i1 %cmp, label %bb, label %exit + +bb: + %div = lshr i32 %m, %n + br label %exit + +exit: + ret void +} + +; Special tests + +define void @constexact(i32 %n) { +; CHECK-LABEL: @constexact( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP:%.*]] = icmp ule i32 [[N:%.*]], 65535 +; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] +; CHECK: bb: +; CHECK-NEXT: [[DIV:%.*]] = lshr exact i32 [[N]], 6 +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; +entry: + %cmp = icmp ule i32 %n, 65535 + br i1 %cmp, label %bb, label %exit + +bb: + %div = lshr exact i32 %n, 6 + br label %exit + +exit: + ret void +} + +define void @varexact(i32 %m, i32 %n) { +; CHECK-LABEL: @varexact( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i32 [[M:%.*]], 65535 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i32 [[N:%.*]], 15 +; CHECK-NEXT: [[CMP:%.*]] = and i1 [[CMP1]], [[CMP2]] +; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] +; CHECK: bb: +; CHECK-NEXT: [[DIV:%.*]] = lshr exact i32 [[M]], [[N]] +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; +entry: + %cmp1 = icmp ule i32 %m, 65535 + %cmp2 = icmp ule i32 %n, 15 + %cmp = and i1 %cmp1, %cmp2 + br i1 %cmp, label %bb, label %exit + +bb: + %div = lshr exact i32 %m, %n + br label %exit + +exit: + ret void +} + +define void @const_8bit(i32 %n) { +; CHECK-LABEL: @const_8bit( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP:%.*]] = icmp ule i32 [[N:%.*]], 15 +; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] +; CHECK: bb: +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[N]], 1 +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; +entry: + %cmp = icmp ule i32 %n, 15 + br i1 %cmp, label %bb, label %exit + +bb: + %div = lshr i32 %n, 1 + br label %exit + +exit: + ret void +} + +define void @var_8bit(i32 %m, i32 %n) { +; CHECK-LABEL: @var_8bit( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i32 [[M:%.*]], 15 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i32 [[N:%.*]], 1 +; CHECK-NEXT: [[CMP:%.*]] = and i1 [[CMP1]], [[CMP2]] +; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] +; CHECK: bb: +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[M]], [[N]] +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; +entry: + %cmp1 = icmp ule i32 %m, 15 + %cmp2 = icmp ule i32 %n, 1 + %cmp = and i1 %cmp1, %cmp2 + br i1 %cmp, label %bb, label %exit + +bb: + %div = lshr i32 %m, %n + br label %exit + +exit: + ret void +} + +define void @const_poweroftwo(i32 %n) { +; CHECK-LABEL: @const_poweroftwo( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP:%.*]] = icmp ule i32 [[N:%.*]], 4095 +; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] +; CHECK: bb: +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[N]], 1 +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; +entry: + %cmp = icmp ule i32 %n, 4095 + br i1 %cmp, label %bb, label %exit + +bb: + %div = lshr i32 %n, 1 + br label %exit + +exit: + ret void +} + +define void @var_poweroftwo(i32 %m, i32 %n) { +; CHECK-LABEL: @var_poweroftwo( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i32 [[M:%.*]], 4095 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i32 [[N:%.*]], 1 +; CHECK-NEXT: [[CMP:%.*]] = and i1 [[CMP1]], [[CMP2]] +; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] +; CHECK: bb: +; CHECK-NEXT: [[DIV:%.*]] = lshr i32 [[M]], [[N]] +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; +entry: + %cmp1 = icmp ule i32 %m, 4095 + %cmp2 = icmp ule i32 %n, 1 + %cmp = and i1 %cmp1, %cmp2 + br i1 %cmp, label %bb, label %exit + +bb: + %div = lshr i32 %m, %n + br label %exit + +exit: + ret void +} + +define void @badconstvec(<2 x i32> %n) { +; CHECK-LABEL: @badconstvec( +; CHECK-NEXT: [[TRUNC:%.*]] = and <2 x i32> [[N:%.*]], +; CHECK-NEXT: [[DIV:%.*]] = lshr <2 x i32> [[TRUNC]], +; CHECK-NEXT: ret void +; + %trunc = and <2 x i32> %n, + %div = lshr <2 x i32> %trunc, + ret void +} + +define void @badvarvec(<2 x i32> %m, <2 x i32> %n) { +; CHECK-LABEL: @badvarvec( +; CHECK-NEXT: [[TRUNCM:%.*]] = and <2 x i32> [[N:%.*]], +; CHECK-NEXT: [[TRUNCN:%.*]] = and <2 x i32> [[N]], +; CHECK-NEXT: [[DIV:%.*]] = lshr <2 x i32> [[TRUNCM]], [[TRUNCN]] +; CHECK-NEXT: ret void +; + %truncm = and <2 x i32> %n, + %truncn = and <2 x i32> %n, + %div = lshr <2 x i32> %truncm, %truncn + ret void +}