1*dc6d0773SYingwei Zheng; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*dc6d0773SYingwei Zheng; RUN: opt < %s -passes=correlated-propagation -S | FileCheck %s 3*dc6d0773SYingwei Zheng 4*dc6d0773SYingwei Zhengdeclare void @use64(i64) 5*dc6d0773SYingwei Zheng 6*dc6d0773SYingwei Zhengdefine void @test1(i32 %n) { 7*dc6d0773SYingwei Zheng; CHECK-LABEL: @test1( 8*dc6d0773SYingwei Zheng; CHECK-NEXT: entry: 9*dc6d0773SYingwei Zheng; CHECK-NEXT: br label [[FOR_COND:%.*]] 10*dc6d0773SYingwei Zheng; CHECK: for.cond: 11*dc6d0773SYingwei Zheng; CHECK-NEXT: [[A:%.*]] = phi i32 [ [[N:%.*]], [[ENTRY:%.*]] ], [ [[EXT:%.*]], [[FOR_BODY:%.*]] ] 12*dc6d0773SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A]], -1 13*dc6d0773SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]] 14*dc6d0773SYingwei Zheng; CHECK: for.body: 15*dc6d0773SYingwei Zheng; CHECK-NEXT: [[EXT_WIDE:%.*]] = zext nneg i32 [[A]] to i64 16*dc6d0773SYingwei Zheng; CHECK-NEXT: call void @use64(i64 [[EXT_WIDE]]) 17*dc6d0773SYingwei Zheng; CHECK-NEXT: [[EXT]] = trunc i64 [[EXT_WIDE]] to i32 18*dc6d0773SYingwei Zheng; CHECK-NEXT: br label [[FOR_COND]] 19*dc6d0773SYingwei Zheng; CHECK: for.end: 20*dc6d0773SYingwei Zheng; CHECK-NEXT: ret void 21*dc6d0773SYingwei Zheng; 22*dc6d0773SYingwei Zhengentry: 23*dc6d0773SYingwei Zheng br label %for.cond 24*dc6d0773SYingwei Zheng 25*dc6d0773SYingwei Zhengfor.cond: ; preds = %for.body, %entry 26*dc6d0773SYingwei Zheng %a = phi i32 [ %n, %entry ], [ %ext, %for.body ] 27*dc6d0773SYingwei Zheng %cmp = icmp sgt i32 %a, -1 28*dc6d0773SYingwei Zheng br i1 %cmp, label %for.body, label %for.end 29*dc6d0773SYingwei Zheng 30*dc6d0773SYingwei Zhengfor.body: ; preds = %for.cond 31*dc6d0773SYingwei Zheng %ext.wide = zext i32 %a to i64 32*dc6d0773SYingwei Zheng call void @use64(i64 %ext.wide) 33*dc6d0773SYingwei Zheng %ext = trunc i64 %ext.wide to i32 34*dc6d0773SYingwei Zheng br label %for.cond 35*dc6d0773SYingwei Zheng 36*dc6d0773SYingwei Zhengfor.end: ; preds = %for.cond 37*dc6d0773SYingwei Zheng ret void 38*dc6d0773SYingwei Zheng} 39*dc6d0773SYingwei Zheng 40*dc6d0773SYingwei Zheng;; Negative test to show transform doesn't happen unless n >= 0. 41*dc6d0773SYingwei Zhengdefine void @test2(i32 %n) { 42*dc6d0773SYingwei Zheng; CHECK-LABEL: @test2( 43*dc6d0773SYingwei Zheng; CHECK-NEXT: entry: 44*dc6d0773SYingwei Zheng; CHECK-NEXT: br label [[FOR_COND:%.*]] 45*dc6d0773SYingwei Zheng; CHECK: for.cond: 46*dc6d0773SYingwei Zheng; CHECK-NEXT: [[A:%.*]] = phi i32 [ [[N:%.*]], [[ENTRY:%.*]] ], [ [[EXT:%.*]], [[FOR_BODY:%.*]] ] 47*dc6d0773SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A]], -2 48*dc6d0773SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]] 49*dc6d0773SYingwei Zheng; CHECK: for.body: 50*dc6d0773SYingwei Zheng; CHECK-NEXT: [[EXT_WIDE:%.*]] = zext i32 [[A]] to i64 51*dc6d0773SYingwei Zheng; CHECK-NEXT: call void @use64(i64 [[EXT_WIDE]]) 52*dc6d0773SYingwei Zheng; CHECK-NEXT: [[EXT]] = trunc i64 [[EXT_WIDE]] to i32 53*dc6d0773SYingwei Zheng; CHECK-NEXT: br label [[FOR_COND]] 54*dc6d0773SYingwei Zheng; CHECK: for.end: 55*dc6d0773SYingwei Zheng; CHECK-NEXT: ret void 56*dc6d0773SYingwei Zheng; 57*dc6d0773SYingwei Zhengentry: 58*dc6d0773SYingwei Zheng br label %for.cond 59*dc6d0773SYingwei Zheng 60*dc6d0773SYingwei Zhengfor.cond: ; preds = %for.body, %entry 61*dc6d0773SYingwei Zheng %a = phi i32 [ %n, %entry ], [ %ext, %for.body ] 62*dc6d0773SYingwei Zheng %cmp = icmp sgt i32 %a, -2 63*dc6d0773SYingwei Zheng br i1 %cmp, label %for.body, label %for.end 64*dc6d0773SYingwei Zheng 65*dc6d0773SYingwei Zhengfor.body: ; preds = %for.cond 66*dc6d0773SYingwei Zheng %ext.wide = zext i32 %a to i64 67*dc6d0773SYingwei Zheng call void @use64(i64 %ext.wide) 68*dc6d0773SYingwei Zheng %ext = trunc i64 %ext.wide to i32 69*dc6d0773SYingwei Zheng br label %for.cond 70*dc6d0773SYingwei Zheng 71*dc6d0773SYingwei Zhengfor.end: ; preds = %for.cond 72*dc6d0773SYingwei Zheng ret void 73*dc6d0773SYingwei Zheng} 74*dc6d0773SYingwei Zheng 75*dc6d0773SYingwei Zheng;; Non looping test case. 76*dc6d0773SYingwei Zhengdefine void @test3(i32 %n) { 77*dc6d0773SYingwei Zheng; CHECK-LABEL: @test3( 78*dc6d0773SYingwei Zheng; CHECK-NEXT: entry: 79*dc6d0773SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[N:%.*]], -1 80*dc6d0773SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] 81*dc6d0773SYingwei Zheng; CHECK: bb: 82*dc6d0773SYingwei Zheng; CHECK-NEXT: [[EXT_WIDE:%.*]] = zext nneg i32 [[N]] to i64 83*dc6d0773SYingwei Zheng; CHECK-NEXT: call void @use64(i64 [[EXT_WIDE]]) 84*dc6d0773SYingwei Zheng; CHECK-NEXT: [[EXT:%.*]] = trunc i64 [[EXT_WIDE]] to i32 85*dc6d0773SYingwei Zheng; CHECK-NEXT: br label [[EXIT]] 86*dc6d0773SYingwei Zheng; CHECK: exit: 87*dc6d0773SYingwei Zheng; CHECK-NEXT: ret void 88*dc6d0773SYingwei Zheng; 89*dc6d0773SYingwei Zhengentry: 90*dc6d0773SYingwei Zheng %cmp = icmp sgt i32 %n, -1 91*dc6d0773SYingwei Zheng br i1 %cmp, label %bb, label %exit 92*dc6d0773SYingwei Zheng 93*dc6d0773SYingwei Zhengbb: 94*dc6d0773SYingwei Zheng %ext.wide = zext i32 %n to i64 95*dc6d0773SYingwei Zheng call void @use64(i64 %ext.wide) 96*dc6d0773SYingwei Zheng %ext = trunc i64 %ext.wide to i32 97*dc6d0773SYingwei Zheng br label %exit 98*dc6d0773SYingwei Zheng 99*dc6d0773SYingwei Zhengexit: 100*dc6d0773SYingwei Zheng ret void 101*dc6d0773SYingwei Zheng} 102*dc6d0773SYingwei Zheng 103*dc6d0773SYingwei Zheng;; Non looping negative test case. 104*dc6d0773SYingwei Zhengdefine void @test4(i32 %n) { 105*dc6d0773SYingwei Zheng; CHECK-LABEL: @test4( 106*dc6d0773SYingwei Zheng; CHECK-NEXT: entry: 107*dc6d0773SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[N:%.*]], -2 108*dc6d0773SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] 109*dc6d0773SYingwei Zheng; CHECK: bb: 110*dc6d0773SYingwei Zheng; CHECK-NEXT: [[EXT_WIDE:%.*]] = zext i32 [[N]] to i64 111*dc6d0773SYingwei Zheng; CHECK-NEXT: call void @use64(i64 [[EXT_WIDE]]) 112*dc6d0773SYingwei Zheng; CHECK-NEXT: [[EXT:%.*]] = trunc i64 [[EXT_WIDE]] to i32 113*dc6d0773SYingwei Zheng; CHECK-NEXT: br label [[EXIT]] 114*dc6d0773SYingwei Zheng; CHECK: exit: 115*dc6d0773SYingwei Zheng; CHECK-NEXT: ret void 116*dc6d0773SYingwei Zheng; 117*dc6d0773SYingwei Zhengentry: 118*dc6d0773SYingwei Zheng %cmp = icmp sgt i32 %n, -2 119*dc6d0773SYingwei Zheng br i1 %cmp, label %bb, label %exit 120*dc6d0773SYingwei Zheng 121*dc6d0773SYingwei Zhengbb: 122*dc6d0773SYingwei Zheng %ext.wide = zext i32 %n to i64 123*dc6d0773SYingwei Zheng call void @use64(i64 %ext.wide) 124*dc6d0773SYingwei Zheng %ext = trunc i64 %ext.wide to i32 125*dc6d0773SYingwei Zheng br label %exit 126*dc6d0773SYingwei Zheng 127*dc6d0773SYingwei Zhengexit: 128*dc6d0773SYingwei Zheng ret void 129*dc6d0773SYingwei Zheng} 130*dc6d0773SYingwei Zheng 131*dc6d0773SYingwei Zhengdefine i64 @may_including_undef(i1 %c.1, i1 %c.2) { 132*dc6d0773SYingwei Zheng; CHECK-LABEL: @may_including_undef( 133*dc6d0773SYingwei Zheng; CHECK-NEXT: br i1 [[C_1:%.*]], label [[TRUE_1:%.*]], label [[FALSE:%.*]] 134*dc6d0773SYingwei Zheng; CHECK: true.1: 135*dc6d0773SYingwei Zheng; CHECK-NEXT: br i1 [[C_2:%.*]], label [[TRUE_2:%.*]], label [[EXIT:%.*]] 136*dc6d0773SYingwei Zheng; CHECK: true.2: 137*dc6d0773SYingwei Zheng; CHECK-NEXT: br label [[EXIT]] 138*dc6d0773SYingwei Zheng; CHECK: false: 139*dc6d0773SYingwei Zheng; CHECK-NEXT: br label [[EXIT]] 140*dc6d0773SYingwei Zheng; CHECK: exit: 141*dc6d0773SYingwei Zheng; CHECK-NEXT: [[P:%.*]] = phi i32 [ 0, [[TRUE_1]] ], [ 1, [[TRUE_2]] ], [ undef, [[FALSE]] ] 142*dc6d0773SYingwei Zheng; CHECK-NEXT: [[EXT:%.*]] = zext i32 [[P]] to i64 143*dc6d0773SYingwei Zheng; CHECK-NEXT: ret i64 [[EXT]] 144*dc6d0773SYingwei Zheng; 145*dc6d0773SYingwei Zheng br i1 %c.1, label %true.1, label %false 146*dc6d0773SYingwei Zheng 147*dc6d0773SYingwei Zhengtrue.1: 148*dc6d0773SYingwei Zheng br i1 %c.2, label %true.2, label %exit 149*dc6d0773SYingwei Zheng 150*dc6d0773SYingwei Zhengtrue.2: 151*dc6d0773SYingwei Zheng br label %exit 152*dc6d0773SYingwei Zheng 153*dc6d0773SYingwei Zhengfalse: 154*dc6d0773SYingwei Zheng br label %exit 155*dc6d0773SYingwei Zheng 156*dc6d0773SYingwei Zhengexit: 157*dc6d0773SYingwei Zheng %p = phi i32 [ 0, %true.1 ], [ 1, %true.2], [ undef, %false ] 158*dc6d0773SYingwei Zheng %ext = zext i32 %p to i64 159*dc6d0773SYingwei Zheng ret i64 %ext 160*dc6d0773SYingwei Zheng} 161*dc6d0773SYingwei Zheng 162*dc6d0773SYingwei Zhengdefine i64 @test_infer_at_use(i32 noundef %n) { 163*dc6d0773SYingwei Zheng; CHECK-LABEL: @test_infer_at_use( 164*dc6d0773SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[N:%.*]], -1 165*dc6d0773SYingwei Zheng; CHECK-NEXT: [[EXT:%.*]] = zext nneg i32 [[N]] to i64 166*dc6d0773SYingwei Zheng; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i64 [[EXT]], i64 0 167*dc6d0773SYingwei Zheng; CHECK-NEXT: ret i64 [[SELECT]] 168*dc6d0773SYingwei Zheng; 169*dc6d0773SYingwei Zheng %cmp = icmp sgt i32 %n, -1 170*dc6d0773SYingwei Zheng %ext = zext i32 %n to i64 171*dc6d0773SYingwei Zheng %select = select i1 %cmp, i64 %ext, i64 0 172*dc6d0773SYingwei Zheng ret i64 %select 173*dc6d0773SYingwei Zheng} 174