1*2e9f8696SJustin Fargnoli; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2*2e9f8696SJustin Fargnoli; RUN: opt -S -passes=normalize -verify-each -norm-rename-all=false < %s | FileCheck %s 3*2e9f8696SJustin Fargnoli 4*2e9f8696SJustin Fargnolidefine void @foo() { 5*2e9f8696SJustin Fargnoli; CHECK-LABEL: define void @foo() { 6*2e9f8696SJustin Fargnoli; CHECK-NEXT: bb17254: 7*2e9f8696SJustin Fargnoli; CHECK-NEXT: ret void 8*2e9f8696SJustin Fargnoli; 9*2e9f8696SJustin Fargnoli ret void 10*2e9f8696SJustin Fargnoli} 11*2e9f8696SJustin Fargnoli 12*2e9f8696SJustin Fargnolidefine void @empty_basic_block() { 13*2e9f8696SJustin Fargnoli; CHECK-LABEL: define void @empty_basic_block() { 14*2e9f8696SJustin Fargnoli; CHECK-NEXT: exit: 15*2e9f8696SJustin Fargnoli; CHECK-NEXT: ret void 16*2e9f8696SJustin Fargnoli; 17*2e9f8696SJustin Fargnoliexit: 18*2e9f8696SJustin Fargnoli ret void 19*2e9f8696SJustin Fargnoli} 20*2e9f8696SJustin Fargnoli 21*2e9f8696SJustin Fargnolideclare void @effecting() 22*2e9f8696SJustin Fargnoli 23*2e9f8696SJustin Fargnoli; Place dead instruction(s) before the terminator 24*2e9f8696SJustin Fargnolidefine void @call_effecting() { 25*2e9f8696SJustin Fargnoli; CHECK-LABEL: define void @call_effecting() { 26*2e9f8696SJustin Fargnoli; CHECK-NEXT: bb15160: 27*2e9f8696SJustin Fargnoli; CHECK-NEXT: call void @effecting() 28*2e9f8696SJustin Fargnoli; CHECK-NEXT: [[TMP0:%.*]] = add i32 0, 1 29*2e9f8696SJustin Fargnoli; CHECK-NEXT: ret void 30*2e9f8696SJustin Fargnoli; 31*2e9f8696SJustin Fargnoli %1 = add i32 0, 1 32*2e9f8696SJustin Fargnoli call void @effecting() 33*2e9f8696SJustin Fargnoli ret void 34*2e9f8696SJustin Fargnoli} 35*2e9f8696SJustin Fargnoli 36*2e9f8696SJustin Fargnolidefine void @dont_move_above_phi() { 37*2e9f8696SJustin Fargnoli; CHECK-LABEL: define void @dont_move_above_phi() { 38*2e9f8696SJustin Fargnoli; CHECK-NEXT: bb76951: 39*2e9f8696SJustin Fargnoli; CHECK-NEXT: br label [[EXIT:%.*]] 40*2e9f8696SJustin Fargnoli; CHECK: exit: 41*2e9f8696SJustin Fargnoli; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ 0, [[BB76951:%.*]] ] 42*2e9f8696SJustin Fargnoli; CHECK-NEXT: call void @effecting() 43*2e9f8696SJustin Fargnoli; CHECK-NEXT: ret void 44*2e9f8696SJustin Fargnoli; 45*2e9f8696SJustin Fargnoli br label %exit 46*2e9f8696SJustin Fargnoliexit: 47*2e9f8696SJustin Fargnoli %1 = phi i32 [0, %0] 48*2e9f8696SJustin Fargnoli call void @effecting() 49*2e9f8696SJustin Fargnoli ret void 50*2e9f8696SJustin Fargnoli} 51*2e9f8696SJustin Fargnoli 52*2e9f8696SJustin Fargnolidefine void @dont_move_above_alloca() { 53*2e9f8696SJustin Fargnoli; CHECK-LABEL: define void @dont_move_above_alloca() { 54*2e9f8696SJustin Fargnoli; CHECK-NEXT: bb15160: 55*2e9f8696SJustin Fargnoli; CHECK-NEXT: [[TMP0:%.*]] = alloca i32, align 4 56*2e9f8696SJustin Fargnoli; CHECK-NEXT: call void @effecting() 57*2e9f8696SJustin Fargnoli; CHECK-NEXT: ret void 58*2e9f8696SJustin Fargnoli; 59*2e9f8696SJustin Fargnoli %1 = alloca i32 60*2e9f8696SJustin Fargnoli call void @effecting() 61*2e9f8696SJustin Fargnoli ret void 62*2e9f8696SJustin Fargnoli} 63*2e9f8696SJustin Fargnoli 64*2e9f8696SJustin Fargnolideclare void @effecting1() 65*2e9f8696SJustin Fargnoli 66*2e9f8696SJustin Fargnolidefine void @dont_reorder_effecting() { 67*2e9f8696SJustin Fargnoli; CHECK-LABEL: define void @dont_reorder_effecting() { 68*2e9f8696SJustin Fargnoli; CHECK-NEXT: bb10075: 69*2e9f8696SJustin Fargnoli; CHECK-NEXT: call void @effecting() 70*2e9f8696SJustin Fargnoli; CHECK-NEXT: call void @effecting1() 71*2e9f8696SJustin Fargnoli; CHECK-NEXT: ret void 72*2e9f8696SJustin Fargnoli; 73*2e9f8696SJustin Fargnoli call void @effecting() 74*2e9f8696SJustin Fargnoli call void @effecting1() 75*2e9f8696SJustin Fargnoli ret void 76*2e9f8696SJustin Fargnoli} 77*2e9f8696SJustin Fargnoli 78*2e9f8696SJustin Fargnolideclare void @effecting2(i32) 79*2e9f8696SJustin Fargnoli 80*2e9f8696SJustin Fargnolidefine void @dont_reorder_effecting1() { 81*2e9f8696SJustin Fargnoli; CHECK-LABEL: define void @dont_reorder_effecting1() { 82*2e9f8696SJustin Fargnoli; CHECK-NEXT: bb10075: 83*2e9f8696SJustin Fargnoli; CHECK-NEXT: [[ONE:%.*]] = add i32 1, 1 84*2e9f8696SJustin Fargnoli; CHECK-NEXT: call void @effecting2(i32 [[ONE]]) 85*2e9f8696SJustin Fargnoli; CHECK-NEXT: [[TWO:%.*]] = add i32 2, 2 86*2e9f8696SJustin Fargnoli; CHECK-NEXT: call void @effecting2(i32 [[TWO]]) 87*2e9f8696SJustin Fargnoli; CHECK-NEXT: ret void 88*2e9f8696SJustin Fargnoli; 89*2e9f8696SJustin Fargnoli %one = add i32 1, 1 90*2e9f8696SJustin Fargnoli %two = add i32 2, 2 91*2e9f8696SJustin Fargnoli call void @effecting2(i32 %one) 92*2e9f8696SJustin Fargnoli call void @effecting2(i32 %two) 93*2e9f8696SJustin Fargnoli ret void 94*2e9f8696SJustin Fargnoli} 95*2e9f8696SJustin Fargnoli 96*2e9f8696SJustin Fargnolidefine void @dont_reorder_across_blocks() { 97*2e9f8696SJustin Fargnoli; CHECK-LABEL: define void @dont_reorder_across_blocks() { 98*2e9f8696SJustin Fargnoli; CHECK-NEXT: bb76951: 99*2e9f8696SJustin Fargnoli; CHECK-NEXT: [[ONE:%.*]] = add i32 1, 1 100*2e9f8696SJustin Fargnoli; CHECK-NEXT: br label [[EXIT:%.*]] 101*2e9f8696SJustin Fargnoli; CHECK: exit: 102*2e9f8696SJustin Fargnoli; CHECK-NEXT: call void @effecting2(i32 [[ONE]]) 103*2e9f8696SJustin Fargnoli; CHECK-NEXT: ret void 104*2e9f8696SJustin Fargnoli; 105*2e9f8696SJustin Fargnoli %one = add i32 1, 1 106*2e9f8696SJustin Fargnoli br label %exit 107*2e9f8696SJustin Fargnoliexit: 108*2e9f8696SJustin Fargnoli call void @effecting2(i32 %one) 109*2e9f8696SJustin Fargnoli ret void 110*2e9f8696SJustin Fargnoli} 111*2e9f8696SJustin Fargnoli 112*2e9f8696SJustin Fargnolidefine void @independentldst(ptr %a, ptr %b) { 113*2e9f8696SJustin Fargnoli; CHECK-LABEL: define void @independentldst( 114*2e9f8696SJustin Fargnoli; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]]) { 115*2e9f8696SJustin Fargnoli; CHECK-NEXT: bb10495: 116*2e9f8696SJustin Fargnoli; CHECK-NEXT: %"vl12961([[B]])" = load i32, ptr [[B]], align 4 117*2e9f8696SJustin Fargnoli; CHECK-NEXT: store i32 %"vl12961([[B]])", ptr [[A]], align 4 118*2e9f8696SJustin Fargnoli; CHECK-NEXT: %"vl89528([[A]])" = load i32, ptr [[A]], align 4 119*2e9f8696SJustin Fargnoli; CHECK-NEXT: store i32 %"vl89528([[A]])", ptr [[B]], align 4 120*2e9f8696SJustin Fargnoli; CHECK-NEXT: ret void 121*2e9f8696SJustin Fargnoli; 122*2e9f8696SJustin Fargnoli %2 = load i32, ptr %a 123*2e9f8696SJustin Fargnoli %3 = load i32, ptr %b 124*2e9f8696SJustin Fargnoli store i32 %3, ptr %a 125*2e9f8696SJustin Fargnoli store i32 %2, ptr %b 126*2e9f8696SJustin Fargnoli ret void 127*2e9f8696SJustin Fargnoli} 128*2e9f8696SJustin Fargnoli 129*2e9f8696SJustin Fargnolidefine void @multiple_use_ld(ptr %a, ptr %b) { 130*2e9f8696SJustin Fargnoli; CHECK-LABEL: define void @multiple_use_ld( 131*2e9f8696SJustin Fargnoli; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]]) { 132*2e9f8696SJustin Fargnoli; CHECK-NEXT: bb14927: 133*2e9f8696SJustin Fargnoli; CHECK-NEXT: %"vl16793([[A]])" = load i32, ptr [[A]], align 4 134*2e9f8696SJustin Fargnoli; CHECK-NEXT: store i32 %"vl16793([[A]])", ptr [[A]], align 4 135*2e9f8696SJustin Fargnoli; CHECK-NEXT: %"vl89528([[B]])" = load i32, ptr [[B]], align 4 136*2e9f8696SJustin Fargnoli; CHECK-NEXT: store i32 %"vl89528([[B]])", ptr [[B]], align 4 137*2e9f8696SJustin Fargnoli; CHECK-NEXT: store i32 %"vl16793([[A]])", ptr [[A]], align 4 138*2e9f8696SJustin Fargnoli; CHECK-NEXT: ret void 139*2e9f8696SJustin Fargnoli; 140*2e9f8696SJustin Fargnoli %2 = load i32, ptr %a 141*2e9f8696SJustin Fargnoli store i32 %2, ptr %a 142*2e9f8696SJustin Fargnoli %3 = load i32, ptr %b 143*2e9f8696SJustin Fargnoli store i32 %3, ptr %b 144*2e9f8696SJustin Fargnoli store i32 %2, ptr %a 145*2e9f8696SJustin Fargnoli ret void 146*2e9f8696SJustin Fargnoli} 147*2e9f8696SJustin Fargnoli 148*2e9f8696SJustin Fargnoli; This is an incorrect transformation. Moving the store above the load could 149*2e9f8696SJustin Fargnoli; change the loaded value. To do this, the pointers would need to be `noalias`. 150*2e9f8696SJustin Fargnolidefine void @undef_st(ptr %a, ptr %b) { 151*2e9f8696SJustin Fargnoli; CHECK-LABEL: define void @undef_st( 152*2e9f8696SJustin Fargnoli; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]]) { 153*2e9f8696SJustin Fargnoli; CHECK-NEXT: bb10495: 154*2e9f8696SJustin Fargnoli; CHECK-NEXT: store i32 undef, ptr [[B]], align 4 155*2e9f8696SJustin Fargnoli; CHECK-NEXT: %"vl16028([[A]])" = load i32, ptr [[A]], align 4 156*2e9f8696SJustin Fargnoli; CHECK-NEXT: store i32 %"vl16028([[A]])", ptr [[A]], align 4 157*2e9f8696SJustin Fargnoli; CHECK-NEXT: ret void 158*2e9f8696SJustin Fargnoli; 159*2e9f8696SJustin Fargnoli %2 = load i32, ptr %a 160*2e9f8696SJustin Fargnoli store i32 undef, ptr %b 161*2e9f8696SJustin Fargnoli store i32 %2, ptr %a 162*2e9f8696SJustin Fargnoli ret void 163*2e9f8696SJustin Fargnoli} 164